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가 일치하지 않습니다.

고려할 수 있는 대안에는 투명 프록시 또는 역방향 프록시 설정이 포함됩니다.

관련 정보