Я пытаюсь открыть несколько обратных SSH-туннелей через разные интерфейсы (на Raspberry Pi с Raspbian Strech) в качестве запасного варианта.
При этом у меня есть проблемы с открытием исходящих ssh-соединений через разные интерфейсы. Сейчас есть:
- eth0 как статический IP (192.168.1.200)
- wlan0 через dhcp (192.168.178.100)
Привязка ssh к IP-адресу работает для «eth0», но не для «wlan0»:
ssh -b 192.168.1.200 user@externalip
работаетssh -b 192.168.178.100 user@externalip
являетсяНЕТработающий
кроме того, я могу проложить маршрут через оба интерфейса в интернет:
ssh -b 192.168.1.200 user@externalip
работает
sudo traceroute -i wlan0 google.com
traceroute to google.com (172.217.21.14), 30 hops max, 60 byte packets
1 192.168.178.1 (192.168.178.1) 12.528 ms 17.229 ms 21.757 ms
2 192.0.0.1 (192.0.0.1) 26.576 ms 41.445 ms 47.408 ms ...
...
sudo traceroute -i eth0 google.com
traceroute to google.com (172.217.21.14), 30 hops max, 60 byte packets
1 192.168.1.1 (192.168.1.1) 0.537 ms 0.404 ms 0.570 ms
...
Есть идеи, как заставить работать ssh через оба интерфейса?
маршрут -n:
0.0.0.0 192.168.1.1 0.0.0.0 UG 202 0 0 eth0
0.0.0.0 192.168.178.1 0.0.0.0 UG 303 0 0 wlan0
192.168.0.0 0.0.0.0 255.255.252.0 U 202 0 0 eth0
192.168.178.0 0.0.0.0 255.255.255.0 U 303 0 0 wlan0
решение1
По умолчанию только первая соответствующая запись в (главной) таблице маршрутизации будет использоваться для определения маршрута к месту назначения. Более того, пакет, который не получен по этой соответствующей записи, будет отброшен из-заrp_filter
.
Ваша настройка требует маршрутизации политики: маршрут теперь должен зависеть не только от пункта назначения, но и от источника, сохраняя несколько маршрутов в нескольких таблицах маршрутизации и выбирая адекватную таблицу, таким образом, маршрут, в зависимости от источника. Предыдущее утверждение остается верным: будет выбран первый соответствующий маршрут в таблице, но он может быть выбран из (a) другой(их) таблицы(й).
Поэтому сначала вы устанавливаете дополнительные таблицы маршрутизации (значения таблиц выбираются «произвольно»), чтобы дополнить то, что не работало бы при использовании только таблицы main
:
ip route add table 1921681 default via 192.168.1.1 dev eth0
ip route add table 192168178 default via 192.168.178.1 dev wlan0
Затем используется правильный селектор источника для выбора подходящей таблицы сip rule
. Здесь было бы достаточно только одного нового правила, но ради симметрии будут добавлены оба, что обеспечивает большую гибкость в основной таблице маршрутизации, например, при изменении метрик (см. далее):
ip rule add from 192.168.0.0/22 lookup 1921681
ip rule add from 192.168.178.0/24 lookup 192168178
Правила теперь такие:
# ip rule
0: from all lookup local
32764: from 192.168.178.0/24 lookup 192168178
32765: from 192.168.0.0/22 lookup 1921681
32766: from all lookup main
32767: from all lookup default
Рассматривайте записи 32764
et 32765
как исключения из записи, 32766
просматривающей обычную main
таблицу.
Вот и все, теперь ваши предыдущие команды будут работать так, как задумано, оба маршрута могут работать одновременно, если вы укажете исходный IP с помощью опции -b
.
Если вы не укажете IP-адрес источника, система не будет немедленно выполнять сопоставление с дополнительными правилами и таблицами маршрутизации, а по умолчанию будет использовать выбор, сделанный при использовании основной таблицы: победит первый совпадающий маршрут, тем самым выбрав источник 192.168.1.200
в вашей текущей настройке.
Повторим еще раз: если вы явно не укажете исходный IP-адрес (как это обычно бывает), ваш основной маршрут все равно выберетпо умолчаниюмаршрут по умолчанию и соответствующий исходный IP по умолчанию, затем правила 32764
и 32765
будут гарантировать, что он будет работать правильно в любом случае. Таким образом, вы можете играть с метриками, чтобы выбрать, какой маршрут и IP будет иметь приоритет.
Например, чтобы wlan0
теперь быть предпочтительным, когда не указан исходный IP, увеличьте метрику 202
до , eth0
чтобы маршрут по умолчанию был выбран первым, таким образом IP будет выбран первым. Явное указание исходного IP все равно напрямую совпадет с правилами 1000
или . Ранее установленные соединения считаются «указывающими исходный IP», поэтому не будут нарушены.wlan0
32764
32765
ip route add default via 192.168.1.1 dev eth0 metric 1000
ip route del default via 192.168.1.1 dev eth0 metric 202
Некоторые дополнительные примечания:
- Не пытайтесь удалить все маршруты по умолчанию в
main
(обычной) таблице, иначе ваши соединения больше не будут устанавливаться, если приложение не указывает исходный IP-адрес ("Network is unreachable
"). - Возможны и более сложные случаи, включая наличие одного и того же IP-адреса в двух разных сетях, но это потребует дополнительных настроек и, вероятно, помощи netfilter и
iptables
. - Можно даже сбалансировать нагрузку на эти маршруты, используя
iptables
иМеткии использовать эти метки как селектор вip rule
, но сложнее заставить его работать правильно во всех случаях, особенно при смешивании соединений, где указан исходный IP и где исходный IP остается на выбор системы, а также особенно для UDP. Это может также потребовать неудобного использования NAT и ослабленияrp_filter
.
решение2
Убедитесь, что у вас включены интерфейсы.
ip link set dev eth0 up
ip link set dev wlan0 up