> >
>
> > > >
> > > >
>
>
>
>
>
>
alterworld.ru - информационный тематический блог
>
> > >
>
>
>
>
>

>
  
> > >
>

Unix → 2 канала на ОС FreeBSD



Недавно столкнулся с проблемой, настройка двух каналов в интернет на ОС FreeBSD
Ничего абсолютно сложного не предполагалось, но все же пришлось не много почитать документацию.

Собственно задача:

1. создать шлюз с двумя выходами в интернет, один основной, другой резервный.
2. минимизировать участие человека в смене на бек канал.

Инструменты:

ОС FreeBSD 6.x , PF, perl

Решение:

FreeBSD был поставлен с минимальной установкой, единственное изменение, которое нужно сделать
это добавить в ядро модуль PF. Делается это все не сложно.

cp /usr/src/sys/i386/conf/GENERIC /usr/src/sys/i386/conf/PF
ee /usr/src/sys/i386/conf/PF

добавляем строчки:
# PF

device pf
device pflog
device pfsync

# ALTQ

options ALTQ
options ALTQ_CBQ
options ALTQ_RED
options ALTQ_RIO
options ALTQ_HFSC
options ALTQ_PRIQ
options ALTQ_NOPCC

Далее нужно сохранить и пересобрать ядро:

cd /usr/src
make buildkernel KERNCONF=PF
make installkernel KERNKONF=PF
reboot

После загрузки системы нужно подправить /etc/rc.conf
Добавить следующее:

gateway_enable="YES"
pf_enable="YES"                 # Включить PF (загрузить модуль если необходимо)
pf_rules="/etc/pf.conf"         # определение правил для pf
pf_flags=""                     # дополнительные флаги для запуска pfctl
pflog_enable="YES"              # запустить pflogd(8)
pflog_logfile="/var/log/pflog"  # где pflogd должен сохранять протокол
pflog_flags=""                  # дополнительные флаги для запуска pflogd

сохраняем.

далее нужно прописать правила для PF:

ee /etc/pf.conf

# Main Setting

ext_if_1="rl0"                  # IPS_1 - интерфейс первого канала
ext_if_2="rl1"                  # IPS_2 - интерфейс второго канал
int_if="ae0"                    # lan - интерфейс внутренний сети
lo="lo0"                        # loopback

int_net="172.21.0.0/16"         # LAN NETWORK
ext_addr_1="222.0.0.2"      
# IPS_1 wan
ext_addr_2="223.0.0.2"
# IPS_2 wan
int_addr="172.21.0.1"           # LAN IP

gw_1="222.0.0.1"         # IPS_1 gw
gw_2="223.0.0.1"
       # IPS_2 gw


# services

tcp_svc="ssh" - разрешенные порты на внешних интерфейсах.

#log - логирование пакетов

set loginterface ae0
set loginterface rl0
set loginterface rl1

# skip iface - не фильтровать loopback,
# многие сервисы используют данный интерфейс под системные вещи.

set skip on lo0


# scrub
scrub in all

# NAT
# Натируем внешние интерфейсы

nat on $ext_if_1 inet from !(self) -> ($ext_if_1:0) # IPS_1 nat
nat on $ext_if_2 inet from !(self) -> ($ext_if_2:0) # IPS_2 nat


# BLOCK ALL
# первоночально необходимо заблокировать весь входящий трафик

block in

# antispoof
antispoof quick for $int_if


# ICMP
# разрешаем icmp на внешних интерфейсах и маршрутизирем их по свои шлюзам
# чтобы не возникло ситуации пингуем один внешний адрес, а ответ идет по второму шлюзу.

# IPS_1
pass in on $ext_if_1 reply-to ($ext_if_1 $gw_1) inet proto icmp to ($ext_if_1) tag EXT_IF_A icmp-type echoreq code 0
pass in on $ext_if_1 inet proto icmp from ($ext_if_1:network) to ($ext_if_1) icmp-type echoreq code 0

# IPS_2
pass in on $ext_if_2 reply-to ($ext_if_2 $gw_2) inet proto icmp to ($ext_if_2) tag EXT_IF_B icmp-type echoreq code 0
pass in on $ext_if_2 inet proto icmp from ($ext_if_2:network) to ($ext_if_2) icmp-type echoreq code 0

# allow tcp ports
# разрешаем на внешних интерфейсах сервисы и маршрутизирем их, выше у нас разрешен только ssh
# для udp аналогичная запись за изменением только proto tcp на proto udp

# IPS_1
pass in on $ext_if_1 reply-to ($ext_if_1 $gw_1) inet proto tcp to ($ext_if_1) port { $tcp_svc }
pass in on $ext_if_1 inet proto tcp from ($ext_if_1:network) to ($ext_if_1) port { $tcp_svc }

