2016-03-25 6 views
1

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 auf eth1.

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.

+0

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? –

+0

http://unix.stackexchange.com/questions/1194/multigateway-routing-for-specific-src-port?rq=1 könnte helfen, Ihre Probleme zu lösen. –

+0

@ 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

Antwort

2

Nach ein paar Tagen konnte ich dieses Problem lösen. Ich benutzte tcpdump wie folgt, um herauszufinden, ob der Verkehr durch eth0 Schnittstelle Routing oder nicht:

tcpdump -i eth0 port ssh 

Und es stellte sich heraus, dass das erste Problem von iptables Markierungsbefehl ist. Anstatt also Anträge auf PREROUTING Kette Markierung, ich markierte sie auf OUTPUT Kette wie folgt:

iptables -t mangle -A OUTPUT -p tcp --dport 22 -j MARK --set-mark 1 

Jetzt konnte ich die ssh-Anfragen auf eth0 sehen, aber ich konnte noch keine Verbindung herstellen. Es stellte sich heraus, dass diese Anfragen masqueraded werden müssen, um richtig funktionieren:

iptables --table nat --append POSTROUTING -o eth0 -p tcp --dport 22 -j MASQUERADE 

Die endgültige Skript ist nicht wie jetzt:

REMOTE_HOSTS=10.20.33.0/24 
HOSTS_ADDR=172.17.42.1 

# Add table 
echo 1 p.ssh >> /etc/iproute2/rt_tables 
# Add route 
ip rule add fwmark 1 table p.ssh 
ip route add $REMOTE_HOSTS via $HOSTS_ADDR dev eth0 table p.ssh 

# Sets mark correctly 
iptables -t mangle -A OUTPUT -p tcp --dport 22 -j MARK --set-mark 1 
iptables --table nat --append POSTROUTING -o eth0 -p tcp --dport 22 -j MASQUERADE 

#IP Stack 
echo 1 > /proc/sys/net/ipv4/ip_forward  # Default in debian/ubuntu 
for f in /proc/sys/net/ipv4/conf/*/rp_filter ; do echo 0 > $f ; done