簡體   English   中英

Docker容器中基於端口的路由

[英]Port based routing in docker container

我有一個docker應用程序容器( node:latest image),它有兩個網絡接口:

  • 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范圍內的主機的所有請求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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM