Wireshark::VXLAN

先日、openvswitchを使ってVXLANをやってみたが、VNIがどうなっているかとか、tcpdumpの結果
だけではわからなかった。
現時点、最新のwireshark 1.10.1ではVXLANをデコードできるようだったので、早速やってみた。

wiresharkでパケットを読み込んで、オーバレイされたパケットを選択する。
Analyze->Decode Asを選択する。
Transportタブに表示されているリストからVXLANを選択してApplyを実行する。

VXLAN-uni-decode

こんな感じでデコードされます。暗号化とかしないと地理的に異なるところでは使えないね。。
何も設定していないので、やはりVNIは0であった。。

先日のVXLANの方法は、純粋なVXLANではないようである。完全にユニキャストのみ。。
これでは、トンネル先を毎回指定しないといけないのでスケールしないかな。。。

調べていると、linuxのkernel 3.7以降でVXLANをサポートしているようであった。
ここに、vxlanの起動の仕方があったので、参考にできるだろう。

次回は、kernelをバージョンアップして、マルチキャストでVXLANする環境を作ってみよう。
おそらく、vxlanを作って、ovsに接続してやればいいだけな気がする。多分。。

 

KVM on ESXi (openvswitch) VXLAN使ってみる

さてさて、次は、vxlanでoverlayしてみます。freebsd上でやろうとしたときは、うまくできなかった。
vxlanそのものがサポートされてないから?

vxlanの事例は、google先生に尋ねると、少ない。。
この設定を見ても、bridgeを2つ作成したりしていてよくわかりません。
設定例から、なんとなくやりたそうなことを推測して、シンプルに独自にやってみた。

まずは、前回、vlanを使っていた設定をやめます。vm 4個で通信可能な状態にしました。
異なるKVM(ホスト)上にあるvm間通信をvxlanを使ってoverlayさせたい訳です。
現状のままでは、openvswitchにeth1を接続させているので、eth1を経由して通常のイーサネットフレームで
通信できてしまいます。
なので、openvswitchからeth1を切り離し、overlayとしてトンネルするためにeth1にダイレクトにIPアドレスを
割り当てます。
このIPアドレス間でudpでカプセル化されたパケットが飛ぶはず。。

KVM1およびKVM2上で、

(KVM1)
# ovs-vsctl del-port eth1
# ifconfig eth1 192.168.222.71 netmask 255.255.255.0

(KVM2)
# ovs-vsctl del-port eth1
# ifconfig eth1 192.168.222.72 netmask 255.255.255.0

この状態では、もちろん、vm73とvm76の通信はできなくなる。eth1がswitchにbindされてないので当たり前。
KVM1からKVM2へのping(192.168.222.72)は通ります。eth1についてるので通常のホストでの通信。

ここからvxlanの設定を、やってみる。上記のリンクを参考に。。。

■KVM1

[root@kvm1 ~]# ovs-vsctl add-port ovsbr1 vx1 -- set interface vx1 type=vxlan options:remote_ip=192.168.222.72

[root@kvm1 ~]# ovs-vsctl show
d74e37a6-b456-42a3-a83a-153d8544cafb
    Bridge "ovsbr1"
        Port "vx1"
            Interface "vx1"
                type: vxlan
                options: {remote_ip="192.168.222.72"}
        Port "vnet1"
            Interface "vnet1"
        Port "vnet0"
            Interface "vnet0"
        Port "ovsbr1"
            Interface "ovsbr1"
                type: internal
    ovs_version: "1.10.0"

■KVM2

[root@kvm2 ~]# ovs-vsctl add-port ovsbr1 vx1 -- set interface vx1 type=vxlan options:remote_ip=192.168.222.71
[root@kvm2 ~]# ovs-vsctl show
3a8d81b3-fdba-47cc-bce1-8fc0372dec6d
    Bridge "ovsbr1"
        Port "vx1"
            Interface "vx1"
                type: vxlan
                options: {remote_ip="192.168.222.71"}
        Port "vnet1"
            Interface "vnet1"
        Port "ovsbr1"
            Interface "ovsbr1"
                type: internal
        Port "vnet0"
            Interface "vnet0"
    ovs_version: "1.10.0"

これでおそらくvm間通信できるはず。。。vm76からvm73へping

[root@vm76 ~]# ping 192.168.200.73
PING 192.168.200.73 (192.168.200.73) 56(84) bytes of data.
64 bytes from 192.168.200.73: icmp_seq=1 ttl=64 time=3.25 ms
64 bytes from 192.168.200.73: icmp_seq=2 ttl=64 time=0.524 ms

本当にVXLANで飛んでいるのか見てみる。
KVM1上のeth1をダンプする。。

[root@kvm1 ~]# tcpdump -n -e -i eth1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
19:03:29.002266 00:0c:29:c4:c1:78 > 00:0c:29:e7:3d:46, ethertype IPv4 (0x0800), length 92: 192.168.222.72.36020 > 192.168.222.71.4789: UDP, length 50
19:03:29.002771 00:0c:29:e7:3d:46 > 00:0c:29:c4:c1:78, ethertype IPv4 (0x0800), length 92: 192.168.222.71.49705 > 192.168.222.72.4789: UDP, length 50
19:03:29.003201 00:0c:29:c4:c1:78 > 00:0c:29:e7:3d:46, ethertype IPv4 (0x0800), length 148: 192.168.222.72.53309 > 192.168.222.71.4789: UDP, length 106
19:03:29.003554 00:0c:29:e7:3d:46 > 00:0c:29:c4:c1:78, ethertype IPv4 (0x0800), length 148: 192.168.222.71.35524 > 192.168.222.72.4789: UDP, length 106
19:03:30.003851 00:0c:29:c4:c1:78 > 00:0c:29:e7:3d:46, ethertype IPv4 (0x0800), length 148: 192.168.222.72.53309 > 192.168.222.71.4789: UDP, length 106
19:03:30.004063 00:0c:29:e7:3d:46 > 00:0c:29:c4:c1:78, ethertype IPv4 (0x0800), length 148: 192.168.222.71.35524 > 192.168.222.72.4789: UDP, length 106
19:03:31.005837 00:0c:29:c4:c1:78 > 00:0c:29:e7:3d:46, ethertype IPv4 (0x0800), length 148: 192.168.222.72.53309 > 192.168.222.71.4789: UDP, length 106
19:03:31.006064 00:0c:29:e7:3d:46 > 00:0c:29:c4:c1:78, ethertype IPv4 (0x0800), length 148: 192.168.222.71.35524 > 192.168.222.72.4789: UDP, length 106
...

確かに192.168.222.71と192.168.222.72の間で、UDPパケットが飛んでいる。vxlanのパケットはudpでカプセル化
されるので、OKっぽい。
lengthから推測すると、最初はarpリクエストで、その次がicmpなんだろな。。。
udpヘッダとvniが付くだけだから、wiresharkとかでパケット見れば細かくわかるのかな。やってないけど。

こんな感じでやるのがシンプルだし、現実的かな。。

構成としては、こんな感じ。
KVM-VXLAN

理論的には、KVMのホストが地球の裏側にあってもOKってことか。。。
live migrationとかやってみたいもんだ。

以下は余談です。
トンネルさせているので、ユニキャストにパケットはなっている。vxlanって確かマルチキャストなはずだが。
これはどうやってやるんだろう。。機会があれば調査してみるか。

今回は、とりあえずvxlan使ってoverlayしてみたってだけ。。。

パフォーマンスとかも測定してないし、vxlanネットワークのmtuとかも調整してないし。。
udpでのカプセル化は暗号化されてないんだろうね。

今回は、1つのネットワーク(vlanとか?)だけだが、複数のネットワーク(マルチテナント?)でどうやるかとか、
vlanとか使った場合もうまくいくのかね。。。vlan tagごとカプセル化されるんだよね?。。。多分。

クラウド業者さんは、大変ですね。こういった技術を組み合わせて、スケールさせていくのですね。お客様のために。。。
個人的には、openvpnとかでL2飛ばしちゃえば済んじゃう話かと思うのですが。

openvswitchでオーバーレイしたら、次は、OpenFlowとかをやってみたくなるが、フローまで書かなきゃ
面白くなさそうなので、敷居高いかな。。