nat-to
и rdr-to
правилах
route-to
,
reply-to
и dup-to
Таблицы можно создавать либо в pf.conf(5), либо при помощи pfctl(8).
table
в файле
pf.conf
. Следующие атрибуты можно использовать для таблиц:
const
- содержимое таблицы не может быть изменено
после создания таблицы. Если этот атрибут не указан, при помощи
pfctl(8) можно добавлять
или удалять адреса из таблицы в любое время, даже если используется
securelevel(7) с
уровнем два и выше.
persist
- заставляет ядро хранить таблицу в памяти,
даже если на нее не ссылаются никакие правила. Без этого атрибута
ядро автоматически удалит таблицу при сбросе последнего правила,
ссылающегося на нее.
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 -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).
self
.
Таблица будет содержать все IP-адреса, назначенные этому интерфейсу или
группе или же машине (включая loopback адреса) соответственно.
Одно ограничение при указании адресов состоит в том, что
0.0.0.0/0
и 0/0
не будут работать в таблицах.
Альтернативой является hard-code-указание этого адреса или же использование
макроса.
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>
: