IPTables/Docker 설정은 패킷을 FORWARD 대신 INPUT 체인으로 라우팅합니다.

IPTables/Docker 설정은 패킷을 FORWARD 대신 INPUT 체인으로 라우팅합니다.

docker와 iptables를 사용하여 여러 설치를 실행하고 있습니다. 이러한 설치의 목적 중 하나는 syslog 메시지를 전달하는 것입니다. 네트워크 패킷이 컨테이너에 도달하지 못하는 중단이 발생하는 경우가 있습니다. 현재의 경우 시스템 로그는 포트 514를 통해 호스트로 전송되며 호스트는 이를 컨테이너로 전달해야 합니다. 로그 소스에 따라 패킷은 UDP 또는 TCP를 통해 도착합니다. 현재 설치 시 UDP 패킷은 컨테이너에 도달하지 않습니다.

설정은 다음과 같습니다.

(1) 컨테이너는 TCP+UDP용 포트 514를 노출합니다.

/usr/bin/docker run --rm --detach \
-p 514:514/udp \
-p 514:514/tcp \
syslog-container \
${@}

(2) netstat로 확인합니다.

root@cc-01-m:~# netstat -plantu | grep 514

tcp  0 0 192.168.8.134:55228 10.68.8.70:514 ESTABLISHED 6844/rsyslogd
tcp6 0 0            :::514             :::* LISTEN      71629/docker-proxy
udp6 0 0            :::514             :::*             71644/docker-proxy

(3) IPTables FORWARD(필터) 및 DOCKER(사전 라우팅) 체인:

Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target           prot opt in out     source      destination
285M 444G  DOCKER-ISOLATION all  --  *  *       0.0.0.0/0   0.0.0.0/0
203M 225G  DOCKER           all  --  *  docker0 0.0.0.0/0   0.0.0.0/0

Chain PREROUTING (policy ACCEPT 8087 packets, 4046K bytes)
 pkts bytes target     prot opt in     out     source               destination
1138M 904G  DOCKER     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain DOCKER (2 references)
pkts bytes target prot opt in      out source    destination
   0     0 RETURN all  --  docker0 *   0.0.0.0/0 0.0.0.0/0
   1    52 DNAT   tcp  -- !docker0 *   0.0.0.0/0 0.0.0.0/0   tcp dpt:514 to:172.17.0.2:514
   0     0 DNAT   udp  -- !docker0 *   0.0.0.0/0 0.0.0.0/0   udp dpt:514 to:172.17.0.2:514

이에 대한 내 생각:

  • TCP와 UDP의 설정은 동일합니다.
  • PREROUTING/DNAT가 514/UDP와 일치하지 않습니다.
  • 아래 업데이트: 포트 1514/UDP도 추가했는데 작동합니다...

(4) dmesg 결과:

하지만 dmesg에서는 다음을 볼 수 있습니다.

실제 예제(TCP, OUT=docker0)

[1220244.781877] [FW-ACCEPT] IN=ens192 OUT=docker0 MAC=00:50:56:9c:a0:21:00:09:0f:09:00:21:08:00 SRC=172.16.104.81 DST=172.17.0.2 LEN=2475 TOS=0x00 PREC=0x00 TTL=125 ID=10684 DF PROTO=TCP SPT=57211 DPT=514 WINDOW=8212 RES=0x00 ACK PSH URGP=0

작동하지 않는 예(UDP, OUT=, FORWARD 대신 INPUT을 의미):

[1219701.100893] [FW-ACCEPT] IN=ens192 OUT= MAC=00:50:56:9c:a0:21:00:09:0f:09:00:21:08:00 SRC=172.16.102.19 DST=192.168.8.134 LEN=793 TOS=0x00 PREC=0x00 TTL=62 ID=13050 DF PROTO=UDP SPT=35541 DPT=514 LEN=773

172.17.0.2는 도커 컨테이너 IP이고, 192.168.8.134는 호스트 IP입니다. 따라서 일치하는 PREROUTING이 있어도 라우팅/전달은 수행되지 않지만 일치됩니다.어떻게든입력하다.

(5) DOCKER 필터 체인 확인

Chain DOCKER (2 references)
pkts  bytes target prot opt in out source destination
1562K 2347M ACCEPT tcp -- !docker0 docker0 0.0.0.0/0 172.17.0.2 tcp dpt:514
   0     0  ACCEPT udp -- !docker0 docker0 0.0.0.0/0 172.17.0.2 udp dpt:514

여기에는 UDP 카운터가 없으며 PREROUTING이 실패합니다.

(6. 결론

나는 이것이 결함이라고 결론을 내릴 수 있습니다.

(7) 질문

누구든지 이것을 이해할 수 있습니까? 문제를 해결하거나 완화하기 위한 추가 단계가 있습니까?

정말 고마워요, 안드레아스

(8) 업데이트

포트 1514/UDP(어쨌든 필요함)에 대해 유사한 설정을 추가했습니다. 이것이 작동하는 것입니다. 나는 아무것도 모른다. 로드 문제일 수도 있나요? 포트 514/UDP에 트래픽이 많습니다. 도커 인터페이스가 존재하기 전에 트래픽이 시작되었고 PREROUTING이 (아직) 가능하지 않았기 때문에 기본적으로 입력이 설정되었을 수 있습니까? ? ? 거기 누구 없어요?

TRACE 타겟을 사용하여 차이점을 확인하려고 하면 다음과 같습니다.

(A) 작업 예(가독성을 위해 단축됨, 포트 1514):

[ 4760.393530] TRACE: raw:PREROUTING:policy:2 IN=ens192 OUT= 
SRC=172.16.102.9 DST=192.168.8.134 ID=31601 PROTO=UDP SPT=63830 DPT=1514 LEN=472

[ 4760.393541] TRACE: filter:FORWARD:rule:1 IN=ens192 OUT=docker0 SRC=172.16.102.9 DST=172.17.0.2 ID=31601 PROTO=UDP SPT=63830 DPT=1514 
LEN=472

[ 4760.393546] TRACE: filter:DOCKER-ISOLATION:return:1 IN=ens192 OUT=docker0 SRC=172.16.102.9 DST=172.17.0.2 ID=31601 PROTO=UDP SPT=63830 DPT=1514 
LEN=472

[ 4760.393551] TRACE: filter:FORWARD:rule:2 IN=ens192 OUT=docker0 SRC=172.16.102.9 DST=172.17.0.2 ID=31601 PROTO=UDP SPT=63830 DPT=1514 
LEN=472

[ 4760.393556] TRACE: filter:DOCKER:rule:1 IN=ens192 OUT=docker0 SRC=172.16.102.9 DST=172.17.0.2 ID=31601 PROTO=UDP SPT=63830 DPT=1514 
LEN=472

(B) 작동하지 않는 예(가독성을 위해 단축됨, 포트 514):

[ 5122.397806] TRACE: raw:PREROUTING:policy:2 IN=ens192 OUT= SRC=172.16.102.19 DST=192.168.8.134 ID=55657 DF PROTO=UDP SPT=35541 DPT=514 LEN=451

[ 5122.397811] TRACE: filter:INPUT:rule:7 IN=ens192 OUT= 
SRC=172.16.102.19 DST=192.168.8.134 ID=55657 DF PROTO=UDP SPT=35541 DPT=514 LEN=451

[ 5122.397822] TRACE: filter:OK:return:2 IN=ens192 OUT= 
SRC=172.16.102.19 DST=192.168.8.134 ID=55657 DF PROTO=UDP SPT=35541 DPT=514 LEN=451

참고: 체인을 기록하고 "확인"을 수락했습니다.

관련 정보