概要
Network Namespace は簡単に言えば仮想的なネットワークを構築していろいろ実験できる Linux の機能です
今回は Ubuntu 18.04 で使ってみました
環境
- Ubuntu 18.04
- ip command (iproute2-ss18012)
構築する環境
ルータ 1 台を挟んだ簡単な構成を構築してみます
Namespace の作成
まずは Namespace を作成します
構成図の四角の数だけ作成します
- sudo ip netns add ns1
- sudo ip netns add ns2
- sudo ip netns add router
- sudo ip netns
router
ns2
ns1
veth インタフェースの作成
Namespace に割り当てるインタフェースを作成します
- sudo ip link add ns1-veth0 type veth peer name gw-veth0
- sudo ip link add ns2-veth0 type veth peer name gw-veth1
- sudo ip link show | grep veth
4: gw-veth0@ns1-veth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
5: ns1-veth0@gw-veth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
6: gw-veth1@ns2-veth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
7: ns2-veth0@gw-veth1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
veth インタフェースを Namespace に割り当てる
作成した veth インタフェースを Namespace に割り当てます
ip link show で見えていたインタフェースがなくなり Namespace 側に移動したのが確認できます
- sudo ip link set ns1-veth0 netns ns1
- sudo ip link set gw-veth0 netns routersudo ip link set gw-veth1 netns router
- sudo ip link set ns2-veth0 netns ns2
- sudo ip netns list
router (id: 1)
ns2 (id: 2)
ns1 (id: 0)
veth インタフェースを起動する
デフォルトは DOWN なので UP にします
- sudo ip netns exec ns1 ip link set ns1-veth0 up
- sudo ip netns exec router ip link set gw-veth0 up
- sudo ip netns exec router ip link set gw-veth1 up
- sudo ip netns exec ns2 ip link set ns2-veth0 up
IP アドレスを設定する
veth それぞれに IP を設定します
ns1 - router 間 (10.0.1.0/24) と ns2 - router (192.0.1.0/24) 間は別の IP 帯にします
- sudo ip netns exec ns1 ip address add 10.0.1.2/24 dev ns1-veth0
- sudo ip netns exec router ip address add 10.0.1.254/24 dev gw-veth0
- sudo ip netns exec ns2 ip address add 192.0.1.2/24 dev ns2-veth0
- sudo ip netns exec router ip address add 192.0.1.254/24 dev gw-veth1
確認
作成した Network Namespace は以下の通りです
- sudo ip netns exec ns1 ip a show
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
5: ns1-veth0@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 86:95:57:15:b5:de brd ff:ff:ff:ff:ff:ff link-netnsid 1
inet 10.0.1.2/24 scope global ns1-veth0
valid_lft forever preferred_lft forever
inet6 fe80::8495:57ff:fe15:b5de/64 scope link
valid_lft forever preferred_lft forever
- sudo ip netns exec router ip a show
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
4: gw-veth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 9a:54:c5:a2:ca:40 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.0.1.254/24 scope global gw-veth0
valid_lft forever preferred_lft forever
inet6 fe80::9854:c5ff:fea2:ca40/64 scope link
valid_lft forever preferred_lft forever
6: gw-veth1@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 62:3a:16:3a:0a:1a brd ff:ff:ff:ff:ff:ff link-netnsid 2
inet 192.0.1.254/24 scope global gw-veth1
valid_lft forever preferred_lft forever
inet6 fe80::603a:16ff:fe3a:a1a/64 scope link
valid_lft forever preferred_lft forever
- sudo ip netns exec ns2 ip a show
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
7: ns2-veth0@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 5e:6a:72:ab:7b:dc brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.0.1.2/24 scope global ns2-veth0
valid_lft forever preferred_lft forever
inet6 fe80::5c6a:72ff:feab:7bdc/64 scope link
valid_lft forever preferred_lft forever
ns1, ns2 にルーティングを追加する
別の IP 帯に通信する際に使用するゲートウェイを設定します
これで router を介して別の IP 帯にアクセスできるようになります
- sudo ip netns exec ns1 ip route add 192.0.1.2 via 10.0.1.254
- sudo ip netns exec ns2 ip route add 10.0.1.2 via 192.0.1.254
router の ipv4.ip_forward を変更する
router にこの設定がないとパケットを転送できないので変更します
- sudo ip netns exec router sysctl net.ipv4.ip_forward=1
動作確認
ns1 - ns2 の異なる IP 帯で通信できることを確認しましょう
- sudo ip netns exec ns1 ping -c 3 192.0.1.2
PING 192.0.1.2 (192.0.1.2) 56(84) bytes of data.
64 bytes from 192.0.1.2: icmp_seq=1 ttl=63 time=0.055 ms
64 bytes from 192.0.1.2: icmp_seq=2 ttl=63 time=0.055 ms
64 bytes from 192.0.1.2: icmp_seq=3 ttl=63 time=0.073 ms
--- 192.0.1.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2056ms
rtt min/avg/max/mdev = 0.055/0.061/0.073/0.008 ms
- sudo ip netns exec ns2 ping -c 3 10.0.1.2
PING 10.0.1.2 (10.0.1.2) 56(84) bytes of data.
64 bytes from 10.0.1.2: icmp_seq=1 ttl=63 time=0.177 ms
64 bytes from 10.0.1.2: icmp_seq=2 ttl=63 time=0.057 ms
64 bytes from 10.0.1.2: icmp_seq=3 ttl=63 time=0.058 ms
--- 10.0.1.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2021ms
rtt min/avg/max/mdev = 0.057/0.097/0.177/0.056 ms
環境削除
- sudo ip netns delete ns1
- sudo ip netns delete ns2
- sudo ip netns delete router
最後に
ネットワーク機器やマシンなどもっと潤沢にもっている人は物理的に結線などして試せますがそうでない人には手軽に使える実験環境かなと思います
0 件のコメント:
コメントを投稿