dnsmasq: не удалось создать прослушивающий сокет для порта 53: адрес уже используется

Я настраивал сервер, как показано ниже по ссылке https://help.ubuntu.com/community/Dnsmasq

root@user-desktop:/etc/init.d# sudo apt-get install dnsmasq
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following NEW packages will be installed:
  dnsmasq
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B/15.4 kB of archives.
After this operation, 120 kB of additional disk space will be used.
Selecting previously unselected package dnsmasq.
(Reading database ... 146283 files and directories currently installed.)
Unpacking dnsmasq (from .../dnsmasq_2.59-4_all.deb) ...
Processing triggers for ureadahead ...
Setting up dnsmasq (2.59-4) ...
 * Starting DNS forwarder and DHCP server dnsmasq                                                                                                                                                            
dnsmasq: failed to create listening socket for port 53: Address already in use [fail]
invoke-rc.d: initscript dnsmasq, action "start" failed.

9 ответов

Проверьте, что прослушивает порт 53 (домен) с помощью:

sudo ss -lp "sport = :domain"

Отключите все службы, работающие на этом порту. Обычно это systemd-resolved,

Я собираюсь также mask так что он не запускается автоматически при перезагрузке.

sudo systemctl disable systemd-resolved
sudo systemctl mask systemd-resolved

Чтобы отменить то, что вы сделали:

sudo systemctl unmask systemd-resolved
sudo systemctl enable systemd-resolved

Также sudo update-rc.d systemd-resolved disable может также остановить автоматический запуск при загрузке, но я не проверял это. использование defaults вместо того disable отменить команду.


Или вы можете изменить порт, который прослушивает dnsmasq, отредактировав файл конфигурации:

sudo nano /etc/dnsmasq.conf

Нажмите Ctrl+W и введите listen-address= и нажмите ввод.

Раскомментируйте строку и добавьте 127.0.0.1 с портом, отличным от 53, например:

listen-address=127.0.0.1#5300

У меня та же проблема, что и у вас. Я думаю, что это правда с 12.10, но эта тема была закрыта до выпуска 12.10.

Занимаясь поиском (главным образом вдохновленный отсюда), я нашел это решение:

  • редактировать /etc/NetworkManager/NetworkManager.conf файл с тобой любимый редактор
  • прокомментировать строку dns=dnsmasq
  • перезапустите сетевой менеджер: sudo service network-manager restart

Но в вашей конфигурации dnsmasq (/etc/dnsmasq.conf), вы должны быть уверены, что слушаете локальные DNS-запросы со строкой listen-address=127.0.0.1,

Если вы измените конфигурацию dnsmasq, не забудьте запустить sudo /etc/init.d/dnsmasq restart

Я надеюсь, это поможет.

У меня такая же проблема.

dnsmasq-base был установлен и прослушан порт 53, предотвращающий dnsmasq начать.

Можно использовать dnsmasq-base часть dnsmasq для той же цели: просто используйте другой каталог конфигурации: тот, который находится в Network Manager папка:

/etc/NetworkManager/dnsmasq.d/

Мое решение: OP: Ubuntu 22.04

Шаг 1. Отредактируйте файл /etc/dnsmasq.conf.

      sudo nano /etc/dnsmasq.conf

Шаг 2: Измените порт 53 -> 5353

      # Listen on this specific port instead of the standard DNS port
# (53). Setting this to zero completely disables DNS function,
# leaving only DHCP and/or TFTP.
port=5353

# Set Listen address
listen-address=127.0.0.1

Шаг 3: перезапустите dnsmasq.service

      sudo systemctl restart dnsmasq.service

Мое решение для Ubuntu 22.04 (улучшенное по сравнению с решением, предоставленным Муратом Чакмаком ), сохраняя оба и .

По сути, мы работаем по другому адресу. Так,/etc/dnsmasq.confбудут следующие строки...

      # If you want dnsmasq to listen for DHCP and DNS requests only on
# specified interfaces (and the loopback) give the name of the
# interface (eg eth0) here.
# Repeat the line for more than one interface.
#interface=
# Or you can specify which interface _not_ to listen on
#except-interface=
# Or which to listen on by address (remember to include 127.0.0.1 if
# you use this.)
listen-address=127.0.53.1

# On systems which support it, dnsmasq binds the wildcard address,
# even when it is listening on only some interfaces. It then discards
# requests that it shouldn't reply to. This has the advantage of
# working even when interfaces come and go and change address. If you
# want dnsmasq to really bind only the interfaces it is listening on,
# uncomment this option. About the only time you may need this is when
# running another nameserver on the same machine.
bind-interfaces

Вышеупомянутое можно автоматизировать, используя следующие строки...

      DNSMASQ_ADD=127.0.53.1
sed -i "s:^# \?\(listen-address=\):\1$DNSMASQ_ADD:" /etc/dnsmasq.conf
sed -i "s:^# \?\(bind-interfaces\):\1:" /etc/dnsmasq.conf

Обязательно перезапустите dnsmasq с...

      systemctl restart dnsmasq

Тогда пустьsystemd-resolvedслушатьdnsmasqдля любых запросов. Это можно сделать безопасно, создав файл под/etc/systemd/resolved.conf.d/вроде следующего...

      DNSMASQ_ADD=127.0.53.1
