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 連接到您的目的地,如果您 ping 某些東西,您可以看到它,並且如果您使用 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。