Docker 컨테이너의 기본 인터페이스 변경

Docker 컨테이너의 기본 인터페이스 변경

나는이 문제로 이틀 동안 어려움을 겪었습니다.

가정:

  • 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예상대로 작동

관련 정보