내 목표는 로컬 호스트에서 원격 서버로 연결을 리디렉션하고 클라이언트 구성을 변경하지 않고도 원격 주소를 동적으로 변경할 수 있는 것입니다. 이제 다음과 같이 외부 인터페이스에서 nat를 사용하여 이 작업을 수행할 수 있습니다.
LOCAL_IP=10.1.1.10
LOCAL_PORT=8888
REMOTE_IP=10.1.1.11
REMOTE_PORT=9999
iptables -t nat -A OUTPUT -p tcp -d $LOCAL_IP --dport $LOCAL_PORT -j DNAT --to-destination $REMOTE_IP:$REMOTE_PORT
iptables -t nat -A POSTROUTING -p tcp -d $REMOTE_IP --dport $REMOTE_PORT -j SNAT --to-source $LOCAL_IP
이것은 잘 작동하지만 여전히 클라이언트 구성을 호스트 IP 주소에 연결합니다. NAT 트래픽을 , 로 보낼 수 있으면 127.0.0.1:8888
좋을 것 같습니다 10.1.1.11:9999
. DNAT/SNAT|MASQUERADE 조합을 사용하면 이것이 가능할 것 같지만 아직 작동하는 구성을 찾지 못했습니다. 내가 시도하는 모든 구성은 자동으로 패킷을 삭제하는 것 같습니다(아마도 화성의 규칙에 의해 포착되었습니까? ip_forward가 활성화되어 있습니다).
답변1
문제는 Linux가 내부의 모든 것을 127.0.0.0/8
로컬로 처리하고 응답조차 하지 않는다는 것입니다(127.99.88.77로 ping을 시도하십시오).
이는 패킷이 "떠날" 때 OUTPUT에서 처음 전송된다는 의미입니다 lo
. 그것이 "들어오면" INPUT 체인으로 들어갑니다(확실히 확인하기 위해 추적합니다). 이것이 당신의 상황이 무너지는 곳입니다.
Linux에서는 PRE/POST 라우팅 체인 외에도 시스템으로 향하는 패킷이 INPUT 체인만 통과합니다. 시스템에서 발생하는 패킷은 OUTPUT 체인만 통과합니다. 로컬 시스템에서 시작되지도 않고 로컬 시스템으로 향하지도 않는 패킷은 FORWARD 체인만 통과합니다.
따라서 Linux가 FORWARD 체인을 선택하도록 하려면 Linux는 INPUT 체인을 선택합니다.
몇 가지 다른 옵션을 시도했지만 제대로 작동하지 못했지만 알고 있습니다.왜작동하지 않습니다. 나중에 시간이 있을 때 이것저것 살펴보도록 하겠습니다.
추신: 처음에는 라우터 문제인 줄 알았습니다(내 생각으로는 여전히 라우팅이 관련되어 있다고 생각합니다). IP를 lo
외부 로 변환하면 127.0.0.1
라우팅 충돌이 발생하여 자동으로 패킷이 삭제될 수 있습니다. 이 기능을 비활성화하려면 를 설정해야 합니다 rp_filter=0
. 작동하려면 여전히 이 작업을 수행해야 하지만 이것이 문제의 원인은 아닙니다. 근본적인 문제는 Linux가 출력이 필요할 때 입력을 사용한다는 것입니다.