МЭ на интерфейсном уровне
Задачи МЭ на интерфейсном уровне:
- Работа непосредственно с фреймами (фильтрация, перенаправление и отслеживание MAC-адресов и их полей)
- Обработка (по возможности) TCP/IP-трафика в сетевых мостах (bridge)
- Ограничение трафика и имитация свойств «настоящей» сети
- Работа на стыке интерфейсного и сетевого уровней (например, ARP)
Сетевой мост (bridge)
FreeBSD (возможна также настройка в /etc/rc.conf):
# ifconfig bridge0 create # ifconfig bridge0 addm fxp0 stp fxp0 addm fxp1 stp fxp1 # ifconfig fxp0 bridge0 192.0.2.10 netmask 255.255.255.0
root@mbb-1:~ # brctl addbr mybridge root@mbb-1:~ # brctl addif mybridge eth0 root@mbb-1:~ # brctl addif mybridge eth1 root@mbb-1:~ # ip addr add dev mybridge 192.168.100.5/24
Spanning Tree Protocol (STP)
Spanning Tree Protocol — пример того, что должно быть реализовано помимо простого перебрасывания фреймов из интерфейса в интерфейс. Задача: если топология сетевых устройств имеет циклы, избавиться от них.
- Все главные (рассылка оповещений-фреймов с ID)
- Если принятое оповещение главнее, пересылка его вместо своего (с добавлением также и собственного ID и стоимости пересылки)
- Остаётся один главный
- Если оповещение принято из нескольких интерфейсов, все более дорогие интерфейсы деактивируются
Алгоритм неидеальный, имеется множество неидеальных же модификаций (см.).
Имитация сети
образы виртуальных машин с Linux и FreeBSD в каталогах ALC703EFW и FWE-BSD соответственно. У каждой машины 3 сетевых интерфейса:
- типа «NAT» — для доступа по ssh из хост-системы (посмотрите, какой порт пробрасывается)
- 2 «внутренних» (сеть «intnet» и «intnet2»), собранных в мост
FreeBSD dummynet
в документации по ipfw (раздел «TRAFFIC SHAPER (DUMMYNET) CONFIGURATION»)
Dummynet поддерживает абстрактные очереди и планировщики, но нас интересует «pipe» — имитация подключения к среде передачи данных заданной паршивости. Часть ipfw.
Пример: Файл /etc/rc.conf:
[root@fwe-bsd ~]# cat /etc/rc.conf hostname="fwe-bsd.fw.cs.msu.su" ifconfig_em0="dhcp" dumpdev="NO" sshd_enable="YES" cloned_interfaces="bridge0" ifconfig_bridge0="addm le0 addm le1 up" ifconfig_le0="up" ifconfig_le1="up" firewall_enable="YES" firewall_type="/etc/rc.ebridge" dummynet_enable="YES"
Файл /etc/rc.ebridge:
pipe 1 config bw 10Mbit/s add pipe 1 ip from any to any via le* layer2 add allow ip from any to any via em0 layer2 add allow ip from any to any via lo0 add allow ip from any to any
Linux TC netem
Базовая статья: NETEM By Linux Foundation и tc-netem manual page
Network Emulator — модуль tc qdisc, привязывается непосредственно к интерфейсу (на выходе пакета).
Пример (если root-очередь в tc не указана, по умолчанию — pfifo_fast):
root@host-15 ~ # tc -s qdisc show dev enp0s8 qdisc pfifo_fast 0: root refcnt 2 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1 Sent 1156 bytes 14 pkt (dropped 0, overlimits 0 requeues 1) backlog 0b 0p requeues 1 root@host-15 ~ # tc qdisc add dev enp0s8 root netem rate 256kbit delay 100ms root@host-15 ~ # tc -s qdisc show dev enp0s8 qdisc netem 8001: root refcnt 2 limit 1000 delay 100.0ms rate 256000bit Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) backlog 0b 0p requeues 0
Пример использования нескольких настроек в Etcnet. Конфигурационные файлы:
root@host-15 ~ # grep -r . /etc/net/ifaces/[be]* /etc/net/ifaces/bridge/options:TYPE=bri /etc/net/ifaces/bridge/options:HOST='enp0s8 enp0s9' /etc/net/ifaces/enp0s3/options:BOOTPROTO=dhcp /etc/net/ifaces/enp0s3/options:TYPE=eth /etc/net/ifaces/enp0s3/options:CONFIG_WIRELESS=no /etc/net/ifaces/enp0s3/options:CONFIG_IPV4=yes /etc/net/ifaces/enp0s8/options:TYPE=eth /etc/net/ifaces/enp0s8/qos/1/qdisc#delay:netem delay 0.5ms loss 0.05% 25% corrupt 0.05% /etc/net/ifaces/enp0s8/qos/1/qdisc#loss:netem loss 0.33% 25% corrupt 0.33% /etc/net/ifaces/enp0s8/qos/1/qdisc#rate:netem loss 0.05% 25% corrupt 0.05% rate 10mbit /etc/net/ifaces/enp0s8/qos/1/qdisc#LOSS:netem loss 5% 10% corrupt 5% /etc/net/ifaces/enp0s8/qos/1/qdisc:pfifo_fast /etc/net/ifaces/enp0s9/options:TYPE=eth /etc/net/ifaces/enp0s9/qos/1/qdisc:pfifo_fast /etc/net/ifaces/enp0s9/qos/1/qdisc#delay:netem delay 0.5ms loss 0.05% 25% corrupt 0.05% /etc/net/ifaces/enp0s9/qos/1/qdisc#loss:netem loss 0.33% 25% corrupt 0.33% /etc/net/ifaces/enp0s9/qos/1/qdisc#LOSS:netem loss 5% 10% corrupt 5% /etc/net/ifaces/enp0s9/qos/1/qdisc#rate:netem loss 0.05% 25% corrupt 0.05% rate 10mbit
Пояснение. Общая задача стенда — имитировать «плохую» сеть между enp0s9 и enp0s8 различной степени паршивости. Для этого на их выход вешается netem.
alt:Etcnet включает в себя понятие «профиль»: при перезапуске сети вида service network restartwith профиль будут использованы настроечные файлы с именами вида файл#профиль, и только если соответствующего файла нет — файл:
root@host-15 ~ # service network restart . . . root@host-15 ~ # tc -s qdisc show dev enp0s8 qdisc pfifo_fast 0: root refcnt 2 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1 . . . root@host-15 ~ # service network restartwith loss . . . root@host-15 ~ # tc -s qdisc show dev enp0s8 qdisc netem 1: root refcnt 2 limit 1000 loss 0.33% 25% corrupt 0.33% . . . root@host-15 ~ # service network restartwith rate . . . root@host-15 ~ # tc -s qdisc show dev enp0s8 qdisc netem 1: root refcnt 2 limit 1000 loss 0.05% 25% corrupt 0.05% rate 10000Kbit
Основные возможности dummynet и netem
Возможность |
dummynet |
netem |
пропускная способность |
bw |
rate (+подсчёт размера пакета по изменённым правилам) |
задержка |
delay (+profile: задание нескольких причин задержки со своими вероятностями и продолжительностью) |
delay (+неточная, +корреляция) |
потеря |
plr |
loss (+различные алгоритмы: цепи Маркова и т. д.) |
порча, удвоение, переупорядочивание |
нет |
corrupt, duplicate, reorder (+алгоритмы переупорядочивания) |
допустимый стартовый всплеск |
burst |
нет |
… |
… |
… |
Сетевой мост и МЭ уровня TCP/IP (ipfw)
Базовая статья: Filtering Bridges Включение (обратите внимание на «прозрачную» коммутацию в ядре вместо создания виртуального сетевого интерфейса типа if_bridge):
# sysctl net.link.ether.bridge.config=fxp0:0,xl0:0 # sysctl net.link.ether.bridge.ipfw=1 # sysctl net.link.ether.bridge.enable=1
Фрагмент правил МЭ ipfw (xl0 смотрит «внутрь», fxp0 — наружу, но всё равно обслуживается единый сегмент локальной сети):
# Outbound add pass tcp from any to any in via xl0 setup keep-state add pass udp from any to any in via xl0 keep-state add pass ip from any to any in via xl0 # Local traffic (my IP is 1.2.3.4) add pass tcp from 1.2.3.4 to any setup keep-state add pass udp from 1.2.3.4 to any keep-state add pass ip from 1.2.3.4 to any # Inbound ssh add pass tcp from any to any 22 in via fxp0 setup keep-state # Inbound SMTP add pass tcp from any to relay 25 in via fxp0 setup keep-state # Inbound DNS add pass tcp from 193.205.245.8 to ns 53 in via fxp0 setup keep-state add pass udp from any to ns 53 in via fxp0 keep-state # Inbound icmp add pass icmp from any to any # Inbound Ephemeral port (IANA standard only) add pass tcp from any to any 49152-65535 in via fxp0 setup keep-state add pass udp from any to any 49152-65535 in via fxp0 keep-state
Пояснения:
- Пакеты, отправляемые с самой машины, надо разрешать отдельно (т. к. они не «получены» ни откуда)
Волшебные слова relay и ns заработают только если уже работает DNS (это поля MX и NS нашего домена)
Далеко не всю информацию можно вынуть из потока фреймов, на всякий случай входящий транспортный трафик на временные порты сразу разрешён
МЭ интерфейсного уровня в Linux: ebtables
Базовая статья: ebtables/iptables interaction on a Linux-based bridge
Пакет попадает в ebtables, если он пришёл или уходит через коммутируемый интерфейс
Пакет покидает ebtables, если его нужно обработать уровнем выше
- Маршрутизация (routing) vs. коммутация (bridging) ⇒ цепочка BROUTE
DROP в BROUTE означает только выкидывание из ebtables и передачу на уровень IP
Обратите внимание, что уровнем выше может быть IPTables (а не просто «application», как на схеме)
Подобно netfilter, ebtables состоит из цепочек и таблиц (путаница та же самая )
- Фильтр по полям фрейма:
- mac-адреса интерфейсов (отправителя, входящий и выходящий на мосту, получателя), в т. ч. т. н. Bridge Group Addres
- по полю «протокол» (фрейма!)
- …
- Фильтры-модули:
поля arp
поля ip (включая порты транспортного уровня!)
ограничитель limit
классификатор mark
поля stp
vlan
- …
Действия-модули (параметры для "-J")
arpreply — порождение произвольного ARP-ответа
snat/dnat — подмена MAC-адресов
mark — маркировка пакета
redirect — «тупая» подмена MAC-адреса
Linux arptables
Базовая статья: ARPTABLES manual page
Структура:
- три цепочки: INPUT, OUTPUT, FORWARD
- одна таблица: filter
- фильтры по полям arp (К. О. гарантирует это)
дополниетльный модуль mangle для подмены адресов