내가 이루고 싶은 것
CentOS(6.8) 상자 1.1.1.1과 원격 오징어 프록시 서버 2.2.2.2가 있습니다.
curl http://google.com -x 2.2.2.2:3128
http_proxy
HTTP 프록시 옵션 없이 변수(예: telegraf)를 고려하지 않고 애플리케이션의 결과를 시뮬레이션하려고 합니다.
내가 지금까지 시도한 것
트래픽을 프록시로 전달하기 위해 iptables 규칙을 설정해 보았습니다.
iptables -t nat -A PREROUTING -i eth0 ! -s 2.2.2.2 -p tcp --dport 80 -j DNAT --to 2.2.2.2:3128
iptables -t nat -A POSTROUTING -o eth0 -s 1.1.1.1 -d 2.2.2.2 -j SNAT --to 1.1.1.1
iptables -A FORWARD -s 1.1.1.1 -d 2.2.2.2 -i eth0 -o eth0 -p tcp --dport 3128 -j ACCEPT
그런 다음 원격 장치로 트래픽을 보내면 반환 트래픽이 제대로 라우팅되지 않기 때문에 DNAT가 제대로 작동하지 않는다는 것을 발견했습니다. 이를 기반으로 애플리케이션을 CentOS 시스템(172.17.0.9)의 docker 컨테이너로 이동하고 호스트 시스템에서 iptables 구성을 유지하여 iptables 구성을 수정하려고 계획했습니다.
iptables -t nat -A PREROUTING -i eth0 ! -s 2.2.2.2 -p tcp --dport 80 -j DNAT --to 2.2.2.2:3128
iptables -t nat -A POSTROUTING -o eth0 -s 172.17.0.0/16 -d 2.2.2.2 -j SNAT --to 1.1.1.1
iptables -A FORWARD -s 172.17.0.0/16 -d 2.2.2.2 -i eth0 -o eth0 -p tcp --dport 3128 -j ACCEPT
또한 다음 규칙 세트를 시도했습니다.
iptables -t nat -A PREROUTING -i eth0 -s 172.17.0.0/16 -p tcp --dport 80 -j DNAT --to-destination 2.2.2.2:3128
iptables -t nat -A POSTROUTING -o eth0 -d 2.2.2.2/32 -j MASQUERADE
이 두 규칙 세트의 결과는 http 트래픽이 여전히 프록시를 통하지 않고 대상에 직접 도달하려고 시도한다는 것입니다.
[root@host ~]# tcpdump -nnn host 216.58.201.35
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
15:26:24.536668 IP 1.1.1.1.38566 > 216.58.201.35.80: Flags [S], seq 3885286223, win 14600, options [mss 1460,sackOK,TS val 2161333858 ecr 0,nop,wscale 9], length 0
Docker 컨테이너의 기본 게이트웨이가 호스트로 올바르게 설정되어 있고 호스트에서 IP 전달이 활성화되어 있습니다.
[root@docker /]# ip route
default via 172.17.0.1 dev eth0
[root@host ~]# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
여기서 분명한 것을 놓치고 있습니까?
답변1
해결하다
iptables 규칙 세트를 사용하십시오.
-A PREROUTING -p tcp -m tcp --dport 80 -j DNAT --to-destination 2.2.2.2:3128
-A POSTROUTING -s 172.17.0.0/16 -j SNAT --to-source 1.1.1.1
이는 인터페이스가 잘못 설정되었기 때문인 것 같습니다(docker0이어야 함). iptables 규칙에서 인터페이스 플래그를 제거하고 이제 정상적으로 작동합니다.
답변2
DNAT는 현재 Squid 버전에서는 작동하지 않습니다.
다음 오류가 발생합니다.
TCP_MISS/403 ... ORIGINAL_DST/<proxy-ip>
WARNING: Forwarding loop detected for...
NAT 구성은 오징어 상자에 사용될 때만 작동합니다. 이는 정확하고 안전하게 차단을 수행하는 데 필요합니다. 별도의 오징어 상자에 있는 게이트웨이 시스템의 트래픽을 가로채서 전달하려면 정책 라우팅을 사용하십시오.
원천:https://wiki.squid-cache.org/ConfigExamples/Intercept/AtSource#outline
가능한 해결책은 다음과 같습니다: