질문
Docker 컨테이너 네트워크는 호스트 TPROXY가 구성한 터널을 통과하지 않습니다.
설정
내 컴퓨터에서 TPROXY 지원 프록시 서버가 실행되고 있습니다(127.0.0.1:8080에서 수신 대기). TPROXY
다음과 같이 대상을 사용하여 이 프록시 서버로 트래픽을 리디렉션하도록 iptables를 구성했습니다 .
ip route add local default dev lo table 100
ip rule add fwmark 1 table 100
iptables -t mangle -N PROXY
# Ignore private IPs
iptables -t mangle -A PROXY -d 10.0.0.0/8 -j RETURN
iptables -t mangle -A PROXY -d 100.64.0.0/10 -j RETURN
iptables -t mangle -A PROXY -d 127.0.0.0/8 -j RETURN
iptables -t mangle -A PROXY -d 169.254.0.0/16 -j RETURN
iptables -t mangle -A PROXY -d 172.16.0.0/12 -j RETURN
iptables -t mangle -A PROXY -d 192.0.0.0/24 -j RETURN
iptables -t mangle -A PROXY -d 224.0.0.0/4 -j RETURN
iptables -t mangle -A PROXY -d 240.0.0.0/4 -j RETURN
iptables -t mangle -A PROXY -d 255.255.255.255/32 -j RETURN
iptables -t mangle -A PROXY -d 192.168.0.0/16 -j RETURN
iptables -t mangle -A PROXY -p tcp -j TPROXY --on-port 8080 --on-ip 127.0.0.1 --tproxy-mark 1
iptables -t mangle -A PROXY -p udp -j TPROXY --on-port 8080 --on-ip 127.0.0.1 --tproxy-mark 1
iptables -t mangle -A PREROUTING -j PROXY
iptables -t mangle -N PROXY_SELF
# Ignore private IPs
iptables -t mangle -A PROXY_SELF -d 10.0.0.0/8 -j RETURN
iptables -t mangle -A PROXY_SELF -d 100.64.0.0/10 -j RETURN
iptables -t mangle -A PROXY_SELF -d 127.0.0.0/8 -j RETURN
iptables -t mangle -A PROXY_SELF -d 169.254.0.0/16 -j RETURN
iptables -t mangle -A PROXY_SELF -d 172.16.0.0/12 -j RETURN
iptables -t mangle -A PROXY_SELF -d 192.0.0.0/24 -j RETURN
iptables -t mangle -A PROXY_SELF -d 224.0.0.0/4 -j RETURN
iptables -t mangle -A PROXY_SELF -d 240.0.0.0/4 -j RETURN
iptables -t mangle -A PROXY_SELF -d 255.255.255.255/32 -j RETURN
iptables -t mangle -A PROXY_SELF -d 192.168.0.0/16 -j RETURN
iptables -t mangle -A PROXY_SELF -m mark --mark 2 -j RETURN
iptables -t mangle -A PROXY_SELF -p tcp -j MARK --set-mark 1
iptables -t mangle -A PROXY_SELF -p udp -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -j PROXY_SELF
로컬로 생성된 패킷의 경우 예상대로 작동합니다. 그러나 호스트를 통과하는 Docker 컨테이너 패킷에 문제가 있습니다. Docker 기본 네트워크/iptables 구성을 변경하지 않았으므로 호스트 인터넷 연결 장치( eth0
)를 게이트웨이로 사용하여 나가는 네트워크를 전달합니다. 트래픽을 프록시 서버로 리디렉션하기 위해 iptables tproxy(위 명령)를 활성화하면 Docker 컨테이너 내부에서 발생하는 트래픽이 프록시 서버에 도달하지 못하고 인터넷에 액세스할 수 없습니다. 어떻게 해결할 수 있나요?
디버그
각 테이블의 각 체인에 대해 iptables 대상을 사용 LOG
하여 패킷이 어떻게 통과되었는지 확인하고 문제가 있는 위치를 디버깅(또는 추측)했습니다. 내가 이해한 바로는 로컬에서 생성된 패킷의 경우 mangle
테이블 체인을 통과할 때 OUTPUT
fwmark 1로 표시되고 , lo
및 명령으로 인해 장치(기본 인터넷 연결 장치 대신)로 라우팅됩니다. 장치에서는 테이블 체인에 정의된 대상과 나머지 프록시 프로세스를 통해 프록시 서버로 리디렉션됩니다. 반면, Docker 컨테이너에서 전송된 패킷의 경우 먼저 (기본 Docker 브리지 네트워크 장치)에서 수신되고 대상에 의해 리디렉션되면 패킷이eth0
ip route
ip rule
lo
tproxy
mangle
PREROUTING
docker0
tproxy
걸다nat
테이블 체인 에서 INPUT
AFAIK는 프록시 서버 프로세스로 전달되기 직전입니다. 프록시 서버로부터 아무런 로그 메시지도 볼 수 없기 때문에, 이 패킷들이 어떻게든(?) 삭제되고 있는 것으로 추측됩니다. 또한 다음을 테스트했습니다.
- 바인딩된 프록시 서버를 실행합니다.
0.0.0.0
net.ipv4.ip_forward
커널 옵션 활성화docker0
패킷이 먼저mangle
테이블 체인을 통과하도록 하고PREROUTING
fwmark 1로 표시한 다음(점프하지 않고tproxy
)ip route
다시 라우팅한 다음lo
(로컬에서 생성된 패킷에서 발생하는 것과 유사) 해당 패킷에 대해 tproxy 리디렉션 장치를 적용합니다. 나중에 수신된 상관 관계 패킷lo
. 예상대로 작동합니다.전달됨lo
하지만 장치에서 수신된 해당 패킷은mangle
감시 체인 뒤에 걸려PREROUTING
계속 진행되지 않습니다.
하지만 결과는 없습니다...
도움을 주시면 감사하겠습니다.
저는 Linux에서 iptables를 사용한 고급 네트워킹을 처음 접했으므로(3일 전에 완전히 시작했습니다) 더 많은 정보가 필요하면 알려주시기 바랍니다.
건배