hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

ip netnsコマンドの使い方(ネットワークの実験の幅が広がるなぁ~)



1 ip netnsコマンドとは?

ネットワークネームスペース(以降、ネームスペースと略)を操作するコマンドです。netnsはipコマンドのOBJECTの1つです。1つの仮想マシンの中で、ホストーブリッジーホストといった環境を構築することができます。

IP(8)                                                   Linux                                                   IP(8)

NAME
       ip - show / manipulate routing, devices, policy routing and tunnels

SYNOPSIS
       ip [ OPTIONS ] OBJECT { COMMAND | help }

       ip [ -force ] -batch filename

       OBJECT := { link | address | addrlabel | route | rule | neigh | ntable | tunnel | tuntap | maddress | mroute |
               mrule | monitor | xfrm | netns | l2tp | tcp_metrics | token | macsec }
-snip-

2 検証環境

CentOS版数は以下のとおりです。

[root@server ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

カーネル版数は以下のとおりです。

[root@server ~]# uname -r
3.10.0-1160.el7.x86_64

3 オプション一覧

[root@server ~]# ip netns help
Usage: ip netns list
       ip netns add NAME
       ip netns set NAME NETNSID
       ip [-all] netns delete [NAME]
       ip netns identify [PID]
       ip netns pids NAME
       ip [-all] netns exec [NAME] cmd ...
       ip netns monitor
       ip netns list-id

4 ネームスペースを表示する方法(list)

listはネームスペースを表示するオプションです。まだネームスペースが登録されていないので、何も表示されていません。

[root@server ~]# ip netns list
[root@server ~]#

5 ネームスペースを追加する方法(add)

addはネームスペースを追加するオプションです。

host1という名前のネームスペースを追加してみます。

[root@server ~]# ip netns add host1

ネームスペースを確認します。host1が追加されたことがわかります。

[root@server ~]# ip netns list
host1

次に、host2という名前のネームスペースを追加します。

[root@server ~]# ip netns add host2

ネームスペースを確認します。host2が追加されたことがわかります。

[root@server ~]# ip netns list
host2
host1

6 ネームスペースを削除する方法

6.1 個別に削除する方法(delete)

ネームスペースを確認します。host1,host2が存在することがわかります。

[root@server ~]# ip netns list
host2
host1

host1を削除します。

[root@server ~]# ip netns delete host1

ネームスペースを確認します。host1が削除されたことがわかります。

[root@server ~]# ip netns list
host2

次に、host2も削除します。

[root@server ~]# ip netns delete host2

ネームスペースを確認します。host2も削除されたことがわかります。

[root@server ~]# ip netns list
[root@server ~]#

6.2 一括削除する方法(-all)

ネームスペースを確認します。host1,host2が存在することがわかります。

[root@server ~]# ip netns list
host2
host1

存在するネームスペースを一括で削除します。

[root@server ~]# ip -all netns del

ネームスペースを確認します。host1,host2が削除されたことがわかります。

[root@server ~]# ip netns list
[root@server ~]#

7 ネームスペースの追加/削除をモニタする方法(monitor)

monitorオプションを使うと、ネームスペースに対する操作をモニタすることができます。ターミナル1で操作をモニタします。ターミナル2でネームスペースに対して操作をします

ターミナル1でmonitorオプションを実行します。

[root@server ~]# ip netns monitor

ターミナル2でネームスペース(host1)を追加します。

[root@server ~]# ip netns add host1

ターミナル1のモニターに"add host1"が表示され、ネームスペースが追加されたことがわかります。

[root@server ~]# ip netns monitor
add host1

ターミナル2でネームスペース(host1)を削除します。

[root@server ~]# ip netns delete host1

ターミナル1のモニターに"delete host1"が表示され、ネームスペースが削除されたことがわかります。

[root@server ~]# ip netns monitor
add host1
delete host1

8 指定したネームスペースでコマンドを実行する方法(exec)

host1という名前のネームスペースを追加します。

[root@server ~]# ip netns add host1

ネームスペースを確認します。host1が追加されたことがわかります。

[root@server ~]# ip netns list
host1

ネームスペース(host1)に入ります。

[root@server ~]# ip netns exec host1 bash

ネームスペース(host1)でipコマンドを実行します。

[root@server ~]# ip l
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

ネームスペース(host1)から抜けます。

[root@server ~]# exit
exit

9 プロセスが動作しているネームスペースを調べる方法(identify)

プロセスのPIDから、プロセスが動作しているネームスペースを確認してみます。

ターミナル1でネームスペースを確認します。host1が存在することがわかります。

[root@server ~]# ip netns list
host1

host1に入ります。

[root@server ~]# ip netns exec host1 bash

bashプロセスのPIDを確認します。bashプロセスのPIDは8787であることがわかります。

[root@server ~]# echo $$
8787

ターミナル2でbashプロセスが動作しているネームスペースを確認します。bashプロセスは、host1で動作していることがわかります。

[root@server ~]# ip netns identify 8787
host1

host1から抜けます。

[root@server ~]# exit
exit

10 ネームスペースで動作しているプロセスのPIDを調べる方法(pids)

ターミナル1でネームスペース(host1)に入ります。

[root@server ~]# ip netns exec host1 bash

host1でbashのPIDを確認します。PIDは8356であることがわかります。

[root@server ~]# echo $$
8356

ターミナル2で次のことを確認します。host1で動作しているプロセスのPIDを確認します。host1で動作しているbashプロセスのPID(8536)を確認することができます。

[root@server ~]# ip netns pids host1
8356

host1でsleepコマンドを実行します。sleepプロセスのPIDは8420であることがわかります。

[root@server ~]# sleep 600&
[1] 8420

ターミナル2でhost1で動作しているプロセスのPIDを確認します。host1で動作しているsleepプロセスのPID(8420)を確認することができます。

[root@server ~]# ip netns pids host1
8356
8420

11 ネームスペースを使ったネットワーク環境構築

11.3 NAT環境構築

未稿

11.4 OVS環境構築

未稿

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