KVM&Open vswitchでVPS+を
作ってみる
自己紹介
中嶋 大輔

主にC社のRouterやSwitchなどを使ってお客
様ネットワークの設計構築してました。

趣味:自転車、食道楽

Twitter @ mamesan
VPSってなに?
rootがもらえるレンタルサーバーです。

              
さんなどがサービスしています

OSも結構選べてすぐ使える!
VPS+ってなに?
複数NICを使えるようにVPSをちょっと拡張
してみました
                ルーター

                                             このあたりが+
                     NIC                    インターネット用NICと

                Open vSwitch                イントラネット用NICが
                                               使える!
    TAP        TAP         TAP        TAP

          VM                     VM
VPS+の要件
1.インターネットNICはIP固定
2.イントラネットNICはプロトコルフリー
3.イントラネットNIC間はL2接続
4.VLANを使用せずマルチテナントを実現
インターネットの通信要件
IPアドレスやMACアドレスなりすまし対策

 ユーザーに払い出したアドレス以外は通
 信させない

通信プログラム対策

 vrrpdやospfdなどはトラブルのもとになる
 ので通信させない
インターネットの通信要件

                                 ルーター


                                L2スイッチ

                                ルーター
                                                                        必要な通信だけ
グローバルIP                                                                      許可する
                                     NIC

                               Open vSwitch
     TAP            TAP             TAP            TAP            TAP

     VM             VM              VM             VM             VM

 IP:192.0.2.1   IP:192.0.2.2    IP:192.0.2.3   IP:192.0.2.4   IP:192.0.2.5
    MAC: A         MAC: B          MAC: C         MAC: D         MAC: E
イントラネットの通信要件
マルチキャストもブロードキャストもOK
 ユーザーが使いたいプロトコルは基本な
 んでも使えるようにしたい
テナント間通信は非VLANで分割
 VLANは4096問題がある
L2ドメインをL3レイヤを超えて通信したい
 カプセル化
イントラネットの通信要件

                                   ルーター


                                  L2スイッチ

    ブロードキャスト                      ルーター
     だけ分割する

                                       NIC
ブロードキャストA                                                          ブロードキャストB
                                 Open vSwitch
         TAP           TAP                          TAP           TAP

        VM            VM                           VM            VM

     IP:10.0.0.1   IP:10.0.0.1                  IP:10.0.0.1   IP:10.0.0.1
       MAC: A        MAC: B                       MAC: D        MAC: E
イントラネットの通信要件
EtherをGREでカプセル化
                                        ルーター
  して通信する

                                       L2スイッチ

               ルーター                                       ルーター



                   NIC                                        NIC

               Open vSwitch                               Open vSwitch
         TAP                  TAP                   TAP                  TAP

        VM                    VM                   VM                    VM
     IP:10.0.0.1         IP:10.0.0.1            IP:10.0.0.1         IP:10.0.0.1
       MAC: A              MAC: C                 MAC: B              MAC: D
GREトンネルについて
                           オリジナルフレーム
Ether   IP   GRE   Ether    IP              FCS
                                  Payload
 14     20    4     14      20               4



        オーバーヘッドが38byte追加
        ネットワークがジャンボフレーム対応で
        ない場合フラグメントが発生
        GREにIDをつけるとGREのオプションが付加
        される?(未確認)
要件からフローを作成
            フロー作成で使えるのは以下の項目
in_port,dl_vlan,dl_vlan_pcp,dl_src,dl_dst,dl_type,nw_src,nwdst,nw_proto,nw_tos,tp_src,tp_dst,icmp_type,
icmp_code,table,vlan_tci,ip_flag,arp_sha,arp_tha,ipv6_src,ipv6_dst,ipv6_label,nd_narget,nd_sll,nd_tll,tun_id,
regX
フロー作成時の注意
フローはロンゲストマッチする

単純にin_portとactionだけでフローを作成
しない

OVSの内部ポート番号は可変
フローのロンゲストマッチ
ovs-ofctl add-flow br0 in_port=4,priority=201,actions=drop

ovs-ofctl add-flow br0 in_port=4,dl_src=52:54:00:00:01:01,priority=202,actions=output:6

