어떤 인터페이스에도 속하지 않는 IP에서 패킷을 리디렉션하도록 브리지를 속이는 방법

어떤 인터페이스에도 속하지 않는 IP에서 패킷을 리디렉션하도록 브리지를 속이는 방법

특정 IP와 포트 일치가 이루어질 때 가상 브리지를 통해 인터페이스 간 트래픽을 리디렉션하고 싶습니다.

예를 들어, 가상 브리지를 통해 물리적 인터페이스로 이동하는 가상 인터페이스를 통해 게스트 내부 포트에 연결할 때 10.20.30.40해당 트래픽을 가로채서 인터넷에 액세스하는 대신 호스트의 포트로 리디렉션하려고 합니다. 쉽습니다. 먼저 호스트 시스템에서 서버를 엽니다.2222tun127.0.0.13333

nc -vkl 127.0.0.1 3333

이제 iptables호스트에 규칙을 적용합니다.

sudo iptables \
  -t nat -A OUTPUT -p tcp \
  -d 10.20.30.40 --dport 2222 \
  -j DNAT --to-destination 127.0.0.1:3333

이제 호스트에서 실행될 수 있는지 테스트합니다.

nc -vzw5 10.20.30.40 2222

좋습니다. 호스트에서는 로컬로 실행되는 것 같지만 게스트에서는 실행하는 데 문제가 있습니다.

docker run --rm -it alpine:3.9 nc -vzw5 10.20.30.40 2222

중요한 것은 docker트래픽이 더 이상 호스트에서 로컬이 아니도록 가상 브리지를 만드는 것입니다. 내 연구에서 호스트에 적용할 수 있는 몇 가지 규칙을 발견했습니다.

sudo iptables -t nat -A PREROUTING -p tcp \
  -d 10.20.30.40 --dport 2222 -j DNAT --to-destination 127.0.0.1:3333
sudo iptables -t nat -A POSTROUTING -p tcp \
  -d 127.0.0.1 --dport 3333 -j SNAT --to-source 10.20.30.40:2222

하지만 작동하지 않습니다... 특정 규칙이 일치할 때 브리지를 통해 호스트의 인터페이스 docker0로 트래픽을 리디렉션 하려면 어떻게 해야 합니까?lo

어떤 장소:

  • 대상 IP는 인터페이스 서브넷에 속하지 않습니다.
  • 이 솔루션에는 DNS 사용이나 docker호스트 켜기/끄기 변경이 포함될 수 없습니다 /etc/hosts.
  • 이러한 iptables규칙은 호스트에만 적용되어야 합니다.
  • 서버는 로컬 시스템에 할당되어야 하며 트래픽이 네트워크로 누출되어서는 안 됩니다. 이 경우 포트의 호스트 IP를 통해 게스트가 직접 액세스하거나 3333물리적 인터페이스를 통해 외부 시스템에서 서버에 액세스할 수 없습니다.

관련 정보