如何将软件网络连接路由到指定接口(linux)

如何将软件网络连接路由到指定接口(linux)
aprogram -> eth1 -> internet A
bprogram -> eth2 -> internet B
aprogram -> eth2 -> internet B
etc.

程序(例如python脚本、curl)的网络通信通过自定义机制路由到指定接口。

我该如何在 Linux(debian 或 ubuntu)下解决这个问题?

答案1

您可以将策略路由与ownermatch(iptables)或skuid/ skgid(nftables)一起使用,并在不同的用户下运行这些程序。

  1. 为不同的表添加不同的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
  1. 根据防火墙标记添加使用它们的规则:
ip rule add fwmark 1 lookup 101
ip rule add fwmark 2 lookup 102
ip rule add fwmark 3 lookup 103
  1. 添加防火墙规则以根据套接字所有者将这些标记分配给数据包:
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,依此类推。

相关内容