OpenBSD PF - настройка маршрутизатора (Building a Router) [FAQ PF - На главную]



Обзор

Материал на этой странице расскажет как настроить OpenBSD для работы в качестве маршрутизатора (router), со следующими задачами: Два сетевых интерфейса em(4) и один athn(4) (wireless) будут использоваться в этом примере. Схематично рассматриваемая конфигурация выглядит так:
 [ comp1 ] ---+
              |
 [ comp2 ] ---+--- [ switch ] --- em1 [ OpenBSD ] em0 --- [ internet ]
              |                  athn0
 [ comp3 ] ---+                        )))))
                                       ((((( [ comp4 ]
Имена интерфейсов em0, em1 и athn0 следует при необходимости заменить.

Сеть

Настройка сети будет подразумевать использование подсети 192.168.1.0/24 для соединений при помощи кабеля и 192.168.2.0/24 для беспроводных соединений.
# echo 'net.inet.ip.forwarding=1' >> /etc/sysctl.conf
# echo 'inet autoconf' > /etc/hostname.em0 # or use a static IP
# echo 'inet 192.168.1.1 255.255.255.0 192.168.1.255' > /etc/hostname.em1
# vi /etc/hostname.athn0
Добавьте следующие строки, изменив при этом режим/канал (mode/channel), если потребуется:
media autoselect mode 11n mediaopt hostap chan 1
nwid AccessPointName wpakey VeryLongPassword
inet 192.168.2.1 255.255.255.0
По умолчанию OpenBSD разрешает только WPA2-CCMP соединения в режиме HostAP. Если необходима поддержка старых (небезопасных) протоколов, они могут быть добавленны.

DHCP

dhcpd(8) демон, который будет предоставлять IP-адреса клиентским машинам в сети, должен запускаться во время загрузки системы.
# rcctl enable dhcpd
# rcctl set dhcpd flags em1 athn0
# vi /etc/dhcpd.conf
В следующем примере dhcpd.conf(5) также показано резервирование статических IP-адресов для laptop'а и сервера на основе их MAC-адресов.
subnet 192.168.1.0 netmask 255.255.255.0 {
	option routers 192.168.1.1;
	option domain-name-servers 192.168.1.1;
	range 192.168.1.4 192.168.1.254;
	host myserver {
		fixed-address 192.168.1.2;
		hardware ethernet 00:00:00:00:00:00;
	}
	host mylaptop {
		fixed-address 192.168.1.3;
		hardware ethernet 11:11:11:11:11:11;
	}
}

subnet 192.168.2.0 netmask 255.255.255.0 {
	option routers 192.168.2.1;
	option domain-name-servers 192.168.2.1;
	range 192.168.2.2 192.168.2.254;
}
Здесь может быть указано любое адресное пространство, стандартизованное в RFC 1918. Строка domain-name-servers в этом примере указывает локальный DNS-сервер, настройка которого рассматривается далее.

Firewall

PF в OpenBSD конфигурируется при помощи файла pf.conf(5). Настоятельно рекомендуется быть знакомым с поддерживаемым им синтаксисом, а также вообще иметь предствление о PF, прежде чем просто копировать приведенный ниже пример.
# vi /etc/pf.conf
Настройка шлюза (gateway) может выглядеть следующим образом.
wired = "em1"
wifi  = "athn0"
table <martians> { 0.0.0.0/8 10.0.0.0/8 127.0.0.0/8 169.254.0.0/16     \
	 	   172.16.0.0/12 192.0.0.0/24 192.0.2.0/24 224.0.0.0/3 \
	 	   192.168.0.0/16 198.18.0.0/15 198.51.100.0/24        \
	 	   203.0.113.0/24 }
set block-policy drop
set loginterface egress
set skip on lo0
match in all scrub (no-df random-id max-mss 1440)
match out on egress inet from !(egress:network) to any nat-to (egress:0)
antispoof quick for { egress $wired $wifi }
block in quick on egress from <martians> to any
block return out quick on egress from any to <martians>
block all
pass out quick inet
pass in on { $wired $wifi } inet
pass in on egress inet proto tcp from any to (egress) port { 80 443 } rdr-to 192.168.1.2
Теперь рассмотрим этот конфиг более подробно.
wired = "em1"
wifi  = "athn0"
Имена сетевых интерфейсов для локальной сети определяются при помощи макросов, используемых для упрощения. На макросы можно ссылаться во всем наборе правил после их определения.
table <martians> { 0.0.0.0/8 10.0.0.0/8 127.0.0.0/8 169.254.0.0/16     \
	 	   172.16.0.0/12 192.0.0.0/24 192.0.2.0/24 224.0.0.0/3 \
	 	   192.168.0.0/16 198.18.0.0/15 198.51.100.0/24        \
	 	   203.0.113.0/24 }
Это таблица немаршрутизируемых private адресов, которые будут использоваться позже.
set block-policy drop
set loginterface egress
set skip on lo0
PF позволяет устанавливать определенные runtime параметры. Использование параметра block-policy определяет, должны ли отброшенные пакеты возвращать TCP RST или же они должны блокироваться без уведомления. Параметр loginterface указывает, на каком интерфейсе должен быть включен сбор трафик-статистики (по пакетам и байтам). Эту статистику можно посмотреть при помощи команды pfctl -si. В этом случае используется egress group вместо конкретного имя интерфейса. При этом автоматически будет выбран интерфейс, используемый для default route, т.е. маршрута по умолчанию (em0). Наконец, skip позволяет исключить данный интерфейс для обработки пакетов. Как видно из конфига, в данном примере будет игнорироваться трафик на lo(4) интерфейсе.
match in all scrub (no-df random-id max-mss 1440)
match out on egress inet from !(egress:network) to any nat-to (egress:0)
Используемые здесь правила match выполняют две задачи: нормализацию входящих пакетов и выполнение трансляции сетевых адресов с egress интерфейсом между LAN и Интернетом. Более подробное объяснение правил match и поддерживаемых ими параметров можно найти в руководстве pf.conf(5).
antispoof quick for { egress $wired $wifi }
block in quick on egress from <martians> to any
block return out quick on egress from any to <martians>
antispoof обеспечивает некоторую защиту от пакетов с поддельными адресами источника. Входящие пакеты следует отбрасывать, если они появляются из списка немаршрутизируемых адресов, определенного ранее. Такие пакеты, вероятно, были отправлены из-за неправильной конфигурации или, возможно, как часть spoofing-атаки. Точно так же клиенты не должны пытаться подключиться к таким адресам. Параметр «return» используется для предотвращения раздражающих timeout'ов для пользователей. Обратите внимание, что это может вызвать проблемы, если сам маршрутизатор также находится за NAT.
block all
Устанавливается политика запрета по умолчанию для всего трафика, что означает, что будут разрешены только входящие и исходящие соединения, которые были явно помещены в набор правил.
pass out quick inet
Разрещен исходящий IPv4 трафик как от самого шлюза, так и от LAN клиентов.
pass in on { $wired $wifi } inet
Разрешен трафик внутри локальной сети (LAN).
pass in on egress inet proto tcp from any to (egress) port { 80 443 } rdr-to 192.168.1.2
Входящие соединения (через TCP-порты 80 и 443 для веб-сервера) будут перенаправляться на компьютер с адресом 192.168.1.2. Это просто пример port forwarding'а.

DNS

Хотя DNS-кэш не требуется для шлюза (gateway system), он является обычным дополнением к нему. Когда клиенты отправляют DNS-запрос, они сначала получают содержание unbound(8) кеша. Если ответа там нет, запрос передается вышестоящему преобразователю. Затем результаты передаются клиенту и кэшируются в течение определенного периода времени, что ускоряет поиск того же адреса в будущем.
# rcctl enable unbound
# vi /var/unbound/etc/unbound.conf
Этот пример должен работать для большинства случаев:
server:
	interface: 192.168.1.1
	interface: 192.168.2.1
	interface: 127.0.0.1
	access-control: 192.168.1.0/24 allow
	access-control: 192.168.2.0/24 allow
	do-not-query-localhost: no
	hide-identity: yes
	hide-version: yes
	prefetch: yes

forward-zone:
        name: "."
        forward-addr: X.X.X.X  # IP для предпочитаемого resolver'а
Дополнительные параметры конфигурации можно найти в руководстве для unbound.conf(5). Исходящие DNS-запросы могут быть зашифрованы при помощи пакета dnscrypt-proxy или при использовании поддерджки DNS over TLS в том же unbound.

Если маршрутизатор должен использовать caching resolver, его /etc/resolv.conf файл должен содержать

nameserver 127.0.0.1

После внесения всех изменений, перезагрузите систему.