Программа pfctl(8) предназначена для управления системой pf(4). Она позволяет устанавливать правила, менять значения параметров и выводить статистическую информацию. Ниже описаны опции данной команды.
-e
-d
-h
-n
-f
file-n
-o
Включить опимизацию правил. Оптимизатор может улучшить производительность пакетного фильтра путём удаления повторов и расположения правил в другом порядке. Вот что он делает:
При указании второй опции -o
, оптимизатор
начинает вставлять ключевое слово quick
в правила.
Побочным эффектом оптимизации может явиться изменение
статистической информации по правилам. Если это важно для
системы учёта трафика (биллинговой системы), вам придётся
расставить опцию lable
, дабы
предотвратить пересортировку правил оптимизатором.
-z
-i
interface-p
device/dev/pf
.
-A
-N
-O
-R
-a
anchor
Применять опции -f
, -F
и
-s
только к правилам соответствующим якорю
anchor. Например, следующая команда позволит просмотреть
правила добавленные при помощи команды
authpf(8) для пользователя smith, при
условии, что программа authpf имеет pid 1234:
#
pfctl -a "authpf/smith(1234)" -s rules
Кроме того, данная опция позволяет ограничивать область видимости таблицы:
#
pfctl -a foo/bar -t mytable -T add 1.2.3.4 5.6.7.8
Данная команда изменит таблицу созданную в якоре foo/bar
но не тронет глобальную
таблицу, даже в случае конфликта имён.
-k
hostСбросить все записи в таблице состояний, относящиеся к указанному хосту. Можно употребить несколько раз:
#
pfctl -k host1 -k host2
Сбросит все записи относящиеся к соединениям между host1 и host2.
-m
Установить явно заданные опции без сброса прочих:
#
echo "set loginterface fxp0" | pfctl -mf -
-D
macro=value-F
modifierСбросить параметр modifier в пакетном фильтре. Можно указать всего одной буквой:
-F nat | Сбросить правила nat |
-F queue | Сбросить правила queue |
-F rules | Сбросить правила фильтрации |
-F state | Сбросить таблицу состояния (для nat и фильтрации) |
-F Sources | Сбросить информацию о источниках пакетов (см. Раздел C.2.1.4.7, «Опции таблицы состояний») |
-F info | Сбросить статистическую информацию (не привязанную к правилам фильтрации) |
-F Tables | Сбросить содержимое всех таблиц |
-F osfp | Сбросить содержимое таблицы для пассивного детектирования операционной системы |
-F all | Сбросить всё |
-s
modifierПоказывать параметры пакетного фильтра, указанные в modifier:
-s nat | Показать загруженные правила nat |
-s queue |
Показать загруженные очереди. При указании совместно
с опцией -v показывается статистика
по очередям. При указании двух флагов
-v -v , пакетный фильтр входит в
цикл и показывает информацию on-line обновляя её раз
в 5 минут. При этом видна так же измеренная полоса
пропускания по каждой очереди.
|
-s rules |
Показать загруженные правила фильтрации. При
использовании совместно с ключём -v
показывается статистика по каждому правилу:
количество срабатываний, количество пакетов и байт
прошедших через правило. Оптимизация «set
step», включённая в ядре по умолчанию,
отключает вычисление статистики, когда это только
возможно. Пакеты соответствующие правилу учитывающему
состояни (keep state) учитываются только в этом
правиле.
|
-s Anchors |
Показать якоря, загруженные непосредственно из
главного набора правил. Если надо просмотреть
вложенные якоря, надо употребить аргумент
-a anchor . При указании опции
-v все якоря рекурсивно
разворачиваются.
|
-s state | Показать таблицу состояний |
-s Sources | Показать информацию о источниках пакетов (см. Раздел C.2.1.4.7, «Опции таблицы состояний») |
-s info |
Показать статистическую информацию и счётчики. При
использовании совместно с -v
показывает информацию об источниках пакетов.
|
-s labels | Показать статистику по каждому правилу. (Метки, количество срабатываний, количество пакетов, количество байт). |
-s timeouts | Показать установленные таймауты. |
-s memory | Показать текущие ограничения на размеры пулов памяти. |
-s Tables | Показать список загруженных таблиц. |
-s osfp | Показать список известных операционных систем для пассивного детектирования операцонной системы. |
-s Interfaces |
Показать список интерфейсов и драйверов интерфейсов,
доступных пакетному фильтру. Совметстно с двумя
аргументами -v -v может показать
статистикку на интерфейсе. Можно ограничить
статистику одним интерфейсом, если использовать
совместно с опцией -i interface .
|
-s all | Паказать всю информацию, кроме списка интерфейсов и списка операционных систем. |
-t
table-T
команда [адреса ...]Указывает действие, которое можно совершить с таблицей. Команда может быть сокращена до одной буквы. Допустимы следующие команды:
-T kill | Уничтожить таблицу |
-T flush | Очистить таблицу |
-T add | Добавить адреса в таблицу. Если таблица не существует, она автоматически создаётся |
-T delete | Удалить указанные адреса из таблицы |
-T replace | Заменить адреса в таблице. Если таблица не существует, она автоматически создаётся |
-T show | Показать содержимое таблицы |
-T test | Проверить, принадлежит ли указанный адрес таблице |
-T zero | Очистить статистическую информацию по таблице |
-T load |
Загрузить только определения таблиц. Используется
совместно с опцией -f
|
Для опций add
, delete
,
replace
и test
адреса
можно задавать как в командной строке, так и в файле,
с помощью опции -f
. Комментарии в
текстовом файле с перечнем адресов, можно начинать с
символа #
. Можно использовать
один или два раза флаг -v
для того, чтобы
информация о проделанных действиях печаталась подробнее.
При этом перед каждым адресом будет печататься следующий
флаг:
A | Добавлен адрес (сеть) |
C | Адрес (сеть) изменены |
D | Адрес (сеть) удалены |
M |
Адрес (сеть) найдены в таблице (для операции
test )
|
X | Адрес (сеть) дублируются (уже есть в таблице), поэтому игнорированы |
Y |
Адрес (сеть) не могут быть добавлены или удалены,
так как конфликтуют с записью с знаком !
|
Z | Статистика по этому адресу сброшена |
В каждой таблице есть счётчики, которые можно просмотреть
при помощи флага -v
. Например, следующая
команда создаёт открытый всем ветрам брандмауэр и посылает
десять пингов на сервер ftp.openbsd.org:
#
printf "table <test> { ftp.openbsd.org }\n \ pass out to <test> keep state\n" | pfctl -f-$
ping -qc10 ftp.openbsd.org
Теперь мы можем использовать команду show
для того, чтобы просмотреть
статистику по адресам из таблицы:
#
pfctl -t test -vTshow
129.128.5.191
Cleared: Thu Feb 13 18:55:18 2003
In/Block: [ Packets: 0 Bytes: 0 ]
In/Pass: [ Packets: 10 Bytes: 840 ]
Out/Block: [ Packets: 0 Bytes: 0 ]
Out/Pass: [ Packets: 10 Bytes: 840 ]
Строка Cleared показывает когда начался учёт.
Аналогично можно просматривать общую информацию о таблицах
используя флаг -v
дважды с командой
-s Tables
. Таким образом, мы получим
информацию о количестве адресов в таблицах, количестве
правил ссылающихся на таблицу, и общую статистику по
таблице.
#
pfctl -vvsTables
--a-r- test
Addresses: 1
Cleared: Thu Feb 13 18:55:18 2003
References: [ Anchors: 0 Rules: 1 ]
Evaluations: [ NoMatch: 3496 Match: 1 ]
In/Block: [ Packets: 0 Bytes: 0 ]
In/Pass: [ Packets: 10 Bytes: 840 ]
In/XPass: [ Packets: 0 Bytes: 0 ]
Out/Block: [ Packets: 0 Bytes: 0 ]
Out/Pass: [ Packets: 10 Bytes: 840 ]
Out/XPass: [ Packets: 0 Bytes: 0 ]
Как видно из строки Evaluations, только один пакет соответствовал правилу, остальные, однако корректно учтены таблицей, так как соответствовали записи в таблице состояний. Перезагрузка правил не влияет на счётчики в таблице. Строки XPass увеличиваются в том случае, если пакет пропускается благодаря записи в таблице состояний, но при этом более не соответствует таблице. (Например, если адрес удалён из таблицы, уже открытые соединения не должны оборваться, если они соответвуют таблице состояний.)
С одним флагом -v
будет выведена только
первая строка, в которой приведены флаги таблицы и её
названия. Вот перечень флагов:
c |
Константа. Содержимое таблицы не может быть
изменено вне pf.conf(5)
|
p | persist — таблица не удаляется автоматически, когда на неё не ссылается ни одно правило. |
a |
Активная таблица. Таблицы без этого флага реально
не существуют, они не могут содержать адреса и
видны только если задан флаг -g .
|
i | inactive — неактивная таблица. Этот влаг выставляется на таблице, на время, в течение которого в неё «заливаются» данные. |
r | На данную таблицу есть ссылки, т.е. на неё реально ссылаются какие-то правила. |
h | Таблица скрыта (на время), так как при помощи якоря загружена другая таблица с таким же именем. |
-v
-g
-x
levelУровень отладки. Можно сокращать до одной буквы:
-x none | Не выводить отладочных сообщений |
-x urgent | Выводить отладочные сообщения только для серьёзных ошибок. По умолчанию включён он. |
-x misc | Выводить отладочные сообщения только для различных ошибок. |
-x loud | Выводить всяческую отладочную информацию |
Пример C.1. Просмотр статистики на интерфейсе выбранном при помощи
опции loginterface
Опция loginterface
в файле
/etc/pf.conf
может указать один (и только
один) интерфейс, для которого собирается полная статистическая
информация. (См. Раздел C.2.2.1, «Опции в пакетном фильтре».)
#
pfctl -s info
Status: Enabled for 14 days 10:02:15 Debug: Urgent
Hostid: 0xd56f1383
Interface Stats for rl1 IPv4 IPv6
Bytes In 193781803 0
Bytes Out 1799932863 0
Packets In
Passed 1716610 0
Blocked 7973 0
Packets Out
Passed 2013028 0
Blocked 0 0
State Table Total Rate
current entries 5
searches 3848785 3.1/s
inserts 77192 0.1/s
removals 77187 0.1/s
Counters
match 206160 0.2/s
bad-offset 0 0.0/s
fragment 0 0.0/s
short 0 0.0/s
normalize 0 0.0/s
memory 0 0.0/s
bad-timestamp 0 0.0/s
congestion 0 0.0/s
ip-option 0 0.0/s
proto-cksum 0 0.0/s
state-mismatch 604 0.0/s
state-insert 0 0.0/s
state-limit 0 0.0/s
src-limit 0 0.0/s
synproxy 0 0.0/s
Пример C.2. Кто из заблокированных взломщиков пытался пройти в систему в последнее время?
#
pfctl -t crackers -v -v -Ts | grep "In/Block:.*Packets: [^0]" -B2
59.124.47.229
Cleared: Fri Apr 20 19:29:30 2007
In/Block: [ Packets: 159 Bytes: 9540 ]
--
61.109.245.208
Cleared: Mon Apr 23 03:13:25 2007
In/Block: [ Packets: 159 Bytes: 9540 ]
--
62.193.224.155
Cleared: Sun Apr 15 00:03:19 2007
In/Block: [ Packets: 1 Bytes: 60 ]
--
66.34.136.28
Cleared: Wed Apr 25 00:06:03 2007
In/Block: [ Packets: 3744 Bytes: 164736 ]
--
67.15.8.50
Cleared: Tue Apr 24 03:44:28 2007
In/Block: [ Packets: 568 Bytes: 34080 ]
--
88.2.123.116
Cleared: Sat Apr 21 11:31:02 2007
In/Block: [ Packets: 48 Bytes: 2880 ]
--
210.87.136.171
Cleared: Sun Apr 15 00:03:19 2007
In/Block: [ Packets: 1 Bytes: 60 ]
--
219.153.32.201
Cleared: Mon Apr 23 10:54:24 2007
In/Block: [ Packets: 164 Bytes: 9840 ]
Пример C.3. Просмотр таблицы состояний
#
pfctl -ss self tcp 172.19.0.2:22 <- 172.19.0.34:60730 ESTABLISHED:ESTABLISHED self tcp 172.19.0.2:22 <- 172.19.0.34:43768 ESTABLISHED:ESTABLISHED self pfsync 172.19.0.2 -> 0.0.0.0 SINGLE:NO_TRAFFIC#
pfctl -vvss self tcp 172.19.0.2:22 <- 172.19.0.34:60730 ESTABLISHED:ESTABLISHED [3302985293 + 64096] wscale 1 [3073141737 + 66608] wscale 5 age 06:30:34, expires in 24:00:00, 16093:13420 pkts, 1181656:3943411 bytes, rule 5 id: 4621338700019ddb creatorid: d56f1383 self tcp 172.19.0.2:22 <- 172.19.0.34:43768 ESTABLISHED:ESTABLISHED [2485562129 + 63136] wscale 1 [4004983129 + 66608] wscale 5 age 05:08:21, expires in 23:59:58, 2743:2321 pkts, 184400:1056475 bytes, rule 5 id: 4621338700019f1d creatorid: d56f1383 self pfsync 172.19.0.2 -> 0.0.0.0 SINGLE:NO_TRAFFIC age 02:33:08, expires in 00:00:29, 15314:14760 pkts, 6238352:826560 bytes, rule 14 id: 462133870001ca8b creatorid: d56f1383
При наличии на интерфейсе NAT трансляции, она отображается в
данном отчёте. Это было показано при обсуждении
pf.conf(5)
в Раздел C.2.1.5.7, «Проверка состояния правил NAT».
См. так же Раздел C.5.2, «pftop».
Пример C.4. Сколько пакетов на какое правило попало?
#
pfctl -vvsr
@0 scrub in all fragment reassemble
[ Evaluations: 8292326 Packets: 3818454 Bytes: 0 States: 0 ]
@0 block return in log all
[ Evaluations: 389809 Packets: 2153 Bytes: 935446 States: 0 ]
@1 pass quick on lo0 all
[ Evaluations: 389809 Packets: 237302 Bytes: 62225678 States: 0 ]
@2 pass in quick on rl1 inet proto udp from any to 172.19.0.2 port = domain
[ Evaluations: 152507 Packets: 19368 Bytes: 1286672 States: 0 ]
@3 pass in quick on rl1 inet proto tcp from <trusted_ip:8> to 172.19.0.2 port = ssh keep state
[ Evaluations: 48415 Packets: 19371 Bytes: 2672486 States: 0 ]
@4 block return in log quick on rl1 inet proto tcp from <crackers:314> to 172.19.0.2 port = ssh
[ Evaluations: 46532 Packets: 7310 Bytes: 371716 States: 0 ]
@5 pass in on rl1 inet proto tcp from any to 172.19.0.2 port = ssh flags S/SA keep state
[ Evaluations: 39219 Packets: 822253 Bytes: 144372004 States: 2 ]
@6 pass in on rl1 inet proto tcp from any to 172.19.0.2 port = smtp flags S/SA keep state
[ Evaluations: 39400 Packets: 49654 Bytes: 41860091 States: 0 ]
@7 pass in on rl1 inet proto tcp from any to 172.19.0.2 port = domain flags S/SA keep state
[ Evaluations: 39400 Packets: 763 Bytes: 44898 States: 0 ]
@8 pass in on rl1 inet proto tcp from any to 172.19.0.2 port = http flags S/SA keep state
[ Evaluations: 39400 Packets: 2409271 Bytes: 1888003875 States: 0 ]
@9 pass in on rl1 inet proto tcp from any to 172.19.0.2 port = imap flags S/SA keep state
[ Evaluations: 39400 Packets: 53382 Bytes: 36933799 States: 0 ]
@10 pass in on rl1 inet proto udp from any port = domain to 172.19.0.2 keep state
[ Evaluations: 41095 Packets: 293 Bytes: 21590 States: 0 ]
@11 pass in inet proto icmp all keep state
[ Evaluations: 47877 Packets: 0 Bytes: 0 States: 0 ]
@12 pass in on rl1 from <internal_ip:3> to any keep state
[ Evaluations: 47877 Packets: 23966 Bytes: 2072826 States: 0 ]
@13 pass out on rl1 from any to <internal_ip:3> keep state
[ Evaluations: 125819 Packets: 0 Bytes: 0 States: 0 ]
@14 pass out on rl1 all keep state
[ Evaluations: 77942 Packets: 1184788 Bytes: 239933074 States: 1 ]
В отчёте, там, где даны имена таблиц, указано сколько в них записей.
Все эти данные позволяют применять утилиту pfctl(8) не только для управления пакетным фильтром, но и для сбора разнообразных данных и постоения биллинговых систем. Некоторое уже готовое програмное обеспечение на эту тему предствлено в Раздел C.4, «Интеграция пакетного фильтра с програмным окружением».