Docker Network를 살펴보기전에 네트워크 기본 개념인 Switching, Routing, DNS에 대해서 먼저 살펴보고, 네트워크 환경 격리를 위한 네트워크 네임스페이스와 격리된 네트워크와의 연결를 위해 브리지 네트워크에 대해서 살펴 볼 것이다.

Network Basic

 

출처 : https://circuitglobe.com/difference-between-router-and-switch.html

Switching

같은 네트워크 대역의 여러 장치들이 필요할 때 스위치를 통해 연결되어 통신 할 수 있도록 한다.

예를들면, 192.168.1.10 <-> 192.168.1.0(switch) <-> 192.168.1.11

 

참고) 네트워크 디바이스에 ip를 설정하는 방법

# eth0 네트워크 디바이스에 ip 설정
ip addr add 192.168.1.10/24 dev eth0
ip addr add 192.168.1.11/24 dev eth0
$ ip link

 

Routing

둘 이상의 다른 대역의 네트워크 간 데이터 전송을 위한 경로를 설정해 주고 데이터가 해당 경로에 따라 통신할 수 있도록 한다.

(gateway : door to the outside)

 

예를들면,

192.168.1.10 <-> 192.168.1.0(switch) <-> 192.168.1.11

                              192.168.1.1

                                 (gateway)

                                 192.168.2.1

192.168.2.10 <-> 192.168.2.0(switch) <-> 192.168.2.11

 

참고) 라우팅을 추가하는 방법

ip route add 192.168.2.0/24 via 192.168.1.1
$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.2.0    192.168.1.1     255.255.255.0   UG     0      0        0 eth0

 

Default Gateway

default는 따로 라우팅 규칙을 적용받지 않을 때 나머지 모든 ip에 대한 라우트를 처리합니다.

 

예를들면,

192.168.1.10 <-> 192.168.1.0(switch) <-> 192.168.1.11

                              192.168.1.1

                              (gateway)  -----------------------------------Internet

                              192.168.2.1

192.168.2.10 <-> 192.168.2.0(switch) <-> 192.168.2.11

 

참고) default gateway를 추가하는 방법

ip route add default via 192.168.2.1
= ip route add 0.0.0.0/0 via 192.168.2.1

$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.2.1     255.255.255.0   UG     0      0        0 eth0
192.168.1.0     192.168.2.1     255.255.255.0   UG     0      0        0 eth0
192.168.2.0     0.0.0.0         255.255.255.0   UG     0      0        0 eth0

# 일반 서버를 라우터처럼 사용할 때
cat /proc/sys/net/ipv4/ip_forward
# /etc/sysctl.conf
net.ipv4.ip_forward = 1(0 : not forward)

 

DNS

각 서버의 별칭을 /etc/hosts에 작성할 수 있지만 관리해야하는 별칭이 많아지거나 IP가 변경됬을 시에 관리해야하는 포인트가 많아 지기 때문에 한 곳에서 관리하고자하는 필요성이 제기된다. 이렇게 DNS Server가 탄생했다.

 

일반적인 사람들은 도메인 이름을 통해 온라인으로 정보에 엑세스한다. 이 도메인이름을 IP 주소로 변환해주는 것이 DNS 서버의 역할이다.

* Name Resolution : Translating Hostname to IP address

 

출처 :&amp;amp;amp;nbsp;http://dailusia.blog.fc2.com/blog-entry-362.html

 

DNS 설정

모르는 host name인 경우 DNS Server에 요청(기본 설정 : /etc/hosts가 우선순위가 높다)

리눅스의 경우 /etc/resolv.conf에 DNS 서버를 여러개 정의할 수 있다.

#/etc/resolv.conf
nameserver 192.168.1.100 8.8.8.8

Domain Names

top level domain : 웹사이트의 목적에 따라  com, .net, .edu, .org, .io 등을 사용한다.

출처 :&amp;amp;amp;nbsp;https://ko.wikipedia.org/wiki/%EB%8F%84%EB%A9%94%EC%9D%B8_%EB%84%A4%EC%9E%84

Search domain 

Organization DNS Server -> RootDNS -> .com DNS -> google DNS server

 

#/etc/resolv.conf
nameserver 192.168.1.100

