Iptables kural kümesi, bir docker kapsayıcısının bir ana bilgisayar IP'sindeki bir hizmete erişebilmesi için ayarlandı


18

Bir docker kapsayıcısından bir ana bilgisayar özel arabirimine (ip) erişimde sorun yaşıyorum. Bunun Iptables kurallarıyla (veya belki de yönlendirmeyle) ilgili olduğundan oldukça eminim. --net=hostBayrağı eklediğimde docker run, her şey beklendiği gibi çalışıyor. Benzer şekilde INPUT politikasının liberal bir politika izlediğini belirlediğimde -P INPUT ACCEPT, işler beklediğim gibi çalışır. Ancak bunlar istenmeyen ve güvenli olmayan seçeneklerden kaçınmak istiyorum.

Hizmetlerime (DNS) özgü olmadığından, docker ile birlikte arama yapmak farklı (popüler) bir sorun alanında arama yaptığından, arama sonuçlarına gürültü eklediğinden bunu sorundan hariç tuttum.

Ayrıca Docker kaplarının bağlanması uygun bir seçenek değildir, çünkü belirli kapların --net = host seçeneğiyle çalıştırılması gerekir, bağlantıyı önler ve mümkün olan yerlerde tutarlı bir durum oluşturmak istiyorum.

Aşağıdaki Iptables kurallarına sahibim. Sanırım CoreOS, Digital Ocean ve Docker'ın bir kombinasyonu.

-P INPUT DROP
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N DOCKER
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth1 -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 3 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT
-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

(İlgili) ana bilgisayar arayüzlerim:

3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    inet 10.129.112.210/16 brd 10.129.255.255 scope global eth1
       valid_lft forever preferred_lft forever
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    inet 172.17.42.1/16 scope global docker0
       valid_lft forever preferred_lft forever

Ve bir liman işçisi konteyneri çalıştırıyorum:

$ docker run --rm -it --dns=10.129.112.210 debian:jessie # Specifying the DNS is so that the public DNS servers aren't used.

Bu noktada 10.129.112.210:53 numaralı yerel bir hizmeti kullanabilmek istiyorum. Böylece aşağıdakiler bir cevap vermelidir:

$ ping google.com
^C
$ ping user.skydns.local
^C

Aynı komutu ana bilgisayarımdan çalıştırdığımda:

$ ping photo.skydns.localPING photo.skydns.local (10.129.112.206) 56(84) bytes of data.
64 bytes from 10.129.112.206: icmp_seq=1 ttl=64 time=0.790 ms
^C

Benim resolv.conf

$ cat /etc/resolv.conf
nameserver 10.129.112.210
nameserver 127.0.0.1
nameserver 8.8.8.8
nameserver 8.8.4.4

Buradaki nokta, genel ana bilgisayarlara değil, ana bilgisayarda bulunan yerel DNS hizmetini (başka bir docker örneği aracılığıyla) kullanarak dahili olanlara erişmektir.

Daha da fazla göstermek için (Ascii sanat tasarım becerilerim iptables fu'yu geride bırakıyor, bu yüzden bu noktada yeterli demeliyim):

 ______________________________________________
|  __________________________           Host   |
| |   Docker DNS container   |                 |
|  ``````````````````````|```                  |
|                        |                     |
|     ,----------,---( private n. interface )  |
|     |          |                             |
|     |          |   ( public  n. interface )---
|     |          |                             |
|     |          |   ( loopbck n. interface )  |
|     |          |                             |
|     |          |                             |
|     |        __|_______________________      |
|     |       | Docker service container |     |
|     |        ``````````````````````````      |
|     |                                        |
|     |                                        |
| [ Local host service using DNS. ]            |
|                                              |
|______________________________________________|

  private (host) network interface: eth1 (10.129.0.0/16)
  Docker network interface: docker0 (172.17.0.0/16)

Ben farklı örnek Iptables yapılandırmaları araştırdı, okudum ve uyguladım, ama neler olduğunu anlamak ve böylece istenen sonucu almak için daha "gelişmiş" Iptables kurallarını çok az biliyorum.

Çıktı iptables -t nat -nL:

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DOCKER     all  --  0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
DOCKER     all  --  0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  172.17.0.0/16        0.0.0.0/0

Chain DOCKER (2 references)
target     prot opt source               destination

Çıktı cat /proc/sys/net/ipv4/ip_forward:

1

Çıktısını gönderebilir misiniz iptables -t nat -nL? Herhangi bir paket analizi yaptınız mı, kaynak kapsayıcıdan bir ping yapın ve ana bilgisayardaki paketleri yakalamak için tcpdump kullanın.
Daniel t.

Kesinlikle, şimdiye kadar yardım ettiğiniz için teşekkürler: pastebin.com/TAaT73nk ( Yoruma uymadı ..) - düzenle -> Bağlantı süresi dolmayan bir macunla güncellendi.
Dynom

Belki sorununuzu doğru anlamadım, ancak ana bilgisayarda DNS sorgularına izin vermek için herhangi bir kural göremiyorum. Ayrıca, ip_forward etkin mi?
Laurentiu Roescu

Merhaba @LaurentiuRoescu. $ cat /proc/sys/net/ipv4/ip_forward -> 1ve özel arayüzdeki -A INPUT -i eth1 -j ACCEPTtüm bağlantıları kabul eder . Hangi kuralları kaçırıyorsunuz?
Dynom

2
Kaptan gelen paketlerin eth1 değil docker0 arayüzünden geldiğini düşünüyorum. deneyin-A INPUT -i docker0 -j ACCEPT
Laurentiu Roescu

Yanıtlar:


14

Kapsayıcı, docker0arabirim kullanarak ana bilgisayarla iletişim kurar . Kapsayıcı eklentisinden gelen trafiğe izin vermek için:

-A INPUT -i docker0 -j ACCEPT

2
Dynom, bundan kaçınmak isteyebileceğiniz bir ders, tüm reddetmelerinizi günlüğe kaydetmenin faydalı olmasıdır iptables -A INPUT -j LOG. Damga IN=docker0hangi kural ayarlamasının gerekli olduğunu belirlemede çok yararlı olurdu. Mükemmel - Laurentiu'nun işinden almak için değil - benden +1!
MadHatter, Monica'yı

5
UFW kullanan insanlar için, Docker kapsayıcılarından tüm iletişimin barındırılmasına izin vermek için yaptığım şey: ufw docker0'da izin ver
Ali Ok

0

Ben çok benzer bir durumla karşılaştım ama ekleme -A INPUT -i docker0 -j ACCEPTdock ana eth0 arayüzü üzerinden tüm erişim açılacak kapsayıcılar için kesinlikle ne istediğim değil.

Ve konteynırımın ana bilgisayar ağından tamamen kapatılmak yerine ana bilgisayar arabirimine sınırlı erişim (sadece bağlantı noktası 22 diyelim) olduğunu fark ettiğim için, iptables kurallarını inceledim ve IN_public_allow zincirinde bundan sorumlu olması gereken bir kural buldum. Kural -A IN_public_allow -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT. Bu yüzden, kabımın istenen diğer ana bilgisayar bağlantı noktalarına erişmesine izin vermek için benzer kurallar ekledim, bu da kapsayıcılara ana bilgisayar ağı erişimini açmanın biraz daha kesin bir yolu olabileceğini düşünüyorum.


-i docker0bunun docker0 ağı üzerinden ulaşmayan trafiği etkilememesini sağlamalıdır. Yine de dilbilgisi belli değil. Belki de eth0 aracılığıyla liman hizmet sağlayıcılarından giden erişimin etkinleştirildiğini söylüyordunuz, bu doğru olabilir. Daha hedeflenmiş kuralların yalnızca ihtiyacınız olduğu kadar açılabileceğini kabul ediyorum.
mc0e
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.