vSpehre(VMware ESXi)4.1でVyattaをほんのちょっと試してみた

以下、ありきたりのことしか書いていません。www.vyatta.com | Empowering SDNで手に入るQuickStartガイドのほうがずっと役立つので、そちらへどうぞ。
(追記)あと、Vyatta――クラウド時代の仮想ルータ活用術:導入編(1/2) − @ITとかもありますね。日本のユーザーグループもあるそうで。そっち先読めばよかったwww
Vyattaというのは、オープンソースのルータソフトウェアで、NIC2枚挿しのサーバをルータにするのに使える。まぁ、それだけならどうってことないのだけど、近年のプライベートクラウドというか物理サーバを仮想化して台数減らすとかいう流れに乗ってみたはいいけれど、もともとブレードシャーシに組み込みだったインテリジェントネットワークスイッチの仮想化をどうすべえと悩んでいたところで出会ったのがこれ。
VMwareの製品上では、単なるスイッチは用意されているけどルーティングやファイアウォールなどはアプライアンスまかせ。Vyattaもそういう製品を出しているけれども、オープンソース版もあるということで試す気になった。

デプロイ

最初、ベースOSにネットワークドライバというかgatedみたいなものをインストールする気でいたら、いきなりvSphere4(VMware ESX(i)4)用のOVFフォーマットのイメージ*1が用意されていて拍子抜け。
個人でvSphere4を実運用している人は少なかろうが、60日間のお試しでインストールしてあるマシンが手元にあったので、このOVFファイル(160MB程度)を取ってきてデプロイすれば終了。もともとcloud環境での用途が想定されているのだから、これがベストプラクティスだと思う。

起動してみる

まずはvSphere clientもしくはvCenterサーバから起動。NICに接続するネットワークの割り当てはVMware側で変更しておくこと。
初期状態ではsshhttpsGUIも使えないようになっているので、コンソールからログインしてネットワークの設定をしてみる。操作ログを残しておきたければ、scriptコマンドが使える。

$ script -f `date +%Y%m%d`.log 

たとえば、自分のネットワーク環境で192.168.0.0/24を使っていて、そこに10.0.0.0/8のネットワークをつなげたい場合、まず双方のネットワークに接続するには以下のようにするだろう。*2

$ configure
# set interfaces ethernet eth0 192.168.0.2/24
# set interfaces ehternet eth1 10.0.0.1/8
# commit
# save

ここまで実行すればVyattaのマシンから、どちらのネットワーク上のマシンへもpingが通るようにはなる。
ということは、コンソールではなくて、ネットワーク経由で設定ができるはず。
というわけで、GUI(HTTPS)とSSH(一応ポートをデフォルトの22から9022に変更してみる)が使えるようにする。
パスワードも変えたほうがいいだろう。

# set service https
# set service ssh port 9022
# set system login user vyatta authentication plaintext-password AACGGATTA$%~!_
# commit

saveのコマンドを実行しなければ、再起動時に設定が消えるのでご注意を。再起動にはshutdownコマンドが使えるので、root権限はほぼ必要ない。
この時点での設定をダンプしてみよう。

# show -all
 interfaces {
     ethernet eth0 {
         address 192.168.0.2/24
         duplex auto
         hw-id 00:xx:xx:xx:xx:xx
         smp_affinity auto
         speed auto
     }
     ethernet eth1 {
         address 10.0.0.1/8
         duplex auto
         hw-id 00:xx:xx:xx:xx:xy
         smp_affinity auto
         speed auto
     }
     loopback lo {
     }
 }
 service {
     https
     ssh {
         port 9022
         protocol-version v2
     }
 }
 system {
     host-name vyatta
     login {
         user vyatta {
             authentication {
                 encrypted-password ***************.
             }
             level admin
         }
     }
     ntp-server どこぞのNTPサーバー
     package {
         auto-sync 1
         repository community {
             components main
             distribution stable
             password ""
             url http://packages.vyatta.com/vyatta
             username ""
         }
     }
     syslog {
         global {
             facility all {
                 level notice
             }
             facility protocols {
                 level debug
             }
         }
     }
     time-zone GMT
 }
[edit]

タイムゾーンはいじりたいかな。*3syslogも外部に流したいが、後で試す。

ごく初歩的なrouting

これもQuick Startガイドそのまんま。
192.168.0.0/24のLANからのインターネットへのゲートウェイが192.168.0.1だったとして、10.0.0.0/8から192.168.0.0/24を経由してインターネットにつなぐには、最低限次のような設定が必要になる。(NATをするのは、もともとのLANのroutingをいじらないため)
ファイアウォールを設定しないとなんでも通ってしまうため、10.0.0.0/8側から発信した応答のみ通すような設定となっている。

