6069
Комментарий:
|
6602
|
Удаления помечены так. | Добавления помечены так. |
Строка 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
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 — пример того, что должно быть реализовано помимо простого перебрасывания фреймов из интерфейса в интерфейс. Задача: если топология сетевых устройств имеет циклы, избавиться от них.
- Все главные (рассылка оповещений-фреймов с ID)
- Если принятое оповещение главнее, пересылка его вместо своего (с добавлением также и собственного ID и стоимости пересылки)
- Остаётся один главный
- Если оповещение принято из нескольких интерфейсов, все более дорогие интерфейсы деактивируются
Алгоритм неидеальный, имеется множество неидеальных же модификаций (см.).
Сетевой мост и 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
- Маршрутизация (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