Различия между версиями 3 и 4
Версия 3 от 2014-04-27 16:49:39
Размер: 6069
Редактор: FrBrGeorge
Комментарий:
Версия 4 от 2014-04-27 18:20:06
Размер: 6602
Редактор: FrBrGeorge
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 6: Строка 6:
 * Работа на стыке интерфейсного и сетевого уровней (например, ARP)
Строка 33: Строка 34:
Включение (обратите внимание на «прозрачную» коммутацию в ядре вместо воздвния виртуального сетевого интерфейса типа `if_bridge`): Включение (обратите внимание на «прозрачную» коммутацию в ядре вместо создания виртуального сетевого интерфейса типа `if_bridge`):
Строка 67: Строка 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]]
{{attachment:bridge2c.png}}
 * Маршрутизация (routing) vs. коммутация (bridging) ⇒ цепочка BROUTE
  * DROP в BROUTE означает «выпихивание» на уровень выше

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

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

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

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


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