Есть несколько возможностей, в зависимости от того, как вы хотите решить, какие пакеты куда и куда отправлять. Большинство из них потребуют некоторого понимания того, как работает сеть 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 …
.
iptables -t nat -A POSTROUTING -o tun0 -j SNAT --to-source ppp_ip
гдеppp_ip
IP-адрес этого адаптера. Во-вторых, вам нужно будет отключить строгиеrp_filter
при/proc/sys/net/ipv4/config/ppp0/rp_filter
. Он работает, когда установлен в расслабляющий режим, который равен 2.