hana_shinのLinux技術ブログ

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

ip netnsコマンドの使い方(host-bridge-host環境構築編)



1 はじめに

ネームスペースを使って、ホストーブリッジーホストの環境を構築してみます。

ip netnsコマンドの基本的な使い方は、以下を参照ください。
ip netnsコマンドの使い方(ネットワークの実験の幅が広がるなぁ~) - hana_shinのLinux技術ブログ

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 構築する環境

ブリッジにホストが2台接続する環境を仮想マシンに構築してみます。

                         192.168.100.0/24

+--- host1 --+            +-- bridge --+          +--- host2 --+
|            |            |            |          |            |
|            |            |            |          |            |
|            |            |            |          |            |
|            |            |            |          |            |
|     host1(p-h1) --- (p1-br)       (p2-br) --- (p-h2)         |
|            | .10        |            |      .20 |            |
|            |            |            |          |            |
|            |            |            |          |            |
|            |            |            |          |            |
+------------+            +------------+          +------------+

4 構築手順

4.1 ホストの作成

ホストを2つ作成します。

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

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

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

4.2 ブリッジの作成

仮想マシンに存在するブリッジを確認します。私の環境では、virbr0という名前のブリッジがありました。

[root@server ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
virbr0          8000.5254006d88ad       yes             virbr0-nic

bridgeという名前のブリッジを作成します。

[root@server ~]# brctl addbr bridge

ブリッジの一覧を表示します。bridgeが追加されたことがわかります。

[root@server ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
bridge          8000.000000000000       no
virbr0          8000.5254006d88ad       yes             virbr0-nic

4.3 ポートの作成

  • ホストポートの作成

ホストに接続するポートを作成します。

[root@server ~]# ip link add p-h1 type veth peer name p1-br
[root@server ~]# ip link add p-h2 type veth peer name p2-br

作成したポートをホストに接続します。

[root@server ~]# ip link set p-h1 netns host1
[root@server ~]# ip link set p-h2 netns host2

bridgeに接続するブリッジポートを作成します。

[root@server ~]# brctl addif bridge p1-br
[root@server ~]# brctl addif bridge p2-br

4.4 IPアドレスの設定

ホストポートにIPアドレスを設定します。

[root@server ~]# ip netns exec host1 ip addr add 192.168.100.10/24 dev p-h1
[root@server ~]# ip netns exec host2 ip addr add 192.168.100.20/24 dev p-h2

4.5 ポートのリンクアップ

  • ホスト1のポートリンクアップ
[root@server ~]# ip netns exec host1 ip link set p-h1 up
[root@server ~]# ip netns exec host1 ip link set lo up
  • ホスト2のポートリンクアップ
[root@server ~]# ip netns exec host2 ip link set p-h2 up
[root@server ~]# ip netns exec host2 ip link set lo up
[root@server ~]# ip link set p1-br up
[root@server ~]# ip link set p2-br up
[root@server ~]# ip link set bridge up

5 設定内容の確認

ホスト1のIPアドレスを確認します。

[root@server ~]# ip netns exec host1 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
7: p-h1@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 12:26:5d:9f:e3:e1 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.100.10/24 scope global p-h1
       valid_lft forever preferred_lft forever
    inet6 fe80::1026:5dff:fe9f:e3e1/64 scope link
       valid_lft forever preferred_lft forever

ホスト2のIPアドレスを確認します。

[root@server ~]# ip netns exec host2 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
9: p-h2@if8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 5e:c9:22:99:7b:07 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.100.20/24 scope global p-h2
       valid_lft forever preferred_lft forever
    inet6 fe80::5cc9:22ff:fe99:7b07/64 scope link
       valid_lft forever preferred_lft forever

ブリッジのポートを確認します。

[root@server ~]# brctl show bridge
bridge name     bridge id               STP enabled     interfaces
bridge          8000.7688e9382eea       no              p1-br
                                                        p2-br

6 動作確認

host1に入ります。

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

host1からhost2に対してpingを実行してみます。host2から応答があることがわかります。

[root@server ~]# ping -c 1 192.168.100.20
PING 192.168.100.20 (192.168.100.20) 56(84) bytes of data.
64 bytes from 192.168.100.20: icmp_seq=1 ttl=64 time=0.090 ms

--- 192.168.100.20 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.090/0.090/0.090/0.000 ms

7 環境構築用シェルスクリプト

今まで説明した手順をシェルスクリプトに記述して、環境構築/削除の自動化をしてみたいと思います。

7.1 構築

環境を構築するスクリプトです。

[root@server ~]# cat build.sh
#!/usr/bin/bash

ip netns add host1
ip netns add host2
brctl addbr bridge

ip link add p-h1 type veth peer name p1-br
ip link add p-h2 type veth peer name p2-br
ip link set p-h1 netns host1
ip link set p-h2 netns host2

brctl addif bridge p1-br
brctl addif bridge p2-br

ip netns exec host1 ip addr add 192.168.100.10/24 dev p-h1
ip netns exec host2 ip addr add 192.168.100.20/24 dev p-h2

ip netns exec host1 ip link set p-h1 up
ip netns exec host1 ip link set lo up

ip netns exec host2 ip link set p-h2 up
ip netns exec host2 ip link set lo up

ip link set p1-br up
ip link set p2-br up
ip link set bridge up

シェルを実行して環境を構築する。

[root@server ~]# ./build.sh

host1からhost2に対してpingを実行します。host2から応答があることがわかります。

[root@server ~]# ip netns exec host1 ping -c 1 192.168.100.20
PING 192.168.100.20 (192.168.100.20) 56(84) bytes of data.
64 bytes from 192.168.100.20: icmp_seq=1 ttl=64 time=0.097 ms

--- 192.168.100.20 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.097/0.097/0.097/0.000 ms

7.2 削除

環境を削除するスクリプトです。

[root@server ~]# cat del.sh
#!/usr/bin/bash

ip link set p1-br down
ip link set p2-br down
ip link set bridge down
ip netns exec host1 ip link set p-h1 down
ip netns exec host1 ip link set lo down
ip netns exec host2 ip link set p-h2 down
ip netns exec host2 ip link set lo down
brctl delif bridge p1-br
brctl delif bridge p2-br

ip link delete p1-br
ip link delete p2-br

brctl delbr bridge
ip netns delete host1
ip netns delete host2

シェルを実行して環境を削除する。

[root@server ~]# ./del.sh

Z 参考情報

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