aprogram -> eth1 -> internet A
bprogram -> eth2 -> internet B
aprogram -> eth2 -> internet B
etc.
程序(例如python脚本、curl)的网络通信通过自定义机制路由到指定接口。
我该如何在 Linux(debian 或 ubuntu)下解决这个问题?
答案1
您可以将策略路由与owner
match(iptables)或skuid
/ skgid
(nftables)一起使用,并在不同的用户下运行这些程序。
- 为不同的表添加不同的nexthops:
ip route add default via 192.0.2.1 table 101
ip route add default via 192.0.2.2 table 102
ip route add default via 192.0.2.3 table 103
- 根据防火墙标记添加使用它们的规则:
ip rule add fwmark 1 lookup 101
ip rule add fwmark 2 lookup 102
ip rule add fwmark 3 lookup 103
- 添加防火墙规则以根据套接字所有者将这些标记分配给数据包:
nft add rule filter output meta skuid 1001 mark set 1
nft add rule filter output meta skuid 1002 mark set 2
nft add rule filter output meta skuid 1003 mark set 3
或者
iptables -A OUTPUT -m owner --uid-owner 1001 -j MARK --set-mark 1
iptables -A OUTPUT -m owner --uid-owner 1002 -j MARK --set-mark 2
iptables -A OUTPUT -m owner --uid-owner 1003 -j MARK --set-mark 3
现在,在 UID 1001 下运行的程序将通过 进行路由192.0.2.1
,依此类推。