1

Тема: FreeBSD 2 канала

Всем доброго времени суток.

Знаю что тема исбитая, но всеравно у меня не получается.
есть 2 провайдера, требуется HTTP трафик пустить через одного, а все остальное через другова.

Основываясь на этой статье http://www.samag.ru/art/02.2007/02.2007_09.html
пытался разделить трафик хотябы по ИП

# natd -n rl0 -p 8668
# natd -n rl2 -p 8669
# ipfw add divert 8668 ip from 192.168.0.0/25 to any
# ipfw add divert 8669 ip from 192.168.0.128/25 to any
# ipfw add fwd 10.0.1.1 ip from 10.0.1.2 to any
# ipfw add fwd 10.1.1.1 ip from 10.1.1.2 to any
# ipfw add divert 8668 ip from any to 10.0.1.2
# ipfw add divert 8669 ip from any to 10.1.1.2

в rc.conf defaultrouter указан тот который работает с rl0
и весь трафик пытается отправиться через rl0

как это побороть ??

2

Re: FreeBSD 2 канала

M_Maniac
а у вас используются такие же сети как и в примере?

3

Re: FreeBSD 2 канала

Нет, делал аналогично, это просто взято как пример.

В моем конфиге стоит
${fwcmd} add divert 8669 log all from 192.168.0.4 to any 
${fwcmd} add divert 8668 log all from 192.168.0.44 to any   
${fwcmd} add fwd 192.168.1.1 log all from 192.168.1.2 to any
${fwcmd} add fwd 81.200.6.1 log all from 81.200.6.190 to any
${fwcmd} add divert 8669 log all from any to 192.168.1.2   
${fwcmd} add divert 8668 log all from any to 81.200.6.190

192.168.0.44 и 192.168.0.4 - локальные адреса, один ходит через один канал, второй через второй (это просто пробы)
81.200.6.1, 192.168.1.1 - шлюз первого и вторго канала
192.168.1.2, 81.200.6.190 - IP одного и второго канала
defaultrouter="81.200.6.1" - соответствует интерфейсу rl0 и IP 81.200.6.190

пробую разбить для начала выходы на кналы по ИП.

при попытке пинговать что то снаружи в логах остается
Divert 8669 ICMP:8.0 192.168.0.4 217.23.134.43 in via rl1           
Divert 8669 ICMP:8.0 192.168.0.4 217.23.134.43 out via rl0           
Forward to 192.168.1.1 ICMP:8.0 192.168.1.2 217.23.134.43 out via rl0
Divert 8669 ICMP:8.0 192.168.0.4 217.23.134.43 in via rl1           
Divert 8669 ICMP:8.0 192.168.0.4 217.23.134.43 out via rl0           
Forward to 192.168.1.1 ICMP:8.0 192.168.1.2 217.23.134.43 out via rl0
Divert 8669 ICMP:8.0 192.168.0.4 217.23.134.43 in via rl1           
Divert 8669 ICMP:8.0 192.168.0.4 217.23.134.43 out via rl0           
Forward to 192.168.1.1 ICMP:8.0 192.168.1.2 217.23.134.43 out via rl0
Divert 8669 ICMP:8.0 192.168.0.4 217.23.134.43 in via rl1           
Divert 8669 ICMP:8.0 192.168.0.4 217.23.134.43 out via rl0           
Forward to 192.168.1.1 ICMP:8.0 192.168.1.2 217.23.134.43 out via rl0

что я не так делаю ??

4

Re: FreeBSD 2 канала

Если я не ошибаюсь то fw заворачивает только на локальные ип, для завоторо на что попало патчить надо, покрайней мере так когдато было.

а какнить так нехочешь в конфиге описать (в бсд манах это популярно описано), rc.conf

static_routes="net0 net1"
route_net0="-net 10.0.0.0/255.255.255.0 10.0.0.1"
route_net1="-net 10.0.1.0/255.255.255.0 10.0.1.1"

Или сделать проще, как я, есть роутер с несколькими ип адресами, надо выпускать всю сеть от одного ип адреса а сервера с разных.
в rc.conf

natd_enable="YES"
natd_interface="rl0"
natd_flags="-f /etc/natd.conf"

в natd.conf

redirect_address 10.0.0.13 111.111.111.111
redirect_address 10.0.0.12 211.211.211.211
или так еще можно
redirect_port tcp 10.0.0.13:80 80

в фаерволе правило стандартное
rc.ipfw

.............
        case ${natd_enable} in
        [Yy][Ee][Ss])
                if [ -n "${natd_interface}" ]; then
                        ${fwcmd} add divert natd ip4 from any to any via ${natd_interface}
                fi
                ;;
        esac
        ${fwcmd} add pass tcp from any to any established
.......
        # ssh
        ${fwcmd} add pass tcp from any to 111.111.111.111, 10.0.0.13 22 setup
        # inet
        ${fwcmd} add pass tcp from 111.111.111.111, 10.0.0.13 to any

Или я чтото непонял?

5

Re: FreeBSD 2 канала

Вобще задача стоит в следующем:
Есть 2 канала
rl0 - оплата по трафику IP 81.200.6.190 Шлюз 81.200.6.1
rl2 - безлимитка "стрим" IP 192.168.1.2 Шлюз 192.168.1.1

Внутреняя сетка
rl1 - 192.168.0.0

Задача состоит в том, чтобы из внутренней сетки пользователи ходили в инет и получали странички через rl0, весь остальной трафик должен идти через канал с реальными адресами.

На серваке стоит Squid, даже если в нем указывать tcp_outgoing_address 192.168.1.2 то через diver трафик всеравно направляется на rl0, как это решить ??

ничего предложеное не помогло.

6

Re: FreeBSD 2 канала

так вам не надо делать диверт с адреса прокси.

Добавлено спустя     5 минут   27 секунд:
Разбираться пока времени честно сказать нет, но вот еще нашел чего у себя

Короткие рецептики


Распределение трафика между каналами в для FreeBSD

Зачастую стречается ситуация, когда имеется 2 канала для выхода в Интернет. Чаще всего для увеличения отказоустойчивасти сервер подключется к 2-м каналам. При этом, один канал работает как основной а второй- в качестве запасного. Но зачастую необходимо распределить трафик между каналами (хотя бы потому, что на каждый канал имеется лимит трафика от провайдера).

Классическим решением работы по двум и более каналам является регистрация автономной системы (AS) и получение сети независимых адресов. Потом по протоколу BGP строятся маршруты прохождения трафика через один или другой канал.

Но регистрация AS и получение независимой сети адресов дело дорогое и достаточно сложное и для организации подкючения корпоративной сети не всегда оправдано. Ведь решить проблему распределения трафика между каналами можно решить с помощью свяки системы NAT и Sorce Routing (маршрутизация по источнику). Кроме того, эта связка позволяет распределить трафик не только на основе пунктов назначения, но и на основе исходных сетей.

Ниже будет показано, как распределять трафик между двумя каналми на основе OC FreeBSD.

Итак, допустим, что имеется два выхода в Интернет:

1. Через интерфейс с IP: 195.1.1.1 c шлюзом 195.1.1.254
2. Через интерфейс с IP: 212.1.1.1 c шлюзом 212.1.1.254

Трудность очевидна: в нормальном режиме (без применения динамической маршрутизации) у OC FreeBSD один шлюз "по умолчанию" (ровн как и у любой другой ОС) и все пакеты "складываются" в этот шлюз. С помощью механизма можно "обходить" шлюз по умолчанию и направлять потоки другие каналы. Для того, чтобы механизм ip forwarding заработал, необходимо включить в ядре FreeBSD опции IPFIREWALL, IP DIVERT, IPFIREWALL_FORWARD. Более подробно, как подготовить ядро, можно прочитать здесь.

После этого появиться возможность применять команду
ipfw fwd <альтернативный шлюз>, которая перенаправляет поток в обход шлюза по умолчанию и вообще статических маршрутов.

В нашем примере, для того чтобы сеть 212.1.2.0/24 "ходила" через интерфейс 212.1.1.1 нужно записать правило (или запустить команду):

ipfw add fwd 212.1.1.254 ip from 212.1.2.0/24 to any

В качестве альтернативного шлюза мы указываем шлюз второго канала.

Приведенный пример показывает как воспользоваться командой ipfw fwd но это применение для сети реальных адресов. Теперь усложним задачу и будем распределять трафик из одной сети с фиктивными адресами (что чаще всего и бывает на практике подключения корпоративных сетей).

Допустим, у нас имеется корпоратвная сеть с адресами 10.1.0.0/16, подключенная к серверу доступа.

Примем первый канал как основной. Для него нужно применить стандартную схему вывода сети в Интернет (см. статью).

- Default route ставим 195.1.1.254 (route add default 195.1.1.254)
route add default 195.1.1.254 или прописать в /etc/rc.conf defaultrouter="195.1.1.254"

- запускаем NAT на интерфейсе адреса 195.1.1.1 (например пусть это будет fxp0)
natd -a 195.1.1.1.1

- запускаем нужные правила ipfw divert... порт для NAT используем стандартный.
ipfw add 100 divert natd ip from 10.1.0.0/16 to any
ipfw add 200 divert natd ip from any to 195.1.1.1

После этого сеть 10.1.0.0 будет выходить в Интернет через канал (1).

Теперь запустим еще один демон NAT на другом порту (например 8672):
natd -a 212.1.1.1 -p 8672

Поставим задачу выпустить через альтернативный канал хост 10.1.1.100.

Для этого:

- "Завернем" трафик с хоста 10.1.1.100 в альтернативный NAT
ipfw add 20 divert 8672 ip from 10.1.1.100 to any

- И уже "свернутый" адрес проведем в алтернативный шлюз
ipfw add 50 fwd 212.1.1.254 ip from 212.1.1.1 to any

- Также не забудем "обратный" divert
ipfw add 60 divert 8672 ip from any to 212.1.1.1


Важно, чтобы эти правила шли перед правилами NAT по умолчанию (обратите внимание на нумерацию правил!).

Итак, теперь вся сеть идет через один канал а хост из этой же сети идет через другой. Гибкость написания правил ipfw позволяет задавать любую логику распределения трафика. Для этого нужно лишь вставлять правила отправки на альтернативный NAT (между правилом 20 и 50).

Например:

ipfw add 21 divert 8672 ip from 10.1.2.0/24 to any - отправит часть сети (подсеть класса C) в другой канал.

ipfw add 21 divert 8672 tcp from 10.1.1.0/16 to any 5190 - отправит трафик ICQ в другой канал.

7 (17-10-2008 14:25:10 отредактировано M_Maniac)

Re: FreeBSD 2 канала

я читал эту статью, основываясь на этой статье, создаю правила
${fwcmd} add divert 8672 log ip from 192.168.0.4 to any   
${fwcmd} add fwd 192.168.1.1 log ip from 192.168.1.2 to any
${fwcmd} add divert 8672 log ip from any to 192.168.1.2   
                                                           
${fwcmd} add divert natd ip from 192.168.0.0/24 to any     
${fwcmd} add divert natd ip from any to 81.200.6.190       


В итоге в логах получаю
Divert 8672 TCP 192.168.0.4:4728 217.23.134.43:80 in via rl1           
Divert 8672 TCP 192.168.0.4:4728 217.23.134.43:80 out via rl0           
Forward to 192.168.1.1 TCP 192.168.1.2:4728 217.23.134.43:80 out via rl0
Divert 8672 TCP 192.168.0.4:4728 217.23.134.43:80 in via rl1           
Divert 8672 TCP 192.168.0.4:4728 217.23.134.43:80 out via rl0           
Forward to 192.168.1.1 TCP 192.168.1.2:4728 217.23.134.43:80 out via rl0
Divert 8672 TCP 192.168.0.4:4728 217.23.134.43:80 in via rl1           
Divert 8672 TCP 192.168.0.4:4728 217.23.134.43:80 out via rl0           
Forward to 192.168.1.1 TCP 192.168.1.2:4728 217.23.134.43:80 out via rl0


я просто не очень понимаю, ведь это у кого то работает, что я не так делаю ??

он всеравно пытается форвардить через rl0

Forward to 192.168.1.1 TCP 192.168.1.2:4728 217.23.134.43:80 out via rl0

8

Re: FreeBSD 2 канала

както странно. А где что касается natd? И вообще natd запущен?

9

Re: FreeBSD 2 канала

конечно, без него бы вобще не работало ))
fw# sockstat | grep natd                                     
root     natd       973   3  div4   *:8672                *:*
root     natd       971   3  div4   *:8668                *:*

fw# ps ax | grep natd                               
  971  ??  Ss     0:00.01 natd -a 81.200.6.190       
  973  ??  Is     0:00.01 natd -a 192.168.1.1 -p 8672

10

Re: FreeBSD 2 канала

А чем мой пример со статик роутом неподходит?
https://www.freebsd.org/doc/ru_RU.KOI8-R … uting.html

11

Re: FreeBSD 2 канала

Если я не ошибаюсь, то он не может по портам раскидывать трафик, с помощью роутинга можно подсеки на разные каналы разложить

12

Re: FreeBSD 2 канала

Я чето задачу не понимаю... Можно на пальцах объяснить?

13

Re: FreeBSD 2 канала

M_Maniac пишет:

Вобще задача стоит в следующем:
Есть 2 канала
rl0 - оплата по трафику IP 81.200.6.190 Шлюз 81.200.6.1
rl2 - безлимитка "стрим" IP 192.168.1.2 Шлюз 192.168.1.1

Внутреняя сетка
rl1 - 192.168.0.0

Задача состоит в том, чтобы из внутренней сетки пользователи ходили в инет и получали странички через rl0, весь остальной трафик должен идти через канал с реальными адресами.

На серваке стоит Squid, даже если в нем указывать tcp_outgoing_address 192.168.1.2 то через diver трафик всеравно направляется на rl0, как это решить ??

ничего предложеное не помогло.

Alan куда еще более на пальцах ?? ))

M_Maniac пишет:

${fwcmd} add divert 8669 log all from 192.168.0.4 to any 
${fwcmd} add divert 8668 log all from 192.168.0.44 to any   
${fwcmd} add fwd 192.168.1.1 log all from 192.168.1.2 to any
${fwcmd} add fwd 81.200.6.1 log all from 81.200.6.190 to any
${fwcmd} add divert 8669 log all from any to 192.168.1.2   
${fwcmd} add divert 8668 log all from any to 81.200.6.190

это были просто пробы, на нених не смотри, забудь.

Добавлено спустя     1 минуту   57 секунд:
Есть 2 канала, в один идет трафик только 80го порта, в диругой идет все остальное.
Вот на пальцах.

14

Re: FreeBSD 2 канала

ну что идеи еончились ?? ))

15

Re: FreeBSD 2 канала

Хмм, надо таблицы роутинга правильно расписать

rl0 - оплата по трафику IP 81.200.6.190 Шлюз 81.200.6.1 - net0 в сети ип напрмиер 10.0.0.1
rl2 - безлимитка "стрим" IP 192.168.1.2 Шлюз 192.168.1.1 - net1 в сети ип напрмиер 10.0.1.1

на роутери настроить
static_routes="net0 net1"
route_net0="-net 10.0.0.0/255.255.255.0 81.200.6.1"
route_net1="-net 10.0.1.0/255.255.255.0 192.168.1.1"

сквиду дать ип из net0 и сказать что гетевай 10.0.0.1
всем остальным дать ип из net1 гетевай 10.0.1.1

незнаю насколько правильно, но попробуй, других идей нету

16

Re: FreeBSD 2 канала

а в ядре чего включено?

17

Re: FreeBSD 2 канала

options IPFIREWALL       
options IPFIREWALL_VERBOSE
options IPFIREWALL_FORWARD
options IPDIVERT         
options DUMMYNET

18

Re: FreeBSD 2 канала

В /etc/sysctl.conf добавь

net.inet.ip.forwarding=1
net.inet.ip.fw.one_pass=0

19

Re: FreeBSD 2 канала

Он всеравно стремиться покинуть сервак через RL0

300 Divert 8669 ICMP:8.0 192.168.0.4 217.23.134.43 in via rl1           
300 Divert 8669 ICMP:8.0 192.168.0.4 217.23.134.43 out via rl0           
500 Forward to 192.168.1.1 ICMP:8.0 192.168.1.2 217.23.134.43 out via rl0
300 Divert 8669 ICMP:8.0 192.168.0.4 217.23.134.43 in via rl1           
300 Divert 8669 ICMP:8.0 192.168.0.4 217.23.134.43 out via rl0           
500 Forward to 192.168.1.1 ICMP:8.0 192.168.1.2 217.23.134.43 out via rl0

20

Re: FreeBSD 2 канала

и опять тишина

21

Re: FreeBSD 2 канала

Конечно тема избитая. У всех пока только теория... Я промолчу так как просто не занимался этим ниразу.

22

Re: FreeBSD 2 канала

Пилити Шура, они золотые...

идеи кончались, а протестить негде

23 (20-11-2008 18:16:48 отредактировано M_Maniac)

Re: FreeBSD 2 канала

На самом деле все оказалось намного проще чем то как все это закрутилось.
Расказываю тем кто сталкнулся с подобной проблемой, но так и не смог это решить.

Опишу коротко то что требовалось и то что получилось
Имеем 2 интернет канала, один из которых это канал с оплатой трафика и реальными адресами, второй безлимитка типа стрим.

первый канал
сетевая rl0 ее ИП 81.200.6.190 шлюз 81.200.6.1
второй канал
сетевая rl2 ее ИП 192.168.1.2 шлюз 192.168.1.1
локальная сеть 192.168.0.0/24

требуется перекинуть разбить трафик на почтовый трафик и интернет серфинг с ФТП и т.д.
запускает 2 НАТА
для удобства запуска я создал файл /usr/local/etc/rc.d/natd.sh

natd.sh:
#!/bin/sh
                           
natd -a 81.200.6.190 -p 8668
natd -a 192.168.1.2 -p 8778


создаем правила в для фаера
rc.firewall:

lan_net="192.168.0.0/24"
int_if="rl1"           
ext_if1="rl0"           
ext_if2="rl2"           
ext_ip1="81.200.6.190" 
ext_ip2="192.168.1.2"   
ext_gw1="81.200.6.1"   
ext_gw2="192.168.1.1"   

${fwcmd} add divert 8668 log ip from ${lan_net} to any         
${fwcmd} add divert 8778 ip from ${lan_net} to any             
${fwcmd} add fwd ${ext_gw2} log ip from ${ext_ip2} to any out
${fwcmd} add fwd ${ext_gw1} log ip from ${ext_ip1} to any out
${fwcmd} add divert 8668 ip from any to ${ext_ip1}           
${fwcmd} add divert 8778 ip from any to ${ext_ip2}             

в конфиге сквида (squid.conf) указываем что он должен ходить через второй канал
tcp_outgoing_address 192.168.1.2

в конфиге постфикса (main.cf) пишем что он живет на первом канале
smtp_bind_address = 81.200.6.190

и наслаждаемся тем что получилось и пусть вас не смущает запись в логах типа
Forward to 192.168.1.1 ICMP:8.0 192.168.1.2 217.23.134.43 out via rl0
трафик чудесным образом всеравно идет на rl2

если будут вопросы пишите.

24

Re: FreeBSD 2 канала

Поздравляю! Вот, смог же smile

25

Re: FreeBSD 2 канала

Еслди долго мучаться, что нибудь получиться ))