Firewallregeln, die den Zugriff auf Docker-Web-Apps nicht einschränken

Firewallregeln, die den Zugriff auf Docker-Web-Apps nicht einschränken

Ich habe ein Problem, bei dem Ports, die für Anwendungen verfügbar sind, die in Docker-Containern auf unserem System ausgeführt werden, für die Welt offen bleiben, obwohl die iptables-Konfiguration den Zugriff einschränken soll.

Mir scheint, dass das Problem damit zusammenhängt, dass der Docker-Daemon beim Start Regeln zu iptables hinzufügt. Ich kenne auch die Flags --icc=true|false, bin mir aber nicht sicher, welche Kombination dieser Flags ich anwenden soll. Ich habe es versucht --ip-forward=true|false, aber keines von beiden hatte den gewünschten Effekt. Ich verwende es nur ungern, weil der Docker-Daemon eindeutig eine Reihe von Regeln hinzufügt, die ich manuell konfigurieren müsste, wenn ich sie noch benötige.--iptables=true|false--icc=false--ip-forward=false--iptables=false

Dies ist der Status der Regeln vor dem Start des Docker-Daemons:

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  

Und so sieht es aus, wenn der Docker-Daemon läuft:

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

Es gibt außerdem eine Reihe von POSTROUTING- und MASQUERADE-Regeln, die nicht mit angezeigt werden iptables -L, sondern nur, wenn Sie verwenden iptables-save. Ich bin mir auch nicht sicher, welche Bedeutung diese haben.

Ich vermute, dass die DOCKER-Zielregel in der FORWARD-Kette die Ursache des Problems ist, sehe aber keine Möglichkeit, dieses Problem zu lösen, da sie anscheinend vom Docker-Daemon am Anfang der Kette eingefügt wird.

Kann mir also jemand einen Rat geben, was ich tun muss, um sicherzustellen, dass die Ports 7990, 8090 usw. beim Ausführen von Docker nicht der Öffentlichkeit zugänglich sind?

Danke

Richard

Antwort1

Die DOCKERKette ist eine benutzerdefinierte Kette, die in der FORWARD-Kette definiert ist. Wenn ein Paket anydie Schnittstelle erreicht und an die Docker0-Bridge-Schnittstelle gebunden ist, wird es an die benutzerdefinierte DOCKER-Kette gesendet.

Pakete Bytes Ziel Schutz Opt-in Out Quelle Ziel         
54492 21M DOCKER alle -- alle Docker0 überall überall            

Jetzt nimmt die DOCKER-Kette alle eingehenden Pakete, außer denen von Docker0, und sendet sie an eine Container-IP (172.xxx) und einen Port, in diesem Fall etwa 7990.

Pakete Bytes Ziel Schutz Opt-in Out Quelle Ziel         
   86 7048 ACCEPT tcp -- !docker0 docker0 überall 172.17.0.2 tcp dpt:7990

Wenn Sie die Ausgabe von posten würden iptables -t nat -L -n, würden Sie die DNATRegel sehen, die die Portweiterleitung vom Host zum Container durchführt. Beispielsweise würden Pakete, die die Hostschnittstelle auf 49154 erreichen, an die Container-IP 172.17.0.2 und Port 7990 weitergeleitet.

DNAT tcp – 0.0.0.0/0 0.0.0.0/0 tcp dpt:49154 bis:172.17.0.2:7990

Sie können verhindern, dass Pakete den Container erreichen, indem Sie beispielsweise die Quell-IP von 0.0.0.0 so beschränken, dass nur Pakete zugelassen werden, die aus Ihrem internen Netzwerk stammen. Um Verbindungen zum Container-Port 7990 nur von Ihrem internen Netzwerk, beispielsweise 192.168.1.0/24, zuzulassen, können Sie den folgenden Befehl ausführen -

/sbin/iptables -I WEITER '!' -s 192.168.1.0/24 -d 172.17.0.2 -p tcp --dport 7990 -j DROP

Dies würde die Weiterleitung von Paketen an einen Container mit der angegebenen IP:Port-Adresse verhindern, es sei denn, sie kommen aus dem internen Netzwerk. Sie können die Quell-/Ziel-IP und den Port je nach Ihrer Konfiguration ändern.

Antwort2

Dies wäre also ein Kommentar, aber kein Stree... Serverfault-Rep dafür.

Haben Sie die hier veröffentlichte Lösung ausprobiert:http://blog.viktorpetersson.com/post/101707677489/die-Gefahren-des-ufw-docker

--iptables=falsediese Flagge auf diese Weise zu verwenden DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --iptables=false"?

verwandte Informationen