나는이 문제로 이틀 동안 어려움을 겪었습니다.
가정:
- Docker 네트워크(및 인터페이스) 이름 지정터미널 네트워크유형다리서브넷172.18.0.0/16
- 두 개의 인터페이스이더넷 0(192.168.1.1) 및이더넷 1(192.168.2.1)
- 기본 경로는 다음을 통과합니다.이더넷 0
내가 원하는 것은:
- 연결된 컨테이너에서 나가는 트래픽터미널 네트워크가야 해이더넷 1
내가 시도한 것:
- docker가 생성한 기본 iptable 규칙은 변경되지 않습니다.
-A POSTROUTING -s 172.18.0.0/16 ! -o docknet -j MASQUERADE
- 내 규칙:
iptables -t mangle -I PREROUTING -s 172.18.0.0/16 -j MARK --set-mark 1
ip rule add from all fwmark 1 table 2
표 2는 다음과 같습니다.
default via 192.168.2.1 dev eth1 proto static
이 설정을 사용하여 Dockernet에 연결된 컨테이너(172.18.0.2)에서 8.8.8.8을 ping하려고 하면 다음과 같은 일이 발생합니다.
- 172.18.0.2는 192.168.2.1로 변환됩니다.
- 패킷이 eth1을 통과합니다.
- 패킷은 소스 주소 8.8.8.8 및 대상 주소 192.168.2.1을 사용하여 eth1로 반환됩니다.
여기에서 192.168.2.1에서 172.168.0.2로의 역방향 전환이 발생해야 하지만 런타임 시 tcpdump -i any host 8.8.8.8
이 전환을 추적할 수는 없습니다.
conntrack -L도 확인했는데 결과는 다음과 같습니다.
icmp 1 29 src=172.18.0.2 dst=8.8.8.8 유형=8 코드=0 id=9 src=8.8.8.8 dst=192.168.2.1 유형=0 코드=0 id=9 태그=0 사용=1
유용한 정보:
- eth1은 실제로 4G USB 어댑터입니다.
- IP 전달이 활성화되었습니다.
curl --interface eth1 ipinfo.io
예상대로 작동