Docker - odsłonięte porty dostępne z zewnątrz - reguły iptables są ignorowane

15

Mam kontener dokera działający jak:

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

Które działa dobrze. Kontener udostępnia port od 80 do 8080 i jest dostępny z hosta lokalnego.

Z jakiegoś powodu jednak całkowicie ignoruje reguły INPUT iptables i jest dostępne również z zewnątrz.

Jak mogę ograniczyć dostęp do mojego kontenera Docker, aby umożliwić dostęp np. IP 123.456.789.0 do niego z zewnątrz?

Dzięki.


sudo iptables -L -n -v --line-numbers

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

informacje o dokerze

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
binaranomalia
źródło
Czy downvoter może to wyjaśnić?
dwuskładnikowy
1
Nie byłem mną, ale myślę, że ktokolwiek to zrobił, uważa, że ​​jest to raczej pytanie o awarię serwera niż pytanie dotyczące programowania. Prawdopodobnie mają rację; możesz go migrować.
1
Czy możesz pokazać wynik iptables-save? Podejrzewam, że sposób dokera dokonuje translacji portów z regułą iptables za pośrednictwem MASQUERADE / NAT, ale tak naprawdę nie wiem
ComputerDruid

Odpowiedzi:

12

Wewnętrznie Docker używa iptables do przekazywania połączeń z hostem dokera na porcie 8080 do usługi nasłuchującej na porcie 80 na kontenerze. Kluczem w konfiguracji jest ten wiersz -

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

Wstawiając ( -I) nową linię przekazywania, można zablokować przekazywanie połączeń do adresu IP kontenera, w tym przypadku 172.17.0.2. Wypróbuj tę zasadę -

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

Daniel t.
źródło
1
Czy możliwe jest automatyczne wstawienie tej reguły przy uruchamianiu nowego kontenera?
Nicolas Massart,
4

Możesz powiązać port z komputerem lokalnym. Wówczas doker nie wystawi portu na zewnątrz. (iptables)

docker run -p 127.0.0.1:8080:8080 some_image
RenRen
źródło
Dzięki! To jest właściwa droga, dokumentacja to potwierdza: docs.docker.com/engine/reference/commandline/run/…
Werner