LINUX.ORG.RU
ФорумAdmin

Назначение альтернативного сетевого интерфейса исходящим «на горячую»

 , ,


0

2

Конфигурация: одноплатник в качестве роутера, бортовая сетевуха смотрит в кабельный интернет, в USB воткнут 4G-модем в качестве запасного канала. 4G-модем определяется как сетевой адаптер (не HiLink, если это важно).

Нужно ручное переключение выходного канала. Вроде ничего сложного, но проблема в том, что адаптер, который определился в системе вторым (USB), записи в таблице роутинга для внешних адресов не получает.

Т.е. 4G-модем работает, через него бегает интернет, но только если на момент загрузки он был единственным адаптером. Если же загрузиться по-нормальному, то в таблице роутинга для модема присутствует только запись на маршрутизацию локальных адресов сотового оператора, вместо адреса шлюза – 0.0.0.0 (для сетевой платы, определенной первой, при этом все в порядке: есть и локальные маршруты и шлюз).

Погашение интерфейса сетевой карты удаляет из таблицы все записи, касающиеся ее адресов, но для модема все остается по-старому, т.е. вообще не остается ни одного шлюза.

Вот, собственно, и вопрос: есть ли какой-то инструмент, который перезаполнит таблицу маршрутов так, как происходит при загрузке системы, но с принудительным указанием «главного» интерфейса?

P.S. Я понимаю, что нужный маршрут до сотового шлюза можно добавить ручками/скриптом, но, например, адрес этого шлюза придется вытаскивать из кеша dhcp-клиента, потому что больше он нигде не фигурирует.


Я толком не понял, как у вас появляется маршрут для 4G-модема, почему из dhcp-кеша, а не просто повторить dhcp-запрос. Но, сложная маршрутизация это PBR, несколько таблиц маршрутизации, если вам мешает default маршрут в таблице main через «бортовую сетевуху», то просто не добавляйте его туда.

Или у вас два 4G-модема?

mky ★★★★★
()
Ответ на: комментарий от mky

Ну давайте так. Вот загрузилась система, USB-модем воткнут, но подключения к оператору нет:

root@debian-9:~# ifconfig -a
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.110.138  netmask 255.255.255.0  broadcast 192.168.110.255
        inet6 fe80::20c:29ff:feca:113b  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:ca:11:3b  txqueuelen 1000  (Ethernet)
        RX packets 47  bytes 6222 (6.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 46  bytes 7443 (7.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wwx001e101f0000: flags=4098<BROADCAST,MULTICAST>  mtu 1500
        ether 00:1e:10:1f:00:00  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Тут ens33 — кабельная сетевуха, а wwx001e101f0000 — модем.

Маршруты:

root@debian-9:~# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.110.2   0.0.0.0         UG    0      0        0 ens33
192.168.110.0   0.0.0.0         255.255.255.0   U     0      0        0 ens33

Коннекчу модем:

root@debian-9:~# ifconfig wwx001e101f0000 up
root@debian-9:~# echo -en 'AT^NDISDUP=1,1\r' > /dev/ttyUSB0
root@debian-9:~# dhclient wwx001e101f0000

Модем подключился и получил IP-адрес:

root@debian-9:~# ifconfig wwx001e101f0000
wwx001e101f0000: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.205.233.77  netmask 255.255.255.252  broadcast 10.205.233.79
        inet6 fe80::21e:10ff:fe1f:0  prefixlen 64  scopeid 0x20<link>
        ether 00:1e:10:1f:00:00  txqueuelen 1000  (Ethernet)
        RX packets 4  bytes 960 (960.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 11  bytes 1674 (1.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Новая таблица маршрутизации:

root@debian-9:~# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.110.2   0.0.0.0         UG    0      0        0 ens33
10.205.233.76   0.0.0.0         255.255.255.252 U     0      0        0 wwx001e101f0000
192.168.110.0   0.0.0.0         255.255.255.0   U     0      0        0 ens33

Как видим, модем идет с 0.0.0.0 и пригоден только для связи с маленьким кусочком подсети оператора.

Тут мне уже хотелось бы иметь возможность просто переключить канал, не извлекая адрес шлюза модема из /var/dhcp/... Как это сделать, не отключая ens33?

Если положить нафиг основной канал:

root@debian-9:~# ifconfig ens33 down
то после повторного запроса DHCP все маршруты появляются и идут через модем, но если канал технически исправен, но связи с интернетами через него нет, то в таблице маршрутов ничего не меняется. А мне нужно пререстроить таблицу без отключения сетевого интерфейса, чтобы иметь возможность мониторить его состояние.

quwy
() автор топика
Ответ на: комментарий от quwy

Лучше вам прочитать про PBR, https://habr.com/ru/post/108690/ и принять мысль, что таблиц маршрутизации может быть несколько. И тогда можно прописав маршруты и правила, сделать выбор исходящего интерфейса по src-ip адресу. Это позволит, указав сокету ip-адрес с помощью ″ping -I″ или ″wget --bind-address″, отправить его пакеты через нужный интерфейс.

Но можете работать с одной таблицей маршртизации, тогда нужно добавлять маршрут по умолчанию через 4G с другой метрикой. А для проверки связи с интернетом переписывать не маршрут по умолчанию, а маршрут до какого-то конкретного хоста (ip-адреса) в Сети через проводной интерфейс.

Нормальный dhcp-клиент позволяет через хуки вызывать самописные скрипты, ими и нужно прописывать маршрут по умолчанию в другую таблицу или с другой метрикой.

10.205.233.76 0.0.0.0 255.255.255.252

модем идет с 0.0.0.0 и пригоден только для связи с маленьким кусочком подсети оператора.

Нет здесь подсети. Всего 4 ip-адреса. Один — адрес сети, один — широковещательный, один — ваш адрес. Остаётся всего один ip-адрес — шлюз.

mky ★★★★★
()

В Линукс при получении параметров интерфейса по dhcp ему назначается ip адрес, в таблицу маршрутизации заносится маршрут до сети в зависимости от маски ip адреса и маршрут по умолчанию (dedault).

При поднятии следующего интерфейса и настроек по dhcp ему также будет назначен ip адрес, в таблицу маршрутизации будет добавлен маршрут до сети соответствующей ip адресу и маске.

И далее в таблице маршрутизации будет перезаписан маршрут по умолчанию (dedault), а не добавлен второй.

Так что если у тебя по dhcp поднимается несколько интерфейсов, то в таблице маршрутизации шлюз (default маршрут) останется от последнего поднятого интерфейса.

infomeh ★★
()

Если влом пилить костыли, то предлагаю осилить NetworkManager и там можно метрики назначать. Оно именно поддерживает горячее подключение сетевух/модемов, в отличие от systemd-networkd. Можно без GUI, чисто nmcli.

Bers666 ★★★★★
()
Ответ на: комментарий от infomeh

Так что если у тебя по dhcp поднимается несколько интерфейсов, то в таблице маршрутизации шлюз (default маршрут) останется от последнего поднятого интерфейса.

Я второе свое сообщение писал с натуры, ничего не добавляя и не убирая. Как видите, default-маршрут остается от первого интерфейса.

quwy
() автор топика
Последнее исправление: quwy (всего исправлений: 1)
Ответ на: комментарий от Bers666

Если влом пилить костыли, то предлагаю осилить NetworkManager и там можно метрики назначать

Я от него еле избавился не для того, чтобы назад вкорячивать. Не совместим он с hostapd, хоть ты тресни.

quwy
() автор топика
Ответ на: комментарий от mky

добавлять маршрут по умолчанию через 4G с другой метрикой

Не проблема добавить маршрут. Проблема сделать это автоматом не изобретая велосипеды, потому что адрес шлюза, полученный от DHCP-сервера, системой игнорится и нигде кроме кеша не сохраняется.

Нормальный dhcp-клиент позволяет через хуки вызывать самописные скрипты

Не очень мне нравится это решение, потому что выходит за рамки одного bash-скрипта. Я потом забуду про этот левый скрипт и потрачу кучу времени на разбор того, как оно работало, и почему перестало.

Нет здесь подсети.

Нет, я и сказал, что доступен маленький кусок подсети, всего несколько адресов, включая свой и шлюзовый.

quwy
() автор топика
Ответ на: комментарий от quwy

Проблема сделать это автоматом не изобретая велосипеды

Маршрутизатор в общем случае это далеко не велосипед, поэтому готовых решений нет, особено с учётом отрицания вами NetworkManager.

Нет, я и сказал, что доступен маленький кусок подсети

Я не про это, а про то, что скрипт может не лезть в кеш dhcp, а «вычислять» шлюз по данным с интерфейса.

Я потом забуду про этот левый скрипт

Ну, надо было в стартовом посте писать, что вы хотите всё сделать одним скриптом, и что у вас проблемы с памятью. Больше сюда писать не буду.

mky ★★★★★
()
Ответ на: комментарий от quwy

dhclient wwx001e101f0000

Сейчас в таблице маршрутизации main находится запись с dst=default и metric=0. dhclient запускает dhclient-script, который пытается добавить ещё одну запись с dst=default,metric=0, чего ядро сделать не даёт, так как такая запись (пусть и с другими via и dev) уже есть.

Надо сделать так, чтобы для ens33 использовалось другое значение metric, например так: dhclient -e IF_METRIC=100 ens33, а потом попробовать dhclient -e IF_METRIC=50 wwx001e101f0000. Тогда default route для wwx001e101f0000 «победит» default route для ens33 благодаря меньшей метрике (но при этом обе записи останутся в таблице main).

kmeaw ★★★
()
Ответ на: комментарий от kmeaw

Супер! Это как раз то, чего я добивался. Спасибо.

quwy
() автор топика
Ответ на: комментарий от mky

проблемы с памятью.

я так и не понял почему он документацию не ведет.

у на есть вики в которой актуализируется все - где и сколько бекендов, фронтов, кластеров, куда лезть, как что настроено - полный фарш. не приведи кто-то в отпуске будет или с кем что случится и чонить отвалится.

кстати, показательно - пишу этот камент находясь в больничке. ну!

deep-purple ★★★★★
()
Ответ на: комментарий от deep-purple

для локалхоста и прочих своих домашних задачек держать вики?) У меня сейчаc на домашнем шлюзе крутятся скрипты написанные мной лет 5-6 назад возможно, и которые пережили обновление с 14.04 до 16.04. Я даже наверняка забыл где и что изменял/писал. Возможно когда что-то перестанет работать, то тогда вспомню.

Если же это не свой какой-то локалхост, то конечно же документация. Сами держим.

as_lan ★★
()
Ответ на: комментарий от as_lan

и для себя тоже, начиная с списка доменов, какой у какого регистратора и заканчивая девайсами в локальной сети.

deep-purple ★★★★★
()
Ответ на: комментарий от as_lan

Вики для локалхоста может и перебор. Но текстовый файлик changelog.txt можно вести. ИМХО, как-то даже лучше запоминается, когда записал.

mky ★★★★★
()
Ответ на: комментарий от mky

Пробовал уже, не сильно помогает. Если этот файл в одном экземпляре, то он легко теряется, а если в нескольких, то начинается бардак с разными версиями. Храню подобные вещи в личном SVN, но все равно знаю, что рано или поздно придется вспоминать самому.

quwy
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.