Linux 中单个接口上的多个 IP 源

Linux 中单个接口上的多个 IP 源

我们可以在单个接口上设置多个 IP 地址,例如使用 NetworkManager:

多个IP

如何使用不同的 IP 与外部 PC 进行连接?

例如,如果我有 8 个 IP 地址(10.7.4.x, 10.7.4.x+1, 10.7.4.x+2, ...),我想使用不同的 IP 连接每个目标地址,可以使用随机 IP 或顺序 mod(当目标 IP mod 8 = 0 时,然后使用x, 当目标 mod 8 = 1,然后使用x+1,依此类推)

答案1

在 Linux 中,传出连接的源地址选择可以通过路由表来控制:

ip route add 10.11.12.0/24 via 10.7.4.1 src 10.7.4.200

如果您只需要对某些固定 IP 范围使用不同的源地址,这就足够了。然而,通过结合 Linux netfilter ( iptables) 和策略路由 ( )的强大功能,ip rule您可以动态选择源地址。

基本流程如下:

  1. PREROUTING在表链中的数据包上设置适当的标记mangle
  2. 对于具有不同标记( )的数据包使用不同的 IP 路由表ip rule add fwmark X table Y
  3. 在每个路由表中使用src数据包所需的地址。

用于根据“mod 4”设置的目标 IP 标记数据包的 netfilter 设置可能如下所示:

iptables -A PREROUTING  -t mangle -j CONNMARK --restore-mark
iptables -A PREROUTING  -t mangle -m mark --mark 0x0 -d 0.0.0.0/0.0.0.3 \
  -j MARK --set-mark 1
iptables -A PREROUTING  -t mangle -m mark --mark 0x0 -d 0.0.0.1/0.0.0.3 \
  -j MARK --set-mark 2
iptables -A PREROUTING  -t mangle -m mark --mark 0x0 -d 0.0.0.2/0.0.0.3 \
  -j MARK --set-mark 3
iptables -A PREROUTING  -t mangle -m mark --mark 0x0 -d 0.0.0.3/0.0.0.3 \
  -j MARK --set-mark 4
iptables -A POSTROUTING -t mangle -j CONNMARK --save-mark

(对于这种特殊情况,您可以省略两个CONNMARK命令,因为其他标记命令将为同一连接中的所有数据包提供相同的结果;但是,对于更复杂的情况,例如源地址的循环使用,需要这些命令以确保连接中的所有数据包将使用相同的路由。)

IP 路由设置可能如下所示:

ip route add default via 10.7.4.1 src 10.7.4.200 table 1
ip route add default via 10.7.4.1 src 10.7.4.201 table 2
ip route add default via 10.7.4.1 src 10.7.4.202 table 3
ip route add default via 10.7.4.1 src 10.7.4.203 table 4

ip rule add fwmark 1 pref 1 table 1
ip rule add fwmark 2 pref 2 table 2
ip rule add fwmark 3 pref 3 table 3
ip rule add fwmark 4 pref 4 table 4

答案2

用于建立传出连接的应用程序或工具必须了解有多个可能的源 IP 地址,并显式绑定到所需的任何地址。

例如,ssh通过选项具有此功能-b;因此,如果您这样做,ssh -b 10.7.4.201 ...它将使用该地址作为源地址。

以例如循环方式自动使用可能的源地址是不可能的。

什么是 -b 标志?

-b bind_address
         Use bind_address on the local machine as the source address of
         the connection.  Only useful on systems with more than one
         address.

相关内容