Kok*_*zzu 3 networking load-balancing
我们可以在单个接口上设置多个 IP 地址,例如使用 NetworkManager:
如何与此 PC 外部建立任何连接以使用不同的 IP?
例如,如果我有 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
,依此类推)
小智 11
在 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 rule add fwmark X table Y
) 的数据包使用不同的 IP 路由表。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
Run Code Online (Sandbox Code Playgroud)
(对于这种特殊情况,您可以省略两个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
Run Code Online (Sandbox Code Playgroud)