ovs-ofctl add-flow br0 in_port=4, dl_src=52:54:00:00:01:01,
priority=203,dl_dst=52:54:00:00:02:02,action=output:6




             このフローの場合、3 -> 2 -> 1->の順番で
             フローがヒットする 間違いでした

            Priorityが大きい方から評価されます

            Priorityを同じにした場合の評価は                                              です
ブロードキャストとマルチキャスト

ovs-ofctl add-flow br0 in_port=4,dl_src=52:54:00:00:01:01,priority=201,actions=output:
6,output8,output10




          outputで設定したポート全てに
             フレームがコピーされる


                                                 Open vSwitch
                           TAP4           TAP6                  TAP8        TAP10

                           VM             VM                    VM           VM
                       IP:192.0.2.1   IP:192.0.2.2        IP:192.0.2.3   IP:192.0.2.4
                          MAC: A         MAC: B              MAC: C         MAC: D
ユニキャストはMACアドレス指定で

ovs-ofctl add-flow br0 in_port=4, dl_src=52:54:00:00:01:01,
priority=202,dl_dst=52:54:00:00:02:02,actions=output:6

ovs-ofctl add-flow br0 in_port=4, dl_src=52:54:00:00:01:01,
priority=203,dl_dst=52:54:00:00:03:02,actions=output:8

ovs-ofctl add-flow br0 in_port=4, dl_src=52:54:00:00:01:01,
priority=204,dl_dst=52:54:00:00:04:02,actions=output:10




                                                 Open vSwitch
                           TAP4           TAP6                  TAP8        TAP10

                           VM             VM                    VM           VM
                       IP:192.0.2.1   IP:192.0.2.2        IP:192.0.2.3   IP:192.0.2.4
                          MAC: A         MAC: B              MAC: C         MAC: D
OVS内部ポート番号は可変
ovs-ofctl show br0
 3(port_Centos01_1): addr:fa:19:31:ca:2c:80
     config:     0
     state:      0
     current:    10MB-FD COPPER
 4(port_Centos01_2): addr:be:43:4b:d8:11:d4
     config:     0
     state:      0
     current:    10MB-FD COPPER
 5(port_Centos02_1): addr:8e:4c:67:8b:cd:8b
     config:     0
     state:      0
     current:    10MB-FD COPPER
 6(port_Centos02_2): addr:7a:08:1f:20:03:db
     config:     0
     state:      0
     current:    10MB-FD COPPER

       起動順に割り当てられるため一意の番号では
       ない
実際にフローを作ってみる
OVSに付属しているovs-ofctlコマンドでフローを
作成してます
インターネットのフロー
ovs-ofctl add-flow br0 in_port=2,priority=1,actions=drop

ovs-ofctl add-flow br0 in_port=2,priority=2,nw_src=224.0.0.0/4,actions=drop

ovs-ofctl add-flow br0
in_port=2,dl_src=52:54:00:00:01:01,priority=101,ip,nw_src=192.0.2.1,actions=normal

ovs-ofctl add-flow br0
in_port=2,dl_src=52:54:00:00:01:01,priority=102,arp,nw_src=192.0.2.1,actions=normal



       S-MACとS-IPを指定してフィルタ
       マルチキャストもフィルタ
       ブロードキャストはARPだけ
イントラネットのフロー
ovs-ofctl add-flow br0 in_port=4,priority=201,actions=drop

ovs-ofctl add-flow br0 in_port=4,dl_src=52:54:00:00:01:02,priority=202,actions=output:6

ovs-ofctl add-flow br0
in_port=4,dl_src=52:54:00:00:01:02,priority=203,dl_dst=52:54:00:00:02:02,action=output:6



       通信したい宛先のポートだけ指定する
       ブロードキャスト,マルチキャスト用のフロー
       を忘れずに
       ただしS-MACは指定する必要がある(後述)
イントラネットのフロー(GRE)
ovs-ofctl add-flow br0 in_port=4,priority=202,actions=output:2

ovs-ofctl add-flow br0 in_port=4,
dl_src=52:54:00:00:01:02,priority=204,dl_dst=52:54:00:00:03:02,actions=output:2



       GREのポート番号向けフローを作成
                                              L2スイッチ

                         ルーター                                  ルーター



                             NIC                                   NIC

                         Open vSwitch                          Open vSwitch
                   TAP                  TAP              TAP                  TAP

                   VM                   VM              VM                    VM
