Linux ブリッジで NFT を使用して特定の IP アドレスへのアクセスをブロックするにはどうすればよいですか?

Linux ブリッジで NFT を使用して特定の IP アドレスへのアクセスをブロックするにはどうすればよいですか?

ブリッジがbr0定義された Ubuntu ボックスがあります。ブリッジはeth0インターネット サービスに接続され、 PC のネットワーク ポートに接続されています。ブリッジは期待どおりに機能し、とeth1の間のすべてのトラフィックを渡します。eth0eth1

PC から特定の外部 IP アドレス (例: 1.1.1.1) へのアクセスをブロックするルールを設定したいと考えています。nftこれがその方法だと思います。1.1.1.1 との間で何も通過できないようにするには、どのようにルールを作成すればよいでしょうかbr0

ここでの目的は、テストのために特定の障害をシミュレートできるようにすることです。

答え1

これは、nftables'ブリッジファミリー

nftablesブリッジファミリーを代替として提供するebtables

テーブルを作成する家族:

# nft add table bridge t

転送されたフレームをフィルタリングするチェーンを作成します。

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

IPパケットをブロックするルールを作成するeth11.1.1.1 に到達するには:

# nft add rule bridge t c iif eth1 ether type ip ip daddr 1.1.1.1 drop

ステートレス ファイアウォールについては以上です。


以来Linuxカーネル5.3 nftablesまた、直接ステートフルファイアウォールもサポートしています。パス:

ブリッジのネイティブ接続追跡サポートを追加します。このパッチセットの前は、ステートフル フィルタリングを行う唯一の方法はbr_netfilterエミュレーション レイヤーを使用することでしたが、これはエミュレーション レイヤーを廃止するための一歩です [...]

これにより、システムを単一方向に簡単に分離できます。たとえば、次のことが可能になります。

  • SSHによるPCへの着信アクセス
  • PCからの発信アクセス: 使用するPCピンおよびDNS(th以下は両方を表しますTCP/IP のそしてudp
  • ARP(これがなければ IPv4 接続は不可能)
  • 必要なものすべて返信トラフィック(パフォーマンス上の理由からの最初のルールとして)
  • 何もありません

次のように使用できます。

# nft add rule bridge t c ct state related,established accept
# nft add rule bridge t c oif eth1 ether type ip tcp dport 22 accept
# nft add rule bridge t c iif eth1 ether type ip meta l4proto {tcp, udp} th dport 53 accept
# nft add rule bridge t c iif eth1 ether type ip icmp type echo-request accept
# nft add rule bridge t c ether type arp accept
# nft add rule bridge t c drop

確かにいくつかの因数分解は可能であり、考慮されるべきである(例えば、集合と連結)。


上記の例はすべて、Ubuntuボックス自体には影響しません。Ubuntuボックスは、依然として双方からアクセス可能であり、アクセスされる可能性があります。PCからUbuntuボックスへのトラフィック(またはUbuntuボックスからPCへのトラフィック)に影響を与えるには、同じ種類のルールをチェーンフックで実行できます。入力(それぞれ出力) の代わりにフォワード


注記:

br_netfilterモジュールはロードしないでください(sysctlプロパティをデフォルトで有効にしますnet.bridge.bridge-nf-call-iptables = 1)。これにより、ネイティブモジュールとルールとip家族のルールも影響するnftables同様にiptablesつまりbr_netfilter同じシステム上でDockerまたはKubernetes(の2つの通常のユーザー)を実行することは避けるべきである。ネットワーク実験を行う際には(ただし、追加の注意を払えば、例えば、このUL SE Q/A)。

br_netfilter(および)をロードするとnet.bridge.bridge-nf-call-iptables = 1、通常の操作方法はフィルタリングであると誤解することになります。ip家族のフィルター/フォワードフック。これは通常のケースではなく、nftablesこれを利用した追加機能が欠けている。iptables'physdevマッチモジュール: 代わりに、目標は常にこれをネイティブに行うことでした家族に頼らないbr_netfilter

答え2

Linux ホストがルーターとして実行されている場合は、ip_forwarding も設定する必要があります。

質問に答えるには、次のように nftables を使用できます。

#!/usr/bin/nft 

flush ruleset

table inet my_table {
   chain INPUT {
      iifname br0 saddr 1.1.1.1 drop
      iifname br0 daddr 1.1.1.1 drop
   }

chain FORWARD {
      iifname br0 saddr 1.1.1.1 drop
      iifname br0 daddr 1.1.1.1 drop
   } 

}

これをnft -f /path/to/your/nft.fileで実行します。

ただし、これはあまり役に立ちません (nftables を学習中であることは承知していますが、あまり深刻に受け止めないでください)。ベスト プラクティスは、すべてをドロップして必要なものだけを許可することです。つまり、特定のトラフィックをドロップするのではなく、特定のトラフィックを許可します。

私は、Red Hat 8 のドキュメントが nftables に非常に役立つと感じました。おそらく、あなたも私と同じようにそこから多くのことを学べるでしょう。

rhel 8 nftables ドキュメント

関連情報