DNSMASQ отказывается запускаться с ошибкой “unknown interface error”, даже если интерфейс активен.

Вопрос или проблема

Странная проблема, которую я не нашел больше нигде в интернете, указывающая, что, вероятно, я что-то напутал, но что именно?

Попытка запустить dnsmasq.service, неважно, при загрузке или из пользовательского сеанса, когда все сетевые службы доступны и работают, завершается ошибкой с unknown interface enp2s0… за исключением того, что вся остальная система утверждает, что он работает.

andrzej@andrzej-PC ~ $ sudo systemctl start dnsmasq
Job for dnsmasq.service failed because the control process exited with 
error code. See "systemctl status dnsmasq.service" and "journalctl -xe" for details.
andrzej@andrzej-PC ~ $ systemctl status dnsmasq
● dnsmasq.service - dnsmasq - A lightweight DHCP and caching DNS server
   Loaded: loaded (/lib/systemd/system/dnsmasq.service; disabled; vendor preset:
  Drop-In: /run/systemd/generator/dnsmasq.service.d
           └─50-dnsmasq-$named.conf, 50-insserv.conf-$named.conf
   Active: failed (Result: exit-code) since Mon 2017-07-10 02:09:41 CEST; 3s ago
  Process: 5551 ExecStart=/etc/init.d/dnsmasq systemd-exec (code=exited, status=
  Process: 5548 ExecStartPre=/usr/sbin/dnsmasq --test (code=exited, status=0/SUC

Jul 10 02:09:41 andrzej-PC systemd[1]: Starting dnsmasq - A lightweight DHCP and
Jul 10 02:09:41 andrzej-PC dnsmasq[5548]: dnsmasq: syntax check OK.
Jul 10 02:09:41 andrzej-PC dnsmasq[5551]: dnsmasq: unknown interface enp2s0
Jul 10 02:09:41 andrzej-PC systemd[1]: dnsmasq.service: Control process exited, 
Jul 10 02:09:41 andrzej-PC systemd[1]: Failed to start dnsmasq - A lightweight D
Jul 10 02:09:41 andrzej-PC systemd[1]: dnsmasq.service: Unit entered failed stat
Jul 10 02:09:41 andrzej-PC systemd[1]: dnsmasq.service: Failed with result 'exit

Правильно, кроме:

andrzej@andrzej-PC ~ $ ifconfig
enp2s0    Link encap:Ethernet  HWaddr /*correct address*/  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:921 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:147421 (147.4 KB)

и то же самое для ip addr:

2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether /*same*/ brd ff:ff:ff:ff:ff:ff

и, наконец:

andrzej@andrzej-PC ~ $ cat /sys/class/net/enp2s0/operstate
up

Что? О, а мой конфигурационный файл выглядит так:

port=0
interface=enp2s0
dhcp-range=192.168.0.50,192.168.0.150,12h
dhcp-boot=/install/netboot/pxelinux.0
dhcp-option-force=209,install/netboot/pxelinux.cfg
dhcp-option-force=210,/
dhcp-option-force=66,192.168.0.1
enable-tftp
tftp-root=/mnt

изменить описание службы DNSMasq

sudo nano /lib/systemd/system/dnsmasq.service

Измените Requires и After, чтобы она запускалась после подъема интерфейсов.

Requires=network-online.target
After=network-online.target

У меня была такая же ситуация – отказ dnsmasq запускаться на вторичном интерфейсе eth, используемом для PXE, подключенном напрямую (без коммутатора) к другому компьютеру.

Как только у меня возникало соединение (некоторый сетевой трафик, загорались индикаторы сетевого интерфейса), dnsmasq начинал работать нормально.

Я знаю, что это не очень научно, но это сработало для меня (Ubuntu 20.04)

Помогла перезагрузка системы – dnsmasq запустился без проблем. Возможно, конфигурация устройства для интерфейса, настроенного для использования с dnsmasq, еще не вступила в силу.

Когда вы используете Linux, вы можете включить bind-dynamic. Согласно документации:

Включите сетевой режим, который является гибридом между --bind-interfaces и по умолчанию. Dnsmasq связывает адреса отдельных интерфейсов, что позволяет нескольким экземплярам dnsmasq, но если появляются новые интерфейсы или адреса, он автоматически слушает их (с учетом любой конфигурации контроля доступа). Это делает динамически создаваемые интерфейсы работать так же, как по умолчанию. Реализация этого параметра требует нестандартных сетевых API и доступна только в Linux. На других платформах она откатывается к режиму --bind-interfaces.

Не забудьте удалить bind-interfaces.

Ссылка: https://thekelleys.org.uk/dnsmasq/docs/dnsmasq-man.html

Я не смог заставить это работать с методом Matt B. Все еще есть проблемы с недоступностью интерфейса. В итоге я создал таймер для службы dnsmasq:

sudo systemctl edit --force --full dnsmasq.timer
[Unit]
Description="Запустить dnsmasq при загрузке"
After=network-online.target

[Timer]
OnActiveSec=5s

[Install]
WantedBy=multi-user.target

Затем просто отключите службу и включите таймер.

sudo systemctl disable dnsmasq
sudo systemctl enable dnsmasq.timer

.

Ответ или решение

Чтобы разобраться с проблемой запуска службы dnsmasq и ошибкой "unknown interface", нужно поэтапно рассмотреть возможные причины и решения, основываясь на предоставленной информации. Данная ошибка возникает, когда dnsmasq не может обнаружить указанный сетевой интерфейс, даже если остальные приложения его видят и он функционирует.

Анализ проблемы

  1. Конфигурация интерфейса: Сначала проверьте, правильно ли настроен сам сетевой интерфейс. Убедитесь, что он назван корректно в конфигурационном файле dnsmasq. Команда ifconfig показывает, что интерфейс enp2s0 действительно активен, однако dnsmasq не может его обнаружить.

  2. Синхронизация с сетевой подсистемой: Вероятнее всего, проблема связана с тем, что dnsmasq пытается стартовать до того, как сетевой интерфейс полноценно инициализирован. Чтобы скорректировать это, можно модифицировать файл службы, чтобы она запускалась только после полной готовности сети.

Рекомендованные шаги решения

1. Модификация службы dnsmasq:

  • Откройте файл службы dnsmasq для редактирования:
    sudo nano /lib/systemd/system/dnsmasq.service
  • Добавьте следующие условия в секцию [Unit]:
    Requires=network-online.target
    After=network-online.target
  • Это гарантирует, что служба dnsmasq запускается только после полной инициализации сети.

2. Использование режима bind-dynamic:

  • В файле конфигурации dnsmasq /etc/dnsmasq.conf замените bind-interfaces на bind-dynamic. Этот режим подходит для Linux и позволяет dnsmasq автоматически настраиваться на новые интерфейсы:
    #bind-interfaces
    bind-dynamic

3. Создание таймера для службы:

  • Если предыдущие шаги не помогли, можно создать таймер для отложенного запуска:
    sudo systemctl edit --force --full dnsmasq.timer
  • В этом файле укажите следующее:

    [Unit]
    Description="Run dnsmasq on boot"
    After=network-online.target
    
    [Timer]
    OnActiveSec=5s
    
    [Install]
    WantedBy=multi-user.target
  • Отключите службу и активируйте таймер:
    sudo systemctl disable dnsmasq
    sudo systemctl enable dnsmasq.timer

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

Заключение

Используя данные подходы, вы можете устранить проблему с запуском dnsmasq. Важно также регулярно проверять логи системы, используя команды journalctl -xe и systemctl status dnsmasq, чтобы следить за поведением системы и службы. Если проблема сохраняется, стоит пересмотреть конфигурацию интерфейса и настройки сетевых служб на вашем компьютере.

Оцените материал
Добавить комментарий

Капча загружается...