web-dev-qa-db-ja.com

NATプレルーティングテーブルでパケットを転送するときにパケットにマークを設定する方法

このようないくつかのポート転送ルールがあります

iptables -t nat -A PREROUTING -p tcp --dport 46000 -j DNAT --to-destination 172.16.8.2:46000
iptables -A FORWARD -p tcp -d 172.16.8.2 --dport 46000 -j ACCEPT

同じ転送ルールを2行ではなく1行で追加する方法があるので、同じデータを2回入力する必要はありません。私はこのようなルールを意味します:

  1. NAT PREROUTINGでは、パケットを宛先に転送してマークします
  2. フィルターFORWARDでは、ルール1を使用してマークされたすべてのパケットを許可します

出来ますか?

3
Poma

DNATごとに1つのコマンドだけでこれを実行することはできません–以下を参照しない限り...ただし、データを一度入力することは可能です。

DNATされて転送される接続のマーク範囲1024〜2047を定義しましょう。

マングル内の各DNAT一致条件を持つ1行:

iptables -t mangle -A PREROUTING -p tcp --dport 46000 -j MARK --set-mark 0x400
iptables -t mangle -A PREROUTING -p tcp --dport 46001 -j MARK --set-mark 0x401
iptables -t mangle -A PREROUTING -p tcp --dport 46002 -j MARK --set-mark 0x402

Natごとに1つのコマンド:

iptables -t nat -A PREROUTING -m mark --mark 0x400 -j DNAT \
  --to-destination 172.16.8.2:46000
iptables -t nat -A PREROUTING -m mark --mark 0x401 -j DNAT \
  --to-destination 172.16.8.2:46001
iptables -t nat -A PREROUTING -m mark --mark 0x402 -j DNAT \
  --to-destination 172.16.8.2:46002

フィルター内のすべてに対して1つのコマンド:

iptables -A FORWARD -m mark --mark 0x400/0x400 -j ACCEPT

ところで:変更されていない場合、-j DNATの宛先ポートを指定する必要はありません。

編集1:

接続を明示的に許可せずに行う場合、DNATされたすべてを許可することに問題がない場合は、これを行うことができます。その場合、あなたはあなたに固執するでしょう

iptables -t nat -A PREROUTING -p tcp --dport 46000 -j DNAT --to-destination 172.16.8.2:46000

ただし、すべてに対してFORWARDルールは1つしかありません。

iptables -A FORWARD -m conntrack --ctstate DNAT -j ACCEPT
3
Hauke Laging