在 Linux 上,是否可以让所有发往特定 IP 的请求都通过虚拟接口路由,这样在另一端,它们会显示与主机主 IP 地址不同的 IP 地址?假设eth0
IP 地址为 1.1.1.1,而eth0:1
地址为 1.1.1.2。如何让所有发往 1.2.3.4 的请求都显示来自eth0:1
?我正在尝试以下方法,但似乎不起作用:
route add 1.2.3.4 dev eth0:1
答案1
是的。
一种方法是使用 IPTABLES 重写离开具有多个 IP 地址的机器的数据包,使其表明它们来自虚拟接口。尝试
/sbin/iptables -t nat -I POSTROUTING -d 目标 IP -j SNAT --to 虚拟 IP
(当然,您需要按照您的设想设置虚拟 IP,即 eth0:1 或等效 IP 需要存在,以便流量可以找到返回机器的路径)
答案2
可能需要使用命令
ip route add 1.2.3.4 dev eth0:1 src 1.1.1.2
或使用类似选项进行路由。如果此方法无法正常工作,则可能需要高级路由:在 /etc/iproute2/rt_tables 中为此目标创建附加路由表,将上述条目作为唯一条目放入此表中并激活此表:
ip rule add to 1.2.3.4 priority 100 table to__1_2_3_4
ip route flush cache
最后一种绝望的解决方案是 netfilter:您可以在 POSTROUTING 链中使用带有 iptables 的 SNAT 来重写到此目的地的数据包的源地址。