Verwenden von iptables, um einem LXC-Container eine routbare IP zuzuweisen

3347
dty

Ich verwende Docker, um LXC-Container zu verwalten. Momentan konfiguriert Docker den zugrunde liegenden LXC-Container mit Host-Only-Routing und verwendet dann iptables / DNAT, um Löcher in den Container zu stanzen, sodass er über die IP-Adresse des Hosts und einen "zufälligen" Port erreichbar ist.

Dies wird aus mehreren Gründen für uns nicht funktionieren. Wir möchten, dass jeder Container über seine eigene (routbare) IP erreichbar ist. Ich habe also mit der Verwendung von IP-Tabellen dafür gespielt. Es funktioniert gut für mich zu Hause (läuft auf Ubuntu Raring), aber nicht bei der Arbeit (läuft auf Ubuntu Precise). Ich vermute, es gibt einige Standard-Kernel-Konfigurationen, die geändert wurden, die mir nicht bekannt sind.

Folgendes mache ich:

1) Einrichten einer neuen virtuellen Macvlan-Schnittstelle, damit ich DHCP verwenden kann, um eine IP zu erhalten:

ip link add container1 link eth0 type macvlan dhclient container1 ip link set container1 up 

Zu diesem Zeitpunkt habe ich eine neue Schnittstelle mit eigener IP-Adresse und Standard-Gateway, Subnetzmaske usw., die der zugrunde liegenden physischen Schnittstelle ( eth0) entspricht.

2) Konfigurieren Sie IP-Tabellen für den eingehenden DNAT-Verkehr von der IP der neuen Schnittstelle. 10.10.10.88Angenommen, die neue Schnittstelle hat IP und der Docker-gesteuerte LXC-Container hat IP 172.17.0.20.

iptables -t nat -N CONTAINER1 iptables -t nat -A PREROUTING -p all -d 10.10.10.88/32 -j CONTAINER1 iptables -t nat -A CONTAINER1 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.20:8080 

(Hier nehme ich auch den Port von 80 auf 8080 NAT).

Wie gesagt, das funktioniert gut zu Hause. Ich kann diesen Container jetzt vom Host als 172.17.0.20:8080 und von einem anderen Computer in meinem LAN als 10.10.10.88:80 erreichen. (Interessanterweise kann ich es am 10.10.10.88:80 nicht vom Host aus erreichen, aber ich denke, ich brauche eine andere Regel in der OUTPUT-Kette, um das zu verstehen.) Aber es funktioniert nicht bei der Arbeit.

Wenn ich bei der Arbeit diesen Container über seine routbare IP-Adresse (in diesem Beispiel 10.10.10.88) erreichen möchte, sehe ich die Pakete, die ankommen und die iptables-Regeln bis zur DNAT-Regel übereinstimmen. Ich kann dies sowohl mit den von iptables -L gedruckten Paketzählern als auch mit dem TRACE-Ziel für die Raw-Tabelle und der Überwachung des Kernelprotokolls beobachten. Aber nach Übereinstimmung mit der DNAT-Regel verschwinden die Pakete einfach. Auf meinem Heimcomputer (der funktioniert) kann ich nach dem DNAT die Pakete durch die INPUT-Kette in der Filtertabelle mit der neuen (NAT'ed) Ziel-IP sehen. Auf meiner Arbeitsmaschine passiert dieser Schritt nicht.

Bei beiden Maschinen ist die IP-Weiterleitung aktiviert.

0
Ich bin verwirrt, sagen Sie Nr. 1, dass Sie den zu Hause laufenden Container nicht von der Arbeit erreichen können? Oder sagen Sie # 2, dass Sie über zwei separate Docker-Instanzen + deren Container verfügen; einer bei der Arbeit, einer zu Hause; ansonsten identisch konfiguriert, abgesehen von den verschiedenen Ubuntu-Versionen, die Sie verwenden? James Webster vor 10 Jahren 0
# 2 - außer dass sie dieselbe Linux-Version sind! dty vor 10 Jahren 0

0 Antworten auf die Frage