тестирования сети в Линукс

    Эта заметка выросла из шпаргалки для самого себя. Мне по работе приходится отлавливать баги в сети. Как проверить скорость в VPN-туннеле? Почему сервер не пингуется? Или пингуется, но не доступен. Кто забил весь канал торрентами? Где пропадают пакеты? Почтовый клиент выдает непонятную ошибку, что произошло на самом деле? Эти и многие другие вопросы периодически возникают у любого пользователя. Под катом описание программ входящих во все современные дистрибутивы, начиная от пинга и до таких экзотических как ngrep. А так же картинками, если картинками можно назвать, копии дампа с консоли.


    ping


    rt94:~# ping -n -i 0.2 -s 512 -I eth0 ya.ru
    PING ya.ru (93.158.134.8) from 10.0.94.2 eth0: 512(540) bytes of data.
    520 bytes from 93.158.134.8: icmp_seq=1 ttl=59 time=17.5 ms
    520 bytes from 93.158.134.8: icmp_seq=2 ttl=59 time=15.0 ms
    520 bytes from 93.158.134.8: icmp_seq=3 ttl=59 time=14.7 ms
    3/3 packets, 0% loss, min/avg/ewma/max = 14.757/15.777/16.899/17.512 ms
    520 bytes from 93.158.134.8: icmp_seq=4 ttl=59 time=14.7 ms
    ^C


    Ключ -n означает, что надо выводить IP адреса вместо доменных имен, это полезно если пингуете по IP, тогда не будет тратится время на разрешение доменого имя, а еще, если DNS сервер не доступен это приведет к паузе в несколько секунд. Ключ -i задает интервал между отправкой пакетов, а -s размер пакета. Размер не может быть больше, чем MTU интерфейса. При помощи комбинации ключей -i и -s можно загрузить канал на любую ширину. -I задает имя интерфейса, через который будет отправлен пакет, полезно, если надо обойти таблицу маршрутизации. Чтобы вывести статистику, как я сделал я после третьего пакета, надо послать пингу сигнал SIGQUIT, с клавиатуры это делается Cntr+\

    traceroute


    rt94:~#traceroute -N 16 -q 1 -A ya.ru
    traceroute to ya.ru (77.88.21.8), 30 hops max, 60 byte packets
    1 10.94.171.1 (10.94.171.1) [AS65534] 1.402 ms
    2 1.32.108.213.hl.ru (213.108.32.1) [AS47333] 1.618 ms
    3 94.122.dsl.westcall.net (195.177.122.94) [AS20485/AS25408] 2.859 ms
    4 b0-152.mrouter.r.westcall.net (84.52.109.161) [AS25408] 3.021 ms
    5 GW-Yandex.retn.net (87.245.250.102) [AS9002] 3.266 ms
    6 aluminium-vlan901.yandex.net (77.88.56.111) [AS13238] 14.037 ms
    7 gallium-vlan901.yandex.net (77.88.56.126) [AS13238] 16.517 ms
    8 hummer-vlan2.yandex.net (87.250.228.136) [AS13238] 16.443 ms
    9 ya.ru (77.88.21.8) [AS13238] 15.809 ms


    traceroute показывает маршрут до удаленного хоста. По умолчанию он работает довольно медленно, так как опрашивает каждый роутер на пути пакета, по очереди и по три раза. Вы видите три времени ответа рядом с каждым хостом или три звездочки, если он не отвечает. Но traceroute можно ускорить. Ключ -N показывает сколько шагов пути пакета, они называются хопами, найти за 1 цикл, а -q количество запросов, которые будут отправлены к хосту. Ключ -A показывает номер автономной системы. Автономная система — блок IP сетей, выделенных одному оператору.

    mtr


    rt94:~#mtr ya.ru
    Приведет к такому экрану.
    image
    mtr это помесь пинга с трейсроутом. Наглядно видно, где проседает канал. В дебиан-образных дистрибутивах консольная версия ставится из пакета mtr-tiny

    tcpdump


    Иногда полезно глубже заглянуть, что же происходит в сети. Какие пакеты приходят и уходят. Например, чтобы удостовериться, что пакеты все таки уходят, а не блокируются фаерволом.

    Вот что происходит при команде

    %nslookup ya.ru

    В соседнем терминале запущен tcpdump
    %sudo tcpdump -ni eth1 udp and port 53 and host 10.0.1.1
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on eth1, link-type EN10MB (Ethernet), capture size 96 bytes
    13:09:39.038766 IP 10.94.171.10.41440 > 10.0.1.1.53: 24708+ A? ya.ru. (23)
    13:09:39.040403 IP 10.0.1.1.53 > 10.94.171.10.41440: 24708 3/2/0 A 77.88.21.8,[|domain]

    Расшифровываю вывод. С хоста 10.94.171.10 порт 41440 на 10.0.1.1 порт 53 пошел запрос А записи для адреса ya.ru. 53 порт это протокол DNS следующая строчка это ответ DNS сервера, по адресу 10.0.1.1
    Не смотря на название, tcpdump знает множество сетевых протоколов. Ключ -i показывает какой интерфейс будем слушать, -n не запрашивать имена в DNS для IP адресов. Дальше в командной строке идет описание какие именно пакеты мы будем отлавливать. Здесь я не буду описывать команды фильтрации — их множество, остановлюсь только на возможностях. И так можно выбирать с какого и на какой хост идет пакет, с какого и на какой порт и даже диапазон портов. Можно группировать фильтры при помощи скобок и логических слов and, or, not. Выбирать протоколы icmp, arp, tcp, udp подробности в мане.

    ngrep


    Несмотря на всю мощь иногда возможностей tcpdump не хватает, например посмотреть, что происходит внутри пакетов, особенно это актуально для текстовых протоколов, таких как smtp, imap, SIP и тд. Тут на помощь приходит ngrep.
    Например, чтобы отловить пакеты идущие с/или на порт 5060, в которых присутствует слово NOTIFY
    rt94:~#ngrep -W byline -d eth0 NOTIFY port 5060
    interface: eth0 (213.108.32.94/255.255.255.255)
    filter: (ip or ip6) and ( port 5060 )
    match: NOTIFY
    #
    U 213.108.33.128:5060 -> 85.114.2.44:5060
    NOTIFY sip:85.114.2.44 SIP/2.0.
    Via: SIP/2.0/UDP 192.168.1.2:5060;branch=z9hG4bK-2c32804.
    From: 8126221842 <sip:0090315@85.114.2.44>;tag=4751f3b994a4aca8o0.
    To: <sip:85.114.2.44>.
    Call-ID: a85b76bd-dc9f6574@192.168.1.2.
    CSeq: 22858 NOTIFY.
    Max-Forwards: 70.
    Event: keep-alive.
    User-Agent: Linksys/PAP2T-5.1.6(LS).
    Content-Length: 0.

    Ключ -W byline форматирует вывод по знакам переноса строки внутри пакета. Это очень удобно для почтовых протоколов или SIP, как в примере. Строка фильтра пакетов формируется так же, как и в tcpdump. Если не указывать какую подстроку ищем, то ngrep будет дампить все подходящие по условую пакеты. Если внутри пакета нет текстовой информации, тогда он обозначается решеткой (#)

    И несколько простых утилиток, про которые нужно знать, что они существуют.
    Как узнать, через какую запись в таблице маршрутизации пойдет трафик на IP адрес.

    rt94:~# ip route get 10.94.171.10
    10.94.171.10 dev eth1.173 src 10.94.171.1
    cache mtu 1500 advmss 1460 hoplimit 64


    Как посмотреть кто или что забивает канал?
    Для этого есть утилита iptraf c интерфейсом основанным на ncurses. При запуске без параметров выводит меню.
    Для того, чтобы посмотреть суммарную статистику по интерфейсу
    iptraf -d eth0
    image

    Для статистики по соединениям
    iptraf -i eth0
    image

    Например у вас есть VPN туннель. Как проверить его ширину? Самый простой способ это утилита iperf. На одном хосте запускаем ее с ключем -s это будет сервер, который повиснет по умолчанию на порт 5001. С другой стороны запускаем с единственным параметром — адресом нашего сервера.

    image

    mii-tool


    rt94:~# mii-tool eth0
    eth0: negotiated 100baseTx-FD flow-control, link ok

    Утилитка из пакета net-tools. Показывает скорость физлинка. При ее помощи можно выловить проблему, когда две сетевые карточки не могут автоматически договориться о скорости и в результате будет что-то типа 10 мбит полудуплекс. Редкая проблема, но до сих пор встречается.

    За рамками обзора остались nmap и hping. Жду в камментах ссылки на другие полезные программы. Может имеет смысл перенести в какой-нибудь подходящий блог?
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 15

      –10
      что-то прям сообщения по линуксу в последнее время прям поперли подряд :)
        +1
        Я бы добавил еще nload, iftop
        nload рисует график загрузки и некоторую статистику
        iftop рисует использование канала с статистикой по адресам юзеров. чемто похож на iptraf но не такой цветастый.
          +1
          Так же из полезняшек:
          ethtool, дает больше инфы чем mii-tool

          GAIN10J:/home/alex# mii-tool eth0
          eth0: no link
          GAIN10J:/home/alex# ethtool eth0
          Settings for eth0:
          Supported ports: [ TP MII ]
          Supported link modes: 10baseT/Half 10baseT/Full
          100baseT/Half 100baseT/Full
          1000baseT/Half 1000baseT/Full
          Supports auto-negotiation: Yes
          Advertised link modes: 10baseT/Half 10baseT/Full
          100baseT/Half 100baseT/Full
          Advertised auto-negotiation: Yes
          Speed: 10Mb/s
          Duplex: Half
          Port: MII
          PHYAD: 0
          Transceiver: internal
          Auto-negotiation: on
          Supports Wake-on: pumbg
          Wake-on: g
          Current message level: 0x00000033 (51)
          Link detected: no

          arp-scan — информация о «соседях в сети» получаемая посредством arp запросов.

          x# arp-scan -l -Iwlan0
          Interface: wlan0, datalink type: EN10MB (Ethernet)
          Starting arp-scan 1.6 with 256 hosts (http://www.nta-monitor.com/tools/arp-scan/)
          192.168.2.1 00:26:18:4c:ba:7f ASUSTek COMPUTER INC.
          192.168.2.5 00:21:91:1f:d9:48 D-Link Corporation
          192.168.2.50 00:21:04:f3:96:7b Gigaset Communications GmbH
          192.168.2.199 00:0c:29:af:27:ff VMware, Inc.
          192.168.2.201 00:0c:29:06:fb:9b VMware, Inc.
          192.168.2.202 00:0c:29:a7:e7:5a VMware, Inc.
          192.168.2.203 00:0c:29:39:58:46 VMware, Inc.
          192.168.2.204 00:0c:29:0b:4e:05 VMware, Inc.

          8 packets received by filter, 0 packets dropped by kernel
          Ending arp-scan 1.6: 256 hosts scanned in 1.679 seconds (152.47 hosts/sec). 8 responded
            +1
            Еще вспомнился dchdump, простая надстройка над tcpdump'ом. Помогает в случае анализа некоректной работы DHCP сервера со всякими опциями типа Option 82.

            dhcpdump -i eth0

            TIME: 2010-03-14 17:37:31.362
            IP: 10.0.13.95 (0:24:1d:83:d9:78) > 255.255.255.255 (ff:ff:ff:ff:ff:ff)
            OP: 1 (BOOTPREQUEST)
            HTYPE: 1 (Ethernet)
            HLEN: 6
            HOPS: 0
            XID: a8a39dfc
            SECS: 0
            FLAGS: 0
            CIADDR: 10.0.13.95
            YIADDR: 0.0.0.0
            SIADDR: 0.0.0.0
            GIADDR: 0.0.0.0
            CHADDR: 00:24:1d:83:d9:78:00:00:00:00:00:00:00:00:00:00
            SNAME:.
            FNAME:.
            OPTION: 53 ( 1) DHCP message type 8 (DHCPINFORM)
            OPTION: 61 ( 7) Client-identifier 01:00:24:1d:83:d9:78
            OPTION: 12 ( 15) Host name 3a77e416c16a443
            OPTION: 60 ( 8) Vendor class identifier MSFT 5.0
            OPTION: 55 ( 13) Parameter Request List 1 (Subnet mask)
            15 (Domainname)
            3 (Routers)
            6 (DNS server)
            44 (NetBIOS name server)
            46 (NetBIOS node type)
            47 (NetBIOS scope)
            31 (Perform router discovery)
            33 (Static route)
            249 (MSFT — Classless route)
            43 (Vendor specific info)
            252 (MSFT — WinSock Proxy Auto Detect)
            12 (Host name)

            OPTION: 43 ( 3) Vendor specific info dc0100…
            — ^C
        • UFO just landed and posted this here
            +3
            arping тоже иногда полезен.
              –3
              Спасибо, в избранное :)
                +1
                хорошая подборка.
                я бы добавил еще такие утилиты как iftop и nethogs — есть в любом дистрибутиве и так же очень помогают выяснить, кто и чем грузит канал.
                  0
                  darkstat — удобная статистика по сетевому трафику, что то похожее на iptraf, только работающее демоном, а просмотр статистики через веб-интерфейс. Как-то пользовался ей, чтобы определить, откуда такое большой трафик на сервере.
                    0
                    Напоминает облегченный ntop.
                      0
                      Да, только ntop был слишком навороченный для моих задач, а этот в самый раз =)
                    0
                    размер пинга может быть сильно больше MTU, просто иногда кто-нибудь не сильно хороший запрещает фрагментацию пакетов

                    ping -s 10000 -c 1 ya.ru
                    PING ya.ru (77.88.21.8) 10000(10028) bytes of data.
                    10008 bytes from ya.ru (77.88.21.8): icmp_seq=1 ttl=54 time=42.5 ms

                    — ya.ru ping statistics — 1 packets transmitted, 1 received, 0% packet loss, time 0ms
                    rtt min/avg/max/mdev = 42.556/42.556/42.556/0.000 ms
                      0
                      ну и есть прекрасная утилита wireshark для любителей GUI
                        +1
                        C не менее прекрасным консольным дополнением tshark :)
                        Удобно записать дамп им, а потом уже у себя в гуе все разобрать.
                        +2
                        kismet — для отладки WiFi-сетей. особенно незаменима при конфигурации сложных мостов\перекрывающихся частот. Если прикрутить GPS — можно вообще карту покрытия рисовать.

                        Only users with full accounts can post comments. Log in, please.