Страница 2 из 2

Re: ipfw fwd & pipe связать вместе.

Добавлено: 2014-04-03 1:04:40
harmless
Нат как реализован?
И давайте все правила фаерволла(я дал конфиг который работает)
Могу дать и для pppoe

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

#!/bin/sh

#############################################
#**** FireWall - конфигурационный файл *****#
#** специально для локальной сети **#
#############################################
# бинарник ipfw
FwCMD="/sbin/ipfw -q "
# шаблон таблицы
FwTable="${FwCMD} table "

#*******************************************#
#**** ISP1 ****#
#*******************************************#
# IP сервера в сети ISP1
IpOut_ISP1="1.1.1.2"
# Интерфейс, смотрящий в сеть ISP1
LanOut_ISP1="vr0"

GW_ISP1="1.1.1.1"

/usr/sbin/setfib -0 route add default ${GW_ISP1}
/usr/sbin/setfib -2 route add default ${GW_ISP1}

#*******************************************#
#**** Все что качается ISP2 ****#
#*******************************************#
# IP сервера в сети ISP2
IpOut_ISP2="2.2.2.2"
# Интерфейс, смотрящий в сеть ISP2
LanOut_ISP2_Phys="re0"
LanOut_ISP2="tun0"

GW_ISP@=$(/sbin/ifconfig | /usr/bin/grep "inet 2.2.2.2" | awk '{print $4}')

/usr/sbin/setfib -1 route add default ${GW_ISP2}

#*******************************************#
#* Все что качается локальной сети  *#
#*******************************************#
# Локальная сеть 
NetIn="10.0.0.0/24"
# IP сервера в локальной сети 
IpIn="10.0.0.1"
# Интерфейс, смотрящий в локальную сеть 
LanIn="em0"

/sbin/sysctl net.inet.ip.forwarding=1
/sbin/sysctl net.inet.ip.fastforwarding=1
/sbin/sysctl net.inet.ip.fw.autoinc_step=1
#*******************************************#
#***************** СЕРВИСЫ *****************#
#*******************************************#

#* DNS,NTP *#

TCP="domain"
UDP="domain,ntp"

#############################################
${FwCMD} disable one_pass
${FwCMD} enable debug
#############################################

################# CLEAN ALL #################

${FwCMD} -f flush
${FwCMD} -f queue flush
${FwCMD} -f pipe flush
${FwCMD} -f sched flush

${FwCMD} nat 4  config  if ${LanOut_ISP1} unreg_only same_ports reset log \
                        redirect_port tcp 10.1.1.2:8000 8000 

${FwCMD} nat 5  config  if ${LanOut_ISP2} unreg_only same_ports reset log \
                        redirect_port tcp 10.1.1.2:8000 8000 

${FwCMD} add reass in                   // REASS in

${FwCMD} add    skipto 15000 in via lo0                         // MOVE incoming LoopBack
${FwCMD} add    skipto 20000 out via lo0                        // MOVE outgoing LoopBack
${FwCMD} add    skipto 25000 in via ${LanOut_ISP1}               // MOVE incoming LanOut_ISP1
${FwCMD} add    skipto 30000 out via ${LanOut_ISP1}              // MOVE outgoing LanOut_ISP1
${FwCMD} add    skipto 35000 in via ${LanOut_ISP2}            // MOVE incoming LanOut_ISP2
${FwCMD} add    skipto 40000 out via ${LanOut_ISP2}           // MOVE outgoing LanOut_ISP2
${FwCMD} add    skipto 45000 in via ${LanIn}                    // MOVE incoming LanIn
${FwCMD} add    skipto 50000 out via ${LanIn}                   // MOVE outgoing LanIn
${FwCMD} add    skipto 55000 in via ${LanOut_ISP2_Phys}   // MOVE outgoing LanOut_ISP2_Phys
${FwCMD} add    skipto 60000 out via ${LanOut_ISP2_Phys}  // MOVE outgoing LanOut_ISP2_Phys
${FwCMD} add    skipto 65534 via any                            // Drop any other packets

# LoopBack lo0
${FwCMD} add 15000      count in        // COUNT in lo0
${FwCMD} add            permit in       // ALLOW in lo0
${FwCMD} add 20000      count out       // COUNT out lo0
${FwCMD} add            permit out      // ALLOW out lo0

# ISP1 LanOut_ISP1
${FwCMD} add 25000      count in                                                                        // COUNT in IpOut_ISP!
${FwCMD} add            skipto 65534 not dst-ip ${IpOut_ISP1} in                                         // DROP not for IpOut_ISP1
${FwCMD} add            nat 4 dst-ip ${IpOut_ISP1} in                                                    // NAT in IpOut_ISP1
${FwCMD} add set 5      permit tcp from any to any dst-ip ${IpOut_ISP1} dst-port ${TCP} in setup         // PERMIT TCP to our services in IpOut_ISP1
${FwCMD} add set 5      permit udp from any to any dst-ip ${IpOut_ISP1} dst-port ${UDP} in keep-state    // PERMIT UDP to our services in IpOut_ISP1
${FwCMD} add set 5      permit tcp from any to any dst-ip ${IpOut_ISP1} dst-port 22 in setup     // PERMIT in TCP to IpOut_ISP1 ssh
${FwCMD} add            permit tcp from any to any dst-ip ${IpOut_ISP1} in established                   // PERMIT in TCP established to IpOut_ISP1
${FwCMD} add            permit dst-ip table\(100\) in                                                   // PERMIT in to clients
${FwCMD} add            permit icmp from any to any dst-ip ${IpOut_ISP1} in keep-state                   // PERMIT ICMP to IpOut_ISP1 in
${FwCMD} add            skipto 65534 in                                                                 // DROP any other packets in

${FwCMD} add 30000      count out                                                                       // COUNT out IpOut_ISP1
${FwCMD} add            nat global src-ip table\(100\) out                                              // CHECK global NAT
${FwCMD} add            skipto 34000 src-ip ${IpOut_ISP1} out                                            // PERMIT from IpOut_ISP1
${FwCMD} add            fwd ${GW_ISP2} src-ip ${IpOut_ISP2}                                         // FWD IpOut_ISP2
${FwCMD} add            nat 4 src-ip table\(100\) out                                                   // NAT clients
${FwCMD} add 34000      permit src-ip ${IpOut_ISP1} out keep-state                                       // PERMIT from IpOut_ISP1
${FwCMD} add            skipto 65534 out                                                                // DROP any other packets out


# ISP2 LanOut_ISP2
${FwCMD} add 35000      count in                                                                        // COUNT in IpOut_ISP2
${FwCMD} add            skipto 65534 not dst-ip ${IpOut_ISP2} in                                      // DROP not for IpOut_ISP2
${FwCMD} add            nat 5 dst-ip ${IpOut_ISP2} in                                                 // NAT in IpOut_ISP2
${FwCMD} add set 5      permit tcp from any to any dst-ip ${IpOut_ISP2} dst-port ${TCP} in setup      // PERMIT TCP to our services in IpOut_ISP2
${FwCMD} add set 5      permit udp from any to any dst-ip ${IpOut_ISP2} dst-port ${UDP} in keep-state // PERMIT UDP to our services in IpOut_ISP2
${FwCMD} add set 5      permit tcp from any to any dst-ip ${IpOut_ISP2} dst-port 22 in setup  // PERMIT in TCP to IpOut_ISP2 ssh
${FwCMD} add            permit tcp from any to any dst-ip ${IpOut_ISP2} in established                // PERMIT in TCP established to IpOut_ISP2
${FwCMD} add            permit dst-ip table\(100\) in                                                   // PERMIT in to clients
${FwCMD} add            permit icmp from any to any dst-ip ${IpOut_ISP2} in keep-state                // PERMIT ICMP to IpOut_ISP2 in
${FwCMD} add            skipto 65534 in                                                                 // DROP any other packets in

