3149
Комментарий:
|
← Версия 9 от 2014-04-28 13:56:12 ⇥
4805
|
Удаления помечены так. | Добавления помечены так. |
Строка 1: | Строка 1: |
= Особенности FreeBSD PF = | ## page was renamed from LecturesCMC/UnixFirewalls2014/04_EssentialsPF = Особенности FreeBSD/OpenBSD PF = |
Строка 3: | Строка 4: |
---- | '''OpenBSD''': отказ от разделения преобразующих (`nat`, `rdr`) и фильтрующих (`bass`, `block`) команд. {{{ pass out on ext_interface from src_addr to dst_addr nat-to ext_addr или match out on ext_interface from src_addr to dst_addr nat-to ext_addr … pass out on ext_interface from src_addr to dst_addr и pass in on ext_interface other_filters port ext_port rdr-to int_server [int_port] }}} [[http://www.openbsd.org/faq/pf/nat.html#config|см. в PF FAQ]] == Синтетическое понятие «состояние» PF == Состояние — это набор информации, необходимый для преобразования/перенаправления/допуска потока данных. См., например, два состояния, сохранённых для `ping` из внутренней сети. |
Строка 18: | Строка 36: |
all udp 10.30.50.1:53 <- 10.30.50.3:44181 SINGLE:MULTIPLE all udp 10.0.2.15:15999 -> 192.168.11.1:53 MULTIPLE:SINGLE |
|
Строка 23: | Строка 39: |
Понятия "modulate sate" и "synproxy state". Назначение SYN proxy. == Списки, макросы и таблицы == * Списки: одно правило в `pf.conf` → N правил * Макросы: переменные * Таблицы: логарифмический поиск, модификация из userspace без модификаций правил [[http://www.openbsd.org/faq/pf/tables.html#match|Пример поиска по таблице]]. Обратите внимание на особенность интерпретации записи вида «`!адрес`» Заполнение таблицы по параметру `overload`. == Разбор примера == |
|
Строка 24: | Строка 50: |
fw-bsd# pfctl -vsA No ALTQ support in kernel ALTQ related functions disabled ftp-proxy ftp-proxy/1022.1 fw-bsd# pfctl -va ftp-proxy/1022.1 -sa No ALTQ support in kernel ALTQ related functions disabled TRANSLATION RULES: nat inet proto tcp from 10.30.50.3 to 193.162.146.4 port = 64093 rtable 0 -> 10.0.2.15 [ Evaluations: 2 Packets: 0 Bytes: 0 States: 0 ] [ Inserted: uid 62 pid 1022 State Creations: 0 ] rdr inet proto tcp from 10.30.50.3 to 193.162.146.4 port = 64038 rtable 0 -> 193.162.146.4 port 64093 [ Evaluations: 4 Packets: 8 Bytes: 495 States: 0 ] [ Inserted: uid 62 pid 1022 State Creations: 1 ] |
# Firewall for Home or Small Office # http://www.openbsd.org/faq/pf/example1.html |
Строка 40: | Строка 53: |
FILTER RULES: pass in quick inet proto tcp from 10.30.50.3 to 193.162.146.4 port = 64093 flags S/SA keep state (max 1) rtable 0 [ Evaluations: 7 Packets: 8 Bytes: 495 States: 0 ] [ Inserted: uid 62 pid 1022 State Creations: 1 ] pass out quick inet proto tcp from 10.0.2.15 to 193.162.146.4 port = 64093 flags S/SA keep state (max 1) rtable 0 [ Evaluations: 3 Packets: 8 Bytes: 495 States: 0 ] [ Inserted: uid 62 pid 1022 State Creations: 1 ] |
# macros ext_if="em0" int_if="le0" |
Строка 48: | Строка 57: |
STATES: all tcp 10.0.2.15:22 <- 10.0.2.2:38606 ESTABLISHED:ESTABLISHED [3755536990 + 65535] [1309337055 + 65535] age 00:08:48, expires in 24:00:00, 1180:736 pkts, 72257:191011 bytes, rule 11 all tcp 10.0.2.15:22 <- 10.0.2.2:38624 ESTABLISHED:ESTABLISHED [711515386 + 65535] [1320134591 + 65535] age 00:07:10, expires in 23:56:58, 138:83 pkts, 12113:12587 bytes, rule 11 all tcp 127.0.0.1:8021 (193.162.146.4:21) <- 10.30.50.3:39696 ESTABLISHED:ESTABLISHED [666381855 + 14624] wscale 6 [2483861655 + 65664] wscale 5 age 00:04:48, expires in 23:56:58, 14:8 pkts, 610:662 bytes all tcp 10.0.2.15:26078 -> 193.162.146.4:21 ESTABLISHED:ESTABLISHED [4051480635 + 65535] [1335296332 + 65535] age 00:04:48, expires in 23:56:58, 11:13 pkts, 498:854 bytes, rule 1 |
tcp_services="{ 22, 13 }" icmp_types="echoreq" |
Строка 62: | Строка 60: |
comp3="10.30.50.3" # options set block-policy return set loginterface $ext_if set skip on lo # scrub scrub in # nat/rdr nat on $ext_if inet from !($ext_if) -> ($ext_if:0) rdr on $ext_if proto tcp from any to any port 80 -> $comp3 # filter rules block in pass out antispoof quick for { lo $int_if } pass in on $ext_if inet proto tcp from any to ($ext_if) port $tcp_services pass in on $ext_if inet proto tcp from any to $comp3 port 80 synproxy state pass in inet proto icmp all icmp-type $icmp_types pass quick on $int_if no state |
|
Строка 64: | Строка 92: |
Замечание (на лекции было замято): параметр `loginterface` определяет, из какого интерфейса пакеты будут перекладываться в `pflog0`, чтобы их можно было проанализировать `pflogd`. | |
Строка 65: | Строка 94: |
сокращения: http://www.openbsd.org/faq/pf/ru/shortcuts.html | == Д/З == Поработать со стендом: [[https://cloud.mail.ru/public/742a237de7f6/FW|Образы клиента и сервера]]: 1. `FW-PFBSD`: сервер, доступ по ssh localhost -p2212, доступ на 80-порт `http://localhost:8012` 1. `FW-client`: клиент с единственной сетью (intnet), адрес 10.30.50.3 (можно попасть из консоли virtualbox или ssh с сервера) |
Строка 67: | Строка 100: |
pass out = pass out all flags S/SA keep state http://www.openbsd.org/faq/pf/ru/index.html pfsync |
Что можно сделать: * Посмотреть правила в `/etc/pf.conf` * Посмотреть, во что они превращаются: `pfctl -sa` * Обратить внимание на якорь (подробнее о якорях — на одной из следующих лекций) * Подключиться к `http://localhost:8012` (проброс на сервер → проброс средствами PF на клиент) * Посмотреть таблицу состояний `pfctl -ss` * Подключиться с клиента куда-нибудь по какому-нибудь протоколу :) * Посмотреть таблицу состояний `pfctl -ss` |
Особенности FreeBSD/OpenBSD PF
OpenBSD: отказ от разделения преобразующих (nat, rdr) и фильтрующих (bass, block) команд.
pass out on ext_interface from src_addr to dst_addr nat-to ext_addr или match out on ext_interface from src_addr to dst_addr nat-to ext_addr … pass out on ext_interface from src_addr to dst_addr и pass in on ext_interface other_filters port ext_port rdr-to int_server [int_port]
Синтетическое понятие «состояние» PF
Состояние — это набор информации, необходимый для преобразования/перенаправления/допуска потока данных. См., например, два состояния, сохранённых для ping из внутренней сети.
fw-bsd# pfctl -ss No ALTQ support in kernel ALTQ related functions disabled all tcp 10.0.2.15:22 <- 10.0.2.2:38548 ESTABLISHED:ESTABLISHED all tcp 10.0.2.15:22 <- 10.0.2.2:38559 ESTABLISHED:ESTABLISHED all tcp 10.30.50.1:18550 -> 10.30.50.3:22 ESTABLISHED:ESTABLISHED all tcp 10.30.50.3:80 (10.0.2.15:80) <- 10.0.2.2:35520 FIN_WAIT_2:FIN_WAIT_2 all tcp 10.0.2.2:35520 -> 10.30.50.3:80 FIN_WAIT_2:FIN_WAIT_2 all udp 10.30.50.1:53 <- 10.30.50.3:59363 SINGLE:MULTIPLE all udp 10.0.2.15:55546 -> 192.168.11.1:53 MULTIPLE:SINGLE all icmp 144.76.222.201:3782 <- 10.30.50.3:3782 0:0 all icmp 10.0.2.15:25608 (10.30.50.3:3782) -> 144.76.222.201:25608 0:0
Понятия "modulate sate" и "synproxy state". Назначение SYN proxy.
Списки, макросы и таблицы
Списки: одно правило в pf.conf → N правил
- Макросы: переменные
- Таблицы: логарифмический поиск, модификация из userspace без модификаций правил
Пример поиска по таблице. Обратите внимание на особенность интерпретации записи вида «!адрес»
Заполнение таблицы по параметру overload.
Разбор примера
# Firewall for Home or Small Office # http://www.openbsd.org/faq/pf/example1.html # macros ext_if="em0" int_if="le0" tcp_services="{ 22, 13 }" icmp_types="echoreq" comp3="10.30.50.3" # options set block-policy return set loginterface $ext_if set skip on lo # scrub scrub in # nat/rdr nat on $ext_if inet from !($ext_if) -> ($ext_if:0) rdr on $ext_if proto tcp from any to any port 80 -> $comp3 # filter rules block in pass out antispoof quick for { lo $int_if } pass in on $ext_if inet proto tcp from any to ($ext_if) port $tcp_services pass in on $ext_if inet proto tcp from any to $comp3 port 80 synproxy state pass in inet proto icmp all icmp-type $icmp_types pass quick on $int_if no state
Замечание (на лекции было замято): параметр loginterface определяет, из какого интерфейса пакеты будут перекладываться в pflog0, чтобы их можно было проанализировать pflogd.
Д/З
Поработать со стендом: Образы клиента и сервера:
FW-PFBSD: сервер, доступ по ssh localhost -p2212, доступ на 80-порт http://localhost:8012
FW-client: клиент с единственной сетью (intnet), адрес 10.30.50.3 (можно попасть из консоли virtualbox или ssh с сервера)
Что можно сделать:
Посмотреть правила в /etc/pf.conf
Посмотреть, во что они превращаются: pfctl -sa
- Обратить внимание на якорь (подробнее о якорях — на одной из следующих лекций)
Подключиться к http://localhost:8012 (проброс на сервер → проброс средствами PF на клиент)
Посмотреть таблицу состояний pfctl -ss
Подключиться с клиента куда-нибудь по какому-нибудь протоколу
Посмотреть таблицу состояний pfctl -ss