vyatta 6.6R1にバージョンアップ

vyattaのバージョンアップを久しぶりに実施した。
6.5R1がリリースされた際にすぐに実施したのだが、なんか不安定だったので、6.4に戻していました。

こんな情報がありました。
この情報をたよりにいろいろと調べてみると、やはり6.5の時から問題が発生していたようです。
以前、不安定だったのはこれが原因のようです。(リリースされてすぐに6.5適用したから情報がなかったんだな。。)
こんなところ、よほどじゃないと疑わないよね。。。

せっかくなので、本当かどうか調べてみました。まずは、6.4でpppoe側をダンプ。

6.4-mss

mtuは1454に設定している。mssは1412と自動調整されていますね。

6.6R1にバージョンアップ後、同様にダンプすると。。。
6.6-mss

mtuは1454で設定しているのに、mssは1460になっていて調整されていない。。。。
これが原因なんですね。

サイトにあるように、policyでinterfaceにINするSYNパケットを1414にセットします。
mtuが1454だら、ヘッダ40として1414って訳ですね。R6.4の時は1412に調査されているようだが、
まっ、40バイトでいいでしょう。
こんな感じでpolicy追加。LAN側はbridge設定しているのでbridge インターフェイスに適用しました。ethXでは、変化なかった。

set policy route PPPOE-IN rule 10 destination address 0.0.0.0/0
set policy route PPPOE-IN rule 10 protocol tcp
set policy route PPPOE-IN rule 10 tcp flags 'SYN,!ACK,!FIN,!RST'
set policy route PPPOE-IN rule 10 set tcp-mss 1414
set interface bridge br2 policy route PPPOE-IN

さて、同様にダンプすると。。。ちゃんとmssが1414に設定されています。
6.6-mss-change

とりあえず、これでOKとしよう。しかしなんでこんなリグレっぽいことが放置されているのだ??

 

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とかをやってみたくなるが、フローまで書かなきゃ
面白くなさそうなので、敷居高いかな。。

 

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

openvswitchで接続できてしまえば、VLANは問題ないだろう。。。

過去記事と、同様にovsでtag付けしてみる。

[root@kvm2 ~]# ovs-vsctl del-port vnet0
[root@kvm2 ~]# ovs-vsctl add-port ovsbr1 vnet0 tag=70
[root@kvm2 ~]# ovs-vsctl show
[root@kvm2 ~]# ovs-vsctl show
3a8d81b3-fdba-47cc-bce1-8fc0372dec6d
    Bridge "ovsbr1"
        Port "eth1"
            Interface "eth1"
        Port "ovsbr1"
            Interface "ovsbr1"
                type: internal
        Port "vnet1"
            Interface "vnet1"
        Port "vnet0"
            tag: 70
            Interface "vnet0"
    ovs_version: "1.10.0"

この状態で、pingをしてみると、当然疎通できません。vm74(vnet0)がtag付き、vm76(vnet1)がtagなしなので。

vnet1側もtag 70に設定して通信。

[root@kvm2 ~]# ovs-vsctl del-port vnet1
[root@kvm2 ~]# ovs-vsctl add-port ovsbr1 vnet1 tag=70
[root@kvm2 ~]# ovs-vsctl show
3a8d81b3-fdba-47cc-bce1-8fc0372dec6d
    Bridge "ovsbr1"
        Port "vnet1"
            tag: 70
            Interface "vnet1"
        Port "eth1"
            Interface "eth1"
        Port "ovsbr1"
            Interface "ovsbr1"
                type: internal
        Port "vnet0"
            tag: 70
            Interface "vnet0"
    ovs_version: "1.10.0"
[root@vm74 ~]# ping 192.168.200.76
PING 192.168.200.76 (192.168.200.76) 56(84) bytes of data.
64 bytes from 192.168.200.76: icmp_seq=1 ttl=64 time=0.528 ms
64 bytes from 192.168.200.76: icmp_seq=2 ttl=64 time=0.267 ms
...

うまく動作しています。

KVM2台で各vmのvlan間通信。vlan60とvlan70で下図の環境。
同一vlan idのみ通信できているので、vlanでL2を分割できています。

KVM-OVS-VLAN

■KVM1の状態

[root@kvm1 ~]# virsh list
 Id    Name                           State
----------------------------------------------------
 1     vm71                           running
 2     vm73                           running