${FwCMD} add 40000      count out                                                                       // COUNT out IpOut_ISP2
${FwCMD} add            nat global src-ip table\(100\) out                                              // CHECK global NAT
${FwCMD} add            skipto 44000 src-ip ${IpOut_ISP2} out                                         // PERMIT from IpOut_ISP2
${FwCMD} add            fwd ${GW_ISP1} src-ip ${IpOut_ISP1}                                               // FWD IpOut_ISP1
${FwCMD} add            nat 5 src-ip table\(100\) out                                                   // NAT clients
${FwCMD} add 44000      permit src-ip ${IpOut_ISP2} out keep-state                                    // PERMIT from IpOut_ISP2
${FwCMD} add            skipto 65534 out                                                                // DROP any other packets out

# Lan
${FwCMD} add 45000      count in                                                                // COUNT in Lan
${FwCMD} add            skipto 65534 not src-ip table\(100\) not dst-ip me in                   // DROP closed clients to not me in Lan
${FwCMD} add set 2      setfib 1 in                                                             // SETFIB 1 in Lan
${FwCMD} add set 12     setfib 0 src-ip 10.0.0.135/32 in
${FwCMD} add set 2      permit in fib 1                                                         // PERMIT fib 1 in Lan
${FwCMD} add set 12     permit in fib 0
${FwCMD} add            permit in                                                               // PERMIT any packets in Lan
${FwCMD} add            skipto 65534 in                                                         // DROP any packets in Lan
${FwCMD} add 50000      count out                                                               // COUNT out Lan

# ISP2 LanOut_ISP2_Phys
${FwCMD} add 55000 set 25 count in                                                              // COUNT in LanOut_ISP2_Phys
${FwCMD} add set 25     permit in                                                               // PERMIT in LanOut_ISP2_Phys
${FwCMD} add 60000 set 25 count out                                                             // COUNT out LanOut_ISP2_Phys
${FwCMD} add set 25     permit out                                                              // PERMIT out LanOut_ISP2_Phys

${FwCMD} add            skipto 65534 out                                                        // DROP any packets out
${FwCMD} add 65534      deny via any                                                            // DROP any packets

Re: ipfw fwd & pipe связать вместе.

Добавлено: 2014-04-15 9:45:50
admin_sv
Ваш конфиг избыточен в моем случае. На системе стоит билинг, он добавляет правило для pipe и заносит ip пользователя в таблицу 21. Я из таблицы 21 беру пару ip и заношу их в таблицу 2 для правил:

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

18503 880085727 310427995115 pipe tablearg ip from table(21) to any
31997 21714 4225455 setfib 1 ip from table(2) to any
31999 20034677 5428352183 allow ip from table(21) to any
наглядно видно что правила срабатывают, но при этом setfib 1 простаивает:

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

setfib 1 netstat -nr | grep default
default 1.0.0.0 UGS 0 24666 tun
Все идет через default route почему?

Re: ipfw fwd & pipe связать вместе.

Добавлено: 2014-04-15 18:19:30
harmless
ставить таблицу маршрутизации нужно на входе пакета в систему!

Re: ipfw fwd & pipe связать вместе.

Добавлено: 2014-04-15 18:23:16
RAGNAR
уважаемый топик стартер это так просто решается а вы такой мут подняли...
http://www.lissyara.su/articles/freebsd ... #example_5
твой вариант 5
даже если оба канала с одним GW пофиг все работает.

пример тотже правила по сложнее

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