# IPS_2
pass in on $ext_if_2 reply-to ($ext_if_2 $gw_2) inet proto tcp to ($ext_if_2) port { $tcp_svc }
pass in on $ext_if_2 inet proto tcp from ($ext_if_2:network) to ($ext_if_2) port { $tcp_svc }

# INCOMING ROUTE
# маршрутизирем весь входящий трафик, под условием, если пришел на тот то интерфейс,
# то отправить необходимо ответ с того-то шлюза
# плюс проставляем теги. Теги помогут нам корректно пробрасывать порты,
# допустим у нас есть терминал сервер, пробросить можно следующим образом
# rdr on $ext_if_2 proto tcp from any to $ext_addr_2 port 3389    tag EXT_IF_B -> 172.21.0.1      port 3389
# rdr on $ext_if_1 proto tcp from any to $ext_addr_1 port 3389    tag EXT_IF_A -> 172.21.0.1      port 3389

# IPS_1
pass in quick from ($ext_if_1:network) tagged EXT_IF_A keep state
pass in quick reply-to ($ext_if_1 $gw_1) tagged EXT_IF_A keep state

# IPS_2
pass in quick from ($ext_if_2:network) tagged EXT_IF_B keep state
pass in quick reply-to ($ext_if_2 $gw_2) tagged EXT_IF_B keep state

# FIREWALL
# разрешаем все во внутреннем пространстве шлюза
pass out inet from (self:network)
pass in inet proto icmp to (self:network)

# LOCAL NETWORK
# Разрешаем весь трафик на выход из локальной сети
pass quick on $int_if

# OUTGOING ROUTE
# Маршрутизирем исходящий трафик

pass out route-to ($ext_if_1 $gw_1) inet from ($ext_if_1) keep state
pass out route-to ($ext_if_2 $gw_2) inet from ($ext_if_2) keep state

pass out inet from { $ext_if_1 $ext_if_2 } to (self:network)

 

Этих правил достаточно чтобы обеспечить хождение по двум каналам, с правильной маршрутизацией.
В подробности впадать не буду, если захотите посмотреть, что означает каждое правило, то почитайте документацию к PF.

Далее, необходимо в rc.conf добавить основной шлюз:

ee /etc/rc.conf

defaultrouter="222.0.0.1"

сохраняем.

Далее нужно поставить пакетик для перла NET_PING:

cd /usr/ports/net/p5-Net-Ping
make install

Далле пишем сам скрипт для переключения каналов в случае падение основного, и обратно в случае поднятия.

Сохраняем скрипт, делаем его исполняемым, и закидываем в крон на исполнение раз в минуту.

Все. Перезагружаемся и у Вас все должно работать.



меткиPF FreeBSD
>

Комментарии:

 captcha
Текст


DrVirus 2009-08-13 11:59:04
А как быть в случае, когда резервный канал использует VPN для выхода в интернет?
Igor 2009-08-14 07:22:47
а в чем загвоздка, если на резервном канале еще и впн крутится? сделайте маршрутизацию: pass in quick on $int_if route-to ($ext_if_2 $gw_2) inet from 172.21.0.0/24 to $VPN_POOL keep state и после этого все пакеты от Лан сети до впн адресов пойдет через верный шлюз.
dllas 2009-09-21 21:24:25
В принципе аналогичная конфигурация, основной VPN-безлимит, резервный-помегабайтный, основным шлюз идет безлимит, все что нужно из инета на нем видно, на втором, не получается отправка пакетов на том же интерфейсе на котором приходят, при пингах видно, что ответы высылаются, на оба внешних интерфейсах, www отрабатывает хорошо, ftp не открывает непривилегированные порты (т.е. ответы уходят по дефолтному пути), при сканировании тож лотерея получается, ответы могут уйти по нужному (резервному), а в основном возвращаются по дефолтному, при смене defaultroute на резервный, мегабайтный канал работает как положено
Igor 2009-09-22 07:50:47
dllas: А вы точно тегируете пакеты при входе? Очень похоже что вы могли пропустить это: pass in quick from ($ext_if_1:network) tagged EXT_IF_A keep state tagged - маркирует пакет, откуда он пришел, и соответственно обратно его отправить нужно по тегу в нужный путь.
>
2010-04-30 14:45:20
Автоматическое бекапирование конфига
Для автоматического бекапирование в cisco есть прекрасная функция archive. В ней можно настроить когда нужно производить бекап, можно по временному ...
Отобразить полное содержание сообщения
>
2010-04-14 10:52:34
В чем заключается работа маршрутизатора?
Обычно, работа маршрутизатора состоит в определении адреса объекта, указанного в общем множестве данных и фиксирует по таблице маршрутизации путь, по ...
Отобразить полное содержание сообщения
>

Статьи

TOP 10 Статей
> > >
>
Alterworld Group © 2008-2010 Все права защищены. >
>
>
> > >
>
>
>
Новости Статьи О проекте Контакты Главная Поиск Послать сообщение Главная Главная