Iptables

iptables - 如果目的地是某個域,則使用不同的傳出 IP

  • September 19, 2020

我有一個有兩個 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。所以我不得不說,如果我的VM想去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 重新路由/轉發流量?如果是,如何?

您目前的設置將不起作用,因為您有兩個 IP 地址分配給一個 NIC。您需要將您的虛擬機變成路由器(或網關)。因此,您需要為該 VM 分配至少兩個網路介面卡,並在不同的子網上具有唯一的 IP 地址。(例如 venet0 = 1.2.3.4/24 和venet1 = 4.3.2.1/24)

首先,在 Linux VM 上啟用 ip 轉發

$ sudo echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
$ sudo sysctl -p

路由表在網路層執行。因此,主機名在這種情況下將不適用。您必須首先將目標主機名轉換為 IP 地址或子網範圍。假設域destination1.com擁有 venet0 的範圍,172.16.10.0/24並且所有流量都必須通過介面venet0退出:

$ sudo ip route add 172.16.10.0/24 dev venet0

雖然域destination2.com擁有 的範圍192.168.20.0/24,但流量必須通過介面venet1退出

$ sudo ip route add 192.168.20.0/24 dev venet1

一旦你對你的配置感到滿意,然後考慮Persistent Routes

引用自:https://unix.stackexchange.com/questions/607478