URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 94917
[ Назад ]

Исходное сообщение
"2 провайдера   с доступом из мира к  FreeBSD"

Отправлено 1stat , 10-Авг-13 01:43 
Нужно сделать активными 2 провайдера, тоесть одновременно в режиме онлайн, по серому ИП (которые выдали провайдеры) можно было попасть в локальную сеть из интернета. Сражу по двум адресам, тоесть я могу сделать по очередно. Если один стоит на default gate по нему захожу и скрипт может переключать. Но нужно чтобы из интернета можно было зайти по любому, тоесть из вне они активны оба .

Есть FreeBSD
Firewall PF
3 сетевые карты
1 Пров статически ИП
2 Пров статический ИП
3 Локалка

Подскажите или покажите где почитать , пожалуйста.


Содержание

Сообщения в этом обсуждении
"2 провайдера   с доступом из мира к  FreeBSD"
Отправлено roman_d , 10-Авг-13 08:16 
Приведите, пожалуйста, версию системы, таблицу маршрутов, список правил файрвола и скрипт, который "может переключать".

"2 провайдера   с доступом из мира к  FreeBSD"
Отправлено 1stat , 10-Авг-13 14:00 
> Приведите, пожалуйста, версию системы, таблицу маршрутов, список правил файрвола и скрипт,
> который "может переключать".

Мне нужно с нуля. Допустим этого нет.


"2 провайдера   с доступом из мира к  FreeBSD"
Отправлено Miha , 10-Авг-13 17:06 
>[оверквотинг удален]
> Если один стоит на default gate по нему захожу и скрипт
> может переключать. Но нужно чтобы из интернета можно было зайти по
> любому, тоесть из вне они активны оба .
> Есть FreeBSD
> Firewall PF
> 3 сетевые карты
> 1 Пров статически ИП
> 2 Пров статический ИП
> 3 Локалка
> Подскажите или покажите где почитать , пожалуйста.

Скажу сразу, PF тут не очень годится.
  У меня сделано на 4 точки включения. Сделано на ipfw. Используются таблицы с именами интерфейсов, поэтому кол-во правил не растет с ростом числа интерфейсов. Работает проброс портов и адресов из любого внешнего направления. Настроена приоритизация трафика (по портам) и нарезка полос пользователям (а также VIP-пользователи) как для лок. сети так и для джаил-сервисов (с опцией VIMAGE).
  Недорого :-)

P.S.: Если все же есть желание осилить самому то смотрите в сторону kernel nat, nat global,http://birdofluck.livejournal.com/8778.html и т.д.

Поверьте, PF тут не очень годится.


"2 провайдера   с доступом из мира к  FreeBSD"
Отправлено 1stat , 10-Авг-13 17:10 
>[оверквотинг удален]
>   У меня сделано на 4 точки включения. Сделано на ipfw.
> Используются таблицы с именами интерфейсов, поэтому кол-во правил не растет с
> ростом числа интерфейсов. Работает проброс портов и адресов из любого внешнего
> направления. Настроена приоритизация трафика (по портам) и нарезка полос пользователям
> (а также VIP-пользователи) как для лок. сети так и для джаил-сервисов
> (с опцией VIMAGE).
>   Недорого :-)
> P.S.: Если все же есть желание осилить самому то смотрите в сторону
> kernel nat, nat global,http://birdofluck.livejournal.com/8778.html и т.д.
> Поверьте, PF тут не очень годится.

Верю, не могли бы набросать краткую инструкцию ?  и при этой схеме с любого внешнего ип можно попасть будет в локалку?


"2 провайдера   с доступом из мира к  FreeBSD"
Отправлено Miha , 10-Авг-13 17:50 
>[оверквотинг удален]
>> ростом числа интерфейсов. Работает проброс портов и адресов из любого внешнего
>> направления. Настроена приоритизация трафика (по портам) и нарезка полос пользователям
>> (а также VIP-пользователи) как для лок. сети так и для джаил-сервисов
>> (с опцией VIMAGE).
>>   Недорого :-)
>> P.S.: Если все же есть желание осилить самому то смотрите в сторону
>> kernel nat, nat global,http://birdofluck.livejournal.com/8778.html и т.д.
>> Поверьте, PF тут не очень годится.
> Верю, не могли бы набросать краткую инструкцию ?  и при этой
> схеме с любого внешнего ип можно попасть будет в локалку?

С вашим подходом к решению вопроса только так, sorry..
>>   Недорого :-)


"2 провайдера   с доступом из мира к  FreeBSD"
Отправлено 1stat , 10-Авг-13 17:52 
>[оверквотинг удален]
>>> (а также VIP-пользователи) как для лок. сети так и для джаил-сервисов
>>> (с опцией VIMAGE).
>>>   Недорого :-)
>>> P.S.: Если все же есть желание осилить самому то смотрите в сторону
>>> kernel nat, nat global,http://birdofluck.livejournal.com/8778.html и т.д.
>>> Поверьте, PF тут не очень годится.
>> Верю, не могли бы набросать краткую инструкцию ?  и при этой
>> схеме с любого внешнего ип можно попасть будет в локалку?
> С вашим подходом к решению вопроса только так, sorry..
>>>   Недорого :-)

Спасибо я сам разберусь или кто то подскажет тут


