포트의 도커 컨테이너 내부에서 노드 서버를 실행 중이고 (컨테이너 IP)를 통해 액세스 8080
할 수 있으며 이제 .172.17.0.2:8080
localhost:9099
localhost:9099
이 트래픽을 리디렉션 하기 위해 iptables를 사용해 보았지만 172.17.0.2:8080
모든 노력이 헛되었습니다.
이것이 내가 사용하는 명령입니다. 내가 잘못한 부분을 바로잡아주세요. 미리 감사드립니다.
sudo iptables -t nat -A PREROUTING -p tcp --dport 9099 -j DNAT --to-destination 172.17.0.2:8080
나는 도움을 받았습니다이것대답했지만 소용이 없었습니다.
답변1
시도에 몇 가지 문제가 있습니다.
- 사용은
localhost
연결이 호스트에서 시작되고 다른 호스트에서 라우팅되지 않음을 나타냅니다. 따라서 처음에는 라우팅이 포함되지 않으므로OUTPUT
체인이 아닌 체인 이 필요합니다 .PREROUTING
- 소스 IP는
127.0.0.1
대상이 변경되면 소스 IP도 변경되어야 합니다. 이를 위해서는 추가POSTROUTING
규칙이 필요합니다. 선택적-m conntrack --ctstate DNAT
일치는 첫 번째 일치 항목이 먼저 일치했는지 확인하며OUTPUT
이는 일종의 스푸핑 시도가 아닙니다. - 적어도 Linux에서는
127.0.0.0/8
이는 라우팅 스택에서 특별히 처리되며POSTROUTING
규칙이 실행되기 전에 패킷이 삭제됩니다. 특수 처리를 제거하고 블록 "외부" 라우팅을 허용하려면127.0.0.0/8
리디렉션이 발생하는 인터페이스에 플래그가 있어야 합니다.route_localnet
1로 설정하세요. 그렇지 않으면 위의 어느 것도 충분하지 않습니다.
질문에서 인터페이스를 알 수 없으므로 경로에서 인터페이스 이름을 검색하여 변수에 넣습니다. 필요한 경우 조정하십시오. all
의사 인터페이스를 사용하여 설정할 수도 있습니다.배너세계적인.
결국 이것은 (루트 또는 사용 sudo
)로 귀결됩니다.
iptables -t nat -A OUTPUT -p tcp --dport 9099 -j DNAT --to-destination 172.17.0.2:8080
iptables -t nat -A POSTROUTING -s 127.0.0.0/8 -d 172.17.0.2 -m conntrack --ctstate DNAT -j MASQUERADE
interface=$(ip -o route get 172.17.0.2 | grep -o 'dev [^ ][^ ]*'|sed 's/^dev //')
echo 1 > /proc/sys/net/ipv4/conf/$(interface)/route_localnet
즉, 127.0.0.0/8
여전히 호스트에 로컬인 비주소를 사용해 보아야 합니다. 이는 작업을 단순화하고 추가 규칙이 필요하지 않습니다 route_localnet
(때로는 필요하지 않을 수도 있음) POSTROUTING
.