freebsd 2 провайдера и одна локальная сеть

Настройка сетевых служб, маршрутизации, фаерволлов. Проблемы с сетевым оборудованием.
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
veres
рядовой
Сообщения: 18
Зарегистрирован: 2010-08-02 23:18:46

freebsd 2 провайдера и одна локальная сеть

Непрочитанное сообщение veres » 2013-03-28 22:15:24

В офисе 2 провайдера. Есть сервер на FreeBSD 8.2
3 сет. карты - 2 для пров. и 1 на локалку. От провайдеров статические ip

Запущены bind, mail server, mpd, httpd и т.д.

Нужно чтоб до сервера извне по ssh можно было достучаться по двум внешним ip , и чтоб сервисы тоже были доступны с 2 адресов
В офисе пользователи получали инет от 1 провайдера, но в случае отключения 1, сменой шлюза по умолчанию можно было переключить всех на 2 провайдера

Нашел на Хабре статью http://habrahabr.ru/post/124447/ и сделал все так же как и там

# /etc/ipfw.script

Код: Выделить всё

ipfw="/sbin/ipfw -q "

local="re0"
ISP1="rl0"
ISP2="rl1"

localnet="192.168.0.0/24"

ISP1_ip="123.45.67.89"
ISP2_ip="234.56.78.9"

ISP1_gw="123.45.67.1"
ISP2_gw="234.56.78.1"

nat_ISP1="8668"
nat_ISP2="8669"
nat_global="8670"

${ipfw} -f flush

${ipfw} add 10 check-state
${ipfw} add 11 allow ip from any to any via lo0
${ipfw} add 12 deny ip from any to 127.0.0.0/8
${ipfw} add 13 deny ip from 127.0.0.0/8 to any

#Пример сервисов которые необходимо вывесить на оба внешних интерфейса.

# sshd
${ipfw} add 20 allow tcp from any to me 14441

# Web Server
${ipfw} add 25 allow tcp from any to me 80

# MailServer
${ipfw} add 26 allow tcp from any to me 25
${ipfw} add 27 allow tcp from any to me 110

# Other

${ipfw} add 28 allow tcp from any to me 1723 setup
${ipfw} add 29 allow tcp from any to any via ng*
${ipfw} add 30 allow udp from any to any via ng*
${ipfw} add 31 allow tcp from any to me 53
${ipfw} add 32 allow udp from any to me 53
${ipfw} add 33 allow tcp from any to me dst-port 21,30000-50000 setup


# Здесь самая соль.
# Следующие две строки нужны чтобы сам шлюз был доступен по обоим адресам, то есть с какого адреса идет пакет от шлюза, в тот интерфейс и уходил.

${ipfw} add 100 fwd ${ISP1_gw} ip from ${ISP1_ip} to not ${localnet}
${ipfw} add 200 fwd ${ISP2_gw} ip from ${ISP2_ip} to not ${localnet}

# Далее разделяем весь трафик по интерфейсам и направлениям, для удобства

# Локальный интерфейс
${ipfw} add 400 skipto 1000 all from any to any in recv ${local}
${ipfw} add 410 skipto 2000 all from any to any out xmit ${local}

# Внешние интерфейсы
${ipfw} add 500 skipto 3000 all from any to any in recv ${ISP1}
${ipfw} add 550 skipto 4000 all from any to any out xmit ${ISP1}
${ipfw} add 600 skipto 5000 all from any to any in recv ${ISP2}
${ipfw} add 650 skipto 6000 all from any to any out xmit ${ISP2}

# Если вдруг объявятся еще интерфейсы то рубим их. Все интерфейсы мы должны разрулить сами, иначе все пакеты с этих новых интерфейсов попадут под следующее разрешающее правило
${ipfw} add 900 deny all from any to any


# Локальный входящий
${ipfw} add 1000 allow all from any to any

# Локальный исходящий
${ipfw} add 2000 allow all from any to any

# ISP1 входящий (входящий трафик заворачиваем в нужный порт natd)
${ipfw} add 3000 divert ${nat_ISP1} ip from any to ${ISP1_ip}
${ipfw} add 3010 allow all from any to any

# ISP1 исходящий (аналогично для обоих провайдеров)
# Заворачиваем пакет в natd  по порту globalport
${ipfw} add 4000 divert ${nat_global} ip from ${localnet} to any
# Если есть запись трянсляции подключения снаружи вовнутрь, то natd  модифицирует пакет и ставит адресом источника тот внешний адрес, на который производилось подключение
# Если это адрес первого провайдера, то далее просто разрешаем пакет и на этом обработка заканчивается
${ipfw} add 4010 allow all from ${ISP1_ip} to any
# Если это адрес второго провайдера, то мы форвардим пакет на шлюз второго провайдера.
${ipfw} add 4020 fwd ${ISP2_gw} ip from ${ISP2_ip} to any
# Если же natd вернул неизмененный пакет, значит данный пакет не относится к подключению извне, тогда заворачиваем его в соответствующий порт natd 
${ipfw} add 4030 divert ${nat_ISP1} ip from ${localnet} to any
# Разрешаем прохождение пакета.
${ipfw} add 4040 allow all from any to any

# Для второго провайдера все аналогично

# ISP2 входящий 
${ipfw} add 5000 divert ${nat_ISP2} ip from any to ${ISP2_ip}
${ipfw} add 5010 allow all from any to any

# ISP2 исходящий 
${ipfw} add 6000 divert ${nat_global} ip from ${localnet} to any
${ipfw} add 6010 allow all from ${ISP2_ip} to any
${ipfw} add 6020 fwd ${ISP1_gw} ip from ${ISP1_ip} to any
${ipfw} add 6030 divert ${nat_ISP2} ip from ${localnet} to any
${ipfw} add 6040 allow all from any to any
При таком конфиге все вроде работает, но Postfix не может отправить почту на внешние адреса (внутренняя ходит) - почему?

И еще обратил внимание на правила 1000 и 2000 - они одинаковые, это так и должно быть?

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

veres
рядовой
Сообщения: 18
Зарегистрирован: 2010-08-02 23:18:46

Re: freebsd 2 провайдера и одна локальная сеть

Непрочитанное сообщение veres » 2013-03-29 16:26:22

Мда... помогли.
Это Postfix не может отправить почту, т.к. поменялся дефолт роут. А когда стоит 1 по дефолту - все ок. Вообщем надо 2 экземпляра псотфикса городить что-ли. Да уж.. на линуксе такой мороки нет, что-то во фре недоработали для 2 каналов ((

Аватара пользователя
skeletor
майор
Сообщения: 2548
Зарегистрирован: 2007-11-16 18:22:04

Re: freebsd 2 провайдера и одна локальная сеть

Непрочитанное сообщение skeletor » 2013-03-29 16:33:38

Вообще-то это дело не ОС, а файервола+маршрутизации.
Оно-то на IPFW геморно и не всегда работает как надо. Советую перейти на pf и там настроить одновременную доступность по 2-м каналам.

veres
рядовой
Сообщения: 18
Зарегистрирован: 2010-08-02 23:18:46

Re: freebsd 2 провайдера и одна локальная сеть

Непрочитанное сообщение veres » 2013-03-29 22:21:38

Итак, продолжим. Немного перефразирую вопрос

Имеем в офисе шлюз на FreeBSD 8.2
Три сетевых интерфейса
re0 - локалка (192.168.0.0/24)
rl0 - 1 провайдер
rl1 - 2 провайдер

IP 1 провайдера 111.111.111.22
GW 1 провайдера 111.111.111.1

IP 2 провайдера 222.222.222.33
GW 2 провайдера 222.222.222.1

В файле /etc/rc.cong
defaultrouter=" 111.111.111.1"

Нужно чтоб сервисы на маршрутизаторе были доступными по обоим внешним адресам одновременно

Сделано средствами IPFW и natd

Содержимое файла /etc/natd.conf

Код: Выделить всё

log 
instance default 
interface rl0 
port 8668 
use_sockets yes 
same_ports yes 
redirect_port tcp 192.168.0.105:4899 9800 

instance rl1 
interface rl1 
port 8669 
use_sockets yes 
same_ports yes 

globalport 8670 
Содержимое файла /etc/ipfw (правила фаервола)

Код: Выделить всё

add 1000 allow tcp from any to me 14441 
add 2000 allow tcp from any to me 80 
add 3000 allow tcp from any to me 25 
add 4000 allow tcp from any to me 110 
add 5000 allow tcp from any to me 1723 setup 
add 6000 allow tcp from any to any via ng* 
add 7000 allow udp from any to any via ng* 
add 8000 allow tcp from any to me 53 
add 9000 allow udp from any to me 53 
add 10000 allow tcp from any to me dst-port 21,30000-50000 setup 

add 11000 fwd 111.111.111.1 ip from 111.111.111.22 to not 192.168.0.0/24 
add 12000 fwd 222.222.222.1 ip from 222.222.222.33 to not 192.168.0.0/24 

add 13000 skipto 20000 all from any to any in recv re0 
add 14000 skipto 21000 all from any to any out xmit re0 

add 15000 skipto 22000 all from any to any in recv rl0 
add 16000 skipto 24000 all from any to any out xmit rl0 
add 17000 skipto 29000 all from any to any in recv rl1 
add 18000 skipto 31000 all from any to any out xmit rl1 

add 19000 deny all from any to any 

add 20000 allow all from any to any 

add 21000 allow all from any to any 

add 22000 divert 8668 ip from any to 111.111.111.22 
add 23000 allow all from any to any 

add 24000 divert 8670 ip from 192.168.0.0/24 to any 

add 25000 allow all from 111.111.111.22 to any 

add 26000 fwd 222.222.222.1 ip from 222.222.222.33 to any 

add 27000 divert 8668 ip from 192.168.0.0/24 to any 

add 28000 allow all from any to any 

add 29000 divert 8669 ip from any to 222.222.222.33 
add 30000 allow all from any to any 

add 31000 divert 8670 ip from 192.168.0.0/24 to any 
add 32000 allow all from 222.222.222.33 to any 
add 33000 fwd 111.111.111.1 ip from 111.111.111.22 to any 
add 34000 divert 8669 ip from 192.168.0.0/24 to any 
add 35000 allow all from any to any 
Все правила написаны одинаково для двух провайдеров, поэтому смена канала осуществляется просто заменой основного шлюза на роутере. Правила модифицировать нет необходимости.

Но, если в rc.conf дефолтроут - шлюз первого провайдера, команда telnet mx.yandex.ru 25 проходит нормально, но если сменить на шлюз второго провайдера (чтоб перевести локалку на использование инета от второго провайдера) telnet по 25 порту не проходит ни на один сервер.

Помогите, что не так?

Avta
проходил мимо

Re: freebsd 2 провайдера и одна локальная сеть

Непрочитанное сообщение Avta » 2014-02-13 16:03:32

В точно такой-же ситуации, у меня например 25 порт был тупо закрыт одним из двух провайдеров.

Аватара пользователя
kharkov_max
капитан
Сообщения: 1862
Зарегистрирован: 2008-10-03 14:56:40

Re: freebsd 2 провайдера и одна локальная сеть

Непрочитанное сообщение kharkov_max » 2014-02-23 18:05:46

Как совет!!!

1. Уйдите от divert на ядерный нат
2. Используйте fib для смены таблицы маршрутов, и уйдите от

Код: Выделить всё

add 33000 fwd 111.111.111.1 ip from 111.111.111.22 to any 
Если мне не изменяет память это кривой пример.
И если у вас физически потухнет линк на 111.111.111.1 (вытянули кабель) то 111.111.111.22 работать не будет вааще ...
Т.е. полностью пропадает суть резервного канала !!!
Хотя я могу заблуждаться.

Если задействуете fib то смену дефольтного маршрута можно делать скриптом через крон.
Пингуете поочереди yandex.ru, google.com, шлюз провайдера через каждый интерфейс и в зависимости от ситуации меняете дефолтный маршрут.