KVM&Open vswitchでVPSを 作ってみる Twitter @mamesan
KVM&Open vswitchでVPSを作ってみる
Twitter @mamesan
某NIに勤務していました
主にC社のRouterやSwitchなどを使ってお客様ネットワークの設計構築してました。
Twitter @ mamesan
自己紹介
rootがもらえるレンタルサーバーです。
さんなどがサービスしています
OSも結構選べてすぐ使える!
VPSってなに?
某社さんは言っていたハイパーバイザーはKVM
仮想スイッチはOpen vSwtich
OSS!家で再現できるかも?作ってみよう!
インストールOpen vSwtichをもってくるhttp://openvswitch.org/
RPMないけどSPECあります。rpmbuildすれば管理も楽!まだ作成途中ですがWikiもありますhttp://www57.atwiki.jp/openvswitch/
Open vSwitch
NIC
TAP
VMTAP
VMTAP
VMTAP
VM
仮想サーバへの仮想の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 show69589346-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構成ルーター
KVM
NIC
NIC
Open vSwitch
管理用スイッチ
10.0.1.0/24~10.0.10.0/24
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管理がめんどうになりそうなので、コントローラを利用する