The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"squid3+dhcp+2канала=разделение пользователей"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Открытые системы на сервере (Маршрутизация, NAT / FreeBSD)
Изначальное сообщение [ Отслеживать ]

"squid3+dhcp+2канала=разделение пользователей"  +/
Сообщение от NEO (ok) on 20-Янв-11, 10:28 
Доброго дня господа!Несколько дней парюс над одной проблемой которую некогда решил. Ситуация простая.
Есть машина на fbsd8, на ней squid3.
Два интерфейса,на одной статик ип(собственно ,некоторые клиентов этой сети должен пересадить на rl0),другой интерфейс берет адреса по dhcp(192.168.1.0/24) с роутера tp-link от другого провайдера.
Задача: перенести часть пользователей на более шустрый канал (на интерфейс который берет ип по dhcp -rl0 )
Аналогичную программу некогда решил с tcp_outgoing_address и сквид,все работало прекрасно.Только тогда обе интерфейса имели статик ип адреса.
Я понимаю ,что в форуме полно таких случаев,поверьте перевернул все вверх дном,конкретного решения не нашел.И с гуглом тоже самое.Думаю с маршрутизацией напортачил.
Вот конфиги.
gateway_enable="YES"
inetd_enable="YES"
devd_enable="yes"
zfs_enable="yes"
hostname="proxy.domain.com"
sshd_enable="yes"
sshd_program="/usr/sbin/sshd"
ifconfig_re0="inet 195.xxx.xxx.195 netmask 255.255.255.192"
ifconfig_re0_alias0="inet 195.xxx.xxx.225 netmask 255.255.255.192"
#
#
ifconfig_rl0="inet 192.168.1.3 netmask 255.255.255.0" - здесь принудительно поставил ип для tcp_outgoing_address ,но  этот интерфейс получает ип динамически
natd_enable="YES"
natd_interface="rl0"
natd_flags="-same_ports -dynamic"
#dhcp_program="/sbin/dhclient"
#
defaultrouter="195.xx.xx.198"
nameserver="195.xx0.xx.68"
firewall_enable="yes"
firewall_type="simple"
firewall_script="/etc/rc.firewall"
sendmail_enable="none"
#
apache22_enable="YES"
squid_enable="yes"
#
dhcpd_enable="NO"
dhcpd_conf="/usr/local/etc/dhcpd.conf"
dhcpd_ifaces=""

Routing tables

Internet:
Destination        Gateway            Flags    Refs      Use  Netif Expire
default            195.xx.xx.198     UGS         5     9455    re0
127.0.0.1          link#6             UH          0        3    lo0
192.168.1.0/24     link#2             U           0        0    rl0
192.168.1.3        link#2             UHS         0        0    lo0
195.xx.xx.192/26  link#1             U           0      214    re0
195.xx0.xx.195     link#1             UHS         0      400    lo0
195.xx0.xx.225     link#1             UHS         0        0    lo0

Internet6:
Destination                       Gateway                       Flags      Netif Expire
::1                               ::1                           UH          lo0
fe80::%lo0/64                     link#6                        U           lo0
fe80::1%lo0                       link#6                        UHS         lo0
ff01:6::/32                       fe80::1%lo0                   U           lo0
ff02::%lo0/32                     fe80::1%lo0                   U           lo0

Благодарю за помощь!

Ответить | Правка | Cообщить модератору

Оглавление

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


