[ comp1 ] ---+ | [ comp2 ] ---+--- [ switch ] --- em1 [ OpenBSD ] em0 --- [ internet ] | athn0 [ comp3 ] ---+ ))))) ((((( [ comp4 ]Имена интерфейсов
em0
, em1
и athn0
следует при необходимости заменить.
# 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. Если необходима поддержка старых (небезопасных) протоколов, они могут быть добавленны.
# 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-сервер, настройка которого рассматривается далее.
# 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 lo0PF позволяет устанавливать определенные 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'а.
# 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
После внесения всех изменений, перезагрузите систему.