четверг, 19 февраля 2009 г.

port-check - чекаем порты без проблем или скрипт для проверки доступности портов


Нам, админам, довольно часто, точнее постоянно, приходится мониторить различные ресурсы своей сети и не редко удаленной. Если нет возможности поставить на хост средства мониторинга, то приходится проверить по портам. Раньше я это делал так:
netcat -w3 -z host port && echo OK
А что если нужно проверять несколько хостов и/или портов? Вот для этих целей и был написан скрипт.


Цель написания скрипта проста - возможность проверить несколько портов на одном и более хосте одной командой. Про существование различных программ я знаю, но не нашел подходящего для себя решения, поэтому написал свой скрипт основанный на netcat.

Ниже приведена справка по использованию скрипта port-check.
$ port-check --help

Скрипт port-check проверяет на доступность указанные порты на указанных хостах.
Возвращает количество закрытых портов.

Использование:
port-check [-q|-v] host port
port-check [-q|-v] host "port1 .. portN"
port-check [-q|-v] "host1 .. hostN" port
port-check [-q|-v] "host1 .. hostN" "port1 .. portN"



-q, --quiet
Ничего не выводить

-v, --verbose
Выводить т.ж. открытые порты, иначе только закрытые и не доступные хосты

-V, --version
Показать версию

-h, --help
Показать эту справку
Все проще некуда =)

А вот несколько примеров работы скрипта:
$ port-check -v "mail.ru google.com 10.0.0.1 192.168.0.1" "80 443 ssh 21"
mail.ru:80 open
mail.ru:443 CLOSE!!!
mail.ru:ssh CLOSE!!!
mail.ru:21 CLOSE!!!
google.com:80 open
google.com:443 open
google.com:ssh CLOSE!!!
google.com:21 CLOSE!!!
Host 10.0.0.1 unreachable!!!
192.168.0.1:80 open
192.168.0.1:443 CLOSE!!!
192.168.0.1:ssh CLOSE!!!
192.168.0.1:21 open


$ port-check -v "mail.ru google.com 10.0.0.1 192.168.0.1" 80
mail.ru:80 open
google.com:80 open
Host 10.0.0.1 unreachable!!!
192.168.0.1:80 open


$ port-check -v mail.ru "80 443 ssh 21"
mail.ru:80 open
mail.ru:443 CLOSE!!!
mail.ru:ssh CLOSE!!!
mail.ru:21 CLOSE!!!


$ port-check -v 10.0.0.1 "80 443 ssh 21"
Host 10.0.0.1 unreachable!!!


$ port-check -q 10.0.0.1 "80 443 ssh 21"


$ port-check "mail.ru google.com 10.0.0.1 192.168.0.1" "80 443 ssh 21"
mail.ru:443 CLOSE!!!
mail.ru:ssh CLOSE!!!
mail.ru:21 CLOSE!!!
google.com:ssh CLOSE!!!
google.com:21 CLOSE!!!
Host 10.0.0.1 unreachable!!!
192.168.0.1:443 CLOSE!!!
192.168.0.1:ssh CLOSE!!!
Вот и все. Надеюсь все понятно и наглядно.

Скачать port-check можно по этой ссылке. Пользуйтесь на здоровье.

Почти каждая строка в скрипте прокомментирована. Уверен, что даже новичок сможет разобраться, как работает скрипт.
Скрипт писал довольно долго, много тестировал, поэтому версия сразу 1.0 и, скорее всего, финальная. Даже не представляю, что еще в него можно добавить...


Критика/комментарии/мнения/etc с радостью принимаются :)))


