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

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

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

Пояснения:

МЭ интерфейсного уровня в Linux: ebtables

Базовая статья: ebtables/iptables interaction on a Linux-based bridge bridge2c.png

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

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


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