KVM&Open vswitchでVPSを
作ってみる
         Twitter @mamesan
自己紹介
某NIに勤務していました

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

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

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

OSも結構選べてすぐ使える!
某社さんは言っていた
 ハイパーバイザーはKVM
 仮想スイッチはOpen vSwtich
   OSS!家で再現できるかも?
   作ってみよう!
インストール
Open vSwtichをもってくる
                                    VM VM VM VM
http://openvswitch.org/              TAP   TAP         TAP   TAP

                                           Open vSwitch

   RPMないけどSPECあります。                              NIC


   rpmbuildすれば管理も楽!
   まだ作成途中ですがWikiもあります
   http://www57.atwiki.jp/openvswitch/
仮想サーバへの仮想のNICアサイン
       qemu-kvmで普通にVMを作ります。
       作成するときにVlanをアサインしてください
/usr/libexec/qemu-kvm -daemonize -M rhel6.0.0 -cpu qemu64 -enable-kvm -m 2048 -smp
1,sockets=1,cores=1,threads=1 -name Centos01 -rtc base=utc -cdrom CentOS-6.2-x86_64-bin-
DVD1.iso -hda vm0001.img -boot order=cd -net
nic,vlan=101,macaddr=52:54:00:00:01:01,model=virtio,name=nc1 -net
tap,vlan=101,ifname=port_Centos01_1,script=/etc/ovs-ifup-br0,downscript=/etc/ovs-ifdown-br0 -
monitor telnet::10001,server,nowait -vnc :1 -k ja -vga cirrus -serial pty -parallel none -
monitor pty


       この状態でovsにTAPが作成され、VMに仮想NICが
       アサインされます。ただし、ovsにはVLANがア
       サインされていません。
仮想NICへのVLANアサイン
       ovs-vsctlコマンドでTAPにVLANをアサインします
/usr/bin/ovs-vsctl set port port_Centos01_1 tag=101



       確認コマンド
ovs-vsctl show
69589346-879f-4ff5-b69d-d9b3453c8531
    Bridge "br0"
        Port "port_Centos01_1"
            tag: 101
            Interface "port_Centos01_1"
        Port "eth0"
            Interface "eth0"
        Port "br0"
            Interface "br0"
                 type: internal



注意: TAP名は自由に決められますが「-」や「*」など使用不可の文字があります。
仮想OSでできること
仮想OSはrootが使える。ってことは?

 IPアドレスやMACアドレスの変更は自由

 vrrpdなどのプログラムも実行したい放題

   これはまずい!
仮想スイッチの要件
IPアドレスやMACアドレスなりすまし対策

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

通信プログラム対策

 vrrpdやospfdなどはトラブルのもとになる
 ので通信させない
フィルタの作成
       OVS内蔵のOpenFlowコントローラを利用
                     ovs-ofctlコマンドでフローを作成
ovs-ofctl add-flow br0 in_port=2,priority=0,actions=drop

ovs-ofctl add-flow br0 in_port=2,priority=0,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=100,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=100,arp,nw_src=192.0.2.1,actions=normal

注意: in_port=の数字は可変です。仮想ポート(TAP)ごとに1から順に採番されますovs-ofctl show で

   確認できます。

     : Priorityを入れないとFlowは登録されますが、効きませんでした
確認コマンド
       Flowテーブルの確認
                     ovs-ofctl dump-flows br0
ovs-ofctl dump-flows br0

NXST_FLOW reply (xid=0x4):

 cookie=0x0, duration=65.37s, table=0, n_packets=17, n_bytes=1266, priority=0,in_port=2
actions=drop

 cookie=0x0, duration=65.363s, table=0, n_packets=4, n_bytes=240,
priority=100,arp,in_port=2,dl_src=52:54:00:00:01:01,nw_src=10.0.1.1 actions=NORMAL

 cookie=0x0, duration=65.365s, table=0, n_packets=11, n_bytes=1098,
priority=100,ip,in_port=2,dl_src=52:54:00:00:01:01,nw_src=10.0.1.1 actions=NORMAL

 cookie=0x0, duration=65.367s, table=0, n_packets=0, n_bytes=0,
priority=0,ip,in_port=2,nw_dst=224.0.0.0/4 actions=drop

 cookie=0x0, duration=93343.255s, table=0, n_packets=186, n_bytes=16490, priority=0
actions=NORMAL
家VPS構成
    ルーター
       10.0.1.0/24∼10.0.10.0/24
          NIC

      Open vSwitch

        KVM

          NIC
                     192.168.1.0/24
    管理用スイッチ
デモ
 OSを立ち上げてとりあえず通信

 IPアドレスを変更してみる

 MACアドレスを変更してみる
はまったこと

物理NICに出ていくときにエラー
ググッても出てこない変なエラー!NICドライバの相性?でした。Intel
にしたら解決!HP NIC・・・


qemuのvlanとOVSのvlanは両方設定
qemuでVM作ったあとに、OVSにもちゃんとVLANの割り当てが必要。
今後の予定
WEB画面からVMを作成/削除できるようにする
  PHPとDBで作成中


複数のOVS間でトンネルを作成し、L3経由のL2
通信をさせる
OVSのFlow管理がめんどうになりそうなので、
コントローラを利用する

OpenvswitchでVPS