作業ログ源泉垂れ流し

しがないIT技術者の作業ログを垂れ流す

nftablesでブリッジにフィルタ設定

前回はVMごとにネットワークフィルタを設定したが、共通のフィルタはホスト環境で設定した方が間違いがない。
そこで、ホスト環境のネットワークインタフェースに接続したブリッジに対してnftablesでフィルタを設定してみる。

ここでは、ホスト環境のネットワークインタフェースenp1s0に接続されたブリッジに対してフィルタを設定する。

まずはnftで手動で設定してみる。
bridge filterテーブルとfowardチェインを(なければ)作る。

# nft add table bridge filter
# nft add chain bridge filter forward '{type filter hook forward priority filter; policy accept; }'

次にルールを設定する。
ここでは、VMから x.y.z.0/24 への通信を禁止してみる。

# nft add rule bridge filter ct state established,related accept
# nft add rule bridge filter oif "enp1s0" ip daddr x.y.z.0/24 counter drop

VM内部からx.y.z.0/24にpingを打っても返ってこない。 なお、先に x.y.z.0/24 のどこかにpingを打って返ってくることを確認してある。

nftでも確認する。

# nft list ruleset bridge
table bridge filter {
    chain forward {
        type filter hook forward priority filter; policy accept;
        ct state established,related accept
        oif "enp1s0" ip daddr x.y.z.0/24 counter packets 3 bytes 252 drop
    }
}

確かにdropルールに引っ掛かっている。

手動で設定したフィルタを永続化する。

# cat <<EOF >> /etc/nftables.conf
table bridge filter {
    chain forward {
        type filter hook forward priority filter; policy accept;
        ct state established,related accept
        oif "enp1s0" ip daddr x.y.z.0/24 counter drop
    }
}

なお/etc/nftables.confDebian系の場合。

設定を反映する。

# systemctl restart nftables
# nft list ruleset bridge
table bridge filter {
    chain forward {
        type filter hook forward priority filter; policy accept;
        ct state established,related accept
        oif "enp1s0" ip daddr x.y.z.0/24 counter packets 0 bytes 0 drop
    }
}

nftablesを使ってホストブリッジにフィルタを設定できた!