8 комментариев:

  1. А что, nmap не спасет отца русской демократии?

    ОтветитьУдалить
  2. Хотя во многие дистры он входит по дефолту, но для таких целей его использовать...

    Вот сравни:
    $ nmap -p 80,21,ssh,https mail.ru google.ru 10.0.0.1 192.168.0.1

    Starting Nmap 4.53 ( http://insecure.org ) at 2009-02-20 11:02 EET
    Warning: Hostname mail.ru resolves to 4 IPs. Using 194.67.57.20.
    Warning: Hostname google.ru resolves to 3 IPs. Using 216.239.59.104.
    Interesting ports on mail.ru (194.67.57.20):
    PORT STATE SERVICE
    21/tcp filtered ftp
    22/tcp filtered ssh
    80/tcp open http
    443/tcp filtered https

    Interesting ports on 192.168.0.1:
    PORT STATE SERVICE
    21/tcp open ftp
    22/tcp filtered ssh
    80/tcp open http
    443/tcp closed https

    Nmap done: 4 IP addresses (2 hosts up) scanned in 4.214 seconds


    $ port-check -v "mail.ru google.ru 10.0.0.1 192.168.0.1" "80 21 ssh https"
    mail.ru:80 open
    mail.ru:21 CLOSE!!!
    mail.ru:ssh CLOSE!!!
    mail.ru:https CLOSE!!!
    google.ru:80 open
    google.ru:21 CLOSE!!!
    google.ru:ssh CLOSE!!!
    google.ru:https open
    Host 10.0.0.1 unreachable!!!
    192.168.0.1:80 open
    192.168.0.1:21 open
    192.168.0.1:ssh CLOSE!!!
    192.168.0.1:https CLOSE!!!


    Что-то я не увидел в выводе NMap'а гугла... Проверим его пингом на доступность и убедимся, что он в сети:
    $ ping -c 1 216.239.59.104
    PING 216.239.59.104 (216.239.59.104) 56(84) bytes of data.
    64 bytes from 216.239.59.104: icmp_seq=1 ttl=242 time=132 ms

    --- 216.239.59.104 ping statistics ---
    1 packets transmitted, 1 received, 0% packet loss, time 0ms
    rtt min/avg/max/mdev = 132.972/132.972/132.972/0.000 ms


    Т.ж. замечал, что он (nmap) не всегда проверяет нормально порты, т.е. у меня были случаи когда я проверял порты на своих серверах и он мне говорил, что порты закрыты (либо, что хост не доступен), хотя все работало на ура (этот же netcat говорил, что все ок + коннект на нужный порт был).

    Но NMap - это очень хороший и мощный инструмент, тут без спора.

    ОтветитьУдалить
  3. Про косяк не знаю, не замечал ни разу, если замечен был, может стоит фафиллить багу разработчикам?

    А про "сравни" - сравнил, nmap сосем не меньше инфы дает, делает то же самое и много, много больше... Так зачем очередной самокат?

    ОтветитьУдалить
  4. Мне нужно на выходе полчить кол-во закрытых портов, а уже в зависимости от этого числа кое-что сделать. Можно и вывод nmap распарсить, но netcat мне удобнее. + еще что-то, уже не припомню... что-то типа нужно было на кокой-то сервак мониторинг поставить, а nmap нельзя было там ставить (админ сервака не разрешал), вот и сделал скрипт. Короче тут много причин, по которым я его писал.

    ОтветитьУдалить
  5. Автор старался, молодец. От себя только добавлю

    nc -w5 -z host port && echo OK || echo Fail

    ОтветитьУдалить
  6. Этот вариант может не сработать...
    Подробности тут:
    http://bappoy.pp.ru/2008/12/24/bash-pitfalls-part04.html
    Ищи совет №20: 20. cmd1 && cmd2 || cmd3

    Или у меня в гугловых доках http://docs.google.com/Doc?id=dd5dc8n6_81dt8c5jfg , тут все части собраны в одну заметку.

    ОтветитьУдалить
  7. Ух какой я некрофил, но скрипт полезный, хотелось бы реализацию 1.1, а в ней добавить возможность проверять UDP и TCP/UDP одновременно, либо возле списка портов указавыть тип.
    Например надо проверить 80 22 TCP и 1194 53 udp, могло бы так выглядеть:
    port-check 127.0.0.1 "1194-u 80-t"
    или
    port-check 127.0.0.1 "1194 53"-u "80 22"-t

    Спасибо.

    ОтветитьУдалить