У меня есть 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
netstat -na | grep 874
если ваши текущие netstat
флаги будут слишком строгими.
iptables -S
выводе?