Как симулировать плохую сеть под Linux, macOS и Windows

image-loader.svg
Clumsy 0.2

Все распределённые системы — базы данных, мобильные приложения, корпративные SaaS и так далее — следует разрабатывать с учётом сбоев. Например, компания Stripe во время тестов убивала случайные инстансы — и смотрела, что произойдёт. Компания Netflix рандомно уничтожала инстансы прямо в продакшне с помощью программы Chaos Monkey (проект Simian Army).

Симуляция сбоев — необходимое средство тестирования. Проблема в том, что ситуации не делятся только на чёрное и белое, Есть огромная «серая» зона, где сбои явно не выражены, а проявляются в плохих условиях сети: ненадёжное соединение, узкий канал, потери пакетов, высокая задержка, дубликаты пакетов и так далее.
Другими словами, система должна быть устойчива не только к сбоям, но и к враждебным окружающим условиям — плохой сети. Специально для таких тестов был разработан симулятор Comcast1, представляющий удобную «обёртку» вокруг стандартных системных инструментов типа iptables и tc.

Инструмент работает путём упаковки некоторых системных инструментов в переносимый «контейнер». В системах семейства BSD, таких как mac OS, для «инъекции сбоя» используются ipfw и pfctl. В Linux — iptables и tc.

В любом случае, поддерживается несколько параметров: устройство, задержка, целевая/дефолтная пропускная способность, потеря пакетов, протокол и номер порта.

Например, такая команда…

$ comcast --device=eth0 --latency=250 --target-bw=1000 --default-bw=1000000 --packet-loss=10% --target-addr=8.8.8.8,10.0.0.0/24 --target-proto=tcp,udp,icmp --target-port=80,22,1000:2000


… добавит 250 мс задержки, ограничит пропускную способность до 1 Мбит/с и отбросит 10% пакетов на указанные адреса по указанным протоколам на указанных портах. Ограничение 1 Мбит/с действует для всего исходящего трафика.

В принципе, соответствующие команды можно запускать и без помощи comcast, а напрямую через iptables или tc.

Например, дропнуть 10% входящих и исходящих пакетов с помощью iptables в Linux:

$ iptables -A INPUT -m statistic --mode random --probability 0.1 -j DROP
$ iptables -A OUTPUT -m statistic --mode random --probability 0.1 -j DROP


В tc ещё больше параметров:

$ tc qdisc add dev eth0 root netem delay 50ms 20ms distribution normal
$ tc qdisc change dev eth0 root netem reorder 0.02 duplicate 0.05 corrupt 0.01


Comcast поддерживает следующие сетевые профили:
Как видим, разработчик уже добавил в профили Starlink с задержкой 20 мс и потерей пакетов 2,5%. Судя по всему, размер пинга взят из планов Илона Маска на будущее. В реальности же пока средние параметры по итогам практического опыта использования Starlink выглядят иначе:

afrtfs-oycfgndc2q8qcnupntzu.jpeg

image-loader.svg

image-loader.svg

Уникальность проекта Starlink состоит именно в том, что используется большое количество не стационарных, а низкоорбитальных спутников, чтобы гарантировать минимальную задержку, сравнимую с наземными каналами.

Естественно, профили Comcast можно редактировать или добавлять.

Разработчик Comcast допускает поддержку Windows через wipfw или встроенный сетевой стек. Но вообще под Windows уже есть похожие симуляторы. Например, программа clumsy на КДПВ, которая для работы задействует библиотеку WinDivert (Windows Packet Divert).

В браузере Google Chrome тоже частично реализована такая функциональность. Этот режим работы (Device Mode) можно включить в инструментах разработчика (F12), нажав сочетание клавиш Ctrl + Shift + M или кликнув соответствующую иконку в левом верхнем углу панели инструментов разработчика. Но здесь всего три варианта симуляции слабого железа и мобильного интернета.

image-loader.svg

Для macOS есть продвинутый инструмент под названием Network Link Conditioner, который можно найти в пакете «Additional Tools for Xcode» или скачать со страницы для разработчиков (Additional Tools).

image-loader.svg

Здесь тоже изменяются стандартные параметры сети: полоса (аплинк и даунлинк), задержка и уровень потери пакетов.

В наличии следующие профили:

  • 100% потеря пакетов
  • 3G
  • DSL
  • EDGE
  • Большая задержка DNS
  • LTE
  • Очень плохая сеть
  • WiFi
  • WiFi 802.11ac


Или и создаём собственный профиль с произвольными параметрами:

image-loader.svg

Более того, Network Link Conditioner реализован в iOS, если подключить гаджет к персональному компьютеру и активировать настройки для разработчиков через Xcode (Window — Devices & Simulators — «Use for Development»).

image-loader.svg

Наверняка это не полный список симуляторов плохой сети. Пользователи Comcast в шутку предлагают реализовать ряд патологических состояний, которые встречаются у коммерческих провайдеров и в корпоративных сетях: несколько уровней NAT со странными настройками, заблокированные случайные порты, странные сетевые «оптимизации», очень медленные ответы DNS и так далее.

1 Примечание. Comcast — крупнейший в США оператор кабельного телевидения и широкополосного доступа в интернет. [вернуться]

© Habrahabr.ru