# web 검색시 web.mycompany.com, web.prod.mycompany.com 이 검색됨
search mycompany.com prod.mycompany.com

 

Main Record Types

Type   example
A 주어진 호스트에 해당하는 IPv4를 알려준다. 192.168.1.1
AAAA 주어진 호스트에 해당하는 IPv6를 알려준다. 2001:0db8:85a3:0000:0000:8a2e:0370:7334
CNAME 도메인 이름의 별칭을 만드는데 사용한다. eat.web-server, hungry.web-server

 

Resolution Tool

ping, nslookup(only DNS), dig(only DNS) 

 


Network Namespaces / Bridge network

네트워크 네임스페이스는 프로세스간에 네트워크 환경을 격리할 수 있는 매우 강력한 기능을 제공한다. 

ip 명령은 네트워크 네임스페이스를 다루는 기능이 기본적으로 내장되어 있고, 네트워크 상태를 확인하고 제어하는 표준적인 명령어이다. ip 명령을 통해 네트워크 네임스페이스와 브리지 네트워크를 실습해 볼 것이다.

 

네트워크 디바이스 조회

  • ip -n {network namespace name} link
root@71bef26e2a21:/# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ipip 0.0.0.0 brd 0.0.0.0
3: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/tunnel6 :: brd ::
9: eth0@if10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0

 

네트워크 네임스페이스 관리

  • ip netns : 네트워크 네임스페이스 조회
  • ip netns add {name} : 네트워크 네임스페이스 생성
  • ip -n {network namespace} link set {vitual interface name} netns {name} : 가상 네트워크 인터페이스에 네임스페이스 지정
  • ip netns exec {name} {command} : 네임워크 네임스페이스에서 명령 실행
  • ip netns exec ip --br link : 네트워크 네임스페이스 내에 네트워크 디바이스 조회
  • ip netns exec {name} ip link set dev {device name} up : 네트워크 네임스페이스 내에 네트워크 인터페이스 실행
root@71bef26e2a21:/# ip netns add red
root@71bef26e2a21:/# ip netns add blue
root@71bef26e2a21:/# ip netns
blue
red

# 특정 네트워크 네임스페이스의 네트워크 디바이스 조희
root@71bef26e2a21:/# ip netns exec red ip --br link
lo               DOWN           00:00:00:00:00:00 <LOOPBACK> 
tunl0@NONE       DOWN           0.0.0.0 <NOARP> 
ip6tnl0@NONE     DOWN           :: <NOARP> 

# 루프백 인터페이스 실행
$ ip netns exec red ip link set dev lo up
$ ip netns exec red ip -br link

root@71bef26e2a21:/# ip netns exec red ip --br link
lo               UNKNOWN        00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP> 
tunl0@NONE       DOWN           0.0.0.0 <NOARP> 
ip6tnl0@NONE     DOWN           :: <NOARP>

 

Virtual Network Interface

  • ip link add {name1} type veth peer name {name2} : 가상 네트워크 인터페이스 생성
  • ip link del {pare 중 1개의 이름} : 하나만 삭제해도 연결된 것 같이 삭제됨.
  • ip a add xx.xx.xx.xx/xx dev {name} : 가상 네트워크 인터페이스에 ip 지정
  • = ip -n {network namespace} addr add xx.xx.xx.xx dev {name} (optional, not recommended)
  • ip -n {network namespace} link set dev {name} up : 가상 네트워크 인터페이스 실행
# veth0, veth1 (virtual interface)
$ ip link add veth0 type veth peer name veth1
$ root@71bef26e2a21:/# ip -br link
lo               UNKNOWN        00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP> 
tunl0@NONE       DOWN           0.0.0.0 <NOARP> 
ip6tnl0@NONE     DOWN           :: <NOARP> 
veth1@veth0      DOWN           0e:7d:e8:e3:60:fd <BROADCAST,MULTICAST,M-DOWN>  <----
veth0@veth1      DOWN           36:e2:ec:f0:95:23 <BROADCAST,MULTICAST,M-DOWN>  <----
eth0@if10        UP             02:42:ac:11:00:03 <BROADCAST,MULTICAST,UP,LOWER_UP>

 

실습 1. 가상 네트워크 인터페이스를 이용하여 네트워크 네임스페이스와 호스트를 연결