# set system gateway-address 192.168.0.1
# set service nat rule 1 source address 10.0.0.0/8
# set service nat rule 1 outbound-interface eth0
# set service nat rule 1 type masquerade
# set firewall name ALLOW_ESTABLISHED
# set firewall name ALLOW_ESTABLISHED rule 1
# set firewall name ALLOW_ESTABLISHED rule 1 action accept
# set firewall name ALLOW_ESTABLISHED rule 1 state established enable
# set interfaces ethernet eth0 firewall in name ALLOW_ESTABLISHED
# set interfaces ethernet eth0 firewall local name ALLOW_ESTABLISHED
# commit
# save

これから試したいこと

  • NAT接続ではないroutingのテスト:2010/12/9追記:やってみた。問題なし。*4
  • VLANの扱い
  • むちゃくちゃたくさん、かつ、複雑なファイアウォールの設定
  • vSphere上の仮想的なネットワーク上でのスループットと、実際の物理NICを経由した場合の比較
  • 3つ以上のNICを接続した場合の動作:2010/12/9追記:問題なし*5
  • XenServerでの運用、、ってやるかなぁ...

自前でデータセンタを運営する気はないけれど、複数ネットワーク規模のテスト環境を構築したり、ブレードサーバの仮想化統合の仕事をする際にこれ使えると大変便利な気がする。デプロイについては、有償版だともっと楽(先に設定してから起動とか。実際にはファイルの差し替えだけだよな)だったりするんだろうか。

(追記)仮想化管理用ネットワークとの関係

2010/12/9追記:ちょびっと設定を足してみた

こんな感じ

  • NIC4枚づけ設定(smp_affinity autoはデフォルトかも)
  • NTPサーバー指定
  • Syslogを別サーバーに出力
 interfaces {
     ethernet eth0 {
         address 192.168.1.2/24
         duplex auto
         hw-id 00:01:23:45:67:05
         smp_affinity auto
         speed auto
     }
     ethernet eth1 {
         address 192.168.30.1/24
         duplex auto
         hw-id 00:01:23:45:67:0f
         smp_affinity auto
         speed auto
     }
     ethernet eth2 {
         address 192.168.40.1/24
         duplex auto
         hw-id 00:01:23:45:67:19
         smp_affinity auto
         speed auto
     }
     ethernet eth3 {
         address 192.168.50.1/24
         duplex auto
         hw-id 00:01:23:45:67:23
         smp_affinity auto
         speed auto
     }
     loopback lo {
     }
 }
 service {
     https
     ssh {
         port 9022
         protocol-version v2
     }
 }
: system {
     gateway-address 192.168.1.1
     host-name vyatta
     login {
         user vyatta {
             authentication {
                 encrypted-password **********************
                 plaintext-password ""
             }
             level admin
         }
     }
     name-server 192.168.1.1
     ntp-server 192.168.1.3
     package {
         auto-sync 1
         repository community {
             components main
             distribution stable
             password ""
             url http://packages.vyatta.com/vyatta
             username ""
         }
     }
     syslog {
         global {
             facility all {
                 level notice
             }
             facility protocols {
                 level debug
             }
         }
         host 192.168.1.85 {
             facility all {
                 level notice
             }
             facility local0 {
                 level info
             }
         }
     }
     time-zone Asia/Tokyo
 }

ルーティングを確認する場合は、一度configureのプロンプトをexitしてからshow ip routeコマンドが使える。

$ show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF,
       I - ISIS, B - BGP, > - selected route, * - FIB route

S>* 0.0.0.0/0 [1/0] via 192.168.1.1, eth0
C>* 192.168.50.0/24 is directly connected, eth3
C>* 127.0.0.0/8 is directly connected, lo
C>* 192.168.1.0/24 is directly connected, eth0
C>* 192.168.30.0/24 is directly connected, eth1
C>* 192.168.40.0/24 is directly connected, eth2

*1:Debianがベースだそう

*2:configureコマンド実行後はプロンプトが変化しているので注意。このモードを抜けるにはexitコマンドが使える

*3:set system time-zone と入力して、あとはTabキーをたたけばAsiaとかの大まかなゾーンの選択しが出てきて、そのあとまたTabをたたけばTokyoだのOsakaだのの選択肢が表示される。

*4:3つ以上のセグメントを接続して、その間で通信することは問題なかった。ただし、各セグメント上のホストのデフォルトゲートウェイの設定をよく確認しないと、問題の切り分けに悩むこともある。あくまでルーターなので、セグメントをつなげば通信できる。遮断する場合に明示的にファイアウォールのルールを指定することになる。

*5:4つNICを割り当ててみたが、問題なくできた。ただし、それぞれのNICについて、VMware側で割り当てたMACアドレスの昇順でeth0,eth1,eth2,,となるかどうかは保証されないようなので、一度割り当ててから、MACアドレスを/sbin/ifconfigコマンドなどで確認してから、明示的に "set interfaces ethernet ethx hw-id mac-addr" とかいう指定をする必要があるだろう。