
특정 IP와 포트 일치가 이루어질 때 가상 브리지를 통해 인터페이스 간 트래픽을 리디렉션하고 싶습니다.
예를 들어, 가상 브리지를 통해 물리적 인터페이스로 이동하는 가상 인터페이스를 통해 게스트 내부 포트에 연결할 때 10.20.30.40
해당 트래픽을 가로채서 인터넷에 액세스하는 대신 호스트의 포트로 리디렉션하려고 합니다. 쉽습니다. 먼저 호스트 시스템에서 서버를 엽니다.2222
tun
127.0.0.1
3333
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
물리적 인터페이스를 통해 외부 시스템에서 서버에 액세스할 수 없습니다.