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 ....
)、あなたは両方持っていますまたはそしてそしてブール論理で真理値表を作成できる接続。