Эмуляция сетевых проблем с помощью WANem

    Картинка для привлечения внимания Недавно один из заказчиков TestLab² пожелал узнать, как будет работать его инсталлятор (с закачкой всякого на лету) на разных каналах. Внезапно первые подходы показали, что нам везет и обычные edge, umts и wimax-каналы (не говоря о проводных) в нашей округе как-то уж очень хорошо работают.
    Чтобы создать тяжелые условия мы нашли и применили специализированный инструмент WANem, о котором я расскажу под катом.

    Что такое WANem?

    Это дистрибутив на основе knoppix, который позволяет эмулировать различные условия сетевого подключения клиентов. В первую очередь, это полезно для тестирования и отладки приложений, которым предстоит работать в не-пойми-каких условиях без физического погружения в эти самые условия.
    Правила для работы можно создавать как вручную, так и через более-менее удобный web-интерфейс.

    Как применять WANem?

    Взять любую систему виртуализации и загрузить в ней LiveCD. Или, если вы используете решения VMWare — скачать готовую виртуальную машину. В дальнейшем я буду исходить из загрузки с LiveCD.

    Подготовка WANem

    1. Создаем новую виртуальную машину (1core/256ram будет вполне достаточно), указываем источником загрузки LiveCD
    2. Подтверждаем загрузку с LiveCD
    3. Подтверждаем конфигурацию всех сетевых интерфейсов через DHCP (или отказываемся, и позже указываем IP вручную)
    4. Стартовый скрипт создает юзера perc и спрашивает, какой пароль ему установить (ssh разрешен по умолчанию)
    5. Указав пароль, мы можем подключиться к SSH
    6. Мы попадаем в интерфейс командной строки WANem. Начнем с простой команды help, которая выведет список всех доступных команд с их кратким описанием
      • help — вывод помощи
      • about — вывод версии и копирайтов
      • clear — очистка экрана
      • reset — сброс сетевых настроек и перезапуск сервисов
      • shutdown — выключение системы
      • restart — перезапуск системы
      • status — вывод текущего статуса системы (IP-адреса, маршруты, состояния сервисов)
      • wanemreset — сброс правил самого WANem (если вы там намудрили злого и доступ к web-интерфейсу плохо работает)
      • assign — указать IP-адрес вручную (если ранее отказались от DHCP)
      • quit — выйти из консоли WANem

    базовая настройка wanem 3Открываем в браузере http://IP виртуалки/WANem/ и видим интерфейс для управления. Из меню доступны:
    • WANalyzer — простое средство проверки параметров и свойств соединения, выдающее вот такие результаты
    • Basic Mode — простой режим настроек эмуляции, позволяющий ограничить пропускную способность и добавить задержку обработки пакетов в миллисекундах
    • Advanced Mode — расширенный режим настроек эмуляции, позволяющий указывать не только более детальные настройки, но и их временное распределение, что приближает эмуляцию еще на шаг ближе к реальности.
    • Save/Restore — сохранение текущих настроек в локальный файл профиля для повторного использования (пример формата)

    Проверка работоспособности

    базовая настройка wanem 3 Внутри себя WANem оперирует правилами, которые можно задавать явно в Advanced Mode, или по-простому выбирать из доступных в Basic Mode. Самый простой сценарий применения — включить режим, скажем ISDN 128 Kbps и задержку в 500 миллисекунд. После сохранения этих настроек нужно скомандовать машине, на которой установлено тестовое приложение, направлять весь свой трафик через WANem.
    • Windows: route add 0.0.0.0 mask 0.0.0.0 WANemIPaddress
    • Debian: route add default gw WANemIPaddress eth0
    • Всякие другие ОС: http://tinyurl.com/4yovdph

    После этого нехитрого действия достаточно сделать traceroute от тестовой машины до внешнего мира и убедиться, что первый хоп — это IP виртуалки с WANem и что задержка пакетов ±совпадает с заданной в настройках.

    Тонкая настройка

    Тонкая настройка wanem 4 Убедившись с помощью Basic Mode, что наша тестовая станция заворачивает весь сетевой трафик через эмулятор, можно переходить к более тонкой настройке. В первую очередь, стоит обратить внимание на обширные настройки случайного распределения задержек, ошибок и патерь покетов потерь пакетов. Очередной небольшой шажок к реалистичности эмуляции.
    Заранее расшифрую самые непонятные опции:
    • MTTF — среднее время до возникновения ошибки
    • MTTR — среднее время до восстановления после ошибки
    • Jitter — в контексте IP-сетей термин детально раскрыт в RFC 3393, а вкратце — это разница (в миллисекундах) между задержкой доставки пары пакетов

    Например можно задать параметры пропадания и восстановления связи, можно сэмулировать наличие соединения но непрохождение пакетов с данными, потерю или повреждение % пакетов.
    При необходимости WANem может работать с несколькими сетевыми интерфейсами одновременно (создавая для них разные правила), что позволяет реализовать самую изощренную сетевую конфигурацию.

    Альтернативы WANem

    Мне известен платный продукт для Windows, под названием SoftPerfect Connection Emulator ($99/$149).
    UPD: Для OS X goshakkk_reborn рекомендует Network Link Conditioner из XCode.
    UPD: Для Windows x1shn1k подсказал также TMnetSim Network Simulator (freeware, есть версии ×32 и ×64)

    Выводы

    Отличный, достаточно простой и эффективный инструмент. Мне лично немного не хватает логирования на стороне WANem, но подозреваю, что это решается third-party утилитами, с которыми еще предстоит разобраться.

    Вот пара примеров профилей, которые мы использовали для тестов: CDMA EV-DO rev.A, EDGE.

    Официальный сайт: wanem.sourceforge.net, дистрибутив ~400мб
    Последняя версия: 2.3, 15.03.2011
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 20

    • UFO just landed and posted this here
        +6
        На OS X можно попробывать Network Link Conditioner, который идет вместе с Xcode image
        image
          +1
          Добавил в статью, спасибо!
            +1
            Вот таких профилей предустановленных у WanEm очень не хватает. Думали сами наделать библиотеку, но времени не хватило. Отличная идея.
              0
              О! Спасиб! Не знал о такой штуке. Оч пригодится.
                0
                Что-то я, правда, не нашел такой у себя. Это какой XCode надо ставить?
                  +1
                  Xcode 4.2, а потом зайти в папку /Developer-4.2/Applications/Utilities/Network Link Conditioner
                    0
                    Хотя нет, можно и с 4.1 — /Developer/Applications/Utilities/Network Link Conditioner
                      0
                      в спотлайте легче написать:)
                      с 4.2 ок
                        0
                        А я пишу в терминале open /D/A/U/N[tab][tab] по старинке :)
                        0
                        Видимо у меня старый XCode. Спасибо. Обновлюсь.
                    +2
                    Windows: route add * mask 255.255.255.255 WANemIPaddress


                    Простите, но работать это не будет никогда.
                    Должно быть так:
                    route add 0.0.0.0 mask 0.0.0.0 WANemIPaddress
                      +1
                      Сделали правку, спасибо!
                      +1
                      У меня в закладках еще такая штука завалялась TMnetSim Network Simulator – Simulate network latency and packet loss
                        +1
                        Добавил в пост, спасибо.
                        0
                        Мы его тоже используем.В принципе все можно докрутить.
                          0
                          Кому-то и сойдёт вариант попроще: FreeBSD с ipfw+dummynet позволяет эмулировать задержки, потери и медленные каналы.
                          А извратившись, можно сделать такие параметры динамическими.
                            +1
                            В принципе это дело реализуемо netem, который уже не первый день линухом поддерживается, правда, проще взять готовый ISO/образ, а не собирать бридж руками.
                              +1
                              Судя по инфе на сайте netem и формату правил WANem — там внутри именно он и используется.
                              +1
                              А для контролируемых «обрывов» HTTP рекомендую mitmproxy

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