iptables - 如果目标是某个域,则使用不同的传出 IP

iptables - 如果目标是某个域,则使用不同的传出 IP

我有一个有两个 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 连接到您的目的地,如果您 p​​ing 某些内容,您可以看到它,并且如果您使用 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

一旦您对您的配置感到满意,请考虑持久路由

相关内容