Меню

Freebsd настройка шлюза на 2 провайдера



Настройка 2 интернет каналов и больше с помощью pf в ОС 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

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:

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

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
# первоночально необходимо заблокировать весь входящий трафик

# 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

# 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

# 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 добавить основной шлюз:

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

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

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

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

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

use strict;
use warnings;
use Net::Ping;

# 1 — автоматический режим переключение канала
# 2 — принудительное переключение на второй канал.

my $action = 1;
my $p = Net::Ping->new(«icmp»);
my $host_gw = «222.0.0.1»; # default gw
my $gw = «223.0.0.1»;
my $now = localtime time;

Источник

Шлюз в интернет на FreeBSD за полчаса

Допустим у нас встала задача быстро развернуть шлюз да выхода в интернет небольшой сети (домашней или небольшого офиса) . Фактически задача сводится к установке операционной системы и развёртывании DHCP, DNS и NAT. Далее будет показано как можно быстро и легко решить эту задачу используя ОС FreeBSD 8.0.

Для начала нужно установить ОС на сервер. Ставить систему можно даже с bootonly CD докачивая необходимое по сети. Нужно поставить только самый минимум. Допустим что у сервера два интерфейса: le0, который «смотрит» в интернет и em0, к которому подключена локальная сеть. В локальной сети мы будем использовать пространство 172.31.255.0/24, причём первый адрес (172.31.255.1) будет использоваться сервером.

Первым делом нужно добавить в файл /etc/rc.conf строку:

Эта строка при загрузке сервера разрешает пересылку IP-пакетов. Без неё не возможно использование сервера в качестве маршрутизатора. Чтобы это изменение вступило в силу до перезагрузки нужно выполнить команду:

Следующим шагом сконфигурируем DNS. Сначала нужно в файле /etc/namedb/named.conf заменить строку:

После этого разрешим запуск DNS-сервера добавив в /etc/rc.conf строку:

И запустим сервис:

Проверить работу DNS-сервера можно командой:

В случае нормальной работы DNS вывод должен выглядеть примерно вот так:

Обновляем дерево портов:

Затем установим DHCP-сервер:

Далее создадим файл /usr/local/etc/dhcpd.conf следующего содержания:

Конфигурация DHCP-сервера более подробно уже была рассмотрена ранее и сейчас останавливаться на ней мы не будем. Для запуска DHCP-сервера нужно добавить в /etc/rc.conf строки:

Теперь осталось только настроить пакетный фильтр. Из всего многообразия оных во FreeBSD выберем pf. Создадим файл /etc/pf.rules следующего содержания:

Добавляем в /etc/rc.conf строки:

Запускаем пакетный фильтр:

Теперь компьютеры в локальной сети смогут получать сетевые настройки по DHCP и спокойно выходить в сеть. На этом всё. Приятной работы!

Источник

Freebsd настройка шлюза на 2 провайдера

Компьютер под FreeBSD5.4
Сетевые адаптеры:
fxp1: 10.200.10.36:255.255.255.0
fxp2: 192.168.0.1:255.255.255.0

Ядро скомпилировано GENERIC + опции
options BRIDGE
options IPDIVERT
options IPFIREWALL
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT=10
options IPFIREWALL_FORWARD
options IPFIREWALL_FORWARD_EXTENDED # на всякий пожарный
device pf
device pflog
device pfsync

Сеть провайдера: 10.0.0.0:255.0.0.0
10.200.10.1 — gateway для моего сегмента
10.200.4.1 — VPN сервер
10.200.4.100 — Сервер с расшаренными по «Netbios over TCP/IP» папками с видеофильмами

Моя маленькая сеть 192.168.0.0:255.255.255.0
192.168.0.2 — Web, FTP, POP3, SMTP сервер
192.168.0.11 — рабочая станция 1
192.168.0.12 — рабочая станция 2

1) Настроил ipfw для хождения с 192.168.0.11 на 10.200.4.100 через natd работает и сейчас. Затем настроил шлюз для хождения с 192.168.0.11 на 10.200.4.100, но на этот раз в качестве NAT выступал PF.

В pf.conf для этого я добавил только одну строку
nat on fxp1 from 192.168.0.0/24 to 10.0.0.0/8 -> (fxp1)

Работает, но ping -l 2000 10.200.4.100 работает только при NAT=natd, а при pf такой пинг не проходит. Ну и с natd соответственно файлы копируются с сервера на рабочую станцию 3-4 минуты, а с pf 9-10 минут. Для pf «магическая» длина пакета оказалась 1472 (мог соврать +/- 3, точно не помню)
При этом правило ipfw для nat выглядело вот так:
$ add 500 divert natd all from any to any via fxp1

