내 목표는 서로 다른 네트워크에서 두 개의 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
iptables
verbose 옵션( )을 사용하여 실행 하면 아래에 대상 참조 인터페이스가 -v
표시됩니다 ( 바로 아래에 규칙이 있음 ).DROP
DOCKER-ISOLATION-STAGE-2
br-deadbeef
DROP
br-feedbeef
를 사용하여 규칙을 추가했으므로 해당 -A
규칙은 체인의 맨 아래에 추가됩니다. DOCKER-ISOLATION-STAGE-1
즉, 점프하여 DOCKER-ISOLATION-STAGE-2
우선순위로 점프하는 것을 의미합니다.
쉬운 수정은 규칙을 추가하는 것입니다 -I
. 이렇게 하면 체인 상단에 삽입됩니다.