Как отлаживать работу в сети Linux: адрес уже используется

10

У меня есть Slackware linux box, где я не могу запустить какой-либо сервис, который прослушивает один конкретный порт на 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 происходит из команды strace -ff nc -l -p 874 -s 127.0.0.1.

Итак, это говорит о том, что процесс уже прослушивает локальный порт 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.
  • Селинукс здесь не используется.
  • Попытка подключения к 127.0.0.1 с помощью telnet возвращает сообщение «Отказано в соединении»
  • Я запускаю команды как root
roelvanmeer
источник
1
Указан ли порт где-нибудь в iptables -Sвыводе?
Hertitu
1
Не могли бы вы также напечатать вывод strace -ff nc -l 874 , который вы использовали, пытаясь установить соединение с портом 874 в качестве порта источника. Спасибо!
Анирудх Малхотра
2
AFAIK Linux требует привилегий root при прослушивании порта <1000. Может быть, в этом проблема.
Koraktor
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, чтобы использовать непривилегированный диапазон (может иметь последствия для безопасности)
Том Шоу
источник