Как я могу проверить, прослушивает ли порт сервер Linux?
Вы можете проверить, прослушивает ли процесс порт TCP или UDP с помощью netstat -tuplen
.
Чтобы проверить, доступны ли некоторые порты извне (вероятно, это то, что вам нужно), вы можете использовать сканер портов, например Nmap из другой система. Запуск Nmap на том же хосте, который вы хотите проверить, совершенно бесполезен для ваших целей.
Самый быстрый способ проверить, открыт ли TCP-порт (включая любые аппаратные брандмауэры, которые у вас могут быть), - это ввести с удаленного компьютера (например, вашего рабочего стола):
telnet myserver.com 80
Который попытается открыть соединение с портом 80 на этом сервере. Если выйдет тайм-аут или отказать, порт не открыт :)
Итак, у вас есть сервер, на который вы можете войти. Вы хотите увидеть, прослушивает ли что-то какой-либо порт. Как root, запустите:
netstat -nlp
это покажет список процессов, прослушивающих порты TCP и UDP. Вы можете сканировать (или использовать grep) его для поиска интересующего вас процесса и / или номеров портов, которые вы ожидаете увидеть.
Если ожидаемого процесса нет, вам следует запустить этот процесс и снова проверить netstat. Если процесс есть, но он прослушивает интерфейс и порт, которых вы не ожидали, то есть проблема с конфигурацией (например, он может прослушивать, но только на интерфейсе обратной связи, поэтому вы увидите 127.0.0.1:3306 и никаких других строк для порта 3306 в случае конфигурации по умолчанию для MySQL).
Если процесс запущен и он прослушивает ожидаемый порт, вы можете попробовать запустить «telnet» на этот порт со своего Macbook в офисе / дома, например,
telnet xxxxxxxxxxxx.co.uk 443
Это проверит, настроен ли (при условии стандартных портов) для SSL веб-сервер. Обратите внимание, что этот тест с использованием telnet будет работать, только если процесс прослушивает TCP-порт. Если это UDP-порт, вы также можете попробовать с любым клиентом, который собирались использовать для подключения к нему. (Я вижу, что вы использовали порт 224. Это masqdialer, и я понятия не имею, что это такое).
Если служба есть, но вы не можете получить к ней доступ извне, значит, вас блокирует брандмауэр. В этом случае запустите:
iptables -L -n
Это покажет все правила брандмауэра, определенные в вашей системе. Вы можете опубликовать это, но, как правило, если вы не разрешаете все в цепочке INPUT, вам, вероятно, потребуется явно разрешить трафик на рассматриваемый порт:
iptables -I INPUT -p tcp --dport 224 -j ACCEPT
Или что-то вдоль этих линий. Не запускайте команды брандмауэра вслепую, основываясь на том, что вам сказал какой-то незнакомец в Интернете. Подумайте, что вы делаете.
Если ваш брандмауэр на коробке разрешает трафик, который вам нужен, то ваша хостинговая компания может использовать брандмауэр (например, они разрешают только SSH (22 / tcp), HTTP (80 / tcp) и HTTPS (443 / tcp). и запретить весь другой входящий трафик). В этом случае вам нужно будет открыть с ними заявку в службу поддержки, чтобы решить эту проблему, хотя я полагаю, что в вашей cPanel может быть что-то, что может разрешить это.
Я использую комбинацию netstat
и lsof
:
netstat -an | grep <portnumber>
lsof -i:<portnumber>
Чтобы узнать, используется ли порт и что его использует.
Если вы подключены к системе и можете запускать команду как root, вы можете проверить вывод iptables.
iptables -L -vn
это перечислит правила брандмауэра и какие порты являются открытыми целевыми ACCEPT
и любые явно закрытые целевые порты REJECT
.
lsof -i :ssh
перечислит все процессы с открытым портом ssh, как прослушивающие, так и активные соединения.
Если вам нужно написать сценарий такого теста, решение Сергея Попова (см. Комментарий к вопросу), вероятно, будет лучшим, поскольку nc
способен искать в стеке TCP открытый порт вместо попытки установить фактическое соединение.
Самая простая форма:
nc -z <ip> <port>
Команда возвращает истину, если находит указанный <ip>:<port>
combo как открываемый (т.е. одна из ваших служб прослушивает).
Итак, теперь вы можете написать сценарий, который будет ждать, пока порт откроется:
while ! nc -z <ip> <port>
do
sleep 1
done
Примечание 1: я попробовал -w
параметр командной строки и, похоже, ничего не сделал. В любом случае команда возвращается немедленно. Я думаю, что -w
бесполезен с -z
.
Примечание 2: чтобы облегчить отладку, попробуйте -v
параметр командной строки.