첫째, 기존 가상 네트워크 인터페이스(veth1)에 네트워크 네임스페이스(red) 지정을 한다.

$ ip link set veth1 netns red
root@71bef26e2a21:/# ip netns exec red ip --br link 
lo               UNKNOWN        00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP> 
tunl0@NONE       DOWN           0.0.0.0 <NOARP> 
ip6tnl0@NONE     DOWN           :: <NOARP> 
veth1@if5        DOWN           0e:7d:e8:e3:60:fd <BROADCAST,MULTICAST> <------ 네트워크 네임스페이스 virtual interface


root@71bef26e2a21:/# ip --br link
lo               UNKNOWN        00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP> 
tunl0@NONE       DOWN           0.0.0.0 <NOARP> 
ip6tnl0@NONE     DOWN           :: <NOARP> 
veth0@if4        DOWN           36:e2:ec:f0:95:23 <BROADCAST,MULTICAST> <------- 호스트 virtual interface
eth0@if10        UP             02:42:ac:11:00:03 <BROADCAST,MULTICAST,UP,LOWER_UP>

둘째, 가상 네트워크 인터페이스(veth0, veth1) IP 지정 및 Up 상태로 변경 후 ping 테스트

root@71bef26e2a21:/# ip a add 10.200.0.2/24 dev veth0
root@71bef26e2a21:/# ip netns exec red ip a add 10.200.0.3/24 dev veth1
root@71bef26e2a21:/# ip link set dev veth0 up
root@71bef26e2a21:/# ip netns exec red ip link set dev veth1 up
root@71bef26e2a21:/# ip -br link
lo               UNKNOWN        00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP> 
tunl0@NONE       DOWN           0.0.0.0 <NOARP> 
ip6tnl0@NONE     DOWN           :: <NOARP> 
veth0@if4        UP             36:e2:ec:f0:95:23 <BROADCAST,MULTICAST,UP,LOWER_UP> 
eth0@if10        UP             02:42:ac:11:00:03 <BROADCAST,MULTICAST,UP,LOWER_UP> 
root@71bef26e2a21:/# ip netns exec red ip -br link
lo               UNKNOWN        00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP> 
tunl0@NONE       DOWN           0.0.0.0 <NOARP> 
ip6tnl0@NONE     DOWN           :: <NOARP> 
veth1@if5        UP             0e:7d:e8:e3:60:fd <BROADCAST,MULTICAST,UP,LOWER_UP>


root@71bef26e2a21:/# ping 10.200.0.3
PING 10.200.0.3 (10.200.0.3) 56(84) bytes of data.
64 bytes from 10.200.0.3: icmp_seq=1 ttl=64 time=0.077 ms

root@71bef26e2a21:/# ip netns exec red ping 10.200.0.2
PING 10.200.0.2 (10.200.0.2) 56(84) bytes of data.
64 bytes from 10.200.0.2: icmp_seq=1 ttl=64 time=0.036 ms
64 bytes from 10.200.0.2: icmp_seq=2 ttl=64 time=0.057 ms

 

Virtual Network Switch(Bridge)

브리지는 데이터링크(L2) 계층의 장비로 네트워크 세그먼트를 연결해주는 역할을 한다. 브리지는 물리 장비나 소프트웨어로 구성할 수 있다. ip 명령어를 사용하면 veth 가상 인터페이스 뿐만 아니라, 가상 브리지를 만드는 것도 가능하다. 

  • ip link add {name} type bridge : 브리지 생성
  • ip link set {name} up : 브리지 실행
  • ip link set {virtual interface name} master {name} : 브리지에 가상 네트워크 인터페이스를 연결
  • ip link set dev {name} up : 가상 네트워크 인터페이스 활성화
  • ip addr add 10.201.0.1/24 brd 10.201.0.255 dev {name} : 브리지에 ip와 브로드캐스트 ip 셋업(10.201.0.0/24 IP 대역이 bridge로 연결됨)
  • ip addr add 10.201.0.1/24 dev {name} 
  • ip a show {name}

 

실습 2. 브리지를 통해 서로 다른 네트워크 네임스페이스(컨테이너)를 연결

 

첫째, 브리지 생성 및 활성화

# 브리지 생성
root@71bef26e2a21:/# ip link add br0 type bridge
root@71bef26e2a21:/# ip link set br0 up

