Адресный пул представляет собой два или более интерфейсов, которые используются совместно группой пользователей. Адресный пул может быть указан в качестве целевого адреса в директивах nat-to, rdr-to, route-to, reply-to, и в дерективе dup-to в качестве опций фильтра (filter).
Существуют четыре метода использования адресного пула:
- bitmask (битовая маска)- указывает сетевую часть пула адресов с помощью которой будем модифицирован адрес (адрес источник для правил nat-to, адрес приемник для правил rdr-to). Пример: если адресный пул определен как 192.0.2.1/24 и адрес, который необходимо модифицировать, 10.0.0.50, то результирующий адрес будет вычислен как 192.0.2.50. Если адресный пул определен как 192.0.2.1/25 и адрес, который необходимо модифицировать, 10.0.0.130, то результирующий адрес будет вычислен как 192.0.2.2.
- random (случайный адрес) – адрес выбирается случайным образом из пула.
- source-hash (хеш источник) – используется хэш функция от адреса источника для определения какой адрес из пула бедет использован. Этот метод гарантирует, что адрес источник всегда будет перенаправлен на соответствующий ему адрес пула. Ключ, который используется для алгоритма хеширования, может быть указан дополнительно после ключевого source-hash в шестнадцатеричном формате, или как строка. По умолчанию, pfctl(8) будет создавать случайный ключ каждый раз при загрузка набора правил.
- round-robin (циклический) – адреса пула выбираются последовательно по кругу. Этот метод используется по умолчанию, а также ТОЛЬКО этот метод используется, когда адресный пул объявлен с использованием таблиц. (table).
За исключением циклического метода, адресный пул должен быть описан как сетевой блок CIDR (Classless Inter-Domain Routing). Цикличейкий метод допускает использование множества отдельных адресов определенных с помощью списка (list) или таблицы (table).
Опция sticky-address может быть использована с пулами типа random и циклического типа для обеспечения того условия, что адрес источника всегда будет соотнесен тому же адресу перенаправления.
Адресный пул может быть использован в качестве адреса для преобразования в правилах nat-to. Соединения будут получать свой адрес источник путем преобразования его в адреса из пула, указанным способом. Это может быть полезным в ситуации, когда PF обслуживает с помощью NAT очень большую сеть. Так как число соединений, преобразованных с помощью NAT, ограниченно добавление дополнительных адресов позволяет шлюзу масштабироваться и обслуживать большее количество клиентов.
В этом примере пул из двух адресов используется для преобразования исходящих пакетов. Для каждого исходящего соединения PF будет циклически выбирать адрес способом round-robin.
match out on $ext_if inet nat-to { 192.0.2.5, 192.0.2.10 }
Одним из недостатков этого метода является то, что соединения с одного внутреннего адреса не могут быть всегда преобразованы в тот же конечный адрес. Это может препятствовать, например, просмотру сайтов, которые отслеживают доступ пользователей основываясь на IP его адресе. Альтернативный способ – использовать метод source-hash. Тогда каждый внутренний адрес всегда будет преобразован в один и тот же конечный адрес. Для этого адресный пул должен быть описан с помощью сетевого блока CIDR.
match out on $ext_if inet nat-to 192.0.2.4/31 source-hash
Это правило использует пул адресов 192.0.2.4/31 (192.0.2.4 — 192.0.2.5) для преобразования адреса исходящих пакетов. Каждый внутренний адрес будет всегда преобразован в один и тот же адрес благодаря ключевому слову source-hash.