Сетевой порт открыт, но процесс не подключен?
У меня странная ситуация с открытым сетевым портом. Мой главный вопрос: почему бы не быть программой, связанной с открытым портом TCP:
netstat -ln --program
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:5666 0.0.0.0:* LISTEN -
В моем конкретном случае предполагается, что демон nrpe (установка opsview) прослушивает порт 5666, но демон nrpe не работает. Если я попытаюсь запустить его, он немедленно выйдет.
lsof -i :5666
не показывает никакого вывода либо. В моей системе не работает (x)inetd.
ОБНОВИТЬ
Да, я запускал эти команды от имени пользователя root. Telnet мог бы, но не было никакого ответа.
После дальнейшего изучения я обнаружил ошибку ядра в dmesg
: это был экземпляр EC2 (на самом деле несколько из них) с более старым ядром (2.6.16, по-видимому, нестабильно). Исправление, чтобы остановить падение, состояло в том, чтобы обновить ядра.
Похоже, из-за сбоя ядра процесс ушел и оставил порт открытым.
6 ответов
Порты, открытые ядром, не будут отображаться с именем программы. Некоторые вещи NFS и OCFS приходят на ум. Может быть, это что-то подобное?
Или это может быть ошибка ядра. Проверьте журналы ядра на OOPS и BUG.
Вы запускаете netstat и lsof от имени пользователя root или с помощью sudo? Обратите внимание на последний столбец:
netstat -ln --program
tcp 0 0 192.168.21.1:53 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -
sudo netstat -ln --program
tcp 0 0 192.168.21.1:53 0.0.0.0:* LISTEN 2566/named
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 2566/named
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 3125/sshd
Из man-страницы netstat:
Вам также понадобятся привилегии суперпользователя, чтобы увидеть эту информацию на сокетах, которыми вы не владеете.
Откуда ты знаешь, что нет ни одного бегущего? Если порт используется, имеет смысл, что он немедленно завершит работу с ошибкой "используется сокет". что происходит, когда вы telnet к порту?
telnet localhost 5666
Выполнить 'netstat --tcp --udp --listening --program' от имени пользователя root. в противном случае вы не будете давать PID/ название программы
затем используйте команду kill -9 PID
Я на самом деле написал небольшой сценарий оболочки, чтобы помочь идентифицировать эти случайные вопросы:
#! /bin/bash
([ "$1" = "" ] || [ "$2" = "" ]) && echo "Usage: tracer <space> <port>" && exit 0
for i in `fuser -n $1 $2`
do
ps aux | grep $i | grep -v 'grep'
done
сохранить как /usr/local/bin/tracer; выход:
root@mo-log:/usr/flows# tracer tcp 80
80/tcp:
root 27904 0.0 0.0 111668 3292 ? Ss Aug04 0:03 /usr/sbin/apache2 -k start
www-data 32324 0.0 0.0 335332 3560 ? Sl Aug05 0:00 /usr/sbin/apache2 -k start
www-data 32327 0.0 0.0 335324 3560 ? Sl Aug05 0:00 /usr/sbin/apache2 -k start
Вам понадобятся права суперпользователя, чтобы использовать его
Я смог отследить процесс, получив его инод через netstat, а затем используя этот инод с lsof. Смотрите мой более подробный ответ в /questions/507163/netstat-pokazyivaet-port-proslushivaniya-bez-pid-no-lsof-ne/507178#507178.
Иногда программы, связанные с NFS, не отображаются в списке программ.
Кроме того, модули pap LDAP и libnss_ldap открывают соединения с серверами ldap, но фактический процесс, удерживающий соединение открытым, не существует, поэтому netstat -tnp показывает активное соединение без процесса.