2021年5月10日月曜日

Network Namespace 超入門

Network Namespace 超入門

概要

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 件のコメント:

コメントを投稿