OpenBSD PF - Таблицы [FAQ PF - На главную]



Введение

Таблица используется для хранения группы IPv4- и/или IPv6-адресов. Поиск в таблице выполняется очень быстро, а по сравнению со списками, процессорного времени и памяти для этого потребуется меньше. По этой причине таблица идеально подходит для хранения именно большой группы адресов, т.к. время поиска в таблице, содержащей 50 000 адресов, не на много больше, чем для таблицы, содержащей 50 адресов. Таблицы можно использовать для следующих целей:

Таблицы можно создавать либо в pf.conf(5), либо при помощи pfctl(8).

Конфигурация

Таблицу можно создать при помощи директивы table в файле pf.conf. Следующие атрибуты можно использовать для таблиц: Например:
table <goodguys> { 192.0.2.0/24 }
table <rfc1918>  const { 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8 }
table <spammers> persist
block in on fxp0 from { <rfc1918>, <spammers> } to any
pass  in on fxp0 from <goodguys> to any
Адреса также могут быть указаны при помощи отрицания (или «не»), например:
table <goodguys> { 192.0.2.0/24, !192.0.2.5 }
Теперь таблица goodguys будет содержать все адреса из сети 192.0.2.0/24, кроме 192.0.2.5.

Обратите внимание, что имена таблиц всегда надо брать в < > (угловые скобки).

Таблицы также можно создать при помощи обычных текстовых файлов, содержащих список IP-адресов и сетей:

table <spammers> persist file "/etc/spammers"
block in on fxp0 from <spammers> to any
Файл /etc/spammers должен содержать список IP-адресов и/или CIDR заблокированных сетей (по одному/одной в каждой строчке).

Управление при помощи pfctl

Таблицами можно управлять на лету при помощи pfctl(8). Например, чтобы добавить записи в таблицу <spammers>, упомянутую выше:
# pfctl -t spammers -T add 203.0.113.0/24
Это также создаст таблицу <spammers>, если её ещё нет. Вывести список адресов таблицы можно при помощи этой команды:
# pfctl -t spammers -T show
Аргумент -v можно использовать и совместно с -T show, чтобы вывести статистику для каждой записи таблицы. Удалить адреса из таблицы можно при помощи этой команды:
# pfctl -t spammers -T delete 203.0.113.0/24
Более подробное описание работы с таблицами при помощи pfctl находится в man-странице pfctl(8).

Указание адресов

Помимо указания IP-адреса, хосты также могут быть указаны при помощи своего имени. Когда имя хоста преобразуется в IP-адрес, все полученные адреса IPv4 и IPv6 помещаются в таблицу. IP-адреса также можно ввести в таблицу, указав правильное имя интерфейса, группу интерфейсов или ключевое слово self. Таблица будет содержать все IP-адреса, назначенные этому интерфейсу или группе или же машине (включая loopback адреса) соответственно.

Одно ограничение при указании адресов состоит в том, что 0.0.0.0/0 и 0/0 не будут работать в таблицах. Альтернативой является hard-code-указание этого адреса или же использование макроса.

Сопоставление адресов

Поиск lookup адреса в таблице вернет наиболее узко совпадающую запись. Это позволяет создавать таблицы, такие как:
table <goodguys> { 172.16.0.0/16, !172.16.1.0/24, 172.16.1.100 }

block in on dc0
pass  in on dc0 from <goodguys>
Любой входящий через dc0 пакет, будет иметь свой source-адрес, совпадающий с таблицей <goodguys>: