グローバルなネットワークにつながったホスト上に、KVM で複数の VM を動かしているが、インターネットにそのまま晒すのは心許ないので VyOS を用いて透過 FW を構築する。
VyOS とは Vyatta からフォークしたオープンソースのソフトウェアルータのこと。
前提
- ホストの OS は Ubuntu Server 12.04.4 LTS を使う
- VyOS には IP アドレスを振らず、透過 FW にする
構成図
構成図を次に示す。
このように、ブリッジ br1
と vybr0
を VyOS でつなぎ、そこに透過 FW を設定する。ゲスト OS は vybr0
に接続する。
手順
ブリッジの設定
まずはホスト OS でブリッジの設定をする。
必要なパッケージを入れる。
$ sudo apt-get install bridge-utils
VyOS 用の仮想ブリッジ vybr0
を追加する。
$ sudo brctl addbr vybr0
$ sudo ip link set dev vybr0 up
/etc/network/interfaces
を編集して、ブリッジの設定をする。
auto eth1
iface eth1 inet manual
auto br1
iface br1 inet manual
bridge_ports eth1
auto vybr0
iface vybr0 inet manual
pre-up brctl addbr $IFACE
post-down brctl delbr $IFACE
up ip link set dev $IFACE up
down ip link set dev $IFACE down
ネットワークを再起動する。
$ sudo service networking restart
設定されたか確認する。
$ brctl show
bridge name bridge id STP enabled interfaces
br1 8000.e41f138066bc no eth1
vybr0 8000.fe54006edfa5 no
virsh にブリッジを追加
追加した各ブリッジを libvirt で使えるようにする。
XML の設定ファイルを作成する。
$ sudo $EDITOR /var/lib/libvirt/network/br1.xml
<network>
<name>br1</name>
<forward mode='bridge'/>
<bridge name='br1' />
</network>
$ sudo $EDITOR /var/lib/libvirt/network/vybr0.xml
<network>
<name>vybr0</name>
<forward mode='bridge'/>
<bridge name='vybr0' />
</network>
libvirt に追加する。
$ sudo virsh net-define /var/lib/libvirt/network/br1.xml
$ sudo virsh net-define /var/lib/libvirt/network/vybr0.xml
$ sudo virsh net-autostart br1
$ sudo virsh net-autostart vybr0
追加されたか確認する。
$ sudo virsh net-list
Name State Autostart
-----------------------------------------
br1 active yes
vybr0 active yes
VyOS のインストール
KVM のゲストとして VyOS をインストールする。VM の NIC には br1
と vybr0
の2つをつないでおく。
iso イメージはミラーサイトから入手できる。インストールも特に難しいことはなく、iso から起動して次のコマンドを実行し、あとは指示に従って適宜設定していけば良い。
$ install image
以降 VyOS は libvirt の console からいじることにする。ログインした直後は操作モードになっているので、設定モードに切り替える。
$ configure
#
もしネットワーク越しに設定したければ、新しい NIC を追加してホストのプライベート側のブリッジとつなぎ、IP アドレスを振って sshd を有効化しておけば良い。
# set interface ethernet eth2 address <IP_ADDRESS/MASK>
# set service ssh
ブリッジの設定
VyOS が用意できたので設定していく。
ブリッジを作成する。
# set interfaces bridge br0
ホストの vybr0
につながった eth0
と、ホストの br1
につながった eth1
をブリッジに接続する。
# set interfaces ethernet eth0 bridge-group bridge br0
# set interfaces ethernet eth1 bridge-group bridge br0
設定を反映させる。
# commit
# save
設定モードを抜けて、設定内容を確認する。
# exit
$ show bridge
bridge name bridge id STP enabled interfaces
br0 0000.5254001f8d44 no eth0
eth1
これでとりあえずホストの vybr0
と eth0
間が通信できるようになる。
透過ファイアウォールの設定
ブリッジに対してルールを設定していく。VyOS には iptables で言うところの physdev 相当の機能がないようで、パケットの流入元デバイスを区別できないので、主に送信元 IP アドレスに基いてルールを作成する。
まず新しいルール名を作成して br0
に適用する。
$ configure
# set firewall name L2FW default-action drop
# set interfaces bridge br0 firewall in name L2FW
自ネットワークを定義する。
# set firewall group network-group DMZ-NET network 203.0.113.0/24
出のパケットは許可する。
# set firewall name L2FW rule 100 action accept
# set firewall name L2FW rule 100 source group network-group DMZ-NET
返ってきたパケットは許可する。
# set firewall name L2FW rule 110 action accept
# set firewall name L2FW rule 110 state established enable
# set firewall name L2FW rule 110 state related enable
# set firewall name L2FW rule 110 destination group network-group DMZ-NET
あとは必要に応じて、入のルールに穴を開けていく。
最後に設定を保存する。
# commit
# save
これで他の VM にファイアウォールをかけられるようになった。
参考ページ
- ユーザーガイド – VyOS jp
- Networking – libvirt: Wiki
- Vyatta で作る Transparent FireWall その2/n – SawanoBlog 2G
コメント