1

Я работаю в системе Linux с "классической" настройкой сети, то есть нет полнофункционального демона конфигурации, работающего как NetworkManager. Большая часть настроек выполняется dhclient.

Мне нужно обнаружить ситуации, когда мне нужно повторно запустить dhclient. (другая подсеть из-за изменений конфигурации кабеля или сети). Я хочу запускать проверку каждые 10 минут, не прерывая существующие соединения.

Что мне в основном нужно, так это ответ на такие вопросы, как мой IP-адрес и шлюз действительны для сети, к которой я подключен? или если я продлю аренду DHCP, получу ли я тот же IP снова? , Чтобы ответить на первый вопрос, можно просто пропинговать какой-нибудь общедоступный IP-адрес, такой как 8.8.8.8, но мне нужно решение, которое также работает в больших частных сетях, о которых я не знаю. Даже шлюз по умолчанию не всегда может быть проверен.

Один, я знал, что мой IP-адрес недействителен, я бы сделал "dhclient -r eth0; dhclient eth0", чтобы продлить аренду. Тем не менее, это отключает меня от Интернета на короткое время, если я уже подключен правильно.

Я обнаружил, что dhcping - это хороший инструмент для запроса DHCP-сервера без фактического использования результата. Тем не менее, я получаю странные результаты, которые могут даже претендовать на другой вопрос. Кажется, что dhcping работает хорошо, только если я знаю ip серверов заранее, поэтому для DHCP DISCOVER отсутствует инструмент. (а использование адресов вещательного сервера ненадежно)

Я знаю, что могу сделать hdcp обнаружить с помощью nmap, однако установка nmap не является хорошей идеей по соображениям безопасности.

Вопросы, которые я хотел бы задать:

  • Есть ли способ проверить мой настроенный IP-адрес в контексте подключенной сети?
  • Есть ли шанс возобновить аренду клиента по требованию?
  • Существуют ли инструменты, позволяющие dhcp обнаружить трансляцию и распечатать результат?

Приложение:

В отличие от результатов моего первого теста, просто вызов dhclient -v не решает мою проблему. Чтобы прояснить это, моей первоначальной проблемой является запуск dhclient в фоновом режиме (без фактического продления аренды постоянно). Вызов dhclient приводит к:

dhclient(30887) уже запущен - завершается.

Это не полностью воспроизводимо, хотя. Иногда это удается. (Вот почему я сначала подумал, что опция -v будет иметь значение, это не так)

Итак, мой вопрос: если я получаю эту уже запущенную проблему, хотя dclient в настоящее время ничего не делает, как запустить обновление для фонового процесса?

(Обоснование этого заключается в том, что клиент DHCP должен привязаться к порту 68. Когда этот порт связан с фоновым демоном dhclient, другой экземпляр не может быть выполнен на переднем плане)

2 ответа2

1

Ответ на первые два вопроса один и тот же: используйте

dhclient -v eth0

(-v означает многословно, не во всех дистрибутивах Linux есть) вместо dhclient -r eth0; Клиент Эт0. Эта более короткая форма сначала запрашивает переназначение текущего IP-адреса, а затем начинает согласование с маршрутизатором, только если он не может назначить запрошенный IP-адрес, либо потому, что он уже занят, либо потому, что он находится вне диапазона DHCP шлюза.

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

Что касается вашего третьего пункта, у AFAIK нет опции пробного запуска для любого клиента dhcp. Однако если вы действительно настаиваете на этом, вы можете сделать следующее: настроить интерфейс macvlan и запустить экземпляр dhcp для этого нового интерфейса:

ip addr flush dev eth0
ip link add link usb0 mac0 mode macvlan
dhclient -v mac0

На этом этапе вы можете увидеть конфигурацию, предоставленную локальным сервером DHCP, сетью, маской сети, шлюзом и DNS-серверами на новом виртуальном интерфейсе. Когда вы сделали,

ip link del dev mac0
dhclient -v eth0

восстановит именно ту конфигурацию, которая была у вас ранее, если DHCP-сервер может вычеркнуть ваш старый IP-адрес. В противном случае вы застряли с новым ;-). Все это тривиально для сценария, на самом деле.

И, кстати, если ваша проблема заключается в сохранении соединений SSH , я предлагаю вам вместо этого проверить mosh .

0

Лучшее решение, которое я нашел на данный момент, - это использование реализации DHCP в Python:

https://code.activestate.com/recipes/577649-dhcp-query/

Что довольно приятно, так как я уже использую Python. Но, возможно, мне все еще не хватает простого решения, и все это слишком сложно.

редактировать: это не очень помогло. Моя основная проблема заключается в том, что фоновый процесс dhclient занимает порт 68, что препятствует любому другому процессу, выполняющему обнаружение DHCP, и я не знаю способа освободить его фоновый процесс без сброса конфигурации сети.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .