Docker Web Apps에 대한 액세스를 제한하지 않는 방화벽 규칙

Docker Web Apps에 대한 액세스를 제한하지 않는 방화벽 규칙

액세스를 제한하도록 설계된 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"?

관련 정보