送信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は一致しません。
考えられる代替案には、透明プロキシまたはリバースプロキシ設定が含まれます。