我们可以在单个接口上设置多个 IP 地址,例如使用 NetworkManager:
如何使用不同的 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
您可以动态选择源地址。
基本流程如下:
PREROUTING
在表链中的数据包上设置适当的标记mangle
。- 对于具有不同标记( )的数据包使用不同的 IP 路由表
ip rule add fwmark X table Y
。 - 在每个路由表中使用
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.