Network Namespace

はじめに

この記事では書籍「Linuxで動かしながら学ぶTCP/IPネットワーク入門」の第3章Network Namespaceに関連するメモを残しておきます。Network NamespaceはLinuxカーネルの機能で、ネットワーク設定を分離して管理することができます。この機能を使って、ネットワークの勉強をしていきます。書籍全体のレビューはこちらに書いています。

環境構築

書籍では第2章で環境構築をしますが、第3章の内容のみであれば以下のように構築できます。Dockerを利用しました。

1
2
3
4
docker run --privileged -it --name tcpip ubuntu
apt-get update
apt-get -y install iproute2
apt-get -y install iputils-ping

セグメント内での通信

新しくNetwork Namespaceを作成

まずはNetwork Namespaceの一覧を確認します。結果は空です。

1
ip netns list

新しくNetwork Namespaceを作成します。

1
ip netns add helloworld

再度、一覧を確認すると、Network Namespaceが作成されたことが確認できます。

1
ip netns list

ネットワークデバイスのIPアドレスを確認

1
ip address show
1
ip netns exec helloworld ip address show

後者のコマンドの方が結果が少なく、eth0などの見慣れたインターフェイスもありません。Network Namespaceではシステムとは独立したネットワークを作ることができるのです。

ルーティングテーブルについても確認してみます。

1
ip netns exec helloworld ip route show

こちらも結果は空となります。

Network Namespaceの削除

以後はこのNetwork Namespaceは使いませんので、削除します。

1
ip netns delete helloworld

通信する

新しくNetwork Namespaceを2つ作成します。

1
2
ip netns add ns1
ip netns add ns2

通信のために、veth (仮想的なネットワークインターフェイス)を使います。まずは一覧を確認します。

1
ip link show | grep veth

vethを下記のコマンドで作成します。

1
ip link add ns1-veth0 type veth peer name ns2-veth0

確認します。

1
ip link show | grep veth

作成したvethインターフェイスのペアを、Network Namespaceで使えるようにします。まずはまだ使えないことを確認します。

1
ip netns exec ns1 ip link show | grep veth

設定します。

1
2
ip link set ns1-veth0 netns ns1
ip link set ns2-veth0 netns ns2

再度確認します。

1
ip netns exec ns1 ip link show | grep veth

vethインターフェイスにIPアドレスを割り当てる

IPを使って通信をしたいため、IPアドレスの割り当てが必要です。

1
2
ip netns exec ns1 ip address add 192.0.2.1/24 dev ns1-veth0
ip netns exec ns2 ip address add 192.0.2.2/24 dev ns2-veth0

pingを送ります。

1
ip netns exec ns1 ping -c 3 192.0.2.2 -I 192.0.2.1

どうやら設定が不十分です。ネットワークインターフェイスの状態がUPになっていないためです。

1
2
ip netns exec ns1 ip link set ns1-veth0 up
ip netns exec ns2 ip link set ns2-veth0 up

再度実行します。

1
ip netns exec ns1 ping -c 3 192.0.2.2 -I 192.0.2.1

繋がりました!

ルータの利用

Network Namespaceの再作成

新しくNetwork Namespaceを作成し直したいため、古いものを削除します。

1
2
3
4
5
ip netns delete ns1
ip netns delete ns2
ip netns add ns1
ip netns add router
ip netns add ns2

vethインターフェイスの作成

1
2
ip link add ns1-veth0 type veth peer name gw-veth0
ip link add ns2-veth0 type veth peer name gw-veth1

Network Namespaceにvethインターフェイスを割り当て

1
2
3
4
ip link set ns1-veth0 netns ns1
ip link set gw-veth0 netns router
ip link set gw-veth1 netns router
ip link set ns2-veth0 netns ns2

ネットワークインターフェイスの状態をUPに変更

1
2
3
4
ip netns exec ns1 ip link set ns1-veth0 up
ip netns exec router ip link set gw-veth0 up
ip netns exec router ip link set gw-veth1 up
ip netns exec ns2 ip link set ns2-veth0 up

IPアドレスの付与

1
2
3
4
ip netns exec ns1 ip address add 192.0.2.1/24 dev ns1-veth0
ip netns exec router ip address add 192.0.2.254/24 dev gw-veth0
ip netns exec router ip address add 198.51.100.254/24 dev gw-veth1
ip netns exec ns2 ip address add 198.51.100.1/24 dev ns2-veth0

セグメント内疎通確認

1
2
ip netns exec ns1 ping -c 3 192.0.2.254 -I 192.0.2.1
ip netns exec ns2 ping -c 3 198.51.100.254 -I 198.51.100.1

ルータ越し疎通確認

1
ip netns exec ns1 ping -c 3 198.51.100.1 -I 192.0.2.1

この時点では失敗します。

ルーティングエントリを追加

デフォルトルートをrouterに向けます。

1
2
ip netns exec ns1 ip route add default via 192.0.2.254
ip netns exec ns2 ip route add default via 198.51.100.254

ルータ越し疎通確認

1
ip netns exec ns1 ping -c 3 198.51.100.1 -I 192.0.2.1

成功です!

繋がらない場合は下記のコマンドを実行してみてください。

1
ip netns exec router sysctl net.ipv4.ip_forward=1

最後に

書籍Linuxで動かしながら学ぶTCP/IPネットワーク入門は実際にコマンドを動かしながらネットワークの仕組みを学べる優良な書籍だと思います。ぜひご覧になってみてください!

記事情報

  • 投稿日:2020年7月19日
  • 最終更新日:2020年7月21日