Есть несколько возможностей, в зависимости от того, как вы хотите решить, какие пакеты куда и куда отправлять. Большинство из них потребуют некоторого понимания того, как работает сеть TCP / IP в Linux. Основными инструментами, которые вам необходимо знать для выполнения сложных задач , являются iptables(Ubuntu: iptables
) и iproute2 ( ipкоманда) (Ubuntu: iproute
, iproute-doc
).
Если вы можете полностью различить целевой IP-адрес, все просто: направьте IP-адреса в соответствии с вашими пожеланиями. Например, следующие команды вызовут все пакеты для 1.2.3. x и 1.2.4.2 для прохождения ppp0и другие пакеты для прохождения eth0.
route add -net 1.2.3.4/24 ppp0
route add -host 1.2.4.2 ppp0
route add -net 0.0.0.0/0 eth0
Для более сложных требований, вы должны начать использовать iptablesи ip route. Например, следующие команды устанавливают специальные таблицы маршрутизации так, чтобы все пакеты, отмеченные 1, проходили через, eth0а все пакеты, отмеченные 2, проходили через ppp0(за исключением пакетов, предназначенных для localhostподключения к интерфейсу обратной связи).
ip rule add fwmark 1 table 1
ip route add 127.0.0.0/0 table 1 dev lo
ip route add 0.0.0.0/0 table 1 dev eth0
ip rule add fwmark 2 table 2
ip route add 127.0.0.0/8 table 2 dev lo
ip route add 0.0.0.0/0 table 2 dev ppp0
Теперь вы можете использовать iptablesдля «манипулирования» исходящими пакетами, добавив отметку, которая будет определять, какой маршрут они выберут. Например, здесь показано, как передать весь исходящий SMTP-трафик (порт 25) через eth0, а весь трафик, исходящий от приложения, запущенного от имени пользователя, - proxyчерез ppp0.
iptables -t mangle -A OUTPUT -p tcp --dport 25 -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -m owner --uid-owner proxy -j MARK --set-mark 2
Смотрите также 2 сетевых интерфейса, подключенных к интернету. Выберите тот, который будет использоваться в соответствии с именем домена, и привяжите программное обеспечение к различным сетевым интерфейсам .
Вам нужно будет организовать выполнение этих команд, когда оба интерфейса подключены. Я рекомендую вам написать скрипт, /etc/network/if-up.d/0justin-routesкоторый будет запускать нужные вам команды. Этот сценарий будет выполняться всякий раз, когда включается сетевой интерфейс; так как его имя начинается с a, 0оно запускается рано в этом процессе, до настройки конкретного приложения, которая может ожидать, что маршруты будут на месте. Существует симметричность /etc/network/if-down.d/в случае, если вы также хотите что-то делать, когда один из интерфейсов выходит из строя. (Все связанные маршруты будут автоматически удалены, что может привести к тому, что некоторые пакеты окажутся заблокированными, если вы захотите, чтобы они переключились на другой интерфейс.)
Сценарии ifup описаны в interfaces(5) man page. Главное, что нужно знать, это то, что имя подключаемого или отключенного интерфейса находится в переменной environement IFACE. Вы можете узнать, работает ли другой интерфейс if ifconfig | sed 's/ .*//' | grep -Fqx 'eth0'; then ….