Docker - Offene Ports, auf die von außen zugegriffen werden kann - Regeln für iptables werden ignoriert

15

Ich habe einen Docker-Container, der wie folgt läuft:

 docker run --name some_container_1 -p 8080:80 -d some_image

Welches funktioniert gut. Der Container zeigt die Ports 80 bis 8080 an und ist von localhost aus zugänglich.

Aus irgendeinem Grund ignoriert es jedoch die Regeln von INPUT iptables vollständig und ist auch von außen zugänglich.

Wie kann ich den Zugriff auf meinen Docker-Container so beschränken, dass nur IP 123.456.789.0 von außen darauf zugreifen kann?

Vielen Dank.


sudo iptables -L -n -v --Zeilennummern

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
2      365 23380 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
3        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22
4        7   788 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0            limit: avg 5/min burst 5 LOG flags 0 level 7 prefix "iptables denied: "
5        7   788 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0           

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1       24  1524 DOCKER     all  --  *      docker0  0.0.0.0/0            0.0.0.0/0           
2        0     0 ACCEPT     all  --  *      docker0  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
3       15 13320 ACCEPT     all  --  docker0 !docker0  0.0.0.0/0            0.0.0.0/0           
4        0     0 ACCEPT     all  --  docker0 docker0  0.0.0.0/0            0.0.0.0/0           

Chain OUTPUT (policy ACCEPT 204 packets, 21792 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain DOCKER (1 references)
num   pkts bytes target     prot opt in     out     source               destination         
1       24  1524 ACCEPT     tcp  --  !docker0 docker0  0.0.0.0/0            172.17.0.2           tcp dpt:80

sudo iptables-save

# Generated by iptables-save v1.4.21 on Wed Apr  8 23:37:43 2015
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [100:16642]
:DOCKER - [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
-A INPUT -j DROP
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 80 -j ACCEPT
COMMIT
# Completed on Wed Apr  8 23:37:43 2015
# Generated by iptables-save v1.4.21 on Wed Apr  8 23:37:43 2015
*nat
:PREROUTING ACCEPT [13:2206]
:INPUT ACCEPT [1:64]
:OUTPUT ACCEPT [4:268]
:POSTROUTING ACCEPT [4:268]
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 80 -j MASQUERADE
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 8080 -j DNAT --to-destination 172.17.0.2:80
COMMIT
# Completed on Wed Apr  8 23:37:43 2015

Docker-Info

Containers: 1
Images: 25
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 27
Execution Driver: native-0.2
Kernel Version: 3.16.0-4-amd64
Operating System: Debian GNU/Linux 8 (jessie)
CPUs: 4
Total Memory: 7.746 GiB
Name: nuc-001
ID: WCMU:MN3T:VFKR:IU42:6423:OEI6:IB5Q:WBNV:K75H:JZDS:UWU5:57WD
WARNING: No memory limit support
WARNING: No swap limit support
Binäranomalie
quelle
Darf der Downvoter erklären?
Binaryanomaly
1
Ich war es nicht, aber ich denke, wer auch immer es getan hat, glaubt, dass dies eher eine Serverfehlerfrage als eine Programmierfrage ist. Sie haben wahrscheinlich recht; Vielleicht möchten Sie es migrieren.
1
Können Sie die Ausgabe von zeigen iptables-save? Ich vermute, dass Docker die Port-Übersetzung mit einer Iptables-Regel über MASQUERADE / NAT durchführt, aber ich weiß es nicht genau
ComputerDruid vom

Antworten:

12

Intern verwendet Docker iptables, um Verbindungen zum Docker-Host an Port 8080 an den Dienst weiterzuleiten, der an Port 80 des Containers empfangsbereit ist. Der Schlüssel in Ihrer Konfiguration ist diese Zeile -

-A DOCKER ! -i docker0 -p tcp -m tcp --dport 8080 -j DNAT --to-destination 172.17.0.2:80

Durch Einfügen ( -I) einer neuen Weiterleitungszeile können Sie die Weiterleitung von Verbindungen an die Container-IP blockieren, in diesem Fall 172.17.0.2. Probieren Sie diese Regel aus -

/sbin/iptables -I FORWARD '!' -s 123.456.789.0 -d 172.17.0.2 -p tcp --dport 80 -j DROP

Daniel t.
quelle
1
Ist es möglich, diese Regel beim Starten eines neuen Containers automatisch einzufügen?
Nicolas Massart
4

Sie können den Port an Ihren lokalen Computer binden. Dann wird Docker den Port nicht nach außen freilegen. (Iptables)

docker run -p 127.0.0.1:8080:8080 some_image
RenRen
quelle
Vielen Dank! Dies ist der aktuelle Weg, die Dokumentation bestätigt dies: docs.docker.com/engine/reference/commandline/run/…
Werner