Шлюз на OpenBSD 3.6

Полезные советы и программы от пользователей нашего форума.

Модератор: Модераторы разделов

Ответить
zag
Сообщения: 102

Шлюз на OpenBSD 3.6

Сообщение zag »

Почему именно OpenBSD?
- Роутер под 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
Спасибо сказали:
Аватара пользователя
VAVka
Сообщения: 96

Re: Шлюз на OpenBSD 3.6

Сообщение VAVka »

А как насчет фаервола на дискете/флешке?
Есть ли какие рецепты по сборке подобной штуковины своими руками? Про Coyote, fd_router знаю, хотелось бы самому попробовать собрать.
В этом случае приоритет также останется за OpenBSD, или разницы нет: что Linux, что FreeBSD, что OpenBSD? Какое ядро более стабильно с точки зрения функционирования фаервола?

Хотелось бы реализовать примерно следующее:
1. Чтоб запускалось на i486 и >; ОЗУ от 16 Мб; без винта.
2. Возможность исправления путей для логов (вплоть до smb/nfs шар), ограничение их размера.
3. web-admin, ssh.
4. VPN (опционально).
чтоб получилось:
диск 1 - система
диск 2 - для логов (опционально).

Вобщем, требования нехитрые.

Весьма смутно представляю себе как собрать подобное. Хотя, общий ход процесса в голове вертиться: конфигурим ядро, подбираем софт, делаем ему пред-настройку, настраиваем inittab и Ко, заворачиваем все (кроме ядра) в tar.gz, делаем mkinitrd, настраиваем лило на загрузку в рамдиск с подготовленным initrd, делам загрузочную дискету и все сливаем на нее.
Оно? :blink:
С уважением, VAVka (VAVka pagе)

NimbleX 200 Mb USB Edition (krnl 2.6.24/2.4.22)
{XOrg 1.4.0/IceWM 1.2.35}
Спасибо сказали:
zag
Сообщения: 102

Re: Шлюз на OpenBSD 3.6

Сообщение zag »

А как насчет фаервола на дискете/флешке?
Этот вопрос поднимался на форуме, да и в интернете есть много статей, вроде этой http://www.dreamcatcher.ru/docs/usb.html
или вот http://www.nag.ru/2004/1208/1208.shtml
Compact Flash шлюз на базе FreeBSD.

Непрерывное развитие науки и техники, восхищение продукцией cisco systems и сбои жестких дисков на серверах стимулируют творческий поиск, в частности, в плане применения новых технологий устройств хранения данных.

Иными словами, возникает потребность собрать и настроить Unix шлюз с использованием твердотельной памяти, например Compact Flash (ATA совместимой). С аппаратной частью все понятно – устанавливается переходник IDE-CF (например, описанный на www.openhardware.ru) к которому с одной стороны подключается карта памяти, а с другой IDE шлейф.

Предварительная теоретическая подготовка (собственные размышления и чтение документации в интернет) ставит перед нами главные вопросы: как разместить операционную систему в малом объеме и как адаптировать ее к особенностям носителя (ограниченность циклов записи и прочее). Попробуем найти на них ответы на практике.

Установка с компакт диска.

В случае наличия карты Compact Flash большого объема (128 Mb и более) можно произвести установку FreeBSD с дистрибутивного компакт диска в обычном режиме. Учитывая ограниченное число операций записи на носитель, заранее отказываемся от использования раздела подкачки (swap) и создаем только один корневой раздел. Тип установки выбираем "minimal" или "custom" с максимальными ограничениями.

Основная идея использования твердотельной памяти заключается в подключении ее в режиме "только чтение". Однако операционной системе FreeBSD при старте необходимо иметь возможность записи в директории /dev, /var, /tmp . Поэтому данные директории создаются в оперативной памяти (memory filesystems), что обеспечивается использованием скрипта бездисковой загрузки rc.diskless2.

В итоге постустановочная настройка заключается в редактировании стартового скрипта:

/etc/rc.conf

diskless_mount=/etc/rc.diskless2 varsize=1000 tmpsize=1000

и перевода режима доступа к носителю в read-only с отключением проверок:

/etc/fstab

/dev/ad0s1a / ufs ro 0 0