둘째, 가상 네트워크 인터페이스 생성 및 네트워크 네임스페이스 지정

# 네트워크 네임스페이스, virtual interface 1
root@71bef26e2a21:/# ip netns add container10 
root@71bef26e2a21:/# ip link add brid10 type veth peer name veth10
root@71bef26e2a21:/# ip link set veth10 netns container10


# 네트워크 네임스페이스, virtual interface 2
root@71bef26e2a21:/# ip netns add container11
root@71bef26e2a21:/# ip link add brid11 type veth peer name veth11
root@71bef26e2a21:/# ip link set veth11 netns container11

셋째, 가상 네트워크 인터페이스 ip 할당 및 활성화

# 네트워크 네임스페이스, IP 할당 및 실행
root@71bef26e2a21:/# ip netns exec container10 ip a add 10.201.0.4/24 dev veth10
root@71bef26e2a21:/# ip netns exec container10 ip link set dev veth10 up

root@71bef26e2a21:/# ip netns exec container11 ip a add 10.201.0.5/24 dev veth11
root@71bef26e2a21:/# ip netns exec container11 ip link set dev veth11 up

넷째, 가상 네트워크 인터페이스를 브리지에 연결 및 활성화

# virtual interface를 브리지에 연결 1
root@71bef26e2a21:/# ip link set brid10 master br0
root@71bef26e2a21:/# ip link set dev brid10 up

# virtual interface를 브리지에 연결 2
root@71bef26e2a21:/# ip link set brid11 master br0
root@71bef26e2a21:/# ip link set dev brid11 up

다섯째, ping 테스트

# 테스트
root@71bef26e2a21:/# ip netns exec container10 ping 10.201.0.5
PING 10.201.0.5 (10.201.0.5) 56(84) bytes of data.
64 bytes from 10.201.0.5: icmp_seq=1 ttl=64 time=0.142 ms

root@71bef26e2a21:/# ip netns exec container11 ping 10.201.0.4
PING 10.201.0.4 (10.201.0.4) 56(84) bytes of data.
64 bytes from 10.201.0.4: icmp_seq=1 ttl=64 time=0.260 ms

 

실습 3. 호스트와 네임스페이스를 연결하고 인터넷과 DNS를 사용할 수 있도록 셋업

호스트에서는 위의 container10과 container11 네임스페이스와 연결되어 있지 않기 때문에 통신을 할 수가 없는 상태이다. 

root@71bef26e2a21:/# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         172.17.0.1      0.0.0.0         UG    0      0        0 eth0
10.200.0.0      0.0.0.0         255.255.255.0   U     0      0        0 veth0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 eth0

 

첫째, 브리지(br0)에 ip와 브로드캐스트 ip를 셋업하자.(10.201.0.0/24 IP 대역이 br0로 연결됨)

root@71bef26e2a21:/# ip addr add 10.201.0.1/24 brd 10.201.0.255 dev br0
root@71bef26e2a21:/# ip a show br0
6: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 62:92:6c:c8:b5:28 brd ff:ff:ff:ff:ff:ff
    inet 10.201.0.1/24 brd 10.201.0.255 scope global br0
       valid_lft forever preferred_lft forever
       
       
root@71bef26e2a21:/# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         172.17.0.1      0.0.0.0         UG    0      0        0 eth0
10.200.0.0      0.0.0.0         255.255.255.0   U     0      0        0 veth0
10.201.0.0      0.0.0.0         255.255.255.0   U     0      0        0 br0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 eth0

root@71bef26e2a21:/# ping 10.201.0.4
PING 10.201.0.4 (10.201.0.4) 56(84) bytes of data.
64 bytes from 10.201.0.4: icmp_seq=1 ttl=64 time=0.072 ms

 

둘째, 네트워크 네임스페이스에서 인터넷을 사용할 수 있도록 default, NAT, DNS 셋업

  • ip route add default via xx.xx.xx.xx
  • /etc/netns/{namespace name}/resolv.conf : DNS 서버 지정
root@71bef26e2a21:/# ip netns exec container10 ip route add default via 10.201.0.1
root@71bef26e2a21:/# ip netns exec container11 ip route add default via 10.201.0.1
root@71bef26e2a21:/# ip netns exec container10 route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         10.201.0.1      0.0.0.0         UG    0      0        0 veth10
10.201.0.0      0.0.0.0         255.255.255.0   U     0      0        0 veth10

