![如何在 Linux 上通过虚拟 IP 传递所有流量](https://linux22.com/image/650627/%E5%A6%82%E4%BD%95%E5%9C%A8%20Linux%20%E4%B8%8A%E9%80%9A%E8%BF%87%E8%99%9A%E6%8B%9F%20IP%20%E4%BC%A0%E9%80%92%E6%89%80%E6%9C%89%E6%B5%81%E9%87%8F.png)
我在 CentOS 服务器上有一块以太网卡。它已配置:
eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether 40:f2:e9:9b:b7:bb brd ff:ff:ff:ff:ff:ff
inet 192.168.1.1/24 brd 10.54.19.255 scope global eth1
inet 192.168.1.2/24 scope global secondary eth1
inet6 fe80::42f2:e9ff:fe9b:b7bb/64 scope link
192.168.1.2 是 VIP(虚拟 IP 由 keepalived 创建)。
我想让所有流量都通过虚拟 IP(192.168.1.2),并且输出数据包必须包含 VIP,而不是真实 IP(192.168.1.1)。我使用了 iptables,但它不起作用:输出数据包仍然包含真实 IP,而不是 VIP。以下是 iptables 命令:
iptables -t nat -I POSTROUTING -d x.x.x.x -j SNAT --to 192.168.1.2
答案1
您是否更改了路由表?您可能需要将路由添加到源地址为 192.168.1.2 的网关。您可以使用 iproute2 查看路由表:
ip route
如果你有类似的东西:
default via 192.168.1.254 dev eth1
您添加一条到该地址的路线:
ip route add 192.168.1.254 dev eth1 src 192.168.1.2
或者你可以添加路由到子网:
ip route add 192.168.1.0/24 dev eth1 src 192.168.1.2
实际上,到这个子网的路由已经存在于您的路由表中,但源 IP 地址为 192.168.1.1,因此您必须删除此条目。首先要做的是查看路由表。希望这会有所帮助。