IPTables - 연결된 클라이언트로 전달하지만 소스 IP는 유지합니다.

IPTables - 연결된 클라이언트로 전달하지만 소스 IP는 유지합니다.

내 시나리오는 다음과 같습니다.

저는 2개의 IP 주소가 있고 OpenVPN을 실행 중인 VPS를 가지고 있습니다(OpenVPN 서버의 IP 주소: 10.1.2.1). 하나의 주소에서 수신된 모든 트래픽을 VPN 클라이언트(10.1.2.2)로 전달하고 싶습니다.

현재 사용하고 있는 두 가지 규칙은 다음과 같습니다.

iptables -t nat -A PREROUTING -i venet0 -p ALL -d <EXTERNAL IP #1> -j DNAT --to-destination 10.1.2.2
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

이것은 작동합니다. 요청을 VPN 클라이언트로 전달하고 VPN 클라이언트가 호스팅하는 서비스를 사용할 수 있습니다. 그러나 INCOMING-CLIENT 요청의 실제 IP 주소를 알아야 하는 또 다른 서비스가 있습니다. 위에서 언급한 방법으로 수행하면 VPN 클라이언트는 수신 클라이언트의 IP 주소가 OpenVPN 서버의 IP 주소인 10.1.2.1이라고 생각합니다.

MASQUERADE를 다음으로 교체하는 것을 포함하여 많은 솔루션을 시도했습니다.

iptables -t nat -A POSTROUING -o tun0 -s 10.1.2.2 -j SNAT --to-source <EXTERNAL IP #1>

하지만 그건 작동하지 않습니다. 모든 요청이 중단됩니다.

내 네트워킹 아키텍처는 OpenVPN 터널인 venet0과 tun0만 사용하고 있습니다. 공개 클라이언트의 TRUE IP 주소를 얻는 방법에 대한 제안은 크게 감사하겠습니다. 감사합니다.

트레시우스

답변1

SNAT나 MASQUERADE를 사용하면 안 되는 것 같습니다. 두 옵션 모두 이중 NAT로 인해 양쪽 끝이 다른 쪽 끝의 실제 IP를 알 수 없게 됩니다. NAT는 항상 적어도 한 방향으로 이 지식을 깨뜨립니다.

반대쪽 끝에 있는 서버가 tun0기본 경로로 라우터를 사용하는 경우 반환 트래픽에 대해 DNAT를 실행 취소할 수 있는 라우터로 트래픽을 다시 반환해야 합니다.

적어도 HTTP의 경우 대체 옵션은 서버에서 프록시를 실행하는 것입니다. 프록시는 X-Forwarded-For 헤더를 추가하거나 확장해야 합니다. 여기에는 트래픽이 전달된 주소를 식별하는 하나 이상의 주소가 포함됩니다. 추가한 IP 주소는 신뢰할 수 있습니다. 다른 주소는 스푸핑될 수 있습니다.

관련 정보