# NAT 셋업 - linux IP 포워드 기능 활성화
$ sysctl -w net.ipv4.ip_forward=1
$ iptables -t nat -A POSTROUTING -s 10.201.0.0/24 -j MASQUERADE

root@71bef26e2a21:/# ip netns exec container10 ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=36 time=92.6 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=36 time=86.7 ms

# DNS 셋업 - 네트워크 네임스페이스 도메인 요청
root@71bef26e2a21:/# mkdir -p /etc/netns/container10/
root@71bef26e2a21:/# echo 'nameserver 8.8.8.8' > /etc/netns/container10/resolv.conf
root@71bef26e2a21:/# ip netns exec container10 curl www.naver.com
<html>
<head><title>302 Found</title></head>
<body>
<center><h1>302 Found</h1></center>
<hr><center> NWS </center>
</body>
</html>
root@71bef26e2a21:/# ip netns exec container10 curl google.com   
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>

 

실습 4. 네트워크 인터페이스에서 인터넷에 연결된 호스트를 통해 다른 네트워크로 통신할 수 있도록 셋업

호스트를 게이트웨이로 활용(192.168.15.2 &amp;gt; 192.168.1.3)

첫째, 네트워크 네임스페이스 셋업

$ ip netns exec {network_namespace} ip route add 192.168.1.0/24 via 192.168.15.5(bridge network ip address)

둘째, 인터넷 접근을 위한 네트워크 네임스페이스 default 셋업

# 인터넷 접근 from internal network
ip netns exec {network_namespace} ip route add default via 192.168.15.5
ip netns exec {network_namespace} ping 8.8.8.8

셋째, NAT 설정

# packet의 source(출처) 정보를 게이트웨이로 변경하는 작업이 필요함. 그래야 외부입장에서는 게이트웨이에서 보낸 것으로 간주하고
# 통신이 가능하게된다.
iptables -t nat -A POSTROUTING -s 192.168.15.0/24 -j MASQUERADE

넷째, 테스트

ip netns exec {network_namespace} ping 192.168.1.3

 

실습 5. 외부 네트워크에서 Virtual network interface 로의 접근

- 첫번째 방법. 위의 방법과 동일하게 호스트를 게이트웨이로 사용한다.

- 두번째 방법. 호스트에 포워딩 룰을 추가한다

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

 

참고

1. While testing the Network Namespaces, if you come across issues where you can't ping one namespace from the other, make sure you set the NETMASK while setting IP Address. ie: 192.168.1.10/24

 

첫째, ip -n red addr add 192.168.1.10/24 dev veth-red

 

둘째, Another thing to check is FirewallD/IP Table rules. Either add rules to IP Tables to allow traffic from one namespace to another. Or disable IP Tables all together (Only in a learning environment).

 

2. Common command

- arp

- netstat -plnt

 


Docker Networking

도커 네트워크 종류

- None

- Host network : docker container isolation 적용 안됨. docker container 끼리 같은 포트를 사용할 수 없음

- Bridge(default) : internal private network

pi@master:~ $ sudo docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
dd74c3b7034f   bridge    bridge    local
87b3579ecb45   host      host      local
ae52f9cf2344   none      null      local

 

Docker0

Linux는 Docker를 설치하면 서버의 물리 NIC(Network Interface Card)가 docker0이라는 가상 브리지 네트워크로 연결된다. 이 docker0은 Docker를 실행시킨 후에 디폴트로 만들어진다. 앞서 배웠던 네임스페이스 개념이 각 컨테이너에게 적용되고, Bridge와 연결 또한 그렇다.

Docker 컨테이너가 실행되면 컨테이너에 172.17.0.0/16 이라는 서브넷 마스크를 가진 프라이빗 IP주소가 eth0으로 자동으로 할당된다. 이 가상 NIC는 OSI 참조 모델의 레이어 2인 가상 네트워크 인터페이스로, 페어인 NIC와 터널링 통신을 한다.

https://jonnung.dev/images/docker_network.png - veth(가상 NIC)

 

NAPT(Network Address Port Translation)

