我们有几台“路由器”机器,它们在同一主机上收集大量外部IP地址,并将stream量redirect,NAT或代理到内部networking。 它们还充当内部networking上机器的路由器。 这工作正常,但是我无法做出路由表,所以我可以改变源地址,基于目标机器从内部networking要访问。
假设我有一个路由器,它具有公共地址P1 (5.5.5.1/24)和P2 (5.5.5.2/24) 。 所有stream量都经过P1 ,但是如果有必要,主机也可以在P2上访问。 这看起来像这样,工作正常:
> ip addr ... 1: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether aa:bb:cc:dd:ee:11 brd ff:ff:ff:ff:ff:ff inet 5.5.5.1/24 brd 5.5.5.255 scope global eth1 inet 5.5.5.2/24 brd 5.5.5.255 scope global secondary eth1:p2 ...
现在我想使用P2作为源地址,如果我想访问Google DNS服务(例如8.8.8.8 )。 所以我在路由表中添加一行:
> ip route add 8.8.8.8 via 5.5.5.254 dev eth1 src 5.5.5.2 > ip route ... default via 5.5.5.254 dev eth1 5.5.5.0/24 dev eth1 proto kernel scope link src 5.5.5.1 8.8.8.8 via 5.5.5.254 dev eth1 src 5.5.5.2 ...
但是这不起作用。 如果我ping了8.8.8.8 ,主机仍然使用P1作为源地址,并且根本不使用P2作为出站连接。
我做对了吗? 我猜不会…
事实上,你可以通过主机的正确IP地址ping通目的地,但不能从内部networkingping通目的地(如果我阅读了你的评论权限),这表明你已经为内部networking启用了NAT。
在这种情况下,您必须查看iptables规则并编辑相应的SNAT或MASQUERADE规则。 例如:
iptables -A POSTROUTING -s <your-internal-network> -d 8.8.8.8 -o eth1 \ -j SNAT --to-source 5.5.5.2
请注意,这只会使转发的内部networkingstream量来自所需的IP(本例中为5.5.5.2),您仍然需要使用iproute规则/表格来使相同的规则适用于路由器。 (来自路由器本身的连接。)
您需要为每个连接设置特定的路由表,这被称为基于策略的路由。 每个表都有一个策略,您可以根据需要设置源地址和其他选项。
在你的情况下,你会添加新的表格:
echo 200 P1 >> / etc / iproute2 / rt_tables
回声200 P2 >> / etc / iproute2 / rt_tables
添加路线:
ip route add 5.5.5.0/24 dev eth1 src 5.5.5.1 table P1
IP路由添加默认通过5.5.5.254表P1
ip route add 5.5.5.0/24 dev eth1 src 5.5.5.2表P2
IP路由添加默认通过5.5.5.254表P2
IP路由通过5.5.5.254表P2添加8.8.8.8
这是重要的一点,你告诉它用与它接收的IP相同的IP进行响应。
ip rule从5.5.5.1表中添加P1
ip规则从5.5.5.2表中添加P2
你可以添加任意多的表,只要记住它们都需要一个默认路由,一个源接口和一个源地址,所以当一个数据包通过表路由时,源地址将被正确设置,并且将使用正确的界面。
看看这些页面,它提供了很多额外的信息如何设置这种types的表格: