Docker 네트워크 간 NAT 설정

Docker 네트워크 간 NAT 설정

내 목표는 서로 다른 네트워크에서 두 개의 Docker 컨테이너를 실행하고 내 호스트 시스템(Ubuntu 22.04)이 NAT를 수행하여 첫 번째 네트워크가 두 번째 네트워크에 연결할 수 있도록 하는 것입니다.

내 설정:

docker network create network1
docker network create network2

docker run --rm -it --network network1 ubuntu:22.04 bash

# In other terminal
docker run --rm -it --network network2 ubuntu:22.04 bash

첫 번째 컨테이너의 주소는 172.19.0.2이고 두 번째 컨테이너의 주소는 172.20.0.2입니다.

내 호스트에서 실행하면 ip addr인터페이스가 br-deadbeef및 입니다 br-feedbeef.

그럼 난 달려

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -A FORWARD -i br-deadbeef -o br-feedbeef -j ACCEPT
iptables -A FORWARD -i br-feedbeef -o br-deadbeef -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -A POSTROUTING -o br-feedbeef -j MASQUERADE

호스트 시스템의 루트로.

그러나 ping 172.20.0.2첫 번째 컨테이너부터 시작하는 것이 제대로 작동하지 않았습니다. 호스트에서 Wireshark를 실행하면 br-deadbeef네트워크에 172.19.0.2에서 172.20.0.2까지의 ICMP 패킷이 있지만 응답이 없음이 표시됩니다.

내가 무엇을 놓치고 있나요?

답변1

문제는 다음 iptables규칙에 있습니다.

Chain FORWARD (policy DROP)
target     prot opt source          destination
DOCKER-USER  all  --  anywhere          anywhere
DOCKER-ISOLATION-STAGE-1  all  --  anywhere          anywhere
...

Chain DOCKER-ISOLATION-STAGE-1 (1 references)
target     prot opt source          destination
DOCKER-ISOLATION-STAGE2  all  --  anywhere          anywhere
...

Chain DOCKER-ISOLATION-STAGE-2 (3 references)
target     prot opt source          destination
DROP       all  --  anywhere        anywhere
...

Chain DOCKER-USER (1 references)
target     prot opt source          destination
RETURN     all  --  anywhere        anywhere

iptablesverbose 옵션( )을 사용하여 실행 하면 아래에 대상 참조 인터페이스가 -v표시됩니다 ( 바로 아래에 규칙이 있음 ).DROPDOCKER-ISOLATION-STAGE-2br-deadbeefDROPbr-feedbeef

를 사용하여 규칙을 추가했으므로 해당 -A규칙은 체인의 맨 아래에 추가됩니다. DOCKER-ISOLATION-STAGE-1즉, 점프하여 DOCKER-ISOLATION-STAGE-2우선순위로 점프하는 것을 의미합니다.

쉬운 수정은 규칙을 추가하는 것입니다 -I. 이렇게 하면 체인 상단에 삽입됩니다.

관련 정보