LinuxでL2F/Wを作ってみた
筆者の環境では既にDMZ(192.168.251.0/24) と内部(192.168.1.0/24)の間にルーター型のF/Wを導入しているのだが、Layer2で導入できるF/Wも作り方を覚えておくと、ネットワーク構成に幅が出そうなので、今回構成してみた。
参考にしたリンクはこちらになる。
http://d.hatena.ne.jp/mdgw/20090103/1231011188
http://tldp.org/HOWTO/Ethernet-Bridge-netfilter-HOWTO-4.html
少々見づらいのだが、ネットワーク構成図はこんな感じになった。赤枠で囲んだ部分が今回追加した部分になる。fedora-virt5がメインの内部ルーター兼F/Wで、そこから、
br0x21=>fedora-virt8(L2F/W)=>br0x22=>fedora-virt9(端末)
のようにつないでいる。
L2F/Wとして使用するfedora-virt8には、Fedora12の64bit版を使用した。ネットワーク接続では、virt-managerから、br0x21, br0x22向けのNICを作成し、次のnetwork-scriptsによりブリッジとして構成した。
(ifcfg-br0) DEVICE=br0 ONBOOT=yes IPADDR=xxx NETMASK=xxx BOOTPROTO=static TYPE=Bridge (ifcfg-eth0) DEVICE=eth0 ONBOOT=yes HWADDR=xxx BRIDGE=br0 TYPE=Ethernet (ifcfg-eth1) DEVICE=eth1 ONBOOT=yes HWADDR=xxx BRIDGE=br0 TYPE=Ethernet
メインのルーターにはeth2 としてbr0x21向けのNICを追加し、fedora-virt8と通信できるようにした。
※ なお、当初こちらのeth2には、eth0を接続しているセグメントと同一セグメントのIPを振ろうとした(つまり、eth0, eth2 は内部的にブリッジ接続のようになる) のだが、この構成はeth2側にARPを返してくれず、上手くいかなかった。回避策として、急遽eth2を192.168.21.0/24のセグメントのルーターとして動作するように構成し、上手く動かすことができた。 同一セグメントのスイッチとして動かすには、fedora-virt5自身もbr0などをもつ必要がありそうだ。。
この状態で、fedora-virt8上のiptablesを使い、fedora-virt5とfedora-virt9の通信をブロックしたのだが、通常のルーター型F/Wと違い、
-A FORWARD -i eth0 -j LOG
などにはパケットがマッチせず、次のようにphysdevモジュール(bridgeで使うためのモジュール)を使用する必要があった。
-A FORWARD -m physdev –physdev-in eth0 -j LOG
physdevモジュールを使う上の設定だと、下記のようなステートフルF/Wとしての設定も上手く動作していた。(fedora-virt9からsshのみが通るようになっていたので、多分大丈夫。。)
- FORWARD DROP [0
- 0]
なお、参考リンクにもあるのだが、fedora12でも、iptablesをbridgeで使用するために、事前に次の/procの設定を変更する必要があった。
# sysctl -w net.bridge.bridge-nf-call-iptables=1
他にip6tables, arptables用の設定もあったので、適宜修正する必要がありそうだ。
L2F/Wはセグメント分割無しでもパケットフィルタができるため、上手く使うと便利そうだ。ただ、元々セグメントはある程度意図を持って分割されているはずで、セグメント内でF/Wを使うと混乱を招くかもしれないが。。w