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

209

Как я могу проверить, прослушивает ли порт сервер Linux?

Джеймс Андерсон
источник
2
Не совсем понятно, о чем ты спрашиваешь. Что вы подразумеваете под «открытым»? Вы имеете в виду, что какой-то сервер прослушивает этот порт? Или вы имеете в виду, что это разрешено системным брандмауэром? Или что?
Дэвид Шварц
Я думаю, что порт заблокирован на моем сервере и хочу разблокировать / открыть его снова.
Джеймс Андерсон
14
netstat -an | grep PORTNUMBER | grep -i listenЕсли вывод пуст, порт не используется.
automatix

Ответы:

187

Вы можете проверить, прослушивает ли процесс порт TCP или UDP с помощью netstat -tuplen.

Чтобы проверить, доступны ли некоторые порты извне (это, вероятно, то, что вам нужно), вы можете использовать сканер портов, такой как Nmap, из другой системы. Запуск Nmap на том же хосте, который вы хотите проверить, совершенно бесполезен для вашей цели.

Joschi
источник
54
GNU NetStat знает параметры -t, -u, -p, -l, -e, и -n. Благодаря парсеру параметров это можно выразить как -tuplen. linux.die.net/man/8/netstat
Йоси
3
Кроме того, telnetкоманда обычно поддерживает только TCP, так что вам не повезло, если служба, которую вы хотите проверить, работает по другому протоколу.
Йоси
1
да, я использовал Windows, поэтому путаница.
Декстер
2
nc является (лучшей) альтернативой telnet. Он также поддерживает UDP.
Цветомир Димитров
1
Используйте его с Судом: sudo netstat -tuplen. Это даст вам процессы, принадлежащие не только вам, но и другим, и распечатает дополнительную информацию (например, PID / Имя программы), если они еще не отображаются как пользователь без полномочий root.
Джон Ред
102

Самый быстрый способ проверить, открыт ли порт TCP (включая любые имеющиеся у вас аппаратные брандмауэры), - набрать с удаленного компьютера (например, с вашего рабочего стола):

telnet myserver.com 80

Который будет пытаться открыть соединение с портом 80 на этом сервере. Если вы получаете тайм-аут или отрицаете, порт не открыт :)

Адриан Макнейл
источник
1
говорит, что он не распознает "телнет" как команду ...
Джеймс Андерсон
6
«yum install telnet» для установки клиентского пакета telnet.
CJC
8
Написано выше:if you get a time out or deny, the port is not open
Индастриал
2
Что делать, если у вас нет разрешения на установку telnet? Есть еще один стандартный инструмент?
KC Baltz
3
Я попробовал «telnet myhost 22» и получил тайм-аут. Но я могу ssh в эту машину. ?!
Торстен Бронджер
30

Итак, в общем, у вас есть сервер, на который вы можете войти. Вы хотите увидеть, если что-то прослушивает какой-то порт. От имени пользователя 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 может быть что-то, что может это позволить.

CJC
источник
Не могли бы вы добавить, как отменить команду iptables -I? Спасибо!!
Евгений
1
«iptables -D», за которым следует все, что у вас было после «-I» в исходной команде. В основном, посмотрите документацию.
CJC
11

Я использую комбо из netstatи lsof:

netstat -an | grep <portnumber>
lsof -i:<portnumber>

Чтобы увидеть, используется ли порт, и что его использует.

кроличий садок
источник
ничто не подсказывает с или без sudo
Dheeraj Thedijje
1
@DheerajThedijje - тогда этот порт не открыт
Warren
Да не было, понял.
Дхирадж Тедидже
7

Если вы подключены к системе и можете запустить команду от имени пользователя root, вы можете проверить вывод iptables.

iptables -L -vn

в этом списке будут перечислены правила брандмауэра, а также какие порты являются целевыми открытыми ACCEPTи любые явно закрытые целевые порты REJECT.

user619714
источник
И если у вас есть firewalld, это проще firewall-cmd --query-port=port/protocol, например firewall-cmd --query-port=80/tcp.
Агостино,
6

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

PGS
источник
Префикс, sudoесли он не возвращает никакого вывода.
Элайджа Линн