[英]Port based routing in docker container
我有一個docker應用程序容器( node:latest
image),它有兩個網絡接口:
pipework
管理,但我不能改變那個級別的任何東西) 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
范圍內的主機的所有請求10.20.33.0/24
將失敗。
所以我認為該路由是如此全局並且影響對該IP范圍的所有輸入/輸出請求。 我搜索了一種方法,只是在stackoverflow上路由輸出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: "
但它也沒有記錄任何東西。
幾天后,我能夠解決這個問題。 我使用tcpdump
如下查找流量是否通過eth0
接口路由:
tcpdump -i eth0 port ssh
事實證明,第一個問題來自iptables
marking命令。 因此,我沒有在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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.