
액세스를 제한하도록 설계된 iptables 구성에도 불구하고 Docker 컨테이너의 시스템에서 실행 중인 애플리케이션에 노출된 포트가 계속 열려 있는 문제가 있습니다.
문제는 시작 시 iptables에 규칙을 추가하는 docker 데몬과 관련이 있을 수 있는 것 같습니다. 나는 또한 flags 에 대해 알고 있지만 이러한 --icc=true|false
플래그 중 어떤 조합을 적용해야 하는지 잘 모르겠습니다. 나는 시도했지만 둘 다 원하는 효과를 얻지 못했습니다. docker 데몬이 여러 규칙을 추가하고 있기 때문에 사용하기가 싫습니다. 규칙이 여전히 필요한 경우 수동으로 구성해야 합니다.--ip-forward=true|false
--iptables=true|false
--icc=false
--ip-forward=false
--iptables=false
docker 데몬이 시작되기 전의 규칙 상태는 다음과 같습니다.
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- lo any anywhere anywhere
0 0 REJECT all -- !lo any anywhere loopback/8 reject-with icmp-port-unreachable
0 0 DROP tcp -- any any anywhere anywhere tcpflags:! FIN,SYN,RST,ACK/SYN state NEW
0 0 DROP all -f any any anywhere anywhere
0 0 DROP tcp -- any any anywhere anywhere tcpflags: FIN,SYN,RST,PSH,ACK,URG/FIN,SYN,RST,PSH,ACK,URG
0 0 DROP tcp -- any any anywhere anywhere tcpflags: FIN,SYN,RST,PSH,ACK,URG/NONE
82 8831 ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED
0 0 ACCEPT icmp -- any any anywhere anywhere icmp echo-request
0 0 ACCEPT tcp -- any any anywhere anywhere multiport dports ssh
0 0 ACCEPT tcp -- any any <IP ADDRESS RANGE 1> anywhere multiport dports ssh,http,https,7990,7999,tproxy,8090,8095,18080
0 0 ACCEPT tcp -- any any <IP ADDRESS RANGE 2> anywhere multiport dports ssh,http,https,7990,7999,tproxy,8090,8095,18080
0 0 LOG all -- any any anywhere anywhere limit: avg 5/min burst 5 LOG level debug prefix "iptables denied: "
0 0 REJECT all -- any any anywhere anywhere reject-with icmp-port-unreachable
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
24 2489 REJECT all -- any any anywhere anywhere reject-with icmp-port-unreachable
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
77 10080 ACCEPT all -- any any anywhere anywhere
docker 데몬이 실행되는 모습은 다음과 같습니다.
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- lo any anywhere anywhere
0 0 REJECT all -- !lo any anywhere loopback/8 reject-with icmp-port-unreachable
0 0 DROP tcp -- any any anywhere anywhere tcpflags:! FIN,SYN,RST,ACK/SYN state NEW
0 0 DROP all -f any any anywhere anywhere
0 0 DROP tcp -- any any anywhere anywhere tcpflags: FIN,SYN,RST,PSH,ACK,URG/FIN,SYN,RST,PSH,ACK,URG
0 0 DROP tcp -- any any anywhere anywhere tcpflags: FIN,SYN,RST,PSH,ACK,URG/NONE
1335 230K ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED
1 32 ACCEPT icmp -- any any anywhere anywhere icmp echo-request
7 380 ACCEPT tcp -- any any anywhere anywhere multiport dports ssh
0 0 ACCEPT tcp -- any any <IP ADDRESS RANGE 1> anywhere multiport dports ssh,http,https,7990,7999,tproxy,8090,8095,18080
0 0 ACCEPT tcp -- any any <IP ADDRESS RANGE 2> anywhere multiport dports ssh,http,https,7990,7999,tproxy,8090,8095,18080
35 2016 LOG all -- any any anywhere anywhere limit: avg 5/min burst 5 LOG level debug prefix "iptables denied: "
62 3672 REJECT all -- any any anywhere anywhere reject-with icmp-port-unreachable
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
54492 21M DOCKER all -- any docker0 anywhere anywhere
51882 20M ACCEPT all -- any docker0 anywhere anywhere ctstate RELATED,ESTABLISHED
58371 9122K ACCEPT all -- docker0 !docker0 anywhere anywhere
0 0 DROP all -- docker0 docker0 anywhere anywhere
1186 121K REJECT all -- any any anywhere anywhere reject-with icmp-port-unreachable
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
2090 263K ACCEPT all -- any any anywhere anywhere
Chain DOCKER (1 references)
pkts bytes target prot opt in out source destination
86 7048 ACCEPT tcp -- !docker0 docker0 anywhere 172.17.0.2 tcp dpt:7990
1639 395K ACCEPT tcp -- !docker0 docker0 anywhere 172.17.0.2 tcp dpt:7999
791 151K ACCEPT tcp -- !docker0 docker0 anywhere 172.17.0.3 tcp dpt:http-alt
20 1898 ACCEPT tcp -- !docker0 docker0 anywhere 172.17.0.4 tcp dpt:8090
49 4561 ACCEPT tcp -- !docker0 docker0 anywhere 172.17.0.5 tcp dpt:18080
25 3642 ACCEPT tcp -- !docker0 docker0 anywhere 172.17.0.6 tcp dpt:8095
iptables -L
을 사용할 때만 표시되지 않는 POSTROUTING 및 MASQUERADE 규칙도 많이 있습니다 iptables-save
. 나도 이것들의 중요성을 잘 모르겠다.
FORWARD 체인의 DOCKER 대상 규칙이 문제의 원인인 것으로 의심되지만 체인 시작 시 docker 데몬에 의해 삽입된 것 같아서 이 문제를 해결하는 방법을 알 수 없습니다.
그렇다면 docker를 실행할 때 포트 7990, 8090 등이 외부에 노출되지 않도록 하려면 어떻게 해야 하는지 조언해 줄 수 있는 사람이 있나요?
감사해요
리차드
답변1
체인 DOCKER
은 FORWARD 체인에 정의된 사용자 정의 체인입니다. 패킷이 any
인터페이스에 도달하고 docker0 브리지 인터페이스에 바인딩되면 사용자 지정 DOCKER 체인으로 전송됩니다.
pkts 바이트 대상 prot 옵트아웃 소스 대상 54492 21M DOCKER all -- 어디서나 모든 docker0
이제 DOCKER 체인은 docker0에서 들어오는 패킷을 제외한 모든 수신 패킷을 가져와 컨테이너 IP(172.xxx) 및 포트(이 경우 7990)로 보냅니다.
pkts 바이트 대상 prot 옵트아웃 소스 대상 86 7048 tcp 수락 -- !docker0 docker0 어디서나 172.17.0.2 tcp dpt:7990
의 출력을 게시하면 호스트에서 컨테이너 포트 전달로의 규칙 iptables -t nat -L -n
을 볼 수 있습니다 DNAT
. 예를 들어 49154의 호스트 인터페이스에 도달하는 패킷은 컨테이너 IP 172.17.0.2 및 포트 7990으로 포트 전달됩니다.
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:49154 ~:172.17.0.2:7990
예를 들어 소스 IP를 0.0.0.0으로 제한하여 내부 네트워크에서 발생하는 패킷만 허용함으로써 패킷이 컨테이너에 도달하는 것을 차단할 수 있습니다. 192.168.1.0/24의 내부 네트워크에서만 7990의 컨테이너 포트에 대한 연결을 허용하려면 다음 명령을 실행할 수 있습니다.
/sbin/iptables -I FORWARD '!' -s 192.168.1.0/24 -d 172.17.0.2 -p tcp --dport 7990 -j 삭제
이렇게 하면 내부 네트워크에서 들어오는 패킷이 아닌 이상 모든 패킷이 지정된 IP:포트의 컨테이너로 전달되지 않습니다. 설정에 따라 소스/대상 IP 및 포트를 수정할 수 있습니다.
답변2
따라서 이것은 주석이 될 것이지만 이에 대한 stree..serverfault 담당자는 없습니다.
여기에 게시된 솔루션을 시도해 보셨나요?http://blog.viktorpetersson.com/post/101707677489/the-dangers-of-ufw-docker
이 플래그를 --iptables=false
이렇게 사용하는 건가요 DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --iptables=false"
?