Мониторинг (измерение) потребляемого траффика в Linux

    Однажды мне потребовалось измерить количество трафика, которое «пожирает» некоторое приложение. Один из способов такого измерения — это установить прокси. Но что, если не хочется ставить прокси-сервер?.. Мне вот не хотелось. В поисках других способов я сначала перерыл Хабр, потом интернет. Так как я в своё время потратил на это много времени, то сейчас я создаю эту заметку, чтобы у других такой проблемы не возникло.

    ВАЖНО:
    Этот метод работает, если мы знаем по какому адресу (адресам) обращается наше приложение, или же с какого/каких портов.

    Пошаговая инструкция


    1. iptraf

    iptraf — это небольшая программа, которая умеет мониторить всю сетевую активность компьютера.
    Исходники и бинарники можно загрузить с сайта iptraf.

    В случае Ubuntu установить iptraf можно выполнив команду:
    sudo apt-get install iptraf

    2. Запускаем!

    В терминале пишем: iptraf


    3. Настраиваем

    Надо включить логирование (иначе программа ограничиться выводом на экран). Делается это, очевидно, в разделе «Configure».


    4. Запуск мониторинга

    Уходим из настроек, жмём «IP traffic monitor» и выбираем путь к файлу, куда будем логировать сетевую активность.


    После этого мы должны увидеть такую картину:


    Это всё, что нужно! Почти.

    5. Анализ

    Как я уже упоминал выше, нужно знать, по какому адресу/порту обращается наше приложение (трафик которого мы высчитываем).
    Например, если мы хотим посчитать сколько трафика «стоит» час радио last.fm, мы должны определить следующее:
    приложение last.fm обращается к адресам вроде таких:
    195.24.* (last.fm не обращается к одному адресу, а обращается к диапазону адресов).
    Чтобы вытащить из лога (который писался час) количество трафика, которое было съедено, я написал небольшую «программку» на java, которая этот трафик и считает:

    package stat;
    
    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.IOException;
    
    /**
     *
     * @author http://habrahabr.ru/users/nucleotide/
     */
    public class Main {
    
        public static void main(String[] args) throws IOException {
            BufferedReader reader = new BufferedReader(new FileReader("/var/log/iptraf/ip_traffic"));
            String line;
            long count = 0;
            long traffic = 0;
            while ((line = reader.readLine()) != null) {
                count++;
                String s[] = line.split(" ");
                if (s.length < 12) {
                    continue;
                }
                if (s[10].contains("195.24.") || s[12].contains("195.24."))  {   //"from" and "to"
                    traffic += new Long(s[7]);
                         if(s.length>16) traffic += new Long(s[17]);
                }
            }
            System.out.println("Count: " + count + "  lines");
            System.out.println("Total: " + traffic + "  bytes!");
            System.out.println("Total: " + traffic / 1024 + "  Kbytes!");
            System.out.println("Total: " + traffic / (1024 * 1024) + "  Mbytes!");
        }
    }
    
    


    Этот вариант хорошо работает, когда вы постоянно пишите логи, а потом уже надо «что-то там» измерить. Просто нужно написать/сконфигурировать парсер именно так, как необходимо в конкретной ситуации, и тогда можно получить все необходимые данные.

    Возможно, это не лучший вариант (хоть и работающий). Есть множество других вариантов:
    http://help.ubuntu.ru/...
    http://iptraf.seul.org/2.7/filters.html
    И так далее.
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 11

      +21
      Обычно можно сделать это без всяких излишеств (свои ограничения, конечно же, присутствуют):

      iptables -A OUTPUT -p tcp -m owner --uid-owner username -j CONNMARK --set-mark 1
      iptables -A INPUT -m connmark --mark 1 -j LOG
      iptables -A OUTPUT -m connmark --mark 1 -j LOG
        +2
        Букоффффка заедает?
          +7
          все делается намноого проще и, что главное, — эффективнее:

          ставится netflow сенсор для iptables(к примеру) — fprobe-ulogd и все это дело одним правилом сливается в коллектор (например flow-tools), откуда заливается в mysql — и делай с ним что хочешь :)
            +1
            Сам использую iptraf для выявления тех, кто забил весь канал в офисе :)
              +2
              Еще есть NetHogs — аналог top для сетевого трафика.
                +2
                можно заюзать nload, визуально он приятнее чем iptraf
                  +1
                  если б к nload'у добавить отображение что и куда лезет то было бы очень здорово
                  +1
                  Мне обычно интереснее узнать что происходит с сетью в настоящий момент. Для этого использую iftop. Может кому-то пригодится.
                    0
                    Есть еще такая вещь как darkstat (рисует графики в веб)
                      0
                      #iftop -i eth0
                      чем ненравится?
                        0
                        за это я темы "… для начинающих" и люблю — интересен не столько сам материал, сколько различные точки зрения в камментах на то, где стоит покопать ;)

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