Userspace не должен быть в состоянии выбрать маршрут, который он использует. Если вы просто хотите использовать один маршрут для трафика SSH и один для трафика HTTP, выполните следующие действия. Обратите внимание, что подход ниже используется потому, что мы маршрутизируем на основе адреса назначения уровня 4. Если бы это было только на основе IP, вы могли бы просто добавить дополнительные маршруты.
Не забудьте заменить IP-адреса, номера портов и имена интерфейсов в зависимости от ситуации. У меня есть правила udev для переименования ссылки на iPhone на основе MAC-адреса. Вы не можете, и это, вероятно, будет отображаться как другое устройство eth *.
Номера таблиц и меток могут быть изменены, если они соответствуют друг другу, как сейчас.
Создайте таблицу маршрутизации со шлюзом по умолчанию для каждой ссылки.
ip route add 172.20.10.0/24 dev iphone0 table 1234
ip route add default via 172.20.10.1 dev iphone0 table 1234
ip route add 192.0.2.0/24 dev eth0 table 4321
ip route add default via 192.0.2.1 dev eth0 table 4321
Так как IP правило маршрутизации только то, что IP-слой, знак трафик , предназначенный для какой бы ни линии связи, используя IPTables. Обратите внимание, как это предварительная маршрутизация.
iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 2
Создайте правила маршрутизации для работы с несколькими шлюзами по умолчанию. Они должны быть на первом месте, так как они заставляют трафик возвращаться из того же интерфейса, откуда он пришел, а не из другого, если, например, вы изменили, какой интерфейс должен использовать трафик SSH.
ip rule add from 172.20.10.2 table 1234 priority 1000
ip rule add from 192.0.2.2 table 4321 priority 1001
(Необязательно, если только трафик в одной подсети не маршрутизируется шлюзом в другой подсети - например, может быть трафик RFC 1918). Создайте правила маршрутизации, чтобы принудительно передавать трафик в подсети, к которым вы напрямую подключены, через соответствующий интерфейс, независимо от того, из того, что вы указали в качестве ссылки, которая будет использоваться для определенного типа трафика.
ip rule add to 172.20.10.0/24 table 1234 pref 1002
ip rule add to 192.0.2.0/24 table 4321 pref 1003
Создать правила маршрутизации
ip rule add fwmark 1 table 1234 pref 1004
ip rule add fwmark 2 table 4321 pref 1005
Установите шлюз по умолчанию для всего другого трафика.
ip route add default via 192.0.2.1 dev eth0 # implicit "table main" here
Что касается изменения того, какое соединение используется на лету, в официальных репозиториях не должно быть команды (если она вообще написана и опубликована). Вам нужно написать скрипт, который будет просто читать существующее правило из RPDB, вычислять «противоположную» таблицу, удалять старое правило и создавать правило для помеченного трафика для использования другой таблицы. Например:
#! /bin/sh
case $1 in
ssh) PREF=1004
http) PREF=1005
*) echo "Unknown." 1>&2; exit 1
esac
TABLE=`ip rule list | grep ^$PREF: | awk '{print $NF}' | rev`
ip rule del pref $PREF
ip rule add fwmark 1 table $TABLE pref $PREF
Здесь выбор номера таблицы сверху имеет значение, потому что я использую дешевый трюк для «переключения» номера таблицы.
Не проверено, так как у меня нет того, что мне нужно.
Вышесказанное можно обобщить на другие ситуации с двумя ссылками и разными схемами адресации.
Также, если вы используете OpenSSH, у него есть флаг для указания адреса, к которому будет привязан, -b
. Так как вышеперечисленное настроило правила для маршрутизации на основе исходного адреса, вы можете просто выполнить ssh -b insert_iphone_address_here user@example.com
или другой адрес, чтобы выбрать, какой маршрут выбрать. Я не знаю ни одного из основных браузеров, позволяющих пользователю устанавливать адрес привязки.