Назад | Перейти на главную страницу

Переадресация портов OpenBSD pf по нескольким правилам

У меня есть несколько десятков серверов за брандмауэром OpenBSD с переадресацией портов. Большинство правил очень похожи и различаются только IP-адресами или иногда перенаправленными портами, поэтому я хочу сжать их, чтобы удалить чрезмерное повторение, но я обнаружил, что использовать столы с участием rdr-to правила. Есть ли способ улучшить эту конфигурацию? Может быть, есть возможность использовать pf макросы для создания нескольких правил одновременно? В настоящий момент я не могу использовать внешний препроцессор.

Примерный набор правил:

pass in  on $extif proto tcp from any     to 10.0.0.213   port {25,80,443} rdr-to 172.16.1.193
pass in  on $intif proto tcp from $intnet to 10.0.0.213   port {25,80,443} rdr-to 172.16.1.193
pass out on $intif proto tcp from any     to 172.16.1.193 port {25,80,443} received-on $intif nat-to $intif

pass in  on $extif proto tcp from any     to 10.0.0.214   port {25,80,443} rdr-to 172.16.1.194
pass in  on $intif proto tcp from $intnet to 10.0.0.214   port {25,80,443} rdr-to 172.16.1.194
pass out on $intif proto tcp from any     to 172.16.1.194 port {25,80,443} received-on $intif nat-to $intif

pass in  on $extif proto tcp from any     to 10.0.0.215   port {25,80,443,3389} rdr-to 172.16.1.195
pass in  on $intif proto tcp from $intnet to 10.0.0.215   port {25,80,443,3389} rdr-to 172.16.1.195
pass out on $intif proto tcp from any     to 172.16.1.195 port {25,80,443,3389} received-on $intif nat-to $intif

Из справочной страницы pf.conf (5):

Параметры трансляции применяются только к пакетам, которые проходят через указанный интерфейс, и если интерфейс не указан, трансляция применяется к пакетам на всех интерфейсах. Например, перенаправление порта 80 внешнего интерфейса на внутренний веб-сервер будет работать только для подключений, исходящих извне. Соединения на адрес внешнего интерфейса с локальных хостов не будут перенаправлены, поскольку такие пакеты фактически не проходят через внешний интерфейс. Перенаправления не могут отражать пакеты обратно через интерфейс, на который они поступают, они могут быть перенаправлены только на хосты, подключенные к другим интерфейсам, или к самому межсетевому экрану.

Возможно, вы сможете сжать некоторые из ваших правил, не указав, на каком интерфейсе вы хотите, чтобы перенаправление происходило, и позволив pf оценить его за вас.

Например:

pass in on $extif proto tcp from any to 10.0.0.213 port {25,80,443} rdr-to 172.16.1.193
pass in on $intif proto tcp from $intnet to 10.0.0.213 port {25,80,443} rdr-to 172.16.1.193

Можно переписать как:

pass in proto tcp from any to 10.0.0.213 port {25, 80, 443} rdr-to 172.16.1.193
  • Входящий трафик, предназначенный для 10.0.0.213 на $extif будет перенаправлен на 172.16.1.193.
  • Входящий трафик, предназначенный для 10.0.0.213 на $intif будет перенаправлен на 172.16.1.193.
  • Это также позволит разрешить трафик, который не является частью $intnet чтобы быть перенаправленным. Это может быть или нежелательно.

Не видя всего вашего набора правил и не зная на самом деле, чего вы пытаетесь достичь, я могу предложить только доказательный пример.

И последнее замечание: я бы действительно этого не делал. Существует тенденция (по крайней мере, у меня она есть) к тому, чтобы писать как можно меньше правил, заставляя одно правило выполнять больше, чем «одно действие». Это плохо. Брандмауэры уже ужасно сложны и, кажется, всегда неправильно настроены; зачем усложнять себе жизнь, создавая византийский набор правил? Более длинный набор правил с более простыми правилами будет проще для понимания, обслуживания и отладки. Избегайте соблазна быть слишком умным.