« Trema のコントローラと仮想ネットワークをそれぞれ別々に動かす | トップページ | ◆ Linux のネットワークネームスペース機能と Open vSwitch で仮想ネットワーク(ルータ追加) »

2013年4月22日 (月)

◆ Linux のネットワークネームスペース機能と Open vSwitch で仮想ネットワーク

Linux のネットワークネームスペースと、Open vSwitch、ip link コマンドを組み合わせたら仮想ネットワークを Linux 内に作って遊べそうだと思ってシェルスクリプトを作って確認してみました。
今回は1例を試しただけですが、さらに色々な仮想ネットワークを Linux 内に作って遊べそうだという感触を得ることができました。Open vSwitch を OpenFlow スイッチとして用いるのも面白いでしょう。

■確認に用いた環境
  Lubuntu 12.04 (i386)

  Lubuntu 12.10 で試される場合は、NetworkManagerが邪魔すると思うので停止しておいた方がよいと思います。以下の記事の「■回避策」を参考にしてくださ:
記事: 「Lubuntu 12.10 で Trema の仮想ネットワーク機能を使うときはネットワークマネージャーを止めましょう」
http://ranosgrant.cocolog-nifty.com/blog/2013/01/lubuntu-1210-tr.html

■今回作成する仮想ネットワークの構成図

VLAN スイッチが2つ、ホストは4台。
VLAN スイッチは Open vSwitch を使用。
ホストは、ネットワークネームスペースを使用。

vhost1 と vhost3 は、tag=10 の VLAN に接続。
vhost2 と vhost4 は、 tag=20 の VLAN に接続。

Photo
■Open vSwitch のインストールについて

Open vSwitch のインストール方法は以下の記事の「■ステップ3. OpenVSwitch のインストール」を参照ください:
記事: 「2万円で OpenFlow スイッチを自作しよう」
http://ranosgrant.cocolog-nifty.com/blog/2013/02/2-openflow-4b98.html

■動作確認結果

vhost1 からは、同じ VLAN タグを持つ vhost3 としか通信できないことを確認してみます。

まずは、vhost1 から vhost3 へ ping で通信できることを確認。

$ sudo ip netns exec vhost1 ping 192.168.1.3
PING 192.168.1.3 (192.168.1.3) 56(84) bytes of data.
64 bytes from 192.168.1.3: icmp_req=1 ttl=64 time=1.29 ms
64 bytes from 192.168.1.3: icmp_req=2 ttl=64 time=0.121 ms
64 bytes from 192.168.1.3: icmp_req=3 ttl=64 time=0.100 ms
^C
--- 192.168.1.3 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 0.100/0.504/1.292/0.557 ms

vhost1 から vhost4 への ping は VLAN が異なるので通信ができず、Ctrl-C で中断。

$ sudo ip netns exec vhost1 ping 192.168.1.4
PING 192.168.1.4 (192.168.1.4) 56(84) bytes of data.
^C
--- 192.168.1.4 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2001ms

■仮想ネットワークの作成用シェルスクリプト

引数は、delete で削除、add で作成。

#!/bin/sh

delete() {
    sudo ovs-vsctl del-br vswitch1
    sudo ovs-vsctl del-br vswitch2
    sudo ip netns delete vhost1
    sudo ip netns delete vhost2
    sudo ip netns delete vhost3
    sudo ip netns delete vhost4
    sudo ip link delete vlink5-0
    sudo ip link delete vlink5-1
}

add() {
    sudo ovs-vsctl add-br vswitch1
    sudo ovs-vsctl add-br vswitch2
    
    sudo ip link add name vlink1-0 type veth peer name vlink1-1
    sudo ip link add name vlink2-0 type veth peer name vlink2-1
    sudo ip link add name vlink3-0 type veth peer name vlink3-1
    sudo ip link add name vlink4-0 type veth peer name vlink4-1
    sudo ip link add name vlink5-0 type veth peer name vlink5-1
    
    sudo ip link set vlink1-0 up
    sudo ip link set vlink2-0 up
    sudo ip link set vlink3-0 up
    sudo ip link set vlink4-0 up
    
    sudo ip link set vlink1-1 up
    sudo ip link set vlink2-1 up
    sudo ip link set vlink3-1 up
    sudo ip link set vlink4-1 up
    
    sudo ip netns add vhost1
    sudo ip netns add vhost2
    sudo ip netns add vhost3
    sudo ip netns add vhost4
    
    sudo ip netns exec vhost1 ifconfig lo 127.0.0.1
    sudo ip netns exec vhost2 ifconfig lo 127.0.0.1
    sudo ip netns exec vhost3 ifconfig lo 127.0.0.1
    sudo ip netns exec vhost4 ifconfig lo 127.0.0.1

    sudo ip link set vlink1-0 netns vhost1
    sudo ip link set vlink2-0 netns vhost2
    sudo ip link set vlink3-0 netns vhost3
    sudo ip link set vlink4-0 netns vhost4
    
    sudo ip netns exec vhost1 ifconfig vlink1-0 192.168.1.1
    sudo ip netns exec vhost2 ifconfig vlink2-0 192.168.1.2
    sudo ip netns exec vhost3 ifconfig vlink3-0 192.168.1.3
    sudo ip netns exec vhost4 ifconfig vlink4-0 192.168.1.4
    
    sudo ovs-vsctl add-port vswitch1 vlink5-0
    sudo ovs-vsctl add-port vswitch2 vlink5-1
    
    sudo ovs-vsctl add-port vswitch1 vlink1-1 tag=10
    sudo ovs-vsctl add-port vswitch1 vlink2-1 tag=20
    
    sudo ovs-vsctl add-port vswitch2 vlink3-1 tag=10
    sudo ovs-vsctl add-port vswitch2 vlink4-1 tag=20

    sudo ip link set vlink5-0 up
    sudo ip link set vlink5-1 up
}

case "$1" in
add)
    set -x
    add
    ;;
delete)
    delete > /dev/null 2>&1
    ;;
*)
    echo "usage: $0 {add|delete}"
esac

« Trema のコントローラと仮想ネットワークをそれぞれ別々に動かす | トップページ | ◆ Linux のネットワークネームスペース機能と Open vSwitch で仮想ネットワーク(ルータ追加) »

仮想ネットワーク」カテゴリの記事

コメント

この記事へのコメントは終了しました。

トラックバック

« Trema のコントローラと仮想ネットワークをそれぞれ別々に動かす | トップページ | ◆ Linux のネットワークネームスペース機能と Open vSwitch で仮想ネットワーク(ルータ追加) »

最近のトラックバック

無料ブログはココログ