- Роутер под OpenBSD работает на 15% быстрее роутеров под Линукс или FreeBSD
- Это наиболее защищенная операционная система в мире.
1. Установка системы
- англ http://www.openbsd.org/faq/faq4.html
- рус http://tr.openbsd.ru/faq/ru/faq4.html
2. Настройка
2.1) Сменим шелл.
По умолчанию шелл у рута csh, что для меня, например, неудобно. Сменим его на ksh
#vipw
2.2) настроим сетевые интерфейсы
Посмотрим, какие сетевые у нас имеются
Код: Выделить всё
# ifconfig -a
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 33224
inet 127.0.0.1 netmask 0xff000000
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x6
rl0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
address: 00:c0:26:a7:e4:eb
media: Ethernet autoselect (100baseTX full-duplex)
status: active
inet 10.1.1.18 netmask 0xff000000 broadcast 10.255.255.255
inet6 fe80::2c0:26ff:fea7:e4eb%rl0 prefixlen 64 scopeid 0x1
rl1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
address: 00:c0:df:09:c8:b0
media: Ethernet autoselect (100baseTX full-duplex)
status: active
inet 192.168.1.1 netmask 0xffffff00 broadcast 192.168.1.255
inet6 fe80::2c0:dfff:fe09:c8b0%rl1 prefixlen 64 scopeid 0x2
pflog0: flags=141<UP,RUNNING,PROMISC> mtu 33224
pfsync0: flags=0<> mtu 2020
enc0: flags=0<> mtu 1536
Настройки сетевых интерфейсов можно посмотреть (изменить) здесь
# cat /etc/hostname.rl0
inet 10.0.0.38 255.255.255.0 NONE
# cat /etc/hostname.rl1
inet 10.0.0.38 255.255.255.0 NONE
Если сетевая карта получает ip-адрес от dhcp-сервера,
# echo dhcp > /etc/hostname.rl0
Создайте файл /etc/resolv.conf. где укажите DNS-серверы
Код: Выделить всё
# cat /etc/resolv.conf
search example.com
nameserver 125.2.3.4
nameserver 125.2.3.5
lookup file bind
Перезагрузите сетевые службы
# sh /etc/netstart
2.3) Теперь перейдем к настройке шлюза.
2.3.1. Включение форвардинга пакетов.
Ядро OpenBSD по умолчанию собрано с поддержкой форвардинга пакетов. Нам лишь достаточно включить его в файле /etc/sysctl.conf. Раскомментируем строку
net.inet.ip.forwarding=1
2.3.2. Включение фильтрации пакетов и настройка pf.
рус http://www.opennet.ru/base/net/pf_faq.txt.html
http://www.dreamcatcher.ru//docs/pf.html
англ http://www.openbsd.org/faq/pf/index.html
Активация:
Для активизации и чтения правил конфигурации pf при начальной загрузке, необходимо в /etc/rc.conf.local прописать следующее:
pf=YES
Вообще-то все глобальные настройки осуществляются в файле /etc/rc.conf, но лучше его не трогать, а вносить изменения в /etc/rc.conf.local, который имеет более высокий приоритет.
Для вступления изменений в силу, необходимо перезагрузить систему. Активизировать и остановить pf можно используя программу pfctl
# pfctl-e
# pfctl-d
для запуска и останова соответственно.
Обратите внимание, что загрузка правил при этом не производится, их необходимо подгружать отдельно, до или после запуска pf.
# pfctl -f /etc/pf.conf
Конфигурация:
pf читает правила конфигурации из файла /etc/pf.conf во время загрузки, когда выполняются rc.scripts. Обратите внимание, что /etc/pf.conf - название по умолчанию и он представляет собой просто текстовый файл, содержащий наборы правил, загружаемые и интерпретируемые pfctl и вставляемые в pf. Для некоторых приложений наборы правил могут располагаться в других файлах и подгружаться после загрузки системы. Как и другие приложения UNIX, pf обладает большой гибкостью.
Обратите внимание, что каждый пакет оценивается набором правил сверху вниз. По умолчанию, пакет отмечен для прохода, что может быть изменено в соответствии с любым правилом, и это может произойти несколько раз до конца списка правил. Последнее подходящее правило "побеждает". Есть одно исключение: использование ключевого слова quick, которое отменяет любую дальнейшую обработку пакета и осуществляет указанное в правиле действие над пакетом.
Посмотрим на пару примеров:
block in on fxp0 proto tcp from any to any port ssh
pass in all
В этом случае блокирующее правило будет оценено, но никогда применяться не будет, так как следующее правило разрешает любой трафик.
block in quick on fxp0 proto tcp from any to any port ssh
pass in all
Эти првила оцениваются по другому, так как блокирующее правило указано с параметром quick, что приведет к блокировке и прекращению обработки пакета, пришедшего на порт ssh. Весь остальной трафик будет пропущен.
Управление:
После начальной загрузки управление pf может осуществляться через
программу pfctl. Вот несколько примеров:
# pfctl -f /etc/pf.conf загрузить pf.conf
# pfctl -nf /etc/pf.conf анализировать файл, но не загружать
# pfctl -Nf /etc/pf.conf загрузить только правила NAT из файла
# pfctl -Rf /etc/pf.conf загрузить только правила фильтрации
# pfctl -sn показать текущие правила NAT
# pfctl -sr показать текущие правила фильтрации
# pfctl -ss показать текущее состояние таблиц
# pfctl -si показать статистику правил и состояние счетчиков
# pfctl -sa показать все
Для полного списка команд смотрите man pfctl
Пример правил фильтрации:
Ниже - пример фильтрующих правил. Сервер с запущенным pf действует как система сетевой защиты между маленькой внутренней сетью и Internet. Показаны только фильтрующие правила: правила queueing, nat, rdr и т.д. в этом примере пропущены.
------------------------------------------------------------------------------
Код: Выделить всё
ext_if = "fxp0"
int_if = "dc0"
lan_net = "192.168.0.0/24"
# scrub incoming packets
scrub in all
# setup a default deny policy
block in all
block out all
# pass traffic on the loopback interface in either direction
pass quick on lo0 all
# activate spoofing protection for the internal interface.
antispoof quick for $int_if inet
# only allow ssh connections from the local network if it's from the
# trusted computer, 192.168.0.15. use "block return" so that a TCP RST is
# sent to close blocked connections right away. use "quick" so that this
# rule is not overridden by the "pass" rules below.
block return in quick on $int_if proto tcp from ! 192.168.0.15 \
to $int_if port ssh flags S/SA
# pass all traffic to and from the local network
pass in on $int_if from $lan_net to any
pass out on $int_if from any to $lan_net
# pass tcp, udp, and icmp out on the external (Internet) interface.
# keep state on udp and icmp and modulate state on tcp.
pass out on $ext_if proto tcp all modulate state flags S/SA
pass out on $ext_if proto { udp, icmp } all keep state
# allow ssh connections in on the external interface as long as they're
# NOT destined for the firewall (i.e., they're destined for a machine on
# the local network). log the initial packet so that we can later tell
# who is trying to connect. use the tcp syn proxy to proxy the connection.
pass in log on $ext_if proto tcp from any to { !$ext_if, !$int_if } \
port ssh flags S/SA synproxy state
2.3.3. Настройка NAT.
Введение:
Трансляция Сетевого адреса (NAT) - "сворачивание" локальной сети к единственному IP адресу. NAT необходим, когда количество IP адресов, выделенных Вам Вашим провайдером меньше чем общее количество компьютеров, для которых Вы желаете обеспечить доступ Internet. NAT описан в RFC 1631.
Конфигурирование NAT: http://www.openbsd.org/faq/pf/nat.html
Полный формат правила NAT выглядит следующим образом:
nat [pass] on interface [af] from src_addr [port src_port] to \
dst_addr [port dst_port] -> ext_addr [pool_type] [static-port]
- nat
Ключевое слово, которое начинает правило NAT
- pass
Транслировать пакеты, полностью обходя правила фильтрации
- interface
Имя сетевого интерфейса, на который будут транслироваться пакеты
- af
Семейство адреса пакета, или inet для IPv4 или inet6 для IPv6. PF обычно способен определить этот параметр, анализируя источник и/или адрес назначения.
- src_addr
Внутренний адрес пакетов, которые будут оттранслированы.
- src_port
Исходный порт.
- dst_addr
Адрес назначения пакетов, которые будут оттранслированы. Адрес назначения имеет те же параметры, что и исходный адрес.
- dst_port
Порт адресата. Параметры такие же как и в src_port.
- ext_addr
Внешний адрес NAT роутера, к которому будут оттранслированы пакеты.
- pool_type
Определяет тип пула адреса, используемый для трансляции.
- static-port
Говорит PF не транслировать исходный порт в TCP и UDP пакетах.
Пример:
nat on tl0 from 192.168.1.0/24 to any -> 24.5.0.5
Это правило подразумевает то, что на интерфейсе tl0 применяется NAT к любым пакетам, исходящих из сети 192.168.1.0/24 и исходный адрес заменяется на IP 24.5.0.5.
В то время как вышеупомянутое правило правильно, такая форма записи не рекомендуется. Обслуживание таких правил будет затруднено, так как любое изменение внешних или внутренних сетевых адресов будет требовать изменение всех правил в списке. Сравниете с этой записью (tl0 является внешним, dc0 внутренним):
nat on tl0 from dc0/24 to any -> tl0
Если Вы используете протокол DHCP, чтобы конфигурировать ваш внешний интерфейс, это может быть проблемой. Так как адрес, назначенный интерфейсу может измениться, а в правилах останется старый адрес, пакеты клиентских машин будут уходить в никуда. Чтобы обойти это, Вы можете сказать PF автоматически модифицировать адрес трансляции, помещая имя интерфейса в круглые скобки.
nat on tl0 from dc0/24 to any -> (tl0)
Не забываем, что в /etc/pf.conf правила для NAT должны быть перед правилами фильтрации.
---------------------------------------------------------------------------------------------
Пример настройки шлюза
[ COMP1 ] [ COMP3/WWW-server ]
|
---+------+-----+-------------- fxp0 [ OpenBSD ] ep0 -------- ( Internet )
|
[ COMP2 ]
----------------------------------------------------------------------------------------------
/etc/pf.conf
Код: Выделить всё
int_if = "fxp0"
ext_if = "ep0"
tcp_services = "{ 22, 113 }"
icmp_types = "echoreq"
priv_nets = "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8 }"
comp3 = "192.168.0.3"
# options
set block-policy return
set loginterface $ext_if
# scrub
scrub in all
# nat/rdr
nat on $ext_if from $int_if:network to any -> ($ext_if)
rdr on $int_if proto tcp from any to any port 21 -> 127.0.0.1 \
port 8021
rdr on $ext_if proto tcp from any to any port 80 -> $comp3
# filter rules
block all
pass quick on lo0 all
block drop in quick on $ext_if from $priv_nets to any
block drop out quick on $ext_if from any to $priv_nets
pass in on $ext_if inet proto tcp from any to ($ext_if) \
port $tcp_services flags S/SA keep state
pass in on $ext_if proto tcp from any to $comp3 port 80 \
flags S/SA synproxy state
pass in on $ext_if inet proto tcp from port 20 to ($ext_if) \
user proxy flags S/SA keep state
pass in inet proto icmp all icmp-type $icmp_types keep state
pass in on $int_if from $int_if:network to any keep state
pass out on $int_if from any to $int_if:network keep state
pass out on $ext_if proto tcp all modulate state flags S/SA
pass out on $ext_if proto { udp, icmp } all keep state
----------------------------------------------------------------------------------------
Подробно: http://www.openbsd.org/faq/pf/example1.html