[CKA] 10일차 - network(1) network 이론 및 network namespace

Networking

네트워크가 작동하는 방식

  • 같은 네트워크 상에서는 스위치로 패킷을 전송할 수 있음
  • 다른 네트워크 상에서는 router가 있어야 함
  • 만약 PC A, B가 같은 네트워크에 있고 PC B, C가 같은 네트워크에 있다면
    라우팅 테이블을 추가하면 A와 C가 통신할 수 있음
    하지만, response를 받을 수 없는데 B는 기본적으로 response를 forwarding하지 않기 때문
    보안적인 이슈인데, 만약 public network와 private network를 연결했을 때 forward가 된다면 문제가 있기 때문

ip 관련 연결 확인 커맨드

네트워크에 물리적으로 연결되었는지 확인: ip link
자신의 컴퓨터가 ip 주소를 할당받았는지 확인: ip addr
routing table 확인: route
network간 연결: ip route add 192.168.2.0/24 via 192.168.1.1 (routing 경로 추가)
device에 ip 추가: ip addr add 192.168.1.10/24 dev eth0
만약 모르는 network와 연결하려고 한다면, default gateway를 지정할 수 있음: ip route add default via 192.168.2.1
다른 네트워크로 패킷 포워드 확인하는 커맨드: cat /proc/sys/net/ipv4/ip_forward (0이면 forward하지 않고, 1이면 forward 함) 하지만 이 커맨드는 영속적이지 않기 때문에 /etc/sysctl.conf에서 net.ipv4.ip_forward = 1 로 둬야 함

host name 추가

cat >> /etc/hosts
192.168.1.11 db

이제 ping db 로 ping을 날릴 수 있음
address name을 ip로 변경하는 작업은 name resolution이라고 함

name resolution server 주소 확인

cat /etc/resolv.conf
nameserver 192.168.1.100

hostname 검색 순서 변경

일반적으로는

1) local의 /etc/hosts 파일에 있는지 확인하고
2) DNS 서버에 질의를 하지만,

cat /etc/nsswitch.conf
파일을 확인했을 때
...
hosts: files dns
...
위와 같은 순서로 되어 있을 텐데, 바꿀 수 있음

name server 주소 추가

cat >> /etc/resolv.conf
nameserver 192.168.1.100
nameserver 8.8.8.8

search domain

만약 mycompany.com 외부에서 web이라는 host를 접속하려면
ping web.mycompany.com 을 하면 됨
하지만 내부적인 입장에서는 web이라는 식별자로 접근할 수 있는데,
cat >> /etc/resolv.conf

nameserver    192.168.1.100
search        mycompany.com

위와 같이 설정하면
내부장에서 ping web 이렇게 사용할 수 있음

search mycompany.com prod.mycompany.com 이렇게 검색할 수 있음

레코드 종류

A 레코드: host name과 IPv4 주소를 매핑
AAAA 레코드: host name과 IPv6 주소를 매핑
CNAME 레코드: name to name mapping

nslookup

nameserer에 query를 날림
로컬에 저장된 /etc/hosts 는 고려되지 않음

dig

name resolution 테스트를 하는 툴
nslookup보다 더 자세하게 나옴

network namespace

network namespace 내부에서는 외부의 정보를 확인할 수 없고
오로지 network namespace 내부의 정보만 볼 수 있습니다(arp table, ip table)

network namespace 생성 커맨드

ip nets add red
ip nets add blue

# 확인
ip netns

network namespace 밖에서 명령 넣기

ip netns exec red ip link
= ip -n red link
ip nets exec red arp
ip nets exec red route

network namespace 간의 연결

연결은 pipe 혹은 virtual network cable로 부를 수 있습니다.

케이블 생성: ip link add  veth-red type veth peer name veth-blue
케이블을 name space에 연결: ip link set veth-red netns red, ip link set veth-blue netns blue
ip 할당: ip -n red addr add 192.168.15.1 dev veth-red, ip -n blue addr add 192.168.15.2 dev veth-blue

ip -n red link set veth-red up
ip -n blue link set veth-blue up

ip netns exec red ping 192.168.15.2
ip netns exec red arp
ip netns exec blue arp

virtual switch

위 처럼 하면 namespace 간의 연결은 가능한데,
여러 namespace 간의 통신은 어렵습니다.
그래서 switch같은 장비가 필요한데, 여러 솔루션들이 있습니다.
예를 들어서, linux-bridge, Open vSwitch 같은 솔루션들...

linux bridge 방법을 사용해서 virtual switch를 생성하는 방법은 다음과 같습니다.

ip link add v-net-0 type bridge
ip link
ip link set dev v-net-0 up

(여기에서 예전에 생성했던 veth-red와 veth-blue 연결은 더이상 필요하지 않습니다. virtual switch를 사용할 거기 때문에..!!)
ip -n red link del veth-red

virtual switch와 각 namespace들을 연결

ip link add veth-red type veth peer name veth-red-br (br을 붙이는 게 interface를 명확하게 하기 위해서 관행임)
ip link add veth-blue type veth peer name veth-blue-br
ip link set veth-red netns red
ip link set veth-red-br master v-net-0
ip link set veth-blue netns blue
ip link set veth-blue-br master v-net-0
ip -n red addr add 192.168.15.1 dev veth-red
ip -n blue addr add 192.168.15.2 dev veth-blue
ip -n red link set veth-red up
ip -n blue link set veth-blue up

host에서 virtual switch에 접근하려면 다음과 같이 입력합니다.

ip addr add 192.168.15.5/24 dev v-net-0
ping 192.168.15.1 (이제 ping이 감)

만약 blue network namespace에서 LAN으로 요청을 하려고 하면

ip netns exec blue ping 192.168.1.3 (LAN에 있는 다른 주소) (unreachable)
ip netns exec blue route
ip netns exec blue ip route add 192.168.1.0/24 via 192.168.15.5

이렇게 설정해도 외부로 나가지 않음
왜냐하면, namespace - host network - lan - 다른 device
이렇게 통신을 할 때 host network에서 응답을 namespace로 forwarding해주지 않음
따라서 NAT 기능을 enable시켜야 함

iptables -t nat -A POSTROUTING -s 192.168.15.0/24 -j MASQUERADE

인터넷과 연결하려고 하면

ip netns exec blue ping 8.8.8.8

ip netns exec blue route
ip netns exec blue ip route add default via 192.168.15.5
ping 8.8.8.8

만약 다른 LAN 상에서 namespace로 접근하려는 경우

두 가지 옵션이 있음

1) LAN 상의 디바이스에서 routing 규칙을 추가해서, namespace로 접근하려면 LAN을 넘어서 디바이스 접근한 후, 그 디바이스의 namespace 로 접근하라고 지정
2) NAT 규칙을 설정

iptables -t nat -A PREROUTING --dport 80 --to-destination 192.168.15.2:80 -j DNAT

댓글

Designed by JB FACTORY