"2 провайдера   с доступом из мира к  FreeBSD"
Отправлено 1stat , 10-Авг-13 18:32 
Тема актуальна,Смыл какой есть шлюз и по этому провайдеру есть дорступ канал падает шлюз меняеться и работает по другому провайдеру. Надо чтоб все также менялось но из вне можно було зайти по любому когда все ок. А шас можно зайти только по тому который стаит шлюзом

Взято с http://habrahabr.ru/post/66851/

Скрипт переключения шлюзов на перле

#!/usr/bin/perl -w

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

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

my $action = 1;
my $p = Net::Ping->new("icmp");
my $host_gw = "XX.XXX.XX.XX"; # default gw
my $gw = "192.168.1.1";
my $now = localtime time;
my $google = "8.8.8.8";

if($action == 1){
my $command = `netstat -rn | grep default`;
my @b = split('\s+',$command,3);
if ($p->ping($google,0.3)){
print "host $host_gw is ok\n";
if($b[1] ne $host_gw){
if($b[1] eq ""){
`route add default XX.XXX.XX.XX`;
}else{
`route change default 89.175.50.21`;
open(LOG,">>/change_route.log");
print LOG "[!] $now Route change to XX.XXX.XX.XX\n";
close(LOG);
}
}
}else{
print "host $host_gw is bad.\n";
if($b[1] ne $gw){
`route change default  YY.YYY.YY.YY`;
open(LOG,">>/change_route.log");
print LOG "[!] $now Route change to  YY.YYY.YY.YY\n";
close(LOG);
}
}
$p->close();
}

if($action == 2){
my $command = `netstat -rn | grep default`;
my @b = split('\s+',$command,3);
if($b[1] ne $gw){
if($b[1] eq ""){
`route add default  YY.YYY.YY.YY`;
}else{
`route change default  YY.YYY.YY.YY`;
open(LOG,">>/change_route.log");
print LOG "[!] $now Route change to  YY.YYY.YY.YY\n";
close(LOG);
}
}
}

Настройки PF

# Main Setting

ext_if_1="rl1" # IPS_1 . интерфейс первого канала
ext_if_2="rl0" # IPS_2 . интерфейс второго канал
int_if="re0" # lan . интерфейс внутренний сети
lo="lo0" # loopback
pult="192.168.6.6"
int_net="192.168.6.0/24" # LAN NETWORK
ext_addr_1="XX.XXX.XX.XX" # IPS_1 wan
ext_addr_2="192.168.1.2" # IPS_2 wan
int_addr="YY.YYY.YY.YY" # LAN IP

to_mts="{ 192.168.6.45, 192.168.6.46, 192.168.6.47, 192.168.6,48, 192.168.6.155, 192.168.6.198, 192.168.6.196 }"

gw_1="XX.XXX.XX.XX" # IPS_1 gw
gw_2="YYY.YYY.YY.YY" # IPS_2 gw

# services

tcp_svc="22" # . разрешенные порты на внешних интерфейсах.
udp_svc="22"
#log . логирование пакетов

set loginterface re0
set loginterface rl0
set loginterface rl1

set block-policy drop
set limit states 50000
set optimization normal
set state-policy if-bound


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

set skip on lo0
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

rdr on $ext_if_1 proto tcp from any to $ext_if_1 port 5000  tag EXT_IF_A  -> $pult port 5000
rdr on $ext_if_1 proto tcp from any to $ext_if_1 port 8000:8003  tag EXT_IF_A  -> $pult
rdr on $ext_if_1 proto tcp from any to $ext_if_1 port 33389  tag EXT_IF_A  -> $pult port 3389
rdr on $ext_if_2 proto tcp from any to $ext_if_2 port 33389  tag EXT_IF_B  -> $pult port 3389

  nat on $ext_if_2 inet proto tcp tagged EXT_SSH -> ($ext_if_2)
# BLOCK ALL
# первоночально необходимо заблокировать весь входящий трафик

block in
block in quick from any os NMAP

# antispoof
antispoof quick for $int_if

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

pass in quick on $int_if route-to ($ext_if_1 $gw_1) from $to_mts to !$int_net keep state


# 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
# pass in quick on $int_if route-to { ($ext_if_1 $gw_1), ($ext_if_2 $gw_2)} round-robin proto tcp from $int_net to any flags S/SA keep state

# 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
# rdr on $ext_if_1 proto tcp from any to $ext_addr_1 port 8000 tag EXT_IF_A -> $pult port 8000

# 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)


"2 провайдера   с доступом из мира к  FreeBSD"
Отправлено roman_d , 11-Авг-13 07:19 
> Поверьте, PF тут не очень годится.

Объясните, пожалуйста, почему?


"2 провайдера   с доступом из мира к  FreeBSD"
Отправлено 1stat , 11-Авг-13 12:17 
>> Поверьте, PF тут не очень годится.
> Объясните, пожалуйста, почему?

Роман можете помочь?


"2 провайдера   с доступом из мира к  FreeBSD"
Отправлено Miha , 11-Авг-13 18:14 
>> Поверьте, PF тут не очень годится.
> Объясните, пожалуйста, почему?

Сколько причин из 1001 вам назвать? Давайте использовать каждый инструмент там, где он больше всего подходит.
PF - неплох, но в данном случае ipfw подходит лучьше.