๋ชฉ์ฐจ
ย Network Namespace
์ปจํ
์ด๋๋ โ๋คํธ์ํฌ๊น์งโ ๊ฒฉ๋ฆฌ๋์ด์ผ ํ๋ค. ํธ์คํธ๊ฐ ๊ฐ์ง eth0, ๋ผ์ฐํ
ํ
์ด๋ธ, ARP ํ
์ด๋ธ์ ์ปจํ
์ด๋๊ฐ ๊ทธ๋๋ก ๋ณด๋ฉด ์ฌ์ค์ ๊ฐ์ ๋คํธ์ํฌ์ ์๋ ๊ฑฐ๋ผ ๊ฒฉ๋ฆฌ๊ฐ ์๋๋ค.
๊ทธ๋์ Linux๋ Network Namespace๋ผ๋ โ๋คํธ์ํฌ ์ ์ฉ ๋ฐฉโ์ ์ ๊ณตํ๋ค.
์ปจํ
์ด๋(Docker)๋ ์ด๊ฑธ ์ด์ฉํด์ ๊ฐ ์ปจํ
์ด๋๊ฐ ์๊ธฐ๋ง์ ์ธํฐํ์ด์ค/๋ผ์ฐํ
/ARP ํ
์ด๋ธ์ ๊ฐ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ฒ ๋ง๋ ๋ค.
Network in Namespace
ํธ์คํธ์์ ip link๋ฅผ ์คํํ๋ฉด ์ผ๋ฐ์ ์ผ๋ก lo, eth0๋ฅผ ํ์ธํ ์ ์๋ค. ํ์ง๋ง ๋ค์์คํ์ด์ค๋ฅผ ๋ง๋ค๋ฉด, ๊ทธ ์์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก lo๋ง ๋ณด์ด๋ ์ํ๋ก ์์ํ๋ค.
ย ๋ค์์คํ์ด์ค ์์ฑ
์ปจํ
์ด๋์๋ Linux ํธ์คํธ์ ์ Network Namespace๋ฅผ ์์ฑํ๋ ์์ฒด ์ธํฐํ์ด์ค๊ฐ ์์ผ๋ฉฐ ip netns add ... ๋ช
๋ น์ ์ฌ์ฉํ ์ ์๋ค.
$ ip netns add red
$ ip netns add blue
$ ip netns
red
blue
Bash
๋ณต์ฌ
ํธ์คํธ์์ ip link๋ฅผ ํตํด ์ธํฐํ์ด์ค๋ฅผ ํ์ธํ๋ ๊ฒ์ฒ๋ผ ์์ฑํ ๋ค์์คํ์ด์ค์ ์ธํฐํ์ด์ค๋ฅผ ํ์ธ ํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค:
ip netns exec red ip link
ip -n red link
Bash
๋ณต์ฌ
๋ ๋ช
๋ น์ด๋ ๋์ผํ ๋ช
๋ น์ด์ด๋ค. ์ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด eth0์ด ๋ณด์ด์ง ์๋๋ฐ, ๋ค์์คํ์ด์ค๋ ํธ์คํธ์ ๋คํธ์ํฌ๋ฅผ โ๋ณด์ง ๋ชปํ๊ฒโ ๋ง๋ ์ํ๋ก ์์ํ๋ค. ์ด๋ arp table๊ณผ routing table๋ ๋ง์ฐฌ๊ฐ์ง๋ค.
ย veth pair
๋ค์์คํ์ด์ค๋ผ๋ฆฌ ํต์ ์ ์ํค๋ ค๋ฉด ์ธํฐํ์ด์ค๊ฐ ํ์ํ๋ค. ๋ฌผ๋ฆฌ ์ธ๊ณ์์ ์ปดํจํฐ 2๋๋ฅผ ์ผ์ด๋ธ๋ก ์ฐ๊ฒฐํ๋ฏ, Linux์์๋ veth pair(๊ฐ์ ์ผ์ด๋ธ)๋ฅผ ์ฌ์ฉํ๋ค.
โข
veth๋ ํญ์ ์์ผ๋ก ์๊ธด๋ค.
โข
ํ์ชฝ ๋์ red, ๋ค๋ฅธ์ชฝ ๊ธ์ blue ๋ค์์คํ์ด์ค์ ๋ฃ์ผ๋ฉด โ์ง๊ฒฐโ๋๋ค.
1.
veth pair ์์ฑ
ip link add veth-red type veth peer name veth-blue
Bash
๋ณต์ฌ
2.
๊ฐ๊ฐ ๋ค์์คํ์ด์ค์ ๋ฃ๊ธฐ
ip link set veth-red netns red
ip link set veth-blue netns blue
Bash
๋ณต์ฌ
3.
ip ํ ๋น + UP
ip -n red addr add 192.168.5.1/24 dev veth-red
ip -n blue addr add 192.168.5.2/24 dev veth-blue
ip -n red link set veth-red up
ip -n blue link set veth-blue up
Bash
๋ณต์ฌ
4.
ํต์ ํ์ธ
ip netns exec red ping 192.168.15.2
ip netns exec red arp
ip netns exec blue arp
Bash
๋ณต์ฌ
โข
red/blue ๋ค์์คํ์ด์ค์ ARP ํ
์ด๋ธ์ ์๋ก๊ฐ ์กํ๋ค
โข
ํธ์คํธ์ ARP ํ
์ด๋ธ์ ์ด ๋ค์์คํ์ด์ค ๋คํธ์ํฌ๋ฅผ ๋ชจ๋ฅธ๋ค
ย ๊ฐ์ ์ค์์น
๋ค์์คํ์ด์ค๊ฐ 2๊ฐ๋ฉด ์ง๊ฒฐ(veth pair)๋ก๋ ๋๋๋ฐ, ๊ทธ ์ด์์ด๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น?
ํ์ค์์ PC ์ฌ๋ฌ ๋๋ฅผ ์ค์์น์ ๋ฌผ๋ฆฌ๋ฏ ํธ์คํธ ์์ ๊ฐ์ ์ค์์น๋ฅผ ๋ง๋ค๊ณ ๋ค์์คํ์ด์ค๋ค์ ์ฌ๊ธฐ์ ๋ถ์ธ๋ค.
๋ฆฌ๋
์ค์์๋ ๋ํ์ ์ผ๋ก
โข
Linux Bridge
โข
Open vSwitch
๊ฐ ์๋ค.
Linux Bridge
Bridge๋ ๋ค์์คํ์ด์ค์๊ฒ ์ค์์น์ง๋ง, ํธ์คํธ ์
์ฅ์์๋ ๊ทธ๋ฅ ์ธํฐํ์ด์ค ํ๋๋ค.
1.
Bridge ์์ฑ + UP
ip link add v-net-0 type bridge
ip link set dev v-net-0 up
Bash
๋ณต์ฌ
2.
๊ธฐ์กด veth pair ์ญ์ (์กด์ฌํ ๊ฒฝ์ฐ)
red, blue๋ฅผ bridge ๋คํธ์ํฌ์ ์ฐ๊ฒฐํ ๊ฒ์ด๋ฏ๋ก ์ญ์ ํ๋ค.
ip link delete veth-red
Bash
๋ณต์ฌ
veth pair๋ ์์ผ๋ก ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ํ ์ชฝ๋ง ์ญ์ ํ๋ฉด ๋ค๋ฅธ ํ ์ชฝ์ ์๋์ผ๋ก ์ญ์ ๋๋ค.
3.
veth pair ์์ฑ
์ด์ ๊ฐ ๋ค์์คํ์ด์ค๋ง๋ค โBridge๋ก ๊ฐ๋ ์ผ์ด๋ธ(veth pair)๊ฐ ํ์ํ๋ค.
โข
Namespace ์ชฝ: veth-red
โข
Bridge ์ชฝ: veth-red-br
ip link add veth-red type veth peer name veth-red-br
ip link add veth-blue type veth peer name veth-blue-br
Bash
๋ณต์ฌ
4.
bridge ์ฐ๊ฒฐ
๋ค์์คํ์ด์ค ์ชฝ์ netns๋ก, ๋ธ๋ฆฌ์ง ์ชฝ์ ๋ธ๋ฆฌ์ง์ ์ฐ๊ฒฐํ๋ค.
ip link set veth-red netns red
ip link set veth-blue netns blue
ip link set veth-red-br master v-net-0
ip link set veth-blue-br master v-net-0
Bash
๋ณต์ฌ
5.
๋ค์์คํ์ด์ค ๋ด๋ถ IP ์ค์ + UP
ip -n red addr add 192.168.15.1/24 dev veth-red
ip -n blue addr add 192.168.15.2/24 dev veth-blue
ip -n red link set veth-red up
ip -n blue link set veth-blue up
Bash
๋ณต์ฌ
์ด์ ๋ค์์คํ์ด์ค๋ค์ ๊ฐ์ ๋ด๋ถ ์ค์์น(v-net-0)์ ๋ถ์ด์ ์๋ก ํต์ ํ๋ค.
ย host
namespace ํต์
Bridge(v-net-0)๋ ํธ์คํธ ์
์ฅ์์ ์ธํฐํ์ด์ค๋ค. ํธ์คํธ๋ ๊ฐ์ ๋์ญ IP๋ฅผ ํ ๋นํ๋ฉด ๋ค์์คํ์ด์ค๋ก ์ง์ ํ์ด ๊ฐ๋ค.
$ ping 192.168.15.1
Not Reachable!
$ ip addr add 192.168.15.5/24 dev v-net-0
$ ping 192.168.15.1
PING 192.168.15.1 ...
Bash
๋ณต์ฌ
ย LAN
๋ค์์คํ์ด์ค์์ ๋ฐ(LAN)์ผ๋ก ๋๊ฐ๋ ๊ฒ์ ํ์ค ๋คํธ์ํฌ์ ๋๊ฐ๋ค.
โข
๋ค์์คํ์ด์ค ๋ด๋ถ๋ง: 192.168.15.0/24
โข
ํธ์คํธ์ ์ธ๋ถ LAN: 192.168.1.0/24
โข
ํธ์คํธ๋ ์์ชฝ์ ๋ฐ์ด ๊ฑธ์ณ ์์
โฆ
v-net-0 = 192.168.15.5
โฆ
eth0 = 192.168.1.2
๋ค์์คํ์ด์ค์์ 192.168.1.3 ๊ฐ์ LAN ํธ์คํธ๋ก pingํ๋ฉด:
โข
๋ค๋ฅธ ๋คํธ์ํฌ๋๊น ๊ฒ์ดํธ์จ์ด(route)๊ฐ ํ์ํจ
1.
๋ค์์คํ์ด์ค ๋ผ์ฐํ
์ถ๊ฐ
ip netns exec blue ip route add 192.168.1.0/24 via 192.168.15.5
Bash
๋ณต์ฌ
ping์ ๋ ๋ฆฌ๋ฉด network unreachable์ ๋จ์ง ์์ง๋ง, ์๋ต์ด ์ค์ง ์์ ์ ์๋ค. LAN ์
์ฅ์์๋ 192.168.15.x๋ฅผ ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ๋๋์๊ฐ ๊ธธ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ NAT๊ฐ ํ์ํ๋ค
2.
NAT ๊ธฐ๋ฅ ์ถ๊ฐ
iptables๋ฅผ ์ฌ์ฉํ์ฌ ์ด ์์
์ ์ํํด์ผ ํ๋ค. postrouting chain์ NAT IP ํ
์ด๋ธ์ ์ ๊ท์น์ ์ถ๊ฐํ์ฌ ์์ค ๋คํธ์ํฌ์์ ์ค๋ ๋ชจ๋ ํจํท์ ๋ฐ์ ์ฃผ์๋ฅผ ๋์ฒดํ๋ค.
โ ๋ค์์คํ์ด์ค ๋ด๋ถ๋ง์ด ๋ฐ์ผ๋ก ๋๊ฐ ๋ ํธ์คํธ IP๋ก ๋ณ์ฅ์ํจ๋ค
iptables -t nat -A POSTROUTING -s 192.168.15.0/24 -j MASQUERADE
Bash
๋ณต์ฌ
ย ์ธํฐ๋ท ์ฐ๊ฒฐ
LAN ๋์ญ ๋ง๊ณ โ๋ชจ๋ ์ธ๋ถโ๋ก ๋๊ฐ๋ ค๋ฉด ๊ธฐ๋ณธ ๊ฒ์ดํธ์จ์ด๋ฅผ ์ก์์ผ ํ๋ค.
ip netns exec blue ip route add default via 192.168.15.5
Bash
๋ณต์ฌ
๋ค์์คํ์ด์ค๋ ํธ์คํธ๊ฐ ๊ฐ ์ ์๋ ๊ณณ์ ๋ค ๊ฐ์ด ๊ฐ ์ ์๋ ํํ๊ฐ ๋๋ค. ์ด๋ ํธ์คํธ๋ ๊ฒ์ดํธ์จ์ด ์ญํ ์ ํ๋ค.
ย ์ธ๋ถ์์์ ์ ๊ทผ
๋ค์์คํ์ด์ค๋ ๋ด๋ถ ์ฌ์ค๋ง์ ์์ผ๋ ๋ค๋ฅธ LAN ํธ์คํธ๋ ์๋ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ๋ค
1.
๋ค๋ฅธ ํธ์คํธ์๊ฒ ๋ด๋ถ๋ง ์๋ ค์ฃผ๊ธฐ
๋ค๋ฅธ LAN ํธ์คํธ(์: 192.168.1.3)๊ฐ 192.168.15.0/24๋ก ๊ฐ๋ ๊ธธ์ 192.168.1.2(ํธ์คํธ)๋ผ๊ณ ๋ผ์ฐํ
์ ์ถ๊ฐํ๋ ๋ฐฉ์์ด๋ค.
โ ํ์ค์ ์ผ๋ก ๊ด๋ฆฌ ๋ถ๋ด ๋ฐ ๋ณด์ ์ด์๋ก ์ธํด ๊ถ์ฅ๋์ง ์๋๋ค
2.
ํฌํธ ํฌ์๋ฉ์ผ๋ก ์๋น์ค๋ง ๋
ธ์ถ
์: blue ๋ค์์คํ์ด์ค๊ฐ 192.168.15.2:80์์ ์น ์๋น์ค๋ฅผ ๋์ด๋ค๋ฉด
ํธ์คํธ์ :80์ผ๋ก ๋ค์ด์ค๋ ํธ๋ํฝ์ blue๋ก ์ ๋ฌ:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 \
-j DNAT --to-destination 192.168.15.2:80
Bash
๋ณต์ฌ
๋ณดํต ์ด ๋ฐฉ์์ด โ์ปจํ
์ด๋ ํฌํธ ๋
ธ์ถโ๊ณผ ๊ฐ์ ๋ชจ๋ธ๋ก ์ด์ด์ง๋ค.
์ด์ ๊ฒ์๋ฌผ
๋ค์ ๊ฒ์๋ฌผ

