dnsmasq не може да заеме порт 53: намерете сокета, който го държи
Грешка при свързване на порт 53 е въпрос на собственост върху сокета. Прочетете слушателите, проверете обхвата на wildcard адреса, после решете кой демон отговаря на VPN клиентите.
dnsmasq завършва с грешка, че адресът вече се използва, а журналът назовава порта, а не виновника. На машина, на която работи и VPN, първата реакция е да обвиним изпратените маршрути, но грешката при свързване се случва преди който и да е клиент да изпрати заявка. Нещо вече държи сокета и задачата е да го открием. Промените в маршрутите не могат да освободят порт.
Пет стъпки в този ред: възпроизведете грешката, избройте слушателите, разберете wildcard адреса, разпределете задачата, после проверете.
Стъпка 1: възпроизведете и прочетете грешката
Стартирайте dnsmasq на преден план със същата конфигурация, която използва услугата, за да се появи грешката в терминала ви, а не в журнал, който трябва да гадаете. Отбележете семейството на адреса и локалния адрес в съобщението. Свързването към конкретен адрес и свързването към wildcard адреса са различни грешки с различни собственици.
Запазете точния текст. Адрес в употреба, отказ на разрешение и липсващ интерфейс идват като неуспех при стартиране и сочат към три различни поправки.
Стъпка 2: избройте собствениците
Първо избройте сокетите. Филтър по порт на източника 53 показва и двата транспорта и процеса собственик, когато имате права да го видите:
ss -lntup 'sport = :53'Четете изхода по колони: транспорт, локален адрес, порт, процес. TCP слушател и UDP слушател са отделни сокети, затова спирането на единия не освобождава другия. Wildcard адресът покрива всеки интерфейс, което означава, че VPN адресът вече е зает, дори никой ред да не го назовава поименно. А името на процеса ви казва дали това е resolver, управляван от дистрибуцията, контейнер или нещо, оставено да работи от предишен експеримент.
Стъпка 3: капанът на wildcard адреса
Опцията bind-interfaces определя дали dnsmasq свързва wildcard сокет или по един сокет за всеки конфигуриран интерфейс, както описва справката за dnsmasq. Без нея dnsmasq може да свърже wildcard адреса и вместо това да филтрира заявките по интерфейс, което се проваля веднага, щом друг демон държи wildcard адреса. Linux добавя bind-dynamic, който обработва интерфейси, създадени след стартирането, реален проблем, когато VPN интерфейсът се появи само при свързване.
Затова два демона, които и двата изглеждат конфигурирани за различни интерфейси, пак се сблъскват. Конфликтът е при сокета, не при намерението. Изберете режима на свързване съзнателно и прочетете документираното поведение за вашата версия, преди да го промените.
Стъпка 4: разпределете задачата
Решете кой демон отговаря на VPN клиентите и кой на хоста. Един resolver, който слуша на адреса на тунела и препраща нагоре е обичайна подредба; два resolver-а, всеки от които смята, че притежава порт 53, изобщо не е подредба.
После изразете това решение в конфигурацията на всяка услуга: адреси за слушане, филтри на интерфейси и препращане. Променяйте ги чрез собственика на услугата, дали е модул на дистрибуцията, мрежов мениджър или среда за изпълнение на контейнери, за да преживее промяната рестарт.
Стъпка 5: проверете сокета, после пътя
След рестарта потвърдете, че желаните сокети съществуват, преди да тествате клиент. Демон, който никога не се е свързал, не може да бъде спасен от маршрут, а отказ на клиент срещу правилно свързан сокет е друг проблем с друга поправка. После проверете достъпността от клиент в тунела. Едва след това си струва да питате дали необходимите имена се резолвират.
Три отделни резултата, които да не се смесват: сокетът съществува, клиентът го достига, отговорът е правилен.
Какво да не правите
Не спирайте непознат resolver, за да освободите порта, без да знаете какво зависи от него, защото собствените търсения на хоста обикновено зависят. Не копирайте стара рецепта, която мести втория демон на публичен адрес за слушане, защото това като страничен ефект решава кой може да ви прави заявки. И не добавяйте препращане, когато повредата е била локална.
Ако машината се управлява, запишете решението за собствеността там, където следващият администратор ще го намери. Конфликтите на портове се връщат всеки път, когато образът се преизгради.