У меня есть 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 поступает из команды strace -ff nc -l -p 874 -s 127.0.0.1
.
Таким образом, это говорит о том, что процесс уже прослушивает порт 874 localhost. Однако я не могу его найти. Все следующие команды ничего не возвращают:
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? На что еще можно посмотреть или какие еще команды можно запустить, чтобы получить дополнительную информацию?
Дополнительная информация:
Если ваш хост является клиентом NFS, он может использовать исходный порт 874 для монтирования NFS. Я подозреваю, что, поскольку соединение исходит не из пользовательского пространства, оно может быть невидимо для инструментов, которые вы использовали до сих пор.
Рассмотрим одно из следующего:
sysctl
s sunrpc.min_resvport
и sunrpc.max_resvport
(по умолчанию 665 и 1023), чтобы изменить диапазон исходных портов, используемых клиентом NFS.noresvport
опция при монтировании NFS для использования непривилегированного диапазона (может иметь последствия для безопасности)