00020  4061779   349642477 prob 0.500000 skipto 90 ip from any to any in recv fxp0
00070 11828436  6625394590 setfib 0 ip from any to any in recv fxp0 keep-state
00080  9111765  6370286206 allow ip from any to any via fxp0
00080   679570   843473126 allow ip from any to any via lo0
00090 13240949  7325931717 setfib 1 ip from any to any in recv fxp0 keep-state
00098  9807970  7022802886 allow ip from any to any via fxp0
00200  3868565  3922943533 skipto 3800 ip from any to any in via ng0
00200  8073426 10036112532 skipto 5300 ip from any to any in via ng1
00200  2806349   280773580 skipto 3600 ip from any to any out via ng0
00200  6043556   492525680 skipto 5000 ip from any to any out via ng1
03600  2806349   280773580 queue 2 ip from any to any out xmit ng0
03700  2806346   280772755 nat 1 ip from any to any via ng0
03750  2897236   289163647 allow ip from any to any
03800  3868565  3922943533 nat 1 ip from any to xx.xx.xx.xx in recv ng0
03900  3766480  3916319719 queue 1 ip from any to any in recv ng0
04000  3766481  3916321179 allow ip from any to any
05000  6043561   492527236 queue 21 ip from any to any out xmit ng1
05100  6043590   492527288 nat 2 ip from any to any out xmit ng1
05200  6043328   492376376 allow ip from any to any
05300  8073426 10036112532 nat 2 ip from any to yy.yy.yy.yy in recv ng1
05400  7970755 10029424886 queue 11 ip from any to any in recv ng1
05500  7959429 10014851765 allow ip from any to any
65535        0           0 deny ip from any to any
лично у меня работало очень давно. на двух каналах адсл. и все это подымалось на mpd как оба рррое1 + рррое2 + скрвер рррое. еще и сквид накинули на все это тогда вроде

Re: ipfw fwd & pipe связать вместе.

Добавлено: 2014-04-15 18:26:26
RAGNAR
мы там принудительно раскидывали на разные ип. номожно и принудительно табами привезать и раскидать.

Re: ipfw fwd & pipe связать вместе.

Добавлено: 2014-04-16 9:52:41
admin_sv
Нет проблемы в реализации задачи, есть проблема в реализации ipfw+setfib. Ваш набор правил не решает моей задачи. А именно что делать если упал setfib 1. я хочу привязать таблицы к правилам и редактировать их содержимое скриптом(он готов), количество ng интерфейсов динамическое а не статическое(еще один + к таблицам)

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

00020   skipto 80 ip from table 1 to any in recv fxp0
00030   skipto 90 ip from table 2 to any in recv fxp0
00080   setfib 1 ip from any to any in recv fxp0 keep-state
00081   allow ip from table 1 to any
00090   setfib 2 ip from any to any in recv fxp0 keep-state
00091   allow ip from table 2 to any
65535   deny ip from any to any
Камнем преткновения является тот факт что счетчик правил говорит о проходе по нему пакетов, но setfib 1 пакеты по себе не передает.

Re: ipfw fwd & pipe связать вместе.

Добавлено: 2014-04-16 14:02:24
RAGNAR
ну как не решает. делаете скрипт по пингу. могу посматреть как у нас гдето было сделано. пингуеться 1 и 2 канал каждую мин до яндекса 3 пакета. если какойто нетпроходит перезапуск ррое клиента , если не помогает переписывай GW. все элементарно.

если так не можишь представить. рисуй точную блок схему как в школе учили. и по этапно реализуй. потом опемизируй если требуеться

Re: ipfw fwd & pipe связать вместе.

Добавлено: 2014-04-16 14:45:17
RAGNAR
вы тото умаливаете и теперь опять не ясно то вы хотите.
если вы пускаете пользователя по ip то причем тут ng тунель?

1. чем и через что ты выходишь и подываешь каждый канал?
2. каким оброзом выпускаешь в интернет?
2.1 просто по ip( у тебя стои dhcp с привязкой по мас ли ты прописываешь на каждой машине в руную )
2.2 пускаешь по средством vpn (server pppoe или server pptp)

теперь берем 2 таблици к примеру

ng0 - первый канал в интернет , ng1 - это второй канал в интернет ( если у тебя заходит по сетевухам меняешь на свои )

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

\\ а вот тут и ставь свои табы и делай свою реализацию .
\\ скажем так 1 таб идет уходит на skipto 00070
\\ вторая 2таб удет на skipto 00090  \\ так уже разнесли пользователй по каналам. применяй свои скрипты как хоешь к каналами


