ペネトレーションしのべくん

さようなら、すべてのセキュリティエンジニア

はじめてのLinux Network NamespaceとLinux Bridge

概要

TremaやRyuを使ってOpenFlowをキメたかったが、gemだのpipを使いこなせずLinuxの仮想ネットワーク機能で飢えを凌ぐ。実行環境はCentOS7.3。

Linux Network Namespaceとは(ざっくり)

  • Linux上に独立したネットワーク空間(多分OpenFlowで言うところの「テナント」)を構築できるスグレモノ。
  • 「ip netns hogehoge」でホストをほげほげする。

Linux Bridgeとは(ざっくり)

  • Linux上にネットワークブリッジを作る機能。多分。
  • 「brctl hogehoge」でブリッジをほげほげする。

参考

https://qiita.com/norin/items/f2c1b0158ee34abcdd0c

d-net.robata.org

作ったネットワーク

ブリッジを介して全てのホストが単一セグメントにいる簡単なもの。

f:id:befs_anne:20171019010106j:plain

流れ

bridge-utilsのインストール

インストールすればbrctlが使えるようになる。

# bridge-utilsのインストール
sudo yum -y install bridge-utils

ブリッジ、ホストの作成

# 以降すべてrootで作業
sudo -s

# ブリッジ作成
brctl addbr br1

# ホスト作成
ip netns add host1
ip netns add host2
ip netns add host3
ip netns add host4

リンク(veth)作成

vethというものを使う。どうやら、片っぽから入ったフレームがもう片っぽから出てくる二対一組のインタフェースっぽい。

ip link add br1_host1 type veth peer name host1_br1
ip link add br1_host2 type veth peer name host2_br1
ip link add br1_host3 type veth peer name host3_br1
ip link add br1_host4 type veth peer name host4_br1

ブリッジとリンクのバインド

vethの一方をブリッジにバインドする。

brctl addif br1 br1_host1
brctl addif br1 br1_host2
brctl addif br1 br1_host3
brctl addif br1 br1_host4

ホストとリンクのバインド

vethのもう一方をホストにバインドする。

ip link set host1_br1 netns host1
ip link set host2_br1 netns host2
ip link set host3_br1 netns host3
ip link set host4_br1 netns host4

IPアドレスの割り当て

ホスト(厳密にはホストにバインドしたveth)にIPアドレスを割り当てる。「ip netns exec {ホスト名} {コマンド}」で指定したホストで指定したコマンドを実行できる。

ip netns exec host1 ip addr add 10.0.0.1/24 dev host1_br1
ip netns exec host2 ip addr add 10.0.0.2/24 dev host2_br1
ip netns exec host3 ip addr add 10.0.0.3/24 dev host3_br1
ip netns exec host4 ip addr add 10.0.0.4/24 dev host4_br1

ループバックアドレスの割り当て

ip netns exec host1 ip addr add 127.0.0.1/8 dev lo
ip netns exec host2 ip addr add 127.0.0.1/8 dev lo
ip netns exec host3 ip addr add 127.0.0.1/8 dev lo
ip netns exec host4 ip addr add 127.0.0.1/8 dev lo

ループバックアドレスのリンクアップ

ip netns exec host1 ip link set lo up
ip netns exec host2 ip link set lo up
ip netns exec host3 ip link set lo up
ip netns exec host4 ip link set lo up

ホストのインタフェースのリンクアップ

ip netns exec host1 ip link set host1_br1 up
ip netns exec host2 ip link set host2_br1 up
ip netns exec host3 ip link set host3_br1 up
ip netns exec host4 ip link set host4_br1 up

ブリッジの起動

brctlで作ったブリッジはip link showの結果に出てくるので、ip link setで起動する。

ip link set br1 up

ブリッジのインタフェースのリンクアップ

ip link set br1_host1 up
ip link set br1_host2 up
ip link set br1_host3 up
ip link set br1_host4 up

疎通確認

疎通確認もip netns execを使って各ホストからpingを実行する。

[centos73 shino]#ip netns exec host1 ping 10.0.0.2 -c 1
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.072 ms

--- 10.0.0.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.072/0.072/0.072/0.000 ms
[centos73 shino]#ip netns exec host1 ping 10.0.0.3 -c 1
PING 10.0.0.3 (10.0.0.3) 56(84) bytes of data.
64 bytes from 10.0.0.3: icmp_seq=1 ttl=64 time=0.070 ms

--- 10.0.0.3 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.070/0.070/0.070/0.000 ms
[centos73 shino]#ip netns exec host1 ping 10.0.0.4 -c 1
PING 10.0.0.4 (10.0.0.4) 56(84) bytes of data.
64 bytes from 10.0.0.4: icmp_seq=1 ttl=64 time=0.080 ms

--- 10.0.0.4 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.080/0.080/0.080/0.000 ms
[centos73 shino]#

おわり

今回は単なるホストだったけど、ルーティングもできるのでもっと面白いことができそう。