проверить, открыт ли порт на сервере linux?

<p>как я могу проверить, прослушивает ли порт сервер linux?</p>

<p>вы можете проверить, прослушивает ли процесс порт tcp или udp) с помощью <code>netstat -tuplen</code>.</p><p>чтобы проверить, доступны ли некоторые порты извне (это, вероятно, то, что вам нужно), вы можете использовать сканер портов, например <a href="http://insecure.org/">nmap</a> из <em> другого </em> система. запуск nmap на том же хосте, который вы хотите проверить, совершенно бесполезен для вашей цели.</p>

<p>самый быстрый способ проверить, открыт ли порт tcp (включая любые имеющиеся у вас аппаратные брандмауэры)), с удаленного компьютера (например, с вашего рабочего стола):</p><pre><code>telnet myserver.com 80 </code></pre><p>который попытается открыть соединение с портом 80 на этом сервере. если вы получаете тайм-аут или отрицаете, порт не открыт :)</p>

<p>итак, в общем, у вас есть сервер, на который вы можете войти. вы хотите увидеть, если что-то прослушивает какой-то порт. от имени пользователя root запустите:</p><pre><code>netstat -nlp </code></pre><p>это покажет список процессов, прослушивающих tcp и udp-порты. вы можете сканировать (или grep) его для процесса, который вас интересует, и/или номеров портов, которые вы ожидаете увидеть ,.</p><p>если ожидаемого вами процесса нет, вам следует запустить этот процесс и снова проверить netstat. если процесс существует, но он прослушивает интерфейс и порт, который вы не ожидали, то есть проблема конфигурации (например, это может быть прослушивание, но только на интерфейсе обратной связи, поэтому вы увидите 127.0.0.1:3306 и нет других строк для порта 3306, в случае конфигурации по умолчанию для mysql).</p><p>если процесс завершен, и он прослушивает ожидаемый вами порт, вы можете попробовать запустить "telnet" к этому порту с вашего macbook в вашем офисе/доме, например,</p><pre><code> telnet xxxxxxxxxxxx.co.uk 443 </code></pre><p>это проверит, если (при условии стандартных портов), что есть веб-сервер, настроенный для ssl. обратите внимание, что этот тест с использованием telnet будет работать только в том случае, если процесс прослушивает порт tcp. если это порт udp, вы также можете попробовать использовать любой клиент, для которого вы собираетесь использовать подключиться к нему (я вижу, что вы использовали порт 224. это masqdialer, и я понятия не имею, что это такое).</p><p>если служба есть, но вы не можете получить к ней доступ извне, то есть брандмауэр, блокирующий вас. в этом случае запустите:</p><pre><code> iptables -l -n </code></pre><p>это покажет все правила брандмауэра, как определено в вашей системе. вы можете опубликовать это, но, как правило, если вы не разрешаете все в цепочке input, вам, вероятно, потребуется явно разрешить трафик на рассматриваемом порту:</p><pre><code> iptables -i input -p tcp --dport 224 -j accept </code></pre><p>или что-то вдоль этих линий. не запускайте команды брандмауэра вслепую, основываясь на том, что незнакомец сказал вам в интернете. подумай, что ты делаешь.</p><p>если ваш брандмауэр на коробке разрешает трафик, который вы хотите, то ваша хостинговая компания может использовать брандмауэр (например, они разрешают только ssh (22/tcp), http (80/tcp) и https (443/tcp) и отрицание всего другого входящего трафика). в этом случае вам нужно открыть билет службы поддержки, чтобы решить эту проблему, хотя я полагаю, что в вашей cpanel может быть что-то, что может это позволить.</p>

<p>я использую комбинацию <code>netstat</code> и <code>lsof</code>:</p><pre><code>netstat -an | grep <portnumber> lsof -i:<portnumber> </code></pre><p>чтобы увидеть, используется ли порт, и что его использует.</p>

<p>если вы подключены к системе и можете выполнить команду от имени пользователя root, вы можете проверить вывод iptables</p><pre><code>iptables -l -vn </code></pre><p>в этом списке будут перечислены правила брандмауэра и какие порты являются целевой целью <code>accept</code>, а любые явно закрытые порты назначения <code>reject</code>.</p>

<p><code>lsof -i :ssh</code> выведет список всех процессов с открытым портом ssh, как прослушивающих, так и активных соединений.</p>

<p>если вам нужен сценарий такого теста, решение сергея попова (см. комментарий к вопросу), вероятно, является наилучшим, поскольку <code>nc</code> может выполнять поиск в открытом стеке tcp) порт вместо попытки фактического соединения.</p><p>самая простая форма:</p><pre><code>nc -z <ip> <port> </code></pre><p>команда возвращает true, если она находит указанное <code><ip>:<port></code> комбо как открытое (т.е. одна из ваших служб прослушивает).</p><p>теперь вы можете написать скрипт для ожидания открытия порта:</p><pre><code>while ! nc -z <ip> <port> do sleep 1 done </code></pre><p><em>примечание 1: я пробовал <code>-w</code> опция командной строки, и это, похоже, ничего не делает. в любом случае команда возвращается немедленно. я думаю, что <code>-w</code> бесполезно с <code>-z</code>.</em></p><p><em>примечание 2: чтобы помочь отладке, попробуйте с <code>-v</code> опция командной строки.</em></p>