2016-04-27 12 views
3

Ich habe docker-1.9.1 läuft auf einer QNAP RAID-Maschine. Es hat das Standardnetzwerk bridge, das das Subnetz 10.0.3.0/24 verwendet. In iptables sehe ich eine Regel in der nat Tabelle:Automatisiert Docker IP Masquerading-Regeln in iptables für Brückennetzwerke?

-A POSTROUTING -s 10.0.3.0/24 ! -d 10.0.3.0/24 -j MASQUERADE

Ich gehe davon aus, dass Docker diese Regel selbst geschaffen.

Ich habe eine neue Brücke Netzwerk erstellt:

docker network create \ 
--gateway=10.0.5.1 \ 
--subnet=10.0.5.0/24 \ 
-o "com.docker.network.bridge.host_binding_ipv4"="0.0.0.0" \ 
-o "com.docker.network.bridge.enable_icc"="true" \ 
-o "com.docker.network.driver.mtu"="1500" \ 
-o "com.docker.network.bridge.name"="lxcbr1" \ 
-o "com.docker.network.bridge.enable_ip_masquerade"="true" \ 
isolated_nw 

Dies ist nicht eine Regel in iptables schafft. Habe ich einen Schritt verpasst?

Hier ist die vollständigen Setup-Befehle und Ergebnisse, Kopieren @larsks' Beispiel:

[/share/Containers] # docker --version 
Docker version 1.9.1, build 147ce3e 
[/share/Containers] # iptables -t nat -S | grep 10.0.5.0 
[/share/Containers] # docker network create \ 
> --gateway=10.0.5.1 \ 
> --subnet=10.0.5.0/24 \ 
> -o "com.docker.network.bridge.host_binding_ipv4"="0.0.0.0" \ 
> -o "com.docker.network.bridge.enable_icc"="true" \ 
> -o "com.docker.network.driver.mtu"="1500" \ 
> -o "com.docker.network.bridge.name"="lxcbr1" \ 
> -o "com.docker.network.bridge.enable_ip_masquerade"="true" \ 
> isolated_nw 
a7b5c938008169f32fcdfc1d9409716b725cc916b30f472ac6ec2a1d71fb77f0 
[/share/Containers] # iptables -t nat -S | grep 10.0.5.0 
[/share/Containers] # iptables -t nat -S 
-P PREROUTING ACCEPT 
-P INPUT ACCEPT 
-P OUTPUT ACCEPT 
-P POSTROUTING ACCEPT 
-A POSTROUTING -s 10.0.3.0/24 ! -d 10.0.3.0/24 -j MASQUERADE 
[/share/Containers] # 
+0

Kennen Sie Ihr eigenes Bridge-Netzwerk unter https://docs.docker.com/engine/userguide/containers/networkingcontainers/? –

+0

Ich habe Beispiele auf dieser Seite verwendet, um mein eigenes Netzwerk zu erstellen. Sieht nicht so aus, als ob es ip masquerade oder iptables abdeckt. –

+0

Es ... tut tatsächlich. Sie können die tatsächliche Reihenfolge der Befehle sehen, die ich in meiner Antwort ausgeführt habe. Oder Sie können dies beobachten, was eine tatsächliche Sitzung von mir ist, die die gleichen Tests ausführt: https://asciina.org/a/9ipp0n6izkcb3iqk2tdgmpx1i – larsks

Antwort

0

Ich bin mit Docker 1.9.1 (auf Fedora 23 Atomic) und Ihr Befehl scheint ganz gut zu funktionieren.

Vor der Erstellung des Netzwerks:

# docker --version 
Docker version 1.9.1, build 7206621 
# iptables -t nat -S | grep 10.0.5.0 
<no result> 

das Netzwerk erstellen:

docker network create \ 
--gateway=10.0.5.1 \ 
--subnet=10.0.5.0/24 \ 
-o "com.docker.network.bridge.host_binding_ipv4"="0.0.0.0" \ 
-o "com.docker.network.bridge.enable_icc"="true" \ 
-o "com.docker.network.driver.mtu"="1500" \ 
-o "com.docker.network.bridge.name"="lxcbr1" \ 
-o "com.docker.network.bridge.enable_ip_masquerade"="true" \ 
isolated_nw 

prüfen iptables:

# iptables -t nat -S | grep 10.0.5.0 
-A POSTROUTING -s 10.0.5.0/24 ! -o lxcbr1 -j MASQUERADE 

... Ich stelle fest, dass docker network rm isolated_nw ausgeführt wird, während es richtig löscht Das Bridge-Gerät scheint die iptables-Regel nicht zu entfernen. Dies scheint in neueren Versionen von Docker behoben zu sein (z. B. ich betreibe 1.11.0 lokal, und diese Version scheint die Regel beim Löschen im Netzwerk korrekt zu entfernen).

aktualisiert

Wenn das Update auf Ihre Frage von iptables -t nat -S den gesamten Ausgang hat, dann etwas wird anders auf, weil Sie die DOCKER Kette in der nat Tabelle fehlen.

# iptables -t nat -S 
-P PREROUTING ACCEPT 
-P INPUT ACCEPT 
-P OUTPUT ACCEPT 
-P POSTROUTING ACCEPT 
-N DOCKER 
-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 10.0.5.0/24 ! -o lxcbr1 -j MASQUERADE 
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE 

Und in der Tat, ich bin überrascht, dass Ihr create network Befehl abgeschlossen ist sogar, denn wenn ich manuell die DOCKER Kette und Verweise entfernen, versucht in ein neues Netzwerk auf meinem System Ergebnis zu erstellen:

Error response from daemon: Failed to program NAT chain: Failed to 
inject docker in PREROUTING chain: iptables failed: iptables --wait 
-t nat -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER: iptables 
v1.4.21: Couldn't load target `DOCKER':No such file or directory 
+0

Ich ändere meine Frage mit meiner Version dieser Befehle. Erstellt die Regel nicht und weiß immer noch nicht warum. –

+0

Ich habe eine Docker-Kette, aber nicht in der 'nat' Tabelle. [/ share/Container] # iptables -S -P INPUT ACCEPT -P ACCEPT FORWARD -P OUTPUT ACCEPT N DOCKER –