netcat: проверка доступности связки ip:port

моему серверу выделено несколько ip-адресов. они добавлены к внешнему интерфейсу (в примере фигурируют интерфейс eth0 и адреса 192.168.2.120 и 192.168.2.188, которые, конечно, не относятся к публичным, но это же только пример):

$ ip a l dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:fd:45:fd:10:4c brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.120/24 brd 192.168.2.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 192.168.2.188/24 scope global secondary eth0
       valid_lft forever preferred_lft forever

как мне с помощью программы nc (netcat) проверить одновременную доступность какого-нибудь порта на каждом из адресов?


Ответы (1 шт):

Автор решения: aleksandr barakin
  • указать прослушиваемый адрес можно с помощью опции -s адрес.
  • указать прослушиваемый порт можно с помощью опции -p порт

для примера возьмём порт 1024 (порты с меньшими номерами требуют повышенных привилегий — надо будет запускать программу nc от имени пользователя root).

запустите на сервере для каждой пары ip:port такую примерно команду:

$ while :; do echo "ip: 192.168.2.188 port:1024" | nc -q 1 -l -s 192.168.2.188 -p 1024 >/dev/null 2>&1 || break; done &

понятно, что в команде echo и в параметрах nc должны фигурировать одни и те же ip-адреса и порты, чтобы ответы можно было отличить.

а теперь из внешнего (для сервера) мира с помощью той же программы nc проверьте, что получаете ответ от сервера:

$ nc 192.168.2.188 1024
ip: 192.168.2.188 port:1024

и так для каждой пары ip:port. если получаете что-нибудь вроде:

(UNKNOWN) [192.168.2.188] 1024 (?) : Connection refused

то значит доступа (по крайней мере от вашего локального компьютера до сервера) к данному ip-адресу и на указанном порту — нет.


проверять можно и с помощью http-клиента («браузера»). для этого надо добавить немного http-информации в команду echo, приведя её примерно к такому виду:

echo -e "HTTP/1.1 200 OK\n\nip: 192.168.2.188 port:1024"

тогда по ссылке http://192.168.2.188:1024 должно отобразиться то же самое сообщение от запущенной на сервере программы nc.

но это подойдёт не для всех портов — например, открывать соединение на 25-м порту протестированные мной http-клиенты firefox и chromium отказались наотрез.


убить запущенные не сервере процессы nc можно с помощью команды:

$ kill номер.процесса

увидеть номера процессов, содержащих в имени nc (и переданные процессам параметры), можно так:

$ pgrep -a nc
→ Ссылка