Як налагодити мережу Linux: Адреса вже використовується


10

У мене є вікно Linux Slackware, де я не можу запустити будь-яку службу, яка слухає на одному конкретному порту в localhost. За допомогою strace я з’ясував, що помилка трапляється під час bind()виклику, і помилка EADDRINUSE (Address already in use):

bind(3, {sa_family=AF_INET, sin_port=htons(874), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 EADDRINUSE (Address already in use)

Це відбувається з будь-яким процесом, який я намагаюся почати слухати на цьому порту, тому він не пов'язаний із самим процесом. Вищенаведений стразевий вихід походить від команди strace -ff nc -l -p 874 -s 127.0.0.1.

Отже, це говорить про те, що на порталі localhost 874. вже прослуховується процес, однак, я не можу його знайти. Усі наступні команди нічого не повертають:

netstat -aplunt | grep :874
netstat -na | grep :874
lsof -i :874
lsof -i tcp | grep 874
fuser 874/tcp
socklist | grep 874
iptables -t filter -S | grep 874
iptables -t nat -S | grep 874
iptables -t mangle -S | grep 874
conntrack -L | grep 874

Якщо я спробую прослухати 0.0.0.0:874це не вдається з тією ж помилкою. Прослуховування однієї з IP-адрес, налаштованих на нік, працює добре, а прослуховування 127.0.0.2:874також працює нормально. Прослуховування на іншому порту чудово працює, також на 127.0.0.1або 0.0.0.0.

Отже, зараз мені цікаво. Як я можу дізнатися, чому мережевий стек повертає EADDRINUSE сюди? Які ще речі я можу переглянути, або які інші команди можна запустити, щоб отримати більше інформації?

Додаткова інформація:

  • Ядро 4.1.31.
  • Тут не використовується Selinux.
  • Спроба підключитися до 127.0.0.1 з telnet повертає "З'єднання відмовлено"
  • Я виконую команди як root

1
Чи згадується порт де-небудь у iptables -Sвиході?
гертіт

1
Чи можете ви також друкувати вихід strace -ff nc -l 874 також, той, який ви використовували, намагається встановити з'єднання з 874 як вихідний порт. Дякую!
Аніруд Малхотра

2
AFAIK Linux вимагає кореневих привілеїв під час прослуховування порту <1000. Можливо, тут проблема.
Корактор

2
Це хост - клієнт NFS? Можливо, використовується вихідний порт 874 для кріплення NFS. У будь-якому разі я б спробував, netstat -na | grep 874якщо ваші поточні netstatпрапори занадто обмежуючі.
Том Шов

1
@TomShaw Ти щойно зробив мій день! Це було в порядку NFS . Я не впевнений, як саме це сталося, але після відключення всіх кріплень NFS та перезавантаження служб RPC та NFS проблема не зникає. За допомогою tcpdump я також бачив деякий трафік від порту 874 до порту 111 (чому я не думав про це раніше), що це підтверджує. Чи можете ви опублікувати це як відповідь, будь ласка?
roelvanmeer

Відповіді:


4

Якщо ваш хост - клієнт NFS, він може використовувати вихідний порт 874 для кріплення NFS. Я підозрюю, що оскільки з'єднання не відбувається з простору користувачів, воно може бути не видно інструментам, яким ви користувались до цього часу.

Розглянемо одне з наступних:

  • Відрегулюйте sysctls sunrpc.min_resvportта sunrpc.max_resvport(за замовчуванням 665 та 1023), щоб змінити діапазон вихідних портів, якими користується клієнт NFS
  • Використовуйте порт для прослуховування поза цим діапазоном
  • Використовуйте noresvportопцію на кріпленні NFS, щоб використовувати непривілейований діапазон (може мати наслідки для безпеки)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.