클라이언트의 원래 IP 주소를 유지하면서 한 서버에서 다른 서버로("프록시로") 패킷을 전달해야 합니다. 토폴로지는 다음과 같습니다. XXXX - 공용 IP1("프록시 서버") YYYY - 공용 IP2(가상화 호스트) 172.16.0.2 - 개인 IP(웹 서버가 있는 가상 머신)
some public IP ---> X.X.X.X ---> Y.Y.Y.Y ---> 172.16.0.2 (web server)
XXXX 및 YYYY 전달이 활성화된 시스템에서.
XXXX를 통한 특정 공용 IP의 트래픽은 XXXX의 YYYY로 라우팅되지만 거기에는 도달하지 않습니다. tcpdump를 사용하여 캡처했습니다. "프록시 서버"에서 가장을 사용하면 제대로 작동하지만 원래 IP 주소는 유지되지 않습니다. YYYY에서 172.16.0.2까지만 포트 80에 DNAT를 사용하고 iptables -t nat -A PREROUTING -d Y.Y.Y.Y/32 -i venet0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.16.0.2:80
YYYY:80을 시도하면 제대로 작동합니다. 문제는 공용 IP XXXX를 사용하는 "프록시 서버"에서 발생할 가능성이 높습니다.
"프록시 서버" 호스트 IP XXXX
인터넷에 연결하기 위한 인터페이스는 eth0 하나만 있습니다.
iptables 규칙: (필터 테이블에서 전달 허용)
iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 443 -j DNAT --to-destination Y.Y.Y.Y:443
라우팅 테이블: 기본 테이블을 사용합니다.
default via X.X.X.1 dev eth0 onlink
호스트 IP YYYY
인터넷에 연결하기 위한 인터페이스는 venet0 하나만 있습니다. VM의 경우 Qemu 및 인터페이스 br0을 사용합니다.
iptables 규칙: (필터 테이블에서 전달 허용)
iptables -t nat -A PREROUTING -d Y.Y.Y.Y/32 -i venet0 -p tcp -m tcp --dport 443 -j DNAT --to-destination 172.16.0.2:443
iptables -t nat -A POSTROUTING -s 172.16.0.0/24 ! -o br0 -j MASQUERADE
라우팅 테이블: 기본 테이블을 사용합니다.
default via 255.255.255.254 dev venet0
호스트 IP 172.16.0.2
인터넷에 대한 인터페이스는 ens6 라우팅 테이블 하나만 있습니다. 기본 테이블을 사용합니다.
default via 172.16.0.1 dev ens6 proto static
gapsf가 답변한 iptables 규칙에 따르면:
XXXX iptables 규칙:
iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 443 -j DNAT --to-destination Y.Y.Y.Y
iptables -t nat -A POSTROUTING -s Y.Y.Y.Y/32 -o eth0 -p tcp -m tcp --sport 443 -j SNAT --to-source X.X.X.X
iptables -A FORWARD -d Y.Y.Y.Y/32 -p tcp -m tcp --dport 443 -j ACCEPT
iptables -A FORWARD -s Y.Y.Y.Y/32 -p tcp -m tcp --sport 443 -j ACCEPT
YYYY iptables 규칙:
iptables -t nat -A PREROUTING -i venet0 -p tcp -m tcp --dport 443 -j DNAT --to-destination 172.16.0.2:443
iptables -t nat -A POSTROUTING -s 172.16.0.2/32 -o venet0 -p tcp -m tcp --sport 443 -j SNAT --to-source Y.Y.Y.Y
iptables -A FORWARD -d 172.16.0.2/32 -i venet0 -o br0 -p tcp -m tcp --dport 443 -j ACCEPT
iptables -A FORWARD -s 172.16.0.2/32 -i br0 -o venet0 -p tcp -m tcp --sport 443 -j ACCEPT
172.16.0.2 iptables 규칙:
iptables -A INPUT -i ens6 -p tcp -m multiport --dports 80,443 -j ACCEPT
iptables -A OUTPUT -o ens6 -p tcp -m tcp --sport 443 -j ACCEPT
도와주실 수 있나요? 문제가 무엇인가요?
답변1
의견에서 귀하는 트래픽을 전달하려는 웹 서버에 패킷을 웹 클라이언트에 직접 반환하는 경로가 없다고 표시했습니다. 이는 매우 일반적인 시나리오이지만 iptables에는 너무 복잡합니다.
일반적인 솔루션은 다음과 같습니다.
웹 서버에 대한 기본 경로가 있는 컴퓨터인 "DMZ" 서브넷의 하드웨어 또는 소프트웨어 로드 밸런서 제품입니다. 로드 밸런서에는 클라이언트가 알고 있는 공개 XXXX IP 주소가 있으며 DNAT를 통해 동일한 소스 주소를 사용하는 웹 서버로 트래픽을 전달합니다. 로드 밸런서는 웹 서버의 기본 게이트웨이이므로 반환 패킷이 로드 밸런서를 통해 다시 전달될 수 있으며 반환 트래픽에 대해 SNAT가 수행될 수 있습니다. 이러한 복잡한 소프트웨어 및/또는 하드웨어의 비용은 많은 조직에서 감당하기 어려울 수 있습니다.
웹 서버에 트래픽을 전달할 때 SNAT를 수행하되, 클라이언트의 실제 IP 주소를 웹 서버 소프트웨어에 알리는 HTTP 헤더를 추가하려면 프록시를 사용하십시오. 이 목적으로 일반적으로 사용되는 헤더는 입니다
X-Forwarded-For:
. 많은 HTTP 서버 라이브러리는 자동으로 이 헤더를 인식하고 헤더의 IP 주소를 응용 프로그램에서 사용할 수 있도록 합니다. 일부 애플리케이션은 헤더에 단일 IP 주소만 예상하고 일부는 주소 목록을 처리할 수 있습니다(트래픽이 프록시에 도달하기 전에 프록시를 통과할 수 있기 때문). 대부분의 네트워크 프록시 소프트웨어는 이 헤더를 추가할 수 있습니다.
다른 모든 것과 마찬가지로 절충안이 있습니다. HTTP 트래픽을 프록시하고 헤더를 추가하는 두 번째 옵션에서는 프록시 소프트웨어가 작동할 수 있도록 HTTP 트래픽이 허용 가능한 표준을 준수해야 합니다. 클라이언트가 HTTP 기반이 느슨하지만 완전히 호환되지 않는 사용자 정의 프로토콜을 사용하는 경우 프록시가 요청을 수정하려고 하면 문제가 발생할 수 있습니다. 예를 들어 프로토콜이 64k바이트보다 긴 URL을 사용하는 경우입니다. (몇 년 전 일이지만 이전에도 이 문제가 발생했습니다.)
귀하가 언급한 요구 사항을 고려할 때 #2가 귀하에게 가장 적합한 솔루션이라고 생각합니다. 네트워크 트래픽이 증가하면 트래픽이 초과되어 더 복잡하고 비용이 많이 드는 로드 밸런싱 솔루션이 필요할 수 있습니다.
답변2
값비싼 하드웨어는 필요하지 않습니다. 라우팅 + iptables만 있으면 충분하다고 생각합니다.XXXX 호스트에는 인터페이스가 하나만 있습니다.?
XXXX에서
ip route add default via eth0
PREORUTING in eth0 dport 80 DNAT to Y.Y.Y.Y
POSTROUTING out eth0 src Y.Y.Y.Y sport 80 SNAT to X.X.X.X
FORWARD dst Y.Y.Y.Y dport 80 ACCEPT
FORWARD src Y.Y.Y.Y sport 80 ACCEPT
유 YYYY
ip route add default via venet0
ip route add 172.16.0.2 via br0
PREROUTING in venet0 dport 80 DNAT to 172.16.0.2
POSTROUTING out venet0 src 172.16.0.2 sport 80 SNAT to Y.Y.Y.Y
FORWARD in venet0 out br0 dst 172.16.0.2 dport 80 ACCEPT
FORWARD in br0 out venet0 src 172.16.0.2 sport 80 ACCEPT
172.16.0.2에서
ip route add default via 172.16.0.1
INPUT in ens6 dport 80 ACCEPT
OUTPUT out ens6 sport 80 ACCEPT
2 부
XXXX iptables 규칙:
iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 443 -j DNAT --to-destination Y.Y.Y.Y
iptables -t nat -A POSTROUTING -s Y.Y.Y.Y/32 -o eth0 -p tcp -m tcp --sport 443 -j SNAT --to-source X.X.X.X
iptables -A FORWARD -d Y.Y.Y.Y/32 -p tcp -m tcp --dport 443 -j ACCEPT
iptables -A FORWARD -s Y.Y.Y.Y/32 -p tcp -m tcp --sport 443 -j ACCEPT
YYYY iptables 규칙:
iptables -t nat -A PREROUTING -i venet0 -p tcp -m tcp --dport 443 -j DNAT --to-destination 172.16.0.2:443
iptables -t nat -A POSTROUTING -s 172.16.0.2/32 -o venet0 -p tcp -m tcp --sport 443 -j SNAT --to-source Y.Y.Y.Y
iptables -A FORWARD -d 172.16.0.2/32 -i venet0 -o br0 -p tcp -m tcp --dport 443 -j ACCEPT
iptables -A FORWARD -s 172.16.0.2/32 -i br0 -o venet0 -p tcp -m tcp --sport 443 -j ACCEPT
172.16.0.2 iptables 규칙:
iptables -A INPUT -i ens6 -p tcp -m multiport --dports 80,443 -j ACCEPT
iptables -A OUTPUT -o ens6 -p tcp -m tcp --sport 443 -j ACCEPT