[root@kvm1 ~]# ovs-vsctl show
d74e37a6-b456-42a3-a83a-153d8544cafb
    Bridge "ovsbr1"
        Port "vnet0"
            tag: 60
            Interface "vnet0"
        Port "eth1"
            Interface "eth1"
        Port "vnet1"
            tag: 70
            Interface "vnet1"
        Port "ovsbr1"
            Interface "ovsbr1"
                type: internal
    ovs_version: "1.10.0"

■KVM2の状態

[root@kvm2 ~]# virsh list
 Id    Name                           State
----------------------------------------------------
 2     vm74                           running
 3     vm76                           running

[root@kvm2 ~]# ovs-vsctl show
3a8d81b3-fdba-47cc-bce1-8fc0372dec6d
    Bridge "ovsbr1"
        Port "eth1"
            Interface "eth1"
        Port "vnet0"
            tag: 60
            Interface "vnet0"
        Port "vnet1"
            tag: 70
            Interface "vnet1"
        Port "ovsbr1"
            Interface "ovsbr1"
                type: internal
    ovs_version: "1.10.0"

vm74からpingの結果vm71とのみ通信できています。(vlan 60同士)

[root@vm74 ~]# ping 192.168.200.71
PING 192.168.200.71 (192.168.200.71) 56(84) bytes of data.
64 bytes from 192.168.200.71: icmp_seq=1 ttl=64 time=2.51 ms
64 bytes from 192.168.200.71: icmp_seq=2 ttl=64 time=0.410 ms

--- 192.168.200.71 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1249ms
rtt min/avg/max/mdev = 0.410/1.462/2.514/1.052 ms
[root@vm74 ~]# ping 192.168.200.73
PING 192.168.200.73 (192.168.200.73) 56(84) bytes of data.

--- 192.168.200.73 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1293ms

[root@vm74 ~]# ping 192.168.200.76
PING 192.168.200.76 (192.168.200.76) 56(84) bytes of data.

--- 192.168.200.76 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1238ms

vm76からpingの結果。vm73とのみ通信できています。(vlan 70同士)

[root@vm76 ~]# ping 192.168.200.71
PING 192.168.200.71 (192.168.200.71) 56(84) bytes of data.

--- 192.168.200.71 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 856ms

[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=2.69 ms
64 bytes from 192.168.200.73: icmp_seq=2 ttl=64 time=0.529 ms

--- 192.168.200.73 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1259ms
rtt min/avg/max/mdev = 0.529/1.609/2.690/1.081 ms
[root@vm76 ~]# ping 192.168.200.74
PING 192.168.200.74 (192.168.200.74) 56(84) bytes of data.

--- 192.168.200.74 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1126ms

vm76からpingを叩いた際のeth1でのパケットダンプ。
KVM1とKVM2間のデータは、802.1Qフレームにて通信してますね。vlan70です。

[root@kvm2 ~]# tcpdump -n -e -i eth1
tcpdump: WARNING: eth1: no IPv4 address assigned
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
16:29:59.267966 52:54:00:1f:aa:a8 > 52:54:00:d4:7c:5e, ethertype 802.1Q (0x8100), length 102: vlan 70, p 0, ethertype IPv4, 192.168.200.76 > 192.168.200.73: ICMP echo request, id 6661, seq 1, length 64
16:29:59.269747 52:54:00:d4:7c:5e > Broadcast, ethertype 802.1Q (0x8100), length 60: vlan 70, p 0, ethertype ARP, Request who-has 192.168.200.76 tell 192.168.200.73, length 42
16:29:59.269980 52:54:00:1f:aa:a8 > 52:54:00:d4:7c:5e, ethertype 802.1Q (0x8100), length 46: vlan 70, p 0, ethertype ARP, Reply 192.168.200.76 is-at 52:54:00:1f:aa:a8, length 28
16:29:59.270358 52:54:00:d4:7c:5e > 52:54:00:1f:aa:a8, ethertype 802.1Q (0x8100), length 102: vlan 70, p 0, ethertype IPv4, 192.168.200.73 > 192.168.200.76: ICMP echo reply, id 6661, seq 1, length 64
16:30:00.269204 52:54:00:1f:aa:a8 > 52:54:00:d4:7c:5e, ethertype 802.1Q (0x8100), length 102: vlan 70, p 0, ethertype IPv4, 192.168.200.76 > 192.168.200.73: ICMP echo request, id 6661, seq 2, length 64
16:30:00.269737 52:54:00:d4:7c:5e > 52:54:00:1f:aa:a8, ethertype 802.1Q (0x8100), length 102: vlan 70, p 0, ethertype IPv4, 192.168.200.73 > 192.168.200.76: ICMP echo reply, id 6661, seq 2, length 64