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]
(中略) -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT -A FORWARD -m physdev --physdev-in eth1 -p icmp -j ACCEPT -A FORWARD -m physdev --physdev-in eth1 -m state --state NEW -p tcp --dport 22 -j ACCEPT -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT

なお、参考リンクにもあるのだが、fedora12でも、iptablesをbridgeで使用するために、事前に次の/procの設定を変更する必要があった。

# sysctl -w net.bridge.bridge-nf-call-iptables=1

他にip6tables, arptables用の設定もあったので、適宜修正する必要がありそうだ。

L2F/Wはセグメント分割無しでもパケットフィルタができるため、上手く使うと便利そうだ。ただ、元々セグメントはある程度意図を持って分割されているはずで、セグメント内でF/Wを使うと混乱を招くかもしれないが。。w