![어떤 인터페이스에도 속하지 않는 IP에서 패킷을 리디렉션하도록 브리지를 속이는 방법](https://linux55.com/image/157046/%EC%96%B4%EB%96%A4%20%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4%EC%97%90%EB%8F%84%20%EC%86%8D%ED%95%98%EC%A7%80%20%EC%95%8A%EB%8A%94%20IP%EC%97%90%EC%84%9C%20%ED%8C%A8%ED%82%B7%EC%9D%84%20%EB%A6%AC%EB%94%94%EB%A0%89%EC%85%98%ED%95%98%EB%8F%84%EB%A1%9D%20%EB%B8%8C%EB%A6%AC%EC%A7%80%EB%A5%BC%20%EC%86%8D%EC%9D%B4%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
특정 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
물리적 인터페이스를 통해 외부 시스템에서 서버에 액세스할 수 없습니다.