IPTables ルールは両方のインターフェイスに適用されません。

IPTables ルールは両方のインターフェイスに適用されません。

IPtablesを使用していますが、質問がありますが、答えが見つかりませんでした。 nat テーブルの PREROUTING セクションにルールを適用したいと思います。ルールはチェーンに対して実行する必要がありますが、2つを除くすべてのインターフェイスに対してルールを実行したいです。名前に関係なく他のすべてのインターフェースが必要なので、ワイルドカードを使用することはできません(できないと仮定)。

私は次の規則を適用しました。

iptables -t nat -A PREROUTING -j my_chain ! -i eth0

結果は次のとおりです。

Chain PREROUTING (policy ACCEPT 19 packets, 3008 bytes)
pkts bytes target     prot opt in     out     source       destination
10   1538  my_chain   all  -- !eth0   *       0.0.0.0/0    0.0.0.0/0

しかし、次のようなものが必要です。

Chain PREROUTING (policy ACCEPT 19 packets, 3008 bytes)
pkts bytes target     prot opt in               out     source      destination
10   1538  my_chain   all  -- !(eth0 or tun0)   *       0.0.0.0/0   0.0.0.0/0

問題は、2つのインターフェイスの1つが異なるインターフェイスのルールに属するため、2つの異なるルールに含めることができないことです。私も同様のことを試しました。

iptables -t nat -A PREROUTING -j my_chain ! -i eth0 ! -i tun0

しかし、次のように返されます。multiple -i flags not allowed

or!eth0 and !tun0デフォルトでは、インタフェース条件付きまたは(論理的に同等の)実装方法が必要です。

私はDebianとiptables v1.4.21を使用しています。

ご協力ありがとうございます!

ベストアンサー1

問題を解決するにはこれを覚えておく必要があります。iptablesルールは順番に適用されます(適用されると確認された場合、そのパケットはチェーンから削除され、同じチェーン内の次のルールはスキップされます)。そして新しいチェーンを作成できるので、2つの新しいチェーンを定義しましょう。

 iptables -N chain1
 iptables -N chain2

これでパケットを送信します。Tun0そしてイーサネット0到着チェーン1その他チェーン2:

 iptables -t nat -A PREROUTING -i tun0 -j chain1
 iptables -t nat -A PREROUTING -i eth0 -j chain1
 iptables -t nat -A PREROUTING -j chain2 

これで、2つのチェーンに別々にルールを割り当てることができます。たとえば、すべてのチェーンを削除します。チェーン2しかし上にはないチェーン1

iptables -A chain1 -j ACCEPT
iptables -A chain2 -j DROP

このトリックを使用すると、ブール値OR(パケットが通過する場合)と同じルールを設定できます。イーサネット0 または渡すTun0そしてそれから...ブールANDは実装しやすいので(例えば、何かを通過した場合)イーサネット0 そして8.8.8.8になる予定なら...

 iptables -t nat -A PREROUTING -i eth0 -d 8.8.8.8 ....

)、あなたは両方持っていますまたはそしてそしてブール論理で真理値表を作成できる接続。

おすすめ記事