1. "squid3+dhcp+2канала=разделение пользователей"  +/
Сообщение от sherlock (ok) on 20-Янв-11, 11:21 
> Доброго дня господа!Несколько дней парюс над одной проблемой которую некогда решил. Ситуация
> простая.
> Есть машина на fbsd8, на ней squid3.
> Два интерфейса,на одной статик ип(собственно ,некоторые клиентов этой сети должен пересадить
> на rl0),другой интерфейс берет адреса по dhcp(192.168.1.0/24) с роутера tp-link от
> другого провайдера.
> Задача: перенести часть пользователей на более шустрый канал (на интерфейс который берет
> ип по dhcp -rl0 )
> Аналогичную программу некогда решил с tcp_outgoing_address и сквид,все работало прекрасно.

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "squid3+dhcp+2канала=разделение пользователей"  +/
Сообщение от NEO (ok) on 20-Янв-11, 11:25 
> Сделайте проще, поставьте шлюз по умолчанию на провайдера с DHCP, сквид всех
> на него и кинет, а уже с помощью TCP_OUTGOING_ADDRESS кого надо
> заверните на другой интерфейс. Ну и для других служб, которые должны
> работать с белым IP используйте Policy Routing

Я бы рад,но тогда не работают некоторые сервисы.В частности www,apache. на счет Policy Routing можно по подробнее??

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "squid3+dhcp+2канала=разделение пользователей"  +/
Сообщение от sherlock (ok) on 20-Янв-11, 11:35 
>> Сделайте проще, поставьте шлюз по умолчанию на провайдера с DHCP, сквид всех
>> на него и кинет, а уже с помощью TCP_OUTGOING_ADDRESS кого надо
>> заверните на другой интерфейс. Ну и для других служб, которые должны
>> работать с белым IP используйте Policy Routing
> Я бы рад,но тогда не работают некоторые сервисы.В частности www,apache. на счет
> Policy Routing можно по подробнее??

Можно, на FreeBSD он реализуется с помощью IPFW (в частности), задача в чем, если запрос пришел на белый IP, то и ответ пойдет с белого IP, но как правило на шлюз по умолчанию (а это неправильно в нашем случае, т.к. это другой провайдер), кстати параметры из rc.conf
типа accept_source_route у меня так и не заработали, все равно приходилось самому пакеты распихивать по каналам с помощью ipfw fwd

теперь поконкретнее:
задача стоит в том, чтобы создать правило на выходе канала (DHCP), которое будет отлавливать на нем исходящие пакеты с SRCIP другого интерфейса и принудительно заворачивать их в другой интерфейс (где они по нормальному должны уходить) методом
fwd GATE1 ip from IP1 to any out via IF2

где:
GATE1 - шлюз прова для статического IP
IP1 - собственно наш статический IP
IF2 - интерфейс, где получаем по DHCP

ну и с помощью tcpdump смотреть, какие пакеты мы пропустили и они неправильно уходят через чужие интерфейсы

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. "squid3+dhcp+2канала=разделение пользователей"  +/
Сообщение от NEO (ok) on 20-Янв-11, 11:38 
Благодарю,как только попробую ,отпишусь о результатах


Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5. "squid3+dhcp+2канала=разделение пользователей"  +/
Сообщение от YuSt on 20-Янв-11, 14:46 
... мдя... суровые сибирские FreeBSD-админы ;)

А может несколько попроще ?
1- пересобираем ядро с options ROUTETABLES=2, соответственно после "применения" получаем две таблицы маршрутизации : 0 - общесистемная, и 1 - наша вспомогательная
3 - обрабатываем ситуацию получения динамического адреса по DHCP - должен стать шлюзом по умолчанию в 1-й таблице маршрутизации (в dhclient-exit-hooks)
2 - для SQUID используем опцию squid_fib=1 в rc.conf
Пы.Сы. Лично я при двух внешних каналах строю ТРИ таблицы маршрутизации, 0 - системныя, 1 - с дефолтом в 1-й внешний канал и 2 - с дефолтом во второй внешний канал. Плюсы подобной реализации (ИМХО) - заморачиваюсь только с переопределением шлюзов по умолчанию ...

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

