DNAt はタグ付きパケットでは機能しません。

DNAt はタグ付きパケットでは機能しません。

送信httpトラフィックを検出し、iptables文字列モジュールを介してホストに転送しようとしています。

iptables -A PREROUTING -t mangle -j CONNMARK --restore-mark
iptables -A PREROUTING -t mangle -p tcp    \
  -m string --string "GET" --algo kmp \
  -m mark --mark 0x0 -j CONNMARK --set-mark 0x55
iptables -A PREROUTING -t mangle -j CONNMARK --save-mark

iptables -A PREROUTING -t nat -p tcp -m connmark --mark 0x55 -j DNAT --to-destination 10.10.10.10:80

iptables -L -v -t mangle - 行番号

Chain PREROUTING (policy ACCEPT 2469 packets, 2078K bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1     2469 2078K CONNMARK   all  --  any    any     anywhere             anywhere             CONNMARK restore
2        1   186 CONNMARK   tcp  --  any    any     anywhere             anywhere             STRING match  "GET" ALGO name kmp TO 65535 mark match 0x0 CONNMARK set 0x55
3     2469 2078K CONNMARK   all  --  any    any     anywhere             anywhere             CONNMARK save

マングルテーブルのパケット数が増加します。ただし、DNATの数は0です。

iptables -L -v -t nat -- 行番号

iptables -L -v -t nat --line-numbers
Chain PREROUTING (policy ACCEPT 306 packets, 61227 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 DNAT       tcp  --  any    any     anywhere             anywhere             connmark match  0x55 to:10.10.10.10:80

このルールに問題がありますか?

すべてのチェーンを許可

-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT

答え1

TCP接続内の項目を一致させようとしているため、接続がすでに確立されているため機能しません。ただし、接続が確立される前にDNATを実行する必要があるため、DNATを実行するには遅すぎます。

したがって、新しい接続を確立するパケットだけが実際に「nat」テーブルによって処理されます。後続のすべてのパケットは、最初のパケット中に設定された同じSNAT / DNAT / etcポリシーを使用して自動的に処理されます。

したがって、最初のパケットが接続されると(テキストデータが含まれていない)、文字列一致フラグがまだ設定されていないため、DNATは一致しません。

考えられる代替案には、透明プロキシまたはリバースプロキシ設定が含まれます。

関連情報