Различия между версиями 5 и 6
Версия 5 от 2014-04-27 18:31:12
Размер: 6517
Редактор: FrBrGeorge
Комментарий:
Версия 6 от 2014-04-27 18:56:54
Размер: 7977
Редактор: FrBrGeorge
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 68: Строка 68:
Базовая статья: [[http://ebtables.sourceforge.net/br_fw_ia/br_fw_ia.html|ebtables/iptables interaction on a Linux-based bridge]] и [[http://ebtables.sourceforge.net/misc/ebtables-man.html|manual page]] Базовая статья: [[http://ebtables.sourceforge.net/br_fw_ia/br_fw_ia.html|ebtables/iptables interaction on a Linux-based bridge]]
Строка 70: Строка 70:
 *  * Пакет попадает в `ebtables`, если он пришёл или уходит через коммутируемый интерфейс
 * Пакет покидает `ebtables`, если его нужно обработать уровнем выше
Строка 72: Строка 73:
Обратите внимание, что уровнем выше может быть IPTables (а не просто «application», как на схеме)
 * Подобно `netfilter`, `ebtables` состоит из цепочек и таблиц (путаница та же самая :) )
Строка 73: Строка 76:
[[http://ebtables.sourceforge.net/misc/ebtables-man.html|Возможности ebtables]]:
 * Фильтр по полям фрейма:
  * mac-адреса интерфейсов (отправителя, входящий и выходящий на мосту, получателя), в т. ч. т. н. Bridge Group Addres
  * по полю «протокол» (фрейма!)
  * …
 * Фильтры-модули:
  * поля `arp`
  * поля `ip` (включая порты транспортного уровня!)
  * ограничитель `limit`
  * классификатор `mark`
  * поля `stp`
  * `vlan`
  * …
 * Действия-модули (параметры для `"-J"`)
  * `arpreply` — порождение произвольного ARP-ответа
  * `snat/dnat` — подмена MAC-адресов
  * `mark` — маркировка пакета
  * `redirect` — «тупая» подмена MAC-адреса

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

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

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

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

Сетевой мост и 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

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

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

Возможности ebtables:

  • Фильтр по полям фрейма:
    • mac-адреса интерфейсов (отправителя, входящий и выходящий на мосту, получателя), в т. ч. т. н. Bridge Group Addres
    • по полю «протокол» (фрейма!)
  • Фильтры-модули:
    • поля arp

    • поля ip (включая порты транспортного уровня!)

    • ограничитель limit

    • классификатор mark

    • поля stp

    • vlan

  • Действия-модули (параметры для "-J")

    • arpreply — порождение произвольного ARP-ответа

    • snat/dnat — подмена MAC-адресов

    • mark — маркировка пакета

    • redirect — «тупая» подмена MAC-адреса


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