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

У меня есть Linux-сервер Slackware, из которого я не могу запустить никакую службу, которая прослушивает один конкретный порт на localhost. Используя strace, я обнаружил, что ошибка возникает при вызове bind () , и это ошибка EADDRINUSE (Адрес уже используется) :

bind (3, {sa_family = AF_INET, sin_port = htons (874), sin_addr = inet_addr ("127.0.0.1")}, 16) = -1 EADDRINUSE (адрес уже используется)

Это происходит с любым процессом, который я пытаюсь начать прослушивать на этом порту, поэтому это не связано с самим процессом. Приведенный выше вывод strace поступает из команды 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-адресов, настроенных на nic, работает нормально, а прослушивание 127.0.0.2:874 также работает нормально. Прослушивание на другом порту работает нормально, также на 127.0.0.1 или 0.0.0.0 .

Итак, теперь мне любопытно. Как я могу узнать, почему сетевой стек здесь возвращает EADDRINUSE? На что еще я мог смотреть, или какие еще команды я могу запустить, чтобы получить дополнительную информацию?

Дополнительная информация:

  • Ядро 4.1.31.
  • Selinux здесь не используется.
  • Попытка подключиться к 127.0.0.1 с помощью telnet возвращает «Соединение отклонено»
  • Я запускаю команды как root
10
задан 26 October 2016 в 09:09
1 ответ

Если ваш хост является клиентом NFS, он может использовать исходный порт 874 для монтирования NFS. Я подозреваю, что, поскольку соединение исходит не из пользовательского пространства, оно может быть невидимо для инструментов, которые вы использовали до сих пор.

Рассмотрите одно из следующего:

  • Настройте sysctl s ] sunrpc.min_resvport и sunrpc.max_resvport (по умолчанию 665 и 1023)для изменения диапазона исходных портов, используемых клиентом NFS
  • Используйте порт прослушивания за пределами этого диапазона
  • Используйте параметр noresvport на монтировании NFS, чтобы использовать непривилегированный диапазон (может иметь последствия для безопасности)
4
ответ дан 2 December 2019 в 22:14

Теги

Похожие вопросы