Docker 컨테이너와 외부 네트워크가 통신을 할 때는 가상 브리지 docker0과 호스트 OS의 물리 NIC에서 패킷을 전송하는 장치가 필요하다. Docker에서는 NAPT 기능을 사용하여 연결한다.

NAPT(Network Address Port Translation)란 하나의 IP 주소를 여러 컴퓨터가 공유하는 기술로, IP 주소와 포트 번호를 변환하는 기능이다. 프라이빗 IP 주소와 글로벌 IP 주소를 투과적으로 상호 변환하는 기술로, TCP/IP의 포트 번호까지 동적으로 변환하기 때문에 하나의 글로벌 IP 주소로 여러 대의 머신이 동시에 연결할 수 있다. Docker에서는 NAPT에 Linux의 iptables를 사용하고 있다.

 

예를들면, 컨테이너 시작 시에 컨테이너 안의 웹 서버가 사용하는 80번 포트를 호스트 OS의 8080번 포트로 전송하도록 설정한다. 그러면 외부 네트워크에서 호스트 OS의 8080번 포트에 엑세스하면 컨테이너 안의 80번 포트로 연결된다.

(docker0과 물리 NIC 사이에서 컨테이너의 포트와 호스트 OS 포트를 IP 마스커레이드(NAPT)를 사용하여 변환하고 있다.)

iptables \
–t nat \
-A DOCKER \
-j DNAT \
--dport 8080 \
--to-destination 172.17.0.3:80

 

참고

NAT와 IP 마스커레이드의 차이

프라이빗 IP 주소와 글로벌 IP 주소를 변환하여 프라이빗 IP 주소가 할당된 컴퓨터에 대해 인터넷 엑세스를 가능하게 할때 사용하는 기술로는 NAT과 NAPT(IP 마스커레이드)가 있다.

 

- NAT(Network Address Translation)

프라이빗 IP 주소가 할당된 클라이언트가 인터넷상에 있는 서버에 엑세스할 때 NAT 라우터는 클라이언트의 프라이빗 IP 주소를 NAT가 갖고 있는 글로벌 IP 주소로 변환하여 요청을 송신한다. 응답은 NAT 라우터가 송신처를 클라이언트의 프라이빗 IP 주소로 변환하여 송신한다.

이러한 주소 변환에 의해 프라이빗 네트워크상의 컴퓨터와 인터넷상의 서버 간의 통신이 성립된다. 그런데 NAT의 경우 글로벌 IP 주소와 프라이빗 IP 주소를 1:1로 변환하기 때문에 동시에 여러 클라이언트가 엑세스할 수가 없다.

 

- NAPT(Network Address Port Translation)

NAPT는 프라이빗 IP 주소와 함께 포트 번호도 같이 변환하는 기술이다. 프라이빗 IP 주소를 글로벌 IP 주소로 변환할 때 프라이빗 IP 주소별로 서로 다른 포트 번호로 변환한다. NAPT는 포트 번호를 바탕으로 프라이빗 IP 주소로 변환할 수 있다. 이로써 하나의 글로벌 IP 주소와 여러 개의 프라이빗 IP 주소를 변환할 수 있는 것이다.

Linux에서 NAPT를 구축하는 것을 IP 마스커레이드라고 부른다.

 

 

Container Network Interface(CNI)

Network Namespaces, Docker ... 모두 비슷하게 브리지 네트워크 구성을 함. 그러므로 CNI 표준이 등장.

- docker does not implement CNI. Docker has its own set of standards known as CNM

- 쿠버네티스에서 docker container를 생성할 때 none 네트워크로 실행하고, 나머지 설정은 CNI plugins에게 맡긴다.

 

* 브리지 네트워크 셋업 절차

1. Create Network Namespace

2. Create Bridge Network/Interface

3. Create VETH Pairs(Pipe, Virtual Cable)

4. Attach vEth to Namespace

5. Attach Other vEth to Bridge

6. Assign IP Addr

7. Bring the tinerfaces up

8. Enable NAT - IP Masquerade

 


출처

- [책] 완벽한 IT 인프라 구축을 위한 Docker 2판

- 네트워크 네임스페이스와 브리지 네트워크 : https://www.44bits.io/ko/post/container-network-2-ip-command-and-network-namespace

+ Recent posts