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

FreeBSD с двумя интерфейсами на два шлюза в инет

Добавлено: 2012-02-16 16:12:52
MrCondor
Помогите! Есть сервер под FreeBSD 8.2 (достался по наследству). Ядро перебрано с опциями

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

options><------>IPFIREWALL
options><------>IPFIREWALL_VERBOSE
options><------>IPFIREWALL_VERBOSE_LIMIT=10
options><------>IPDIVERT
options><------>IPFIREWALL_DEFAULT_TO_ACCEPT
options><------>IPFIREWALL_FORWARD
options><------>IPFIREWALL_NAT
options><------>LIBALIAS
options><------>DUMMYNET
На нем два интерфейса bge0 и bge1 на разные шлюзы в интернет.
netstat -rn

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

default            172.24.110.62      UGS        39    71080   bge0
127.0.0.1          link#5             UH          0        0    lo0
172.24.110.48/28   link#1             U           6      475   bge0
172.24.110.60      link#1             UHS         0        0    lo0
172.24.110.68/30   link#2             U           0        0   bge1
172.24.110.70      link#2             UHS         0        0    lo0
На шлюзах проброшен порт на сервер.
iptables -t nat -S|grep 80

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

-A PREROUTING -i eth0.201 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.24.110.60:80
и

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

-A PREROUTING -i ppp+ -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.24.110.70:80
Соответственно возникает проблема - как сделать, чтобы пакеты с сервера возвращались в нужный интерфейс, а не в дефаултроут? Возможно ли как в iproute из linux задать правила маршрутизации?
Я нашел такие правила для ipfw на просторе интеренета, но не работает :( Что не так?

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

ipfw add 100 skipto 300 tag 1 in recv bge0 keep-state
ipfw add 200 skipto 300 tag 2 in recv bge1 keep-state
ipfw add 300 allow { recv bge0 or recv bge1 } # входящие снаружи
ipfw add 500 fwd 172.24.110.62 tagged 1 # остались ответы на внешнем интерфейсе,
ipfw add 600 fwd 172.24.110.69 tagged 2 # зарулим их куда надо
Я не очень понимаю 300-е правило. Ткните носом, пожалуйста в man, мануал или подскажите хоть в какую сторону копать?

Re: FreeBSD с двумя интерфейсами на два шлюза в инет

Добавлено: 2012-02-16 18:08:41
gardener
MrCondor писал(а):

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

ipfw add 100 skipto 300 tag 1 in recv bge0 keep-state
ipfw add 200 skipto 300 tag 2 in recv bge1 keep-state
ipfw add 300 allow { recv bge0 or recv bge1 } # входящие снаружи
ipfw add 500 fwd 172.24.110.62 tagged 1 # остались ответы на внешнем интерфейсе,
ipfw add 600 fwd 172.24.110.69 tagged 2 # зарулим их куда надо
Я не очень понимаю 300-е правило. Ткните носом, пожалуйста в man, мануал или подскажите хоть в какую сторону копать?
На 300-е правило скипаются два предыдущих правила, чтобы корректно работало сохраненное состояние, чтобы ответный исходящий пакет был правильно обработан. При этом 300-е разрешает пакеты только принятые любым из двух интерфейсов.
Для исходящих предназначена другая дорога.

Где располагается правило CHECK-STATE? Оно должно быть в начале, до правила №100.

Re: FreeBSD с двумя интерфейсами на два шлюза в инет

Добавлено: 2012-02-16 18:27:08
ADRE
по идее да. чтобы проверить свормированный динамичиский путь.

Re: FreeBSD с двумя интерфейсами на два шлюза в инет

Добавлено: 2012-02-17 9:47:47
MrCondor
Про правило 300 я вроде понял, что нужно ибо по-умолчанию всё запрещено. Сделал попытку № 2.
Пересобрал ядро с

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

options         ROUTETABLES=4
и

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

setfib -1 route add default 172.24.110.62
setfib -2 route add default 172.24.110.69
ipfw add 100 skipto 300 tag 1 in recv bge0 keep-state
ipfw add 200 skipto 400 tag 2 in recv bge1 keep-state
ipfw add 300 setfib 1 tagged 1
ipfw add 400 setfib 2 tagged 2
setfib -1 netstat -rn

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

setfib -1 route add default 172.24.110.62
setfib -2 route add default 172.24.110.69
ipfw add 100 skipto 300 tag 1 in recv bge0 keep-state
ipfw add 200 skipto 400 tag 2 in recv bge1 keep-state
ipfw add 300 setfib 1 tagged 1
ipfw add 400 setfib 2 tagged 2
setfib -2 netstat -rn

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

Routing tables

Internet:
Destination        Gateway            Flags    Refs      Use  Netif Expire
default            172.24.110.69      UGS         0        2   bge1
127.0.0.1          link#5             UH          0        0    lo0
172.24.110.48/28   link#1             U           0        0   bge0
172.24.110.68/30   link#2             U           0        0   bge1
netstat -rn

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

Routing tables

Internet:
Destination        Gateway            Flags    Refs      Use  Netif Expire
default            172.24.110.62      UGS        41    97708   bge0
127.0.0.1          link#5             UH          0        0    lo0
172.24.110.48/28   link#1             U           6     1792   bge0
172.24.110.60      link#1             UHS         0        1    lo0
172.24.110.68/30   link#2             U           0        0   bge1
172.24.110.70      link#2             UHS         0      324    lo0
ipfw list

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

00100 skipto 300 tag 1 ip from any to any in recv bge0 keep-state
00200 skipto 400 tag 2 ip from any to any in recv bge1 keep-state
00300 setfib 1 ip from any to any tagged 1
00400 setfib 2 ip from any to any tagged 2
65535 allow ip from any to any
Tcp-дамплю, а пакеты снова убегают по дефаулроут :( :( :( :'( Причём
ipfw show

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

00100 123776  85192447 skipto 300 tag 1 ip from any to any in recv bge0 keep-state
00200   1098     56148 skipto 400 tag 2 ip from any to any in recv bge1 keep-state
00300 109265  74300376 setfib 1 ip from any to any tagged 1
00400    970     49688 setfib 2 ip from any to any tagged 2
65535 201489 141111877 allow ip from any to any
Т.е. пакеты пробегают по правилам для второй таблицы... :-( Не срабатывает 400 что ли? Может в ядро что добавить надо было?

Re: FreeBSD с двумя интерфейсами на два шлюза в инет

Добавлено: 2012-02-18 10:32:30
ADRE
на pf было прикольно правило возвращать пакет на тотже интерфейс с которого пришло.
а вот на ipfw незнаю -( думаю тоже должно быть.
--
У тебя пакеты возвращаются от сервера по default rotuter 100%
ipfw поэтому и не использует это т.е. равило и не отработает т.к. он пойдет по 1 интерфейсу. надо дальше копать. меня ломало это делать _), но думаю стоит посмотреть как делают типа интренет для двух провайдеров, но там не рассматривается что соединения происходят из внешней сети.
а если сменить правила местами?

Re: FreeBSD с двумя интерфейсами на два шлюза в инет

Добавлено: 2012-02-18 10:48:40
ADRE
попробуй через fwd может прокатит, вроде локальные интерфейсы.

Re: FreeBSD с двумя интерфейсами на два шлюза в инет

Добавлено: 2012-02-20 11:59:30
MrCondor
ADRE писал(а):на pf было прикольно правило возвращать пакет на тотже интерфейс с которого пришло.
а вот на ipfw незнаю -( думаю тоже должно быть.
Подскажи, пожалуйста, а как с pf такое сделать? А то я бьюсь бьюсь, а все стоит :-(

Re: FreeBSD с двумя интерфейсами на два шлюза в инет

Добавлено: 2012-02-20 12:37:10
arkan
У меня вот так работало

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

add 50 fwd 89.189.177.158 ip from 89.189.177.132 to any
add 60 fwd 178.49.215.1 ip from 178.49.215.2 to any

89.189.177.132  /  178.49.215.2    мой IP
89.189.177.158  /  178.49.215.1   шлюз прова
Но !
это только при условии если с внешки идет запрос типа на веб сервер
от куда прищел запрос туда и уходит ответ

Если излокальной сети пойти через так настроенный сервер то все идет через дефолт

Re: FreeBSD с двумя интерфейсами на два шлюза в инет

Добавлено: 2012-02-20 15:33:42
MrCondor
arkan писал(а):У меня вот так работало

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

add 50 fwd 89.189.177.158 ip from 89.189.177.132 to any
add 60 fwd 178.49.215.1 ip from 178.49.215.2 to any

89.189.177.132  /  178.49.215.2    мой IP
89.189.177.158  /  178.49.215.1   шлюз прова
Но !
это только при условии если с внешки идет запрос типа на веб сервер
от куда прищел запрос туда и уходит ответ

Если излокальной сети пойти через так настроенный сервер то все идет через дефолт
Заработало :good: Огромное спасибо!