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

== Имитация сети ==
=== FreeBSD dummynet ===
 * [[http://info.iet.unipi.it/~luigi/dummynet/|на сайте автора, Луиджи Риццо]]
 * [[BSDman:ipfw|в документации по ipfw]] (раздел «TRAFFIC SHAPER (DUMMYNET) CONFIGURATION»)
<!> '''TODO'''
Строка 73: Строка 79:
  * DROP в BROUTE означает ''только выкидывание из ebtables'' и передачу на уровень IP
Строка 94: Строка 101:
== Linux arptables ==
Базовая статья: [[http://ebtables.sourceforge.net/misc/arptables-man.html|ARPTABLES manual page]]

Структура:
 * три цепочки: INPUT, OUTPUT, FORWARD
 * одна таблица: filter
 * фильтры по полям arp (К. О. гарантирует это)
 * доаолниетльный модуль `mangle` для подмены адресов

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

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

  • Работа непосредственно с фреймами (фильтрация, перенаправление и отслеживание MAC-адресов и их полей)
  • Обработка (по возможности) TCP/IP-трафика в сетевых мостах (bridge)
  • Ограничение трафика и имитация свойств «настоящей» сети
  • Работа на стыке интерфейсного и сетевого уровней (например, ARP)

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

FreeBSD dummynet

<!> TODO

Сетевой мост (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. Если оповещение принято из нескольких интерфейсов, все более дорогие интерфейсы деактивируются

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

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


<!> 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

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