В принципе этого достаточно, так как ядро GENERIC, устанавливаемое по умолчанию, содержит все минимально необходимое для работы в такой конфигурации:

options MFS
options MD_ROOT
pseudo-device md

Дополнительный тюнинг может заключаться в выборочном отключении периодических скриптов (в /etc/periodic) и лишнего в cron.

В случае необходимости записи на носитель (например при редактировании конфигурации) всегда можно перемонтировать корневой раздел в режиме записи:

# mount –uw /

и обратно:

# mount –ur /

Сборка собственного дистрибутива.

Несмотря на ошеломляющую простоту вышеописанного способа наиболее предпочтительно все-таки подготовить собственный дистрибутив операционной системы. Это позволит добиться максимальной адаптированности в минимальном объеме.

Для дальнейшей работы необходима уже установленная базовая система FreeBSD, к которой подключается Compact Flash. Разбить и отформатировать Compact Flash проще всего, используя /stand/sysinstall, хотя ничто не мешает это сделать вручную (fdisk, disklabel).

Сборка дистрибутива предполагает наличие дерева исходных текстов (/usr/src), которое можно установить с компакт диска или воспользовавшись cvsup.

Очень важно подготовить /etc/make.conf (взять копию /etc/defaults/make.conf), в котором нужно указать необходимые для сборки опции и, самое главное, отключить сборку лишнего, например так:

/etc/make.conf

CPUTYPE=i686
CFLAGS= -O –pipe
COPTFLAGS= -O –pipe
NOPROFILE= true

NO_CVS= true # do not build CVS
NO_FORTRAN= true # do not build g77 and related libraries
NO_I4B= true # do not build isdn4bsd package
NO_LPR= true # do not build lpr and related programs
NO_MODULES= true # do not build modules with the kernel
NO_OBJC= true # do not build Objective C support
NO_SHAREDOCS= true # do not build the 4.4BSD legacy docs
NO_X= true # do not compile in XWindows support (e.g. doscmd)
NOGAMES= true # do not build games (games/ subdir)
NOINFO= true # do not make or install info files
NOLIBC_R= true # do not build libc_r (re-entrant version of libc)
NOMAN= true # do not build manual pages
NOPERL= true # do not build perl. Disables OpenSSL optimizations
NOSHARE= true # do not go into the share subdir
NOUUCP= true # do not build uucp related programs

Подготовим конфигурацию будущего ядра (назвав его /usr/src/sys/i386/conf/CF например). В дополнение к стандартным опциям отключим использование подкачки вообще:
options MFS
options MD_ROOT
options NO_SWAPPING
pseudo-device md

Монтируем Compact Flash раздел и проводим сборку и установку нового дистрибутива (в принципе аналогично стандартному обновлению системы, только DESTDIR другой):

# mount /dev/ad3s1a /CF

# cd /usr/src

# make buildworld
# make buildkernel KERNCONF=CF
# make DESTDIR=/CF hierarchy
# make DESTDIR=/CF install
# make DESTDIR=/CF installkernel KERNCONF=MY

Теперь необходимо сгенерировать /etc. Это можно сделать через mergemaster:

# mergemaster -D /CF -i

или так:

# cd /usr/src/etc
# make DESTDIR=/CF distribution

Далее создаем файлы устройств:

# cd /CF/dev
# sh MAKEDEV all

И, наконец, выполняем описанные в первом методе установки процедуры (внесение изменений в /etc/fstab и /etc/rc.conf) касающиеся подключения носителя в режиме read-only.

Установив в дальнейшем zebrу или quaggу получаем cisco-like роутер повышенной надежности на основе FreeBSD.

Ссылки.

http:// www.openhardware.ru
http://www.freebsd.org/doc/en_US.ISO8859-1...es/solid-state/


zag добавил в 21.06.2005 10:44

Вообще-то по поводу роутера на флешке могу сказать одно - извращение это. Дешевле и проще купить простенький аппаратный. Т.к. нужна загрузка с флеш, особо древняя мать не пойдет, +проц, +память, +корпус какой-никакой. + сама флешка.
IMHO овчинка выделки не стоит :devil_2:
Спасибо сказали:
Ответить