Доброго дня господа!Несколько дней парюс над одной проблемой которую некогда решил. Ситуация простая.
Есть машина на 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 lo0Internet6:
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Благодарю за помощь!
> Доброго дня господа!Несколько дней парюс над одной проблемой которую некогда решил. Ситуация
> простая.
> Есть машина на fbsd8, на ней squid3.
> Два интерфейса,на одной статик ип(собственно ,некоторые клиентов этой сети должен пересадить
> на rl0),другой интерфейс берет адреса по dhcp(192.168.1.0/24) с роутера tp-link от
> другого провайдера.
> Задача: перенести часть пользователей на более шустрый канал (на интерфейс который берет
> ип по dhcp -rl0 )
> Аналогичную программу некогда решил с tcp_outgoing_address и сквид,все работало прекрасно.Сделайте проще, поставьте шлюз по умолчанию на провайдера с DHCP, сквид всех на него и кинет, а уже с помощью TCP_OUTGOING_ADDRESS кого надо заверните на другой интерфейс. Ну и для других служб, которые должны работать с белым IP используйте Policy Routing
> Сделайте проще, поставьте шлюз по умолчанию на провайдера с DHCP, сквид всех
> на него и кинет, а уже с помощью TCP_OUTGOING_ADDRESS кого надо
> заверните на другой интерфейс. Ну и для других служб, которые должны
> работать с белым IP используйте Policy RoutingЯ бы рад,но тогда не работают некоторые сервисы.В частности www,apache. на счет Policy Routing можно по подробнее??
>> Сделайте проще, поставьте шлюз по умолчанию на провайдера с 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 смотреть, какие пакеты мы пропустили и они неправильно уходят через чужие интерфейсы
Благодарю,как только попробую ,отпишусь о результатах
... мдя... суровые сибирские FreeBSD-админы ;)А может несколько попроще ?
1- пересобираем ядро с options ROUTETABLES=2, соответственно после "применения" получаем две таблицы маршрутизации : 0 - общесистемная, и 1 - наша вспомогательная
3 - обрабатываем ситуацию получения динамического адреса по DHCP - должен стать шлюзом по умолчанию в 1-й таблице маршрутизации (в dhclient-exit-hooks)
2 - для SQUID используем опцию squid_fib=1 в rc.conf
Пы.Сы. Лично я при двух внешних каналах строю ТРИ таблицы маршрутизации, 0 - системныя, 1 - с дефолтом в 1-й внешний канал и 2 - с дефолтом во второй внешний канал. Плюсы подобной реализации (ИМХО) - заморачиваюсь только с переопределением шлюзов по умолчанию ...
>[оверквотинг удален]
> 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>
> Я в первые в фрее работаю с более чем одной таблицей маршрутизации.(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
упс... естественно :
> setfib 1 route -q change default $new_routers || setfib 1 route -q add default $new_routers
> ... мдя... суровые сибирские FreeBSD-админы ;)да, мы такие :-)
знаю, про возможность нескольких таблиц маршрутизации, как появилась в 7-ке, так сразу было вкомпилено, правда пока не использовал, т.к. у меня для построения таблицы маршрутизации используется quagga (ospf), и я не уверен, что она может внедрять куда-либо, кроме своей, где будет запущена (setfib). потому я все-же использую ipfw fwd
а так, да, с setfib более грамотное и красивое решение.
Огромное вам спасибо,господа!Все заработало. Пересобрал ядро с поддержкой фиб.потом кальмар с поддержкой фиб,и дал внешнему интерфейсу ип из пула дхцп.
дальще настроил таблицы марщрутизации.