Читайте также:  Под какими логинами можно редактировать настройки счетчика

А для pf я такого не писал. Может как то тоже через divert передавать в pf. Или в pf.conf еще каких параметров надо добавить чтобы он пропускал пакеты до 25000 длиной?

PS использовать PF в качестве одного единственного файрвола пока не хочу, ибо пока я в нем совсем новичек.

2) Вот по этой статье
http://www.opennet.ru/base/net/pptp_client.txt.html
Добавил в ppp.conf секцию vpn со всеми описанными строками без изменений, за исключением пароля и логина. Установил пакет pptp
Затем прописал в /etc/rc.d/*NETWORKING
route add -host 10.200.4.1 10.200.10.1
route add -net 10.0.0.0 10.200.10.1
/usr/local/sbin/pptp 10.200.4.1 vpn &

В resolv.conf DNS провайдера записан

При загрузке все вроде идет без ошибок до появления приглашения login(ttyv0):
проходит пара секунд и появляется сообщение:
ppp[303]: tun0: Error: rt_Set: Cannot add a route with gateway 0.0.0.0

После чего интернет работает, но все попытки пропинговать интернет хосты проваливаются со 100% потерей. При просмотре счетчиков ipfw выяснилось что все пинги на интернет почемуто идут просто на fxp1, а не на tun0.

В случае с PPTP я организую второй NAT на PF
nat on tun0 from 192.168.0.0/24 to !10.0.0.0/8 -> (tun0)

Хочется добить icmp на интернет

Последняя непристойность: после всех перезагрузок и настроек появились файлы pptp.core в корне и в папке /root — это нормально при shutdown -r now ?

В логах ppp просто куча сообщений:
15:00:04 ppp[303]: tun0: CPP: DeflateInput: Seq error: Got 110, expected 108
15:00:04 ppp[303]: tun0: CPP: deflink: SendResetReq(116) state = Openned
15:00:04 ppp[303]: tun0: CPP: deflink: RecvResetReq(116) state = Openned
15:00:04 ppp[303]: tun0: CPP: deflate: Input channel reset
15:00:08 ppp[303]: tun0: CPP: DeflateInput: Seq error: Got 83, expected 81
15:00:08 ppp[303]: tun0: CPP: deflink: SendResetReq(117) state = Openned
15:00:08 ppp[303]: tun0: CPP: deflink: RecvResetReq(117) state = Openned
15:00:08 ppp[303]: tun0: CPP: deflate: Input channel reset
15:00:11 ppp[303]: tun0: CPP: DeflateInput: Seq error: Got 157, expected 156
15:00:11 ppp[303]: tun0: CPP: deflink: SendResetReq(118) state = Openned
15:00:11 ppp[303]: tun0: CPP: deflink: RecvResetReq(118) state = Openned
15:00:11 ppp[303]: tun0: CPP: deflate: Input channel reset

Прошу помощи. Спасибо что не поленились дочитать. 🙂

Высказать мнение | Ответить | Правка | Cообщить модератору

Оглавление

  • Настройка шлюза FreeBSD между двумя локалками и интернетом ч. , KlounAda, 04:18 , 12-Июл-06, (1)
    • Настройка шлюза FreeBSD между двумя локалками и интернетом ч. , MaximKat, 15:02 , 12-Июл-06, (2)
    • Настройка шлюза FreeBSD между двумя локалками и интернетом ч. , sedfom, 16:51 , 12-Июл-06, (3)
      • Настройка шлюза FreeBSD между двумя локалками и интернетом ч. , Johnrea, 12:24 , 09-Окт-08, (4)

Сообщения по теме [Сортировка по времени | RSS]

АЙ.. не дочитал 🙂 Задачу твою нихрена не понял.

«PS использовать PF в качестве одного единственного файрвола пока не хочу, ибо пока я в нем совсем новичек.» — а стОит!

Советы:
1. Выкить IPFW, используйю PF. И вообще, как ты два фаерволла собрался одновременно юзать?
2. В PF можеш прописывать НАТы хоть сотню, не надо никаких дивертов, т.е. можно отдельные адреса выпукать на отдельные адреса и ваще как угодно

Краткий пример:
В ядре
option altq
device pf
device pflog
device pfsync
и на компиляцию.

nat on $ext_if from 192.168.0.11 to 10.200.4.100 -> $ext_if # НАТиш один одрес на один адрес
nat on $ext_if from <192.168.0.1 192.168.0.5>to 195.184.14/24 -> $ext_if #НАТиш два внутренних адреса на какую-то подсеть
nat on $ext_if proto tcp from 192.168.0/24 to any port <25 110>-> $ext_if # Выпускаешь всю сеть наружу по портам 25 и 110 — почту забирать
nat on $ext_if proto icmp from 192.168.0/24 to any -> $ext_if #Выпускаешь пинги

и т.д. хоть сотни НАТов

.
block in all
block out all

pass out from $ext_ip to any keep state

pass in from $int_net to $int_net
pass out from $int_net to $int_net
или pass on $int_if from any to any

.
для PPPoE
pass on tun0 from any to any

Если будут вопросы пиши мне на мыло, вышлю рабочие конфиги и нормальный хелп по ПФ

1. «Настройка шлюза FreeBSD между двумя локалками и интернетом ч. «
Сообщение от KlounAda (??) on 12-Июл-06, 04:18
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. «Настройка шлюза FreeBSD между двумя локалками и интернетом ч. «
Сообщение от MaximKat (ok) on 12-Июл-06, 15:02

>Если будут вопросы пиши мне на мыло, вышлю рабочие конфиги и нормальный
>хелп по ПФ

Можешь мне выслать? Заодно поделись опытом как считать трафик? (по клиентам) Вроде встретил упоминания что IPA работает c PF но на оффсайте об этом ни слова 🙁

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. «Настройка шлюза FreeBSD между двумя локалками и интернетом ч. «
Сообщение от sedfom (ok) on 12-Июл-06, 16:51

>АЙ.. не дочитал 🙂 Задачу твою нихрена не понял.
>
>»PS использовать PF в качестве одного единственного файрвола пока не хочу, ибо
>пока я в нем совсем новичек.» — а стОит!
>

Есть сеть вот такой структуры:

Картинка не моя, но структура у меня такая же.

Напишите работоспособный конфиг для PF который позволит:

1) Натить мою локалку — если смотреть на этот рисунок, то 10.0.0.0/8 в любой сегмент локалки 192.168.xxx.0/24

2) Натить мою локалку — если смотреть на этот рисунок, то 10.0.0.0/8 в интернет через PPTP интерфейс tun0

3) В моей локалке 10.0.0.0/8 есть мой сервер web, ftp,pop3,smtp его надо промапить в локалку провайдера только по портам этих сервисов.

Проблемы с которыми я столкнулся в PF на этом пути:

1) строка
nat on fxp1 from 192.168.0.0/24 to 10.0.0.0/8 -> (fxp1)
срезает все пакеты превышающие длину 1472, что ведет к тормозам. Все парамерты в этой строке из моего первого поста выше, а не с рисунка 🙂

2) строка
nat on tun0 from 192.168.0.0/24 to !10.0.0.0/8 -> (tun0)

Все парамерты в этой строке из моего первого поста выше, а не с рисунка

Перед 10.0.0.0/8 стоит восклицательный знак

Вообще не пропукает пинг — все пакеты идут по прежнему в локалку провайдера, а не на ВПН тунель, но при этом http,ftp она пропускает в интернет нормально

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. «Настройка шлюза FreeBSD между двумя локалками и интернетом ч. «
Сообщение от Johnrea on 09-Окт-08, 12:24

Проверте конфиг. Плиззз Кажись тут че-то нетак, я с pf столкнулся первый раз ))

и если можно расписать что строки обозначают.

ext_if=»inet0″ # replace with actual external interface name i.e., dc0
int_if=»lnet0″ # replace with actual internal interface name i.e., dc1
internel_net=»192.168.1.3, 192.168.1.127, 192.168.1.125, 192.168.1.250″
internel_net1=»192.168.1.25, 192.168.1.126, 192.168.1.125, 192.168.1.10, 192.168.1.12, 192.1

nat on $ext_if from $internal_net to any -> ($ext_if)

block in log all

pass in on $ext_if proto tcp from any to $ext_if port 22 keep state
pass out on $ext_if proto < tcp, udp >all 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
pass in on $ext_if proto < gre, tcp >all keep state
pass in on $ext_if proto from any to $ext_if port <1723,47,21,8080,443,80,1777,33
pass out on $ext_if proto from any to $ext_if port

и еще там 2 сетевых интерфейса lnet0 с разными айпи, один на внешку др. на лок. так может быть?

Источник

Adblock
detector