У меня есть несколько десятков серверов за брандмауэром 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
$extif
будет перенаправлен на 172.16.1.193.$intif
будет перенаправлен на 172.16.1.193.$intnet
чтобы быть перенаправленным. Это может быть или нежелательно.Не видя всего вашего набора правил и не зная на самом деле, чего вы пытаетесь достичь, я могу предложить только доказательный пример.
И последнее замечание: я бы действительно этого не делал. Существует тенденция (по крайней мере, у меня она есть) к тому, чтобы писать как можно меньше правил, заставляя одно правило выполнять больше, чем «одно действие». Это плохо. Брандмауэры уже ужасно сложны и, кажется, всегда неправильно настроены; зачем усложнять себе жизнь, создавая византийский набор правил? Более длинный набор правил с более простыми правилами будет проще для понимания, обслуживания и отладки. Избегайте соблазна быть слишком умным.