根据目标IP更改源地址

根据目标IP更改源地址

我们有几台“路由器”机器,它们在同一台主机上收集大量外部 IP 地址,并将流量重定向、NAT 或代理到内部网络。它们还充当内部网络上机器的路由器。这很好用,但是我无法制作路由表,因此我可以根据内部网络中的机器想要访问的目的地更改源地址。

假设我有一个路由器,它有公共地址P1 (5.5.5.1/24)P2 (5.5.5.2/24)。所有流量都经过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根本不用于传出连接。

我做对了吗?我想不是...

答案1

事实上,您可以从主机使用正确的 IP 地址 ping 通目标,但不能从内部网络 ping 通(如果我没有看错您的评论的话),这表明您已为内部网络启用了 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

请注意,这只会使转发的内部网络流量来自所需的 IP(示例中为 5.5.5.2),您仍然需要 iproute 规则/表来使相同的规则适用于路由器。(连接来自路由器本身。)

答案2

您需要为每个连接设置特定的路由表,这称为基于策略的路由。每个表都有一个策略,您可以在其中设置源地址和其他选项(如果需要)。

就您而言,您需要添加新表:

echo 200 P1 >> /etc/iproute2/rt_tables
echo 200 P2 >> /etc/iproute2/rt_tables

添加路线:

ip route add 5.5.5.0/24 dev eth1 src 5.5.5.1 表 P1
ip route add default via 5.5.5.254 表 P1
ip route add 5.5.5.0/24 dev eth1 src 5.5.5.2 表 P2
ip route add default via 5.5.5.254 表 P2
ip route add 8.8.8.8 via 5.5.5.254 表 P2

这是重要的一点,您要告诉它使用接收连接的相同 IP 进行响应。

ip 规则从 5.5.5.1 表 P1
添加 ip 规则从 5.5.5.2 表 P2 添加

您可以根据需要添加任意数量的表,只需记住它们都需要默认路由、源接口和源地址,因此当数据包通过表路由时,源地址将被正确设置并且它将使用正确的接口。

看看这些页面,它提供了许多有关如何设置此类表格的附加信息:

http://lartc.org/howto/lartc.rpdb.html

相关内容