2016-03-25 42 views
1

我有一個具有兩個網絡接口泊塢窗應用容器(node:latest圖像):港碼頭工人基於容器的路由

  • 的eth1:這是一個默認的界面,是從所有容器之間的橋接網絡一項服務。 (由pipework管理,但我不能改變這個水平的任何東西)
  • 爲eth0:是常規docker0接口,並已獲得無處不在,除了那些在eth1

這裏是默認的路由表:

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 

正如你看到它是需要有eth1爲默認界面,但它使我一個問題:我的應用程序需要ssh訪問一些其他遠程通過eth1無法訪問的服務器,但eth0有權訪問。所以我需要改變這個請求的路由。我的第一個解決方案是這樣的:

route add -net 10.20.33.0/24 gw 172.17.42.1 

這種方式工作得很好,我會得到範圍10.20.33.0/24訪問這些地址。但它會阻止從主機訪問應用程序本身。該應用程序在端口80上運行,並且在添加此路由之後,來自範圍爲10.20.33.0/24的主機的所有請求都將失敗。

所以我想這條路線是如此全球化,並影響所有輸入/輸出請求的IP範圍。我搜索的方式,只是途徑輸出的SSH要求各地計算器,到目前爲止,這是我所:

# 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 

但它無法正常工作。我試圖通過iptables登錄標記的包,所以也許我能找到在這個過程中的任何問題,但syslog沒有在容器內運行,所以我安裝了它apt-get install rsyslog,並將此規則:

iptables -A PREROUTING -t mangle -p tcp --dport 22 -j LOG --log-level 4 --log-prefix "fwmark 1: " 

但它的不記錄任何東西。

+0

有你刪除這條路線:路線添加-net 10.20.33.0/24 GW 172。17.42.1你爲路由ssh設置了iptables之後嗎? –

+0

http://unix.stackexchange.com/questions/1194/multigateway-routing-for-specific-src-port?rq=1可能有助於解決您的問題。 –

+0

@ThanhNguyenVan是的,我已經刪除了該路線,並感謝有關鏈接,我已經嘗試過(最後一條評論)並且沒有任何更改,問題仍然存在。 – Shahinism

回答

2

幾天後,我才解決了這個問題。我用tcpdump如下,以找出是否流量從eth0接口或沒有路由:

tcpdump -i eth0 port ssh 

而且事實證明,第一個問題是iptables標記命令。因此,而不是對PREROUTING鏈標記要求,標誌着我他們OUTPUT鏈就像如下:

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

現在我能看到eth0 ssh的請求,但我仍然無法連接。原來,這個請求需要僞裝的正常工作:

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

最終的腳本是像現在這樣:

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