イントラネットのフロー(GRE)
ovs-ofctl add-flow br0 in_port=2,dl_src=52:54:00:00:01:02,priority=202,actions=output:4

ovs-ofctl add-flow br0
in_port=2,dl_src=52:54:00:00:01:02,priority=204,dl_dst=52:54:00:00:03:02,actions=output:4


       S-MACでテナントを分割(妥協)
                                              L2スイッチ

                         ルーター                                 ルーター



                             NIC                                  NIC

                         Open vSwitch                         Open vSwitch
                   TAP                  TAP             TAP                  TAP

                  VM                    VM              VM                   VM
GREトンネルの設定
ovs-vsctl add-port br0 gre0 -- set interface gre0 type=gre options:remote_ip=192.0.0.201




       Open vSwtichにIPアドレスをアサインしておく

                                                  L2スイッチ

                             ルーター                                         ルーター



                                 NIC                                          NIC
         192.0.2.201                                  192.0.0.201
                             Open vSwitch                                 Open vSwitch
                       TAP                  TAP                     TAP                  TAP

                       VM                   VM                      VM                   VM
まとめ
OVSはフローを(MACテーブル)をすべて書か
なくてはダメ
GREは便利に使えそう。OVSの台数が増えた時
の管理が課題
フローをテンプレート化すればオペレーショ
ンはかなり楽になりそう
ところで・・・


フローコントローラーとIaaSデータベースの連
携ってどうなんでしょう?
OpenStack???
検証VPS+の構成
                                         ルーター


                                        L2スイッチ


                         ルーター                       ルーター

192.0.2.0/24                                                            192.0.0.0/24
                             NIC                        NIC

                         Open vSwitch               Open vSwitch

               NIC NIC   NIC NIC   NIC NIC       NIC NIC      NIC NIC

                VM1       VM2           VM1       VM3          VM2
検証VPS+の構成

            ルーター                    ルーター




  NIC         NIC         NIC          NIC         NIC
192.0.2.1   192.0.2.2   192.0.0.4    192.0.2.3   192.0.0.3
  VM1         VM2         VM3           VM1        VM2
10.0.0.1    10.0.0.2    10.0.0.3      10.0.0.1   10.0.0.2
  NIC         NIC         NIC           NIC        NIC
OVSの内部ポートについて
OVSの内部ポート番号は可変

どうにか固定できませんか?

(どこかのコントローラは固定できるっ
ぽい?
(付録)L2スイッチの動作
     MACアドレステーブルの作成方法
フレームがポートに到着すると
 MACアドレスを学習する


                                                         MAC   ポート

    1     2    3      4    5      6    7      8   リスト1    A     1




  MAC:A       MAC:B       MAC:C       MAC:D
(付録)L2スイッチの動作
      フレームの転送
ブロードキャストやマルチキャスト、Unknownユニキャストは
    すべてのポートとにフレームがコピーされる


                                                          MAC   ポート

     1     2    3      4    5      6    7      8   リスト1    A     1




   MAC:A       MAC:B       MAC:C       MAC:D
(付録)L2スイッチの動作
      フレームの転送
宛先がMAC:BでMACアドレステーブルにリストがある場合、
      特定のポートにフレームを転送する


                                                          MAC   ポート

     1     2    3      4    5      6    7      8   リスト1    A     1

                                                   リスト2    B     3




   MAC:A       MAC:B       MAC:C       MAC:D

Openvswitch vps 20120429資料

Editor's Notes

  • #2 \n
  • #3 \n
  • #4 \n
  • #5 \n
  • #6 \n
  • #7 \n
  • #8 \n
  • #9 \n
  • #10 \n
  • #11 \n
  • #12 \n
  • #13 \n
  • #14 \n
  • #15 \n
  • #16 送信先を指定しない場合、すべてのポートにパケットがコピーされる\n
  • #17 送信先を指定しない場合、すべてのポートにパケットがコピーされる\n
  • #18 \n
  • #19 \n
  • #20 \n
  • #21 \n
  • #22 \n
  • #23 \n
  • #24 \n
  • #25 \n
  • #26 \n
  • #27 \n
  • #28 \n
  • #29 \n
  • #30 \n
  • #31 \n
  • #32 \n