
У меня есть несколько сетевых интерфейсов, обеспечивающих подключение к интернету. Я могу изменить интерфейс, используемый для доступа в интернет, route add default gw ...
в любое время.
Однако возможно ли выбрать шлюз только для определенной команды? Например, один процесс может использовать канал GSM-модема, в то время как система будет использовать канал Ethernet для всех остальных интернет-запросов.
решение1
Вы можете сделать это с помощью iptables
и другого пользователя. Предполагая, что IP-адрес интерфейса, который вы хотите использовать в команде, это 1.2.3.4
и имя eth1
и шлюз 1.2.3.1
.
1) Создайте нового пользователя:
adduser user2
2) Отметьте пакеты, исходящие от этого пользователя:
iptables -t mangle -A OUTPUT -m owner --uid-owner user2 -j MARK --set-mark 42
3) Примените IP-адрес к этим пакетам:
iptables -t nat -A POSTROUTING -o eth1 -m mark --mark 42 -j SNAT --to-source 1.2.3.4
4) Направить отмеченные пакеты через eth1
шлюз:
ip rule add fwmark 42 table 42
ip route add default via 1.2.3.1 dev eth1 table 42
5) Выполните команду от имени нового пользователя:
sudo -u user2 ping example.com
ping example.com
теперь будет маршрутизироваться через шлюз, 1.2.3.1
а не через шлюз системы по умолчанию.