00070 11828436  6625394590 setfib 0 ip from any to any in recv fxp0 keep-state  \\  первый канал  настройка и привязка к фибу не показана
00080  9111765  6370286206 allow ip from any to any via fxp0  \\ это локалка , выход на пользователей
00080   679570   843473126 allow ip from any to any via lo0      \\  без коминтариев
00090 13240949  7325931717 setfib 1 ip from any to any in recv fxp0 keep-state    \\ второй канал  
00098  9807970  7022802886 allow ip from any to any via fxp0
00200  3868565  3922943533 skipto 3800 ip from any to any in via ng0  \\  как и говарил меняй на свои если подымаешь по mpd там жеская привязка
00200  8073426 10036112532 skipto 5300 ip from any to any in via ng1
00200  2806349   280773580 skipto 3600 ip from any to any out via ng0
00200  6043556   492525680 skipto 5000 ip from any to any out via ng1
03600  2806349   280773580 queue 2 ip from any to any out xmit ng0
03700  2806346   280772755 nat 1 ip from any to any via ng0
03750  2897236   289163647 allow ip from any to any
03800  3868565  3922943533 nat 1 ip from any to xx.xx.xx.xx in recv ng0  \\ первй внешняя статика
03900  3766480  3916319719 queue 1 ip from any to any in recv ng0
04000  3766481  3916321179 allow ip from any to any
05000  6043561   492527236 queue 21 ip from any to any out xmit ng1
05100  6043590   492527288 nat 2 ip from any to any out xmit ng1
05200  6043328   492376376 allow ip from any to any
05300  8073426 10036112532 nat 2 ip from any to yy.yy.yy.yy in recv ng1  \\ вторая внешняя стоат если нет ставь any
05400  7970755 10029424886 queue 11 ip from any to any in recv ng1
05500  7959429 10014851765 allow ip from any to any
65535        0           0 deny ip from any to any
пишишь скрипт адекватности канала и в зависимости отрезельтата выполняешь действие на табами или gw
примернотак.

пример если инет подымаеться через рррое
скрипт пишиь
1. делаешь пинг до ya.ru через фиб 0 если хорошо то делаем пинг ya.ru через фиб1 если хорошо то все.
2 если пинг фиб 0 не идет то делаем фиб 1 тоже не идет , то переподымаем соединение.
3. если пинг фиб 0 не идет делаем фиб 2 идет , то преподымаем канал 1 и повторно проверяем фиб 1 и фиб 2 если по прежнему фиб 0 не доступен тогда можно всех отправить на фиб1 меня привило скипто

вощем кароче уже управлением ты передашь скрипту.

а если еще кручи.
ставишь 1 пк и подымаешь на нем 1 канал и osfp
ставишь 2 пк и подымаешь на нем 2 канал и osfp
ставишь 3 пк твой сервер и подымаешь на нем подымаешь osfp и тогде osfp протокол динамической маршрутизации все сам сделает по выбору gw
в такой реализацц тебе останеться на серваке жоско привезать каму через какой канал работать а osfp остольное сам сделает. и это можно в клетке поднять... вооще будит полный изврат с садомазой. я пробывал работает ))) пс.с скриптами проще

Re: ipfw fwd & pipe связать вместе.

Добавлено: 2014-04-17 11:11:43
admin_sv
Давай опешу полностью:
Есть сервер на freebsd 9. На нет стоит mpd5 + freeradius+ mysql и билинг (у него свой набор правил ipfw). Пользователи(их много) подключаются по PPPOE. Сам роутер имеет 2 подключения: первое прямое(просто настройка сети по dhcp), второе через ppp туннель(tun0).
Билинг во время работы авторизованным на mpd пользователям создает pipe и заносит в table 21(выявлено аналитическим путем). Суть идеи состоит в том чтобы перераспределять пользователей из 21 таблицы между 2(первой и второй), в случае отключения пользователя удалить его из таблицы. В случае падения канала переписать пользователей в другую таблицу. ЭТО все выполнено.
Проблема в том что-бы пользователи шли через setfib который им указан, а не шлюз по умолчанию. Правело говорит что пакеты по нему идут, но пользователь уперто идет через шлюз по умолчанию.

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

 prob 0.500000 skipto 90 ip from any to any in recv fxp0
