Docker - Port terbuka yang dapat diakses dari luar - aturan iptables diabaikan

15

Saya memiliki wadah buruh pelabuhan yang beroperasi seperti:

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

Itu bekerja dengan baik. Kontainer memperlihatkan port 80 hingga 8080 dan dapat diakses dari localhost.

Namun karena beberapa alasan mengabaikan aturan iptables INPUT sepenuhnya dan juga dapat diakses dari luar.

Bagaimana saya bisa membatasi akses ke wadah Docker saya hanya mengizinkan yaitu IP 123.456.789.0 untuk mengaksesnya dari eksternal?

Terima kasih.


iptables sudo -L -n -v --line-number

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

info buruh pelabuhan

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
binaryanomaly
sumber
Bolehkah sang downvoter menjelaskan?
binaryanomaly
1
Bukan saya, tapi saya pikir siapa pun yang berpikir ini lebih merupakan pertanyaan serverfault daripada pertanyaan pemrograman. Mereka mungkin benar; Anda mungkin ingin memigrasikannya.
1
Bisakah Anda menunjukkan output dari iptables-save? Saya curiga cara buruh pelabuhan melakukan terjemahan port adalah dengan aturan iptables via MASQUERADE / NAT, tapi saya tidak benar-benar tahu
ComputerDruid

Jawaban:

12

Secara internal Docker menggunakan iptables untuk meneruskan koneksi ke host buruh pelabuhan pada port 8080 ke layanan mendengarkan pada port 80 pada wadah. Kunci dalam konfigurasi Anda adalah baris ini -

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

Dengan menyisipkan ( -I) garis maju baru, Anda dapat memblokir koneksi agar tidak diteruskan ke IP kontainer, dalam hal ini 172.17.0.2. Coba aturan ini -

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

Daniel t.
sumber
1
Apakah mungkin membuat aturan ini dimasukkan secara otomatis saat memulai wadah baru?
Nicolas Massart
4

Anda dapat mengikat port ke mesin lokal Anda. Maka buruh pelabuhan tidak akan mengekspos port ke luar. (iptables)

docker run -p 127.0.0.1:8080:8080 some_image
RenRen
sumber
Terima kasih! Ini adalah cara aktual untuk pergi, dokumentasi menegaskan ini: docs.docker.com/engine/reference/commandline/run/…
Werner