Ich habe einen Andockfensters Applikationsbehälter (node:latest
Bild), die zwei Netzwerkschnittstellen hat:Port-based Routing in Andockfensters Behälter
- eth1: welcher A die Standardschnittstelle ist und das Brückennetzwerk zwischen allen Behältern aus Ein Dienst. (Verwaltung
pipework
, aber ich kann nichts in dieser Ebene ändern) - eth0: die eine regelmäßige
docker0
Schnittstelle ist und hat Zugang zu überall, außer denen aufeth1
.
Und hier ist die Standard-Routing-Tabelle:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.25.88.254 0.0.0.0 UG 0 0 0 eth1
10.25.88.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
Wie Sie sehen es notwendig ist, eth1
als Standardschnittstelle zu haben, aber es macht mir ein Problem: Meine Anwendung benötigt ssh
Zugang zu einem anderen Fern Server, auf die nicht über eth1
, sondern über eth0
zugegriffen werden kann, hat Zugriff. Also muss ich die Route für diese Anfragen ändern. Meine erste Lösung war:
route add -net 10.20.33.0/24 gw 172.17.42.1
Dieser Ansatz funktioniert gut, und ich werde den Zugriff auf diese Adressen in Bereich 10.20.33.0/24
bekommen. Aber es wird den Zugriff von diesen Hosts auf die Anwendung selbst blockieren. Die Anwendung wird auf Port 80 ausgeführt, und nach dem Hinzufügen dieser Route schlagen alle Anfragen von Hosts im Bereich 10.20.33.0/24
fehl.
Also nehme ich an, dass die Route so global ist und alle Eingabe/Ausgabe-Anfragen auf diesen Bereich von IPs wirkt. Ich suchte nach einem Weg, um gerade Strecke Ausgabe ssh Anfragen alle über Stackoverflow und so weit das ist, was ich habe:
# Initialize route table
echo 1 p.ssh > /etc/iproute2/rt_tables
ip route add table p.ssh default via 172.17.42.1
# Mark Packet with matching D.Port
iptables -A PREROUTING -t mangle -p tcp --dport 22 -j MARK --set-mark 1
iptables -A POSTROUTING -t nat -o eth0 -p tcp --dport 22 -j SNAT --to 172.17.42.1
#IP Route
ip rule add fwmark 1 table p.ssh
ip route flush cache
#IP Stack
#This is the missing part from the guide
echo 1 > /proc/sys/net/ipv4/ip_forward
for f in /proc/sys/net/ipv4/conf/*/rp_filter ; do echo 0 > $f ; done
echo 0 > /proc/sys/net/ipv4/route/flush
Aber es funktioniert nicht. Ich habe versucht, das markierte Paket von iptables
so vielleicht einzuloggen ich jedes Problem in dem Prozess finden konnte, aber die syslog
nicht im Innern des Behälters ausgeführt wird, so dass ich es installierte apt-get install rsyslog
und fügte hinzu, diese Regel:
iptables -A PREROUTING -t mangle -p tcp --dport 22 -j LOG --log-level 4 --log-prefix "fwmark 1: "
Aber es ist auch nichts protokollieren.
haben Sie diesen Weg entfernt: route add -net 10.20.33.0/24 gw 172.17.42.1 nachdem du iptables nur für route ssh gesetzt hast? –
http://unix.stackexchange.com/questions/1194/multigateway-routing-for-specific-src-port?rq=1 könnte helfen, Ihre Probleme zu lösen. –
@ ThanhNguyenVan Ja, ich habe diese Route entfernt, und danke über den Link, ich habe es versucht (der letzte Kommentar als Antwort) und nichts geändert, das Problem bleibt immer noch. – Shahinism