6. "squid3+dhcp+2канала=разделение пользователей"  +/
Сообщение от NEO (ok) on 20-Янв-11, 14:52 
>[оверквотинг удален]
> 1- пересобираем ядро с options ROUTETABLES=2, соответственно после "применения" получаем
> две таблицы маршрутизации : 0 - общесистемная, и 1 - наша
> вспомогательная
> 3 - обрабатываем ситуацию получения динамического адреса по DHCP - должен стать
> шлюзом по умолчанию в 1-й таблице маршрутизации (в dhclient-exit-hooks)
> 2 - для SQUID используем опцию squid_fib=1 в rc.conf
> Пы.Сы. Лично я при двух внешних каналах строю ТРИ таблицы маршрутизации, 0
> - системныя, 1 - с дефолтом в 1-й внешний канал и
> 2 - с дефолтом во второй внешний канал. Плюсы подобной реализации
> (ИМХО) - заморачиваюсь только с переопределением шлюзов по умолчанию ...

3ий пунктик еще раз,плз;-) вторую часть.

Я в первые в фрее работаю с более чем одной таблицей маршрутизации.(2 года в армии),че то новое.
И обе маршруты добавляются так: route add default <gateway_ip>

Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

7. "squid3+dhcp+2канала=разделение пользователей"  +/
Сообщение от YuSt on 20-Янв-11, 15:43 
> Я в первые в фрее работаю с более чем одной таблицей маршрутизации.(2
> года в армии),че то новое.
> И обе маршруты добавляются так: route add default <gateway_ip>

В этом плане придется наверстывать ;)
По крайне мере 8.х при соответсвующей сборке ядра могут работать в несколькими таблицами маршрутизации - стало напоминать Линух ;) Единственный (я бы сказал) ньюанс - default gateway, который "получаете автоматически" - применяется только к нулевой таблице. Для работы с несколькими таблицами добавили команды setfib и getfib ну и далее по ману... Т.е. если хотите задать default gateway для первой таблицы - пишете setfib 1 route add default <gateway_ip>, посмотреть маршруты - getfib 1 netstat -nr ... ну и т.д. В ipfw "забросить" в ту или иную таблицу можете правилами типа ipfw add ХХХХХ setfib 1 ip from ХХХ to ХХХ ....
Теперь собственно по второй части третьего пункта - если у Вас интерфейс получает адрес по DHCP, то выставить default gateway автоматически (с настройками по умолчанию) но сможет только в таблице 0. Во всех других - Вам придется делать это "ручками" (скриптом). Предопределенное в FreeBSD 8.х место - это /etc/dhclient-exit-hooks - скрипт, вызываемый при каждом телодвижении dhclient. Вот в нем и можете выстроить конструкцию для задания шлюза в любой другой таблице маршрутизации. Что-то типа:

case $reason in
BOUND|RENEW|REBIND|REBOOT)
   if [ "$interface" = "re1" ]; then
   route -q change default $new_routers || route -q add default $new_routers
   fi                                                                                                                      
   ;;                                                                                                                      
esac

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

8. "squid3+dhcp+2канала=разделение пользователей"  +/
Сообщение от YuSt on 20-Янв-11, 15:44 
упс... естественно :
>    setfib 1 route -q change default $new_routers || setfib 1 route -q add default $new_routers
Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

9. "squid3+dhcp+2канала=разделение пользователей"  +/
Сообщение от sherlock (ok) on 21-Янв-11, 05:59 
> ... мдя... суровые сибирские FreeBSD-админы ;)

да, мы такие :-)

знаю, про возможность нескольких таблиц маршрутизации, как появилась в 7-ке, так сразу было вкомпилено, правда пока не использовал, т.к. у меня для построения таблицы маршрутизации используется quagga (ospf), и я не уверен, что она может внедрять куда-либо, кроме своей, где будет запущена (setfib). потому я все-же использую ipfw fwd

а так, да, с setfib более грамотное и красивое решение.

Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

10. "squid3+dhcp+2канала=разделение пользователей"  +/
Сообщение от NEO (ok) on 21-Янв-11, 13:47 
Огромное вам спасибо,господа!Все заработало. Пересобрал ядро с поддержкой фиб.потом кальмар с поддержкой фиб,и дал внешнему интерфейсу ип из пула дхцп.
дальще настроил таблицы марщрутизации.


Ответить | Правка | ^ к родителю #9 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру