CentOS7でbridgeしたパケットをフィルタリング(iptables)

我が家のネットワークでは、iptablesサーバからフォワードしてWebサーバに接続するようにしているんですが
いつの間にかiptablesのFORWARDチェーンが働いてませんでした。
具体的にはDROPするように設定したIPアドレスからガンガンアクセスしてました。

# iptables -nvxL

上記のコマンドを実行すると、iptablesで設定した各ルール毎に該当したパケットがカウントされている筈だったんですが
FORWARDチェーンだけが全て0になってました。

色々と調べてみたところ、br_netfilterモジュールをロードしていなかったせいで
bridgeしたインターフェースのパケットをフィルタリングしてませんでした。

# cat /var/log/messages
May  1 10:00:01 HOGE kernel: bridge: automatic filtering via arp/ip/ip6tables has been deprecated. Update your scripts to load br_netfilter
# lsmod |grep br_netfilter
br_netfilter           22248  0
bridge                107106  1 br_netfilter

本来なら、ロードしたモジュールからbr_netfilterが出てくるはずなんですがありませんでした。

手動でbr_netfilterをロードさせて、bridgeしたパケットをフィルタリングできるようにします

# modprobe br_netfilter

OS起動時、自動でbr_netfilterモジュールをロードするようにします

# vi /etc/sysconfig/modules/br_netfilter.modules
以下を記入
#!/bin/sh
/sbin/modprobe br_netfilter >/dev/null 2>&1

パーミッションを変更します

# chmod 755 /etc/sysconfig/modules/br_netfilter.modules

上記で復旧している筈ですが、下記でカーネルパラメータの状態を確認します

# sysctl -a |grep net.bridge.bridge-nf-call
net.bridge.bridge-nf-call-arptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1

値が”0″になっている時は下記のコマンドを実行します。

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

また、念のために起動時のカーネルパラメータの設定を確認します

# cat /usr/lib/sysctl.d/00-system.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-arptables = 1

上記で値が”1″に設定されていることを確認します。そもそも記入がない場合とかは追加します。

==============================================================================================
全然気づかなかった・・・・。
たぶんkernelをアップデートした時に設定が消えてしまったんだろうなぁ。