You can check if a process listens on a TCP or UDP port with netstat -tuplen
.
To check whether some ports are accessible from the outside (this is probably what you want) you can use a port scanner like Nmap from another system. Running Nmap on the same host you want to check is quite useless for your purpose.
Quickest way to test if a TCP port is open (including any hardware firewalls you may have), is to type, from a remote computer (e.g. your desktop):
telnet myserver.com 80
Which will try to open a connection to port 80 on that server. If you get a time out or deny, the port is not open :)
Если вы подключены к системе и можете запускать команду как root, вы можете проверить вывод iptables
iptables -L -vn
, в котором будут перечислены правила брандмауэра и какие порты являются открытыми целевыми ACCEPT
и любой явно закрытый целевой порт REJECT
.
Итак, у вас есть сервер, на который вы можете войти. Вы хотите увидеть, прослушивает ли что-то какой-либо порт. От имени пользователя 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 есть что-то, что может разрешить это.
тогда ваша хостинговая компания может использовать брандмауэр (например, они разрешают только SSH (22 / tcp), HTTP (80 / tcp) и HTTPS (443 / tcp) и запрещают весь другой входящий трафик). В этом случае вам нужно будет открыть запрос в службу поддержки, чтобы решить эту проблему, хотя я полагаю, что в вашей cPanel есть что-то, что может разрешить это. тогда ваша хостинговая компания может использовать брандмауэр (например, они разрешают только SSH (22 / tcp), HTTP (80 / tcp) и HTTPS (443 / tcp) и запрещают весь другой входящий трафик). В этом случае вам нужно будет открыть запрос в службу поддержки, чтобы решить эту проблему, хотя я полагаю, что в вашей cPanel есть что-то, что может разрешить это. lsof -i: ssh
перечислит все процессы с открытым портом ssh, как прослушивающие, так и активные соединения.
Я использую комбинацию netstat
и lsof
:
netstat -an | grep <portnumber>
lsof -i:<portnumber>
, чтобы узнать, используется ли порт и что его использует.
Если вам нужно написать такой тест, решение Сергея Попова (см. комментарий к вопросу), вероятно, будет лучшим, поскольку nc
способен искать в стеке TCP открытый порт³ вместо попытки фактического подключения.
Простейшая форма:
nc -z <ip> <port>
Команда возвращает true, если обнаруживает указанную комбинацию
как открытую (т.е. одна из ваших служб прослушивает).
Теперь вы можете написать скрипт для ожидания открытия порта:
while ! nc -z <ip> <port>
do
sleep 1
done
Примечание 1: Я попробовал параметр командной строки -w
, и это, похоже, ничего не дало. В любом случае команда возвращается немедленно. Я думаю, что -w
бесполезно с -z
.
Примечание 2: для облегчения отладки попробуйте использовать параметр командной строки -v
.
Примечание 3: nc -z ...
фактически создает socket()
, а затем пытается bind()
его и connect( )
. Если это работает, он считает, что порт открыт.