Различия между версиями 7 и 8
Версия 7 от 2014-04-27 19:32:07
Размер: 8826
Редактор: FrBrGeorge
Комментарий:
Версия 8 от 2014-04-27 21:37:28
Размер: 13410
Редактор: FrBrGeorge
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 7: Строка 7:

== Имитация сети ==
=== FreeBSD dummynet ===
 * [[http://info.iet.unipi.it/~luigi/dummynet/|на сайте автора, Луиджи Риццо]]
 * [[BSDman:ipfw|в документации по ipfw]] (раздел «TRAFFIC SHAPER (DUMMYNET) CONFIGURATION»)
<!> '''TODO'''
Строка 38: Строка 31:
== Сетевой мост и ipfw ==
== Имитация сети ==
[[https://cloud.mail.ru/public/742a237de7f6/FW|образы виртуальных машин с Linux и FreeBSD ]] в каталогах `ALC703EFW` и `FWE-BSD` соответственно. У каждой машины 3 сетевых интерфейса:
 * типа «NAT» — для доступа по ssh из хост-системы (посмотрите, какой порт пробрасывается)
 * 2 «внутренних» (сеть «intnet» и «intnet2»), собранных в мост
=== FreeBSD dummynet ===
 * [[http://info.iet.unipi.it/~luigi/dummynet/|на сайте автора, Луиджи Риццо]]
 * [[BSDman:ipfw|в документации по 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 ===
Базовая статья: [[http://www.linuxfoundation.org/collaborate/workgroups/networking/netem|NETEM By Linux Foundation]] и [[http://man7.org/linux/man-pages/man8/tc-netem.8.html|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
}}}

Пример использования ''нескольких'' настроек в [[Alt: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) ==
Строка 109: Строка 213:

------
<!> '''TODO'''
{{{
root@host-15 ~ # grep -r "." /etc/net/ifaces/enp0s*
/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

}}}

{{{
[root@fwe-bsd ~]# cat /etc/rc.conf
hostname="fwe-bsd.fw.cs.msu.su"
ifconfig_em0="dhcp"
#defaultrouter="10.0.2.1"
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"
[root@fwe-bsd ~]# cat /etc/rc.ebridge
#export $PATH="/bin:/sbin"
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 deny ip from any to 127.0.0.0/8
add deny ip from 127.0.0.0/8 to any
add deny ip from any to ::1
add deny ip from ::1 to any
add allow ip from any to any
}}}

МЭ на интерфейсном уровне

Задачи МЭ на интерфейсном уровне:

  • Работа непосредственно с фреймами (фильтрация, перенаправление и отслеживание 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

Linux

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 — пример того, что должно быть реализовано помимо простого перебрасывания фреймов из интерфейса в интерфейс. Задача: если топология сетевых устройств имеет циклы, избавиться от них.

  1. Все главные (рассылка оповещений-фреймов с ID)
  2. Если принятое оповещение главнее, пересылка его вместо своего (с добавлением также и собственного ID и стоимости пересылки)
  3. Остаётся один главный
  4. Если оповещение принято из нескольких интерфейсов, все более дорогие интерфейсы деактивируются

Алгоритм неидеальный, имеется множество неидеальных же модификаций (см.).

Имитация сети

образы виртуальных машин с Linux и FreeBSD в каталогах ALC703EFW и FWE-BSD соответственно. У каждой машины 3 сетевых интерфейса:

  • типа «NAT» — для доступа по ssh из хост-системы (посмотрите, какой порт пробрасывается)
  • 2 «внутренних» (сеть «intnet» и «intnet2»), собранных в мост

FreeBSD dummynet

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 bridge2c.png

  • Пакет попадает в ebtables, если он пришёл или уходит через коммутируемый интерфейс

  • Пакет покидает ebtables, если его нужно обработать уровнем выше

  • Маршрутизация (routing) vs. коммутация (bridging) ⇒ цепочка BROUTE
    • DROP в BROUTE означает только выкидывание из ebtables и передачу на уровень IP

Обратите внимание, что уровнем выше может быть IPTables (а не просто «application», как на схеме)

  • Подобно netfilter, ebtables состоит из цепочек и таблиц (путаница та же самая :) )

Возможности 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 для подмены адресов

LecturesCMC/UnixFirewalls2014/10_EthernetFirewall (последним исправлял пользователь FrBrGeorge 2014-04-27 21:39:32)