[ ! -d /etc/systemd/resolved.conf.d ] && mkdir /etc/systemd/resolved.conf.d
[ ! -f /etc/systemd/resolved.conf.d/dnsmasq.conf ] && \
    echo -e "[Resolve]\nDNS=$DNSMASQ_ADD" > /etc/systemd/resolved.conf.d/dnsmasq.conf
systemctl restart systemd-resolved

Для получения дополнительной информации, пожалуйста, ознакомьтесь с справочными страницамиresolved.conf.dиresolved.conf. Я надеюсь, что это поможет кому-то!

Если вы не хотите испортить распознаватель, сделайте это с помощью rc.local.

Остановить автоматический запуск dnsmasq.

servicectl disable dnsmasq

Создать файл /etc/rc.localили же /etc/rc.d/rc.localв зависимости от дистрибутива.

Установить права chmod +x /etc/rc.local

Изменить файл:

      #!/bin/bash
service systemd-resolved stop
service dnsmasq start

Отключение systemd-resolved при запуске вызывает проблемы. Я считаю, что это как-то связано с /etc/resolv.confфайл, но я не уверен. Все, что я знаю, это то, что первый ответ вызвал у меня много проблем и в конечном итоге вообще не сработал. Простая остановка systemd-resolved, а затем запуск dnsmasq после полной загрузки работает отлично, по крайней мере, на Mint. Я не могу говорить о других дистрибутивах.

попробуйте это:sudo fuser -k 53/tcp он напечатает вам идентификатор процесса, связанного с этим портом, а затем уничтожит его, используя: sudo kill -9 идентификатор процесса

Это также может произойти, если вы установили dnscrypt-proxy и включили активацию сокета systemd. Это может стать проблемой при попытке использовать dnscrypt с такими системами, как run pi-hole, которые зависят от работы dnsmasq на порту 53. Похоже, что эта функция включена по умолчанию в некоторых дистрибутивах, поэтому ее необходимо отключить вручную, как описано в dnscrypt- . прокси-документы .

Вот шаги, которые они предлагают: Сначала вам нужно будет установить новый порт для прослушивания, отредактировав файл конфигурации dnscrypt-proxy и изменивlisten_addresses(например, для прослушивания порта 53533 используйте:listen_addresses = ['127.0.0.1:53533']:

      sudo nano /etc/dnscrypt-proxy/dnscrypt-proxy.toml

Затем вам нужно будет остановить и отключить службу, которая привязывает и перенаправляет порт 53 (выполняя активацию сокета systemd), которая называется:

      sudo systemctl stop dnscrypt-proxy.socket
sudo systemctl disable dnscrypt-proxy.socket

А затем удалите его из иdnscrypt-proxy-resolvconf.serviceконфигурационные файлы (закомментировав любые ссылки наdnscrypt-proxy.socketто есть, добавив#символ комментария перед любыми записями: например#After=dnscrypt-proxy.socket #Requires=dnscrypt-proxy.socket #Also=dnscrypt-proxy.socket)

      sudo nano /lib/systemd/system/dnscrypt-proxy.service
sudo nano /lib/systemd/system/dnscrypt-proxy-resolvconf.service

Затем вам будет предложено выполнить перезагрузку демона после редактирования файлов конфигурации systemd:

      sudo systemctl daemon-reload

И, наконец, вы можете перезапуститьdnscrypt-proxy.service:

      sudo systemctl restart dnscrypt-proxy.service

И процесс инициализации больше не будет привязан к порту 53, и вы увидите только dnscrypt-proxy, подключенный к настроенному вами порту (или 53533, если вы скопировали приведенный выше пример).

РЕДАКТИРОВАТЬ: немного погуглил, и я нашел решение. Кажется, что сетевой менеджер зависит от пакета, называемого "dnsmasq-base", который предоставляет некоторые функции dnsmasq. Запись Dnsmasq в Ubuntu Wiki гласит, что

"Обратите внимание, что пакет"dnsmasq"мешает сетевому менеджеру, который может использовать" dnsmasq-base "для предоставления услуг DHCP при совместном использовании подключения к Интернету. Поэтому, если вы используете сетевой менеджер (хорошо только в простых установках), установите dnsmasq". -base, но не dnsmasq. Если у вас более сложная настройка, удалите сетевой менеджер, используйте dnsmasq или подобное программное обеспечение (bind9, dhcpd и т. д.) и настройте все вручную."

Другими словами: вы хотите использовать dnsmasq? Тогда тебе лучше знать, что ты делаешь. Упомянутое ранее решение предлагает заменить dnsmasq-base на dnsmasq следующим образом (первая команда также удалит network-manager):

sudo apt-get remove dnsmasq-base
sudo apt-get install dnsmasq
sudo apt-get install network-manager network-manager-gnome

И вот некоторые общие комментарии по поиску того, что блокирует ваши порты: вы можете найти то, что прослушивает какой порт, используя lsof:

lsof -Pn +M -i4

перечислит порты IPv4 из-за -i4, в то время как

lsof -Pn +M -i6

перечислит порты IPv6. Или просто введите

lsof -Pn +M | grep ':53 (LISTEN)'

Это должно (надеюсь) рассказать вам, что использует порт 53. -Pn параметры командной строки предотвращают преобразование номера порта / IP-адреса хоста в имена.

Или запустить

netstat -utlnp
Другие вопросы по тегам