Как маршрутизировать программное сетевое соединение к указанному интерфейсу (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. Добавьте разные следующие переходы в разные таблицы:
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и т. д.

Связанный контент