Это правило делит трафик поровну без учета ip. Когда вы авторизовались даже на этом форуме с таким правилом на шлюзе, и отошли от компа на время хранения записи в таблице

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

keep-state
для форума вы новый гость! Вот это и не устраивает!!!!!
Помощь необходима в работе с setfib
PS
На PF данный алгоритм уже решен и используется + добавлен еще 1 канал =3 и происходит учет весов канала

Re: ipfw fwd & pipe связать вместе.

Добавлено: 2014-04-17 11:20:51
RAGNAR
суть в том то ваши все правела должны быть перед правилами фиб а на них скито перебрасывайте. да проб это жестко. я же написал в предыдущем ставите 2 таб и каждый кидаете на свой фиб. раз у вас уже они есть осталось тока ссылки кинуть на фибы.
покажите полный вывод ipfw

Re: ipfw fwd & pipe связать вместе.

Добавлено: 2014-04-18 9:56:15
admin_sv
Вот дефолтный, который надо модернезировать

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

00004 allow ip from 10.110.0.0/16 to any
00004 allow ip from any to 10.110.0.0/16
00004 allow ip from X.X.X.X to me
00004 allow ip from me to X.X.X.X
00005 allow gre from any to any
00050 allow tcp from any to me dst-port 8282
00051 allow tcp from me 8282 to any
00110 allow ip from any to any via lo0
00120 skipto 1000 ip from me to any
00130 deny icmp from any to any in icmptypes 5,9,13,14,15,16,17
00160 skipto 2000 ip from any to me
00200 skipto 500 ip from any to any { via re0 or via em1 or via tun0 or via tun1 }
00300 skipto 4500 ip from any to any in
00400 skipto 450 ip from any to any { recv re0 or recv em1 or recv tun0 or recv tun1 }
00420 divert 1 ip from any to any
00450 divert 2 ip from any to any
00490 allow ip from any to any
00500 skipto 32500 ip from any to any in
00510 divert 1 ip from any to any
00540 allow ip from any to any
01000 allow udp from any 53,7723 to any
01010 allow tcp from any to any setup keep-state
01020 allow udp from any to any keep-state
01100 allow ip from any to any
02000 check-state
02010 allow icmp from any to any
02020 allow tcp from any to any dst-port 22,80,443,5006
02030 allow tcp from table(101) to any dst-port 3306
02050 deny ip from any to any { via re0 or via em1 or via tun0 or via tun1 }
02060 allow udp from any to any dst-port 53,7723
02100 deny ip from any to any
04500 allow ip from any to table(100)
05000 skipto 18502 ip from table(24) to table(14)
05001 allow ip from table(44) to table(14)
05002 skipto 18503 ip from table(21) to table(11)
05003 allow ip from table(41) to table(11)
18500 fwd 127.0.0.1,8080 tcp from any to any dst-port 80
18501 deny ip from any to any
18502 pipe tablearg ip from table(24) to any
18503 pipe tablearg ip from table(21) to any
// место внедрения
32000 deny ip from any to any
32490 deny ip from any to any
32500 allow ip from table(100) to any
33000 skipto 46501 ip from table(14) to table(34)
33001 allow ip from table(14) to table(44)
33002 skipto 46502 ip from table(11) to table(31)
33003 allow ip from table(11) to table(41)
46500 deny ip from any to any
46501 pipe tablearg ip from any to table(34)
46502 pipe tablearg ip from any to table(31)
60000 deny ip from any to any
65535 allow ip from any to any
добавляю

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

ipfw add 31997 setfib 1 ip from "table(2)" to any
ipfw add 31998 allow ip from "table(2)" to any