こんちはー。
今回はNetworkに関する記事です。今回はNamespaceについて理解をしてみようというものになります。
幸いにもうちではラズベリーパイが絶賛稼働中です。こちらのラズベリーパイを思いっきり使わないなんてもったいないので、今回はラズベリーパイを動かしながらName Spaceとはなんぞやという事を理解したいと思います。
ちなみにラズベリーパイの初期設定は以下の二つの記事を参考にしていただければと思います。
一つ目
二つ目
Networkの分野はコマンドを使って作業することが多いのですが、コマンドだけなのでもちろん文字ばかりです。そうなるとどんな構成なのかどういう動きをしているかなどをイメージすることが難しいです。個人的にはそこがNetworkで一番難しいかと思います。なので今回は画像も併用して説明していこうと思います。
さて、では早速Namespaceを動かしていきましょう。
Network Namespaceとは
Network Namespaceとはネットワーク的にはシステムから独立した領域を実現する機能です。つまりパソコンの中に新たにパソコンを作るようなもので、その作られた領域は母体のパソコンとは独立してパソコンの中に存在します。これはDockerなどのコンテナ型仮想化技術を構成する要素の一つです。(Dockerの意味が分からなければここは無視してもらって大丈夫です。)
【実践】Namespaceを作って、構成要素を確認する
Namespaceの作成
まず、2つのNamespaseを作成してみます。以下のコマンドをラズベリーパイで実行してみましょう。
「ip netns add」はNamespaseを追加するコマンドです。今回はnamespase1とnamespase2という名前の2つのNamespaseを作成しました。(情弱野郎なのでnamespaceとするところをnamespaseと間違えて名前を付けてます。)
$ sudo ip netns add namespase1
$ sudo ip netns add namespase2
この段階では以下のような状態です。

2つのNamespaceを繋ぐ
インターフェースの作成
作成したnamespase1とnamespase2を繋ぎます。この二つのNamespaceを接続するためにインターフェースを用意します。接続部分ですね。veth(Virtual Ethernet Device)という仮想的なネットワークインターフェースを使用します。
以下のコマンドでインターフェースが作られます。ns1-veth0とns2-veth0はインターフェースの名前です。
$ sudo ip link add ns1-veth0 type veth peer name ns2-veth0
作成したインターフェースは「ip link show」で確認できます。(以下の例ではgrepで文字列を絞り込んでいます。)
$ ip link show | grep veth0
4: ns2-veth0@ns1-veth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
5: ns1-veth0@ns2-veth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
作成したインターフェースをNamespace内に所属させる(Namespace同士を接続する)
まだ作成したインターフェースはNamespace内にありません。なので作成したインターフェースをNamespace内に所属させます。以下の2つのコマンドを実行します。
$ sudo ip link set ns1-veth0 netns namespase1
$ sudo ip link set ns2-veth0 netns namespase2
これでインターフェースはNamespaceに移動し、さらにNetwork Namespace同士が各Namespaceに配置されたvethインターフェースを介してつながりました。
ここまでで以下の状態になりました。

確認は以下のようにします。namespase1のNamespaceにns1-veth0が追加されているのがわかります。
$ sudo ip netns exec namespase1 ip link show | grep veth0
5: ns1-veth0@if4: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
インターフェースにIPアドレスを割り当てる
IPアドレスが付与されて初めてお互いのNamespaceのインターフェース同士が通信できるようになります。
以下のコマンドでns1-veth0には192.0.5.1というIPアドレスが割り当てられ、ns2-veth0には192.0.5.2というIPアドレスが割り当てられます。
$ sudo ip netns exec namespase1 ip address add 192.0.5.1/24 dev ns1-veth0
$ sudo ip netns exec namespase2 ip address add 192.0.5.2/24 dev ns2-veth0
今の状態は以下の様。

インターフェースを起動させる
namespase1のNamespaceにns1-veth0が追加されているのを確認するときに以下のような「sudo ip netns exec namespase1 ip link show | grep veth0」というコマンドを実行して以下のような結果が出てきました。
$ sudo ip netns exec namespase1 ip link show | grep veth0
5: ns1-veth0@if4: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
ここでstateが「DOWN」になっているのが確認できるでしょうか。
実はインターフェースは「DOWN」だと無効の状態を表します。ここで「DOWN」を「UP」にすることでインターフェースを有効の状態にして使えるようにする必要があります。
以下のコマンドを実行しましょう
$ sudo ip netns exec namespase1 ip link set ns1-veth0 up
$ sudo ip netns exec namespase2 ip link set ns2-veth0 up
namespase1の方を確認してみましょう。UPになってますね(以下)
$ sudo ip netns exec namespase1 ip link show | grep veth0
5: ns1-veth0@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
それではnamespase1からnamespase2への疎通確認をしてみましょう。疎通確認にはpingというこまんどを使います。
以下のコマンドを打ってみてください。以下のように応答が返ってくれば成功です。
$ sudo ip netns exec namespase1 ping -c 3 192.0.5.2
PING 192.0.5.2 (192.0.5.2) 56(84) bytes of data.
64 bytes from 192.0.5.2: icmp_seq=1 ttl=64 time=0.236 ms
64 bytes from 192.0.5.2: icmp_seq=2 ttl=64 time=0.092 ms
64 bytes from 192.0.5.2: icmp_seq=3 ttl=64 time=0.080 ms
--- 192.0.5.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 71ms
rtt min/avg/max/mdev = 0.080/0.136/0.236/0.070 ms
これは以下のようなことをしています。

以上でNetwork Namespaceの構築をしながらNetwork Namespaceとは何ぞやという事を見てきました。
今後はこのNamespaceで遊んでいろんなことができたら、いろんなことが学べたらいいなと思っています。
今回は以上です。ありがとうございました。