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=host
Bayrağı 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
$ cat /proc/sys/net/ipv4/ip_forward -> 1
ve özel arayüzdeki -A INPUT -i eth1 -j ACCEPT
tüm bağlantıları kabul eder . Hangi kuralları kaçırıyorsunuz?
-A INPUT -i docker0 -j ACCEPT
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.