포트에서 들어오고 나가는 모든 트래픽을 특정 IP로 리디렉션

포트에서 들어오고 나가는 모든 트래픽을 특정 IP로 리디렉션

포트의 도커 컨테이너 내부에서 노드 서버를 실행 중이고 (컨테이너 IP)를 통해 액세스 8080할 수 있으며 이제 .172.17.0.2:8080localhost: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_localnet1로 설정하세요. 그렇지 않으면 위의 어느 것도 충분하지 않습니다.

질문에서 인터페이스를 알 수 없으므로 경로에서 인터페이스 이름을 검색하여 변수에 넣습니다. 필요한 경우 조정하십시오. 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.

관련 정보