我有一个有两个 IP 的虚拟机。假设是 1.2.3.4 和 4.3.2.1。
如果我执行“ip a”,它会显示 1.2.3.4 作为第一个,4.3.2.1 作为第二个:
2: venet0: <BROADCAST,POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1476 qdisc noqueue state UNKNOWN group default
link/void
inet 127.0.0.1/32 scope host venet0
valid_lft forever preferred_lft forever
inet 1.2.3.4/24 brd 1.2.3.255 scope global venet0:0
valid_lft forever preferred_lft forever
inet 4.3.2.1/24 brd 4.3.2.255 scope global venet0:1
valid_lft forever preferred_lft forever
我认为 Linux 总是会尝试使用第一个 IP 连接到您的目的地,如果您 ping 某些内容,您可以看到它,并且如果您使用 1.2.3.4 而不是 4.3.2.1 (ping -I 4.3 .2.1 目的地)。
现在,我使用的应用程序无法使用不同的接口或源 IP 地址,例如 ping 或 Traceroute。所以我不得不说,如果我的虚拟机想要访问destination1.com(域名,而不是IP!),它应该使用4.3.2.1作为源IP,而不是1.2.3.4,因为它与destination1.com有更好的连接。
如果我的虚拟机想要访问destination2.com,它应该使用1.2.3.4作为源IP,而不是4.3.2.1,因为1.2.3.4与destination2.com的连接比4.3.2.1更好。
是否可以像这样使用 iptables 重新路由/转发流量?如果是,怎么办?
答案1
您当前的设置将不起作用,因为您有两个 IP 地址分配给一个 NIC。您需要将虚拟机变成路由器(或网关)。因此,您需要至少为该虚拟机分配两个网络接口卡,并在不同子网中具有唯一的 IP 地址。 (维内特0= 1.2.3.4/24 和韦内特1= 例如 4.3.2.1/24)
首先,在Linux VM上启用ip转发
$ sudo echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
$ sudo sysctl -p
路由表在网络层运行。因此主机名在这种情况下不适用。您必须首先将目标主机名转换为 IP 地址或子网范围。假设域destination1.com
拥有 的范围172.16.10.0/24
,并且所有流量都必须通过接口退出维内特0:
$ sudo ip route add 172.16.10.0/24 dev venet0
虽然域destination2.com
拥有 的范围192.168.20.0/24
,并且流量必须通过接口退出韦内特1
$ sudo ip route add 192.168.20.0/24 dev venet1
一旦您对您的配置感到满意,请考虑持久路由。