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

Re: два kernel nat

Добавлено: 2009-07-16 15:05:22
chillivilli
Днсов и пингов, это вы имеете ввиду прекращение траффика на втором канале когда я кладу первый?

Re: два kernel nat

Добавлено: 2009-07-16 15:09:18
terminus
да вот это:
Заметил интересную особенность - делаю так ifconfig igb0 down
соотвественно на первом канале все умирает, по логике вторая локалка должна же продолжать работать через второй канал?
А оказывается, что это не так.. Во второй локалке через первый канал продолжают работать только те соединения которые были подняты до отключения первого канала.. при этом с маршрутами все ок, т.к например вот как продолжает ходить с нее пинг до мейлру
13:20:12.521033 IP cl54-142-12-195.cl.metrocom.ru > mail.ru: ICMP echo request, id 512, seq 7177, length 40
13:20:12.539760 IP mail.ru > cl54-142-12-195.cl.metrocom.ru: ICMP echo reply, id 512, seq 7177, length 40

но если попробовать открыть ту же страничку mail.ru - ничего не открвается
если из "второй" сети пинговать mail.ru по IP то тоже не работает?
днс сервера на клиентах в первой и во второй сетях прописаны одни и те же (и поэтому достп к ним умирет когда отключаем igb0) или нет?

Re: два kernel nat

Добавлено: 2009-07-16 15:53:48
chillivilli
стоит кеширующий днс, в нем прописано редиректить на днс первого прова, которого отключаем, сейчас прописал на клиенте днс второго прова вместто - днс шлюза - есть выход в инет, отсюда вывод необходимо донастроить днс сервер прописав туда в качестве форвардных днсов днсы и второго прова. Что сейчас и сделаю

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

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

Jul 16 17:01:11 zlon named[1617]: internal_send: 195.177.123.1#53: Network is down
Jul 16 17:01:13 zlon named[1617]: socket.c:1689: unexpected error:
Jul 16 17:01:13 zlon named[1617]: internal_send: 195.1.128.137#53: Network is down
Jul 16 17:01:15 zlon named[1617]: socket.c:1689: unexpected error:
Jul 16 17:01:15 zlon named[1617]: internal_send: 84.10.107.107#53: Network is down
Jul 16 17:01:18 zlon named[1617]: socket.c:1689: unexpected error:
Jul 16 17:01:18 zlon named[1617]: internal_send: 195.1.128.130#53: Network is down

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

[Thu 17:05 root@zlon]/usr/home/west#named -v
BIND 9.6.1
в общем понял я косяк в чем, в том что при отсутсвии основного канала бинду не послать запросы, т.к через второй канал он не может ходить, чтоб через два канала работал он, я так понимаю надо писать скрипт который будет определять через какую таблицу работать ему

Re: два kernel nat

Добавлено: 2009-07-16 16:14:17
chillivilli
С этим все понятно, а вот касательно последнего рисунка, там видно что два внешних интерфейса имеют ипы из одной подсети и с одним шлюзом, как в данном случае грамотно можно разрулить канал?

Re: два kernel nat

Добавлено: 2009-07-16 16:19:27
terminus
бинд он такой - со странностями, да. Не хотите от него отказаться и использовать вместо него unbound ( http://www.lissyara.su/?id=1705 )? unbound насколько я помню при форвардинге не валиться, когда пропадает коннект на сетевухе...

Спасибо что проверили - теперь понятно что косячек был не в ipfw nat. :smile:

Re: два kernel nat

Добавлено: 2009-07-16 16:22:25
chillivilli
да незачто, бинд кстате говоря, тоже не валится, просто сыпет еррорами, мне кажется тут уже не зависит от того какой днс сервер используется, зависит от того, можно ли для его работы указывать два канала сразу :)

Re: два kernel nat

Добавлено: 2009-07-16 16:29:43
terminus
chillivilli писал(а):С этим все понятно, а вот касательно последнего рисунка, там видно что два внешних интерфейса имеют ипы из одной подсети и с одним шлюзом, как в данном случае грамотно можно разрулить канал?
настраевать fib тут не надо - все по-ходу станет намного проще:

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

ipfw nat 123 config if igb0 same_ports
ipfw nat 124 config if igb1 same_ports

ipfw add  nat 123 ip from 192.168.1.0/24 to any out
ipfw add  nat 123 ip from any to 84.52.60.241 in via igb0

ipfw add  nat 124 ip from 192.168.55.0/24 to any out
ipfw add  nat 124 ip from any to 84.52.60.41 in via igb1

ipfw add  allow ip from any to any

Re: два kernel nat

Добавлено: 2009-07-16 16:38:44
chillivilli
спасибо, попробую завтра сделать таким образом, у меня еще вопрос вот на рисунке видно, что посередине его делит пополам ||, вот по умолчанию с такими правилами не будет никаких перекрестных подключений? ну естественно для локальных необюходимо добавить что-то вроде
add deny all from 192.168.1.0/24 to 192.168.88.0/24
add deny all from 192.168.88.0/24 to 192.168.1.0/24

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

Re: два kernel nat

Добавлено: 2009-07-16 16:48:22
terminus
Ну тут уже полет фантазии :smile:
Для внешних адресов тогда тоже добавть что-то типа

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

add deny all from 84.52.60.241 to 84.52.60.41
add deny all from 84.52.60.41 to 84.52.60.241
Вообще для просветления очень рекомендую почитать nuclight'а http://nuclight.livejournal.com/124348.html :smile:

Re: два kernel nat

Добавлено: 2009-07-16 16:58:35
chillivilli
да спасибо, читал уже эту статью, но пока для меня сложновато все переварить, да и там к тому же divert а не kernel nat мне кажется, между этими реализациями наверняка есть какая-то разница в плане прохождения пакетов.
А по поводу опции sysctl ...ip.fw.one_pass каким образом она влияет на правила фаерволла, я так понял что при указании в 1 пакеты проходят фаер один раз до момента с дивертом, если указывать 0 то, после прохождения правил ната они возвращаются в фаерволл и идут дальше.

Соотвественно из этого можно сделать вывод, что при указании этой опции в 1 - все запрещающие , разрешающие директивы необходмио писать до правид ната, в случае если опция равна 0 - тогда можно казыать запрещеющие разрешающие правила как до так и после ната?
Немогли бы вы мне разъяснить этот момент?

Re: два kernel nat

Добавлено: 2009-07-16 17:10:13
terminus
Про это как раз написано у nuclight ;-)
Подобное выведение пакета из обработки ipfw в другую подсистему - не уникально
для divert, это общая схема работы в стеке FreeBSD. Например, действия pipe и
queue в dummynet, передача пакета в netgraph (а также появившийся в 7.0
ipfw nat) действуют по тому же принципу. Отличие, однако, в том, что в этих
подсистемах пакет остается внутри ядра, никакому демону не передается.
Поэтому, во-первых, подсистемы вместо номера правила сохраняют на него полный
указатель, и пакет вернется непосредственно в следующее правило, даже если оно
имеет тот же номер. Во-вторых, для таких подсистем действует настройка one_pass
в соответствующем sysctl - если она включена, то при повторном входе пакета в
ipfw после возврата из подсистемы dummynet (netgraph), ipfw_chk() сразу
вернется без прохода по правилам, как если бы к пакету был применен allow.
Это поведение позволяет упростить правила файрвола, когда известно, что если
пакет попал в трубу, то он уже точно отправляется дальше, и не требуется после
каждого pipe вставлять allow (чтобы пакет не попал в следующие правила и
следующие pipe/queue). Если же конфигурация требует сначала ограничить трафик,
а потом уже разбираться по замысловатым требованиям, что из него разрешить, а
что запретить, то упрощению правил наоборот будет способствовать отключенный
one_pass - поскольку с ним вместо allow, расположенных до pipe, пришлось бы
делать skipto.

Re: два kernel nat

Добавлено: 2009-07-17 9:25:42
chillivilli
все таки не могу никак разобратся с парвилами
на двиерте у меня был фаервол типа стейтфулл со скипами и кипстейтами

тут же например в этой структуре

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

ipfw nat 123 config if igb0 same_ports
ipfw nat 124 config if igb1 same_ports

ipfw add  nat 123 ip from 192.168.1.0/24 to any out
ipfw add  nat 123 ip from any to 84.52.60.241 in via igb0

ipfw add  nat 124 ip from 192.168.55.0/24 to any out
ipfw add  nat 124 ip from any to 84.52.60.41 in via igb1

ipfw add  allow ip from any to any

я хочу добавить разрешающее правило для внешнего интерфейса
например добавляю перед нат правилами

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

ipfw add allow all from any to 84.52.60.241 22 in
 ipfw add allow from 84.52.60.241 22 to any out
останольной траффик хочу порезать весь, но в то же время чтобы из сетки 192.168.1.0/24 можно было ходить например по порту 22 на внешние серваки, не пойму каким образом расставить правила грамотно?
т.е. не понятно где мне написать deny all from any to any , если пишу до ната естественно в него ничего непопадает, если пишу после ната т то, что не нужно поподает в нат

Re: два kernel nat

Добавлено: 2009-07-17 10:38:26
terminus
one_pass=1

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

# localhost sam na sebja razreshon
ipfw add 10 allow all from any to any via lo0

# rezhim trafik mezhdu klientami
ipfw add 20 deny all from any to 84.52.60.41 recv em0 
ipfw add 30 deny all from any to 84.52.60.241 recv em1 
ipfw add 40 deny all from any to any recv em0 xmit em1
ipfw add 50 deny all from any to any recv em1 xmit em0

# razreshaem poluchenie vsego ot klientov na vhod
ipfw add 55 allow all from any to any via em0
ipfw add 56 allow all from any to any via em1

# razreshaem soedinenie na 84.52.60.241:ssh
ipfw add 60 allow tcp from any to 84.52.60.241 22 in
ipfw add 61 allow tcp from me 22 to any out established

# obarbotka lokalnogo trafika ot nat rutera
ipfw add 65 check-state
ipfw add 66 allow all from me to any out keep-state

ipfw nat 123 config if igb0 same_ports deny_in
ipfw nat 124 config if igb1 same_ports deny_in

# perenapravlaem na nat vse chto prislo ot 192.168.1.0 i idet naruzhu cherez igb0
ipfw add 70 nat 123 ip from 192.168.1.0/24 to any out
# perenapravlaem obratno na nat vse chto prishli na igb0
ipfw add 80 nat 123 ip from any to 84.52.60.241 in via igb0

# perenapravlaem na nat vse chto prislo ot 192.168.55.0 i idet naruzhu cherez igb1
ipfw add 90 nat 124 ip from 192.168.55.0/24 to any out
# perenapravlaem obratno na nat vse chto prishli na igb1
ipfw add 100 nat 124 ip from any to 84.52.60.41 in via igb1

ipfw add 110 deny ip from any to any
как это будет работать:

Трафик пришедший от 192.168.1.0/24 и идущий в интернет будет получен через em1 и пройдет через все правила до 56 после чего его движение по проходу IN прекратитья и он перейдет в проход OUT. В проходе OUT он сново побежит по правилам и дойдет до правила 70. Попав в нат пакет будет обработан и сразу же выйдет в сеть (так как включен one_pass) через igb0 получив IP 84.52.60.241.
На обратном пути на проходе IN он дойдет до 80 после чего будет сразу же принят (так как включен one_pass) и перейдет в проход OUT где дойдет до правила 56 после чего попадет к клиенту.
Так трафик будет ходить через нат. Для 192.168.55.0 все аналогично.

Трафик пришедший из интернетов непонятно от кого на IP 84.52.60.241 дойдет до 80 и не будет принят так как в настройках ната включен deny_in. Аналогично для 84.52.60.41.

Трафик пришедший на 84.52.60.241:22 дойдет до 60 и будет принят. Ответный трафик с 84.52.60.241:22 будет разрешен через 61.

Трафик от самого рутера будет ходить через keep-state 65 и 66 правила.
К стати от keep-state 65 и 66 можно отказаться, если добавить правило

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

ipfw add 69 nat 123 ip from me to any out
тогда весь локальный трафик от самого рутера будет ходить через нат.

Re: два kernel nat

Добавлено: 2009-07-17 11:14:05
chillivilli
Спасибо, за ответ, сейчас прочитаю, но столкнулся с новой непонятной проблемой, в той схеме "боевой" с последнего рисунка видно - что внешние сетевухи имеют одинаковую маску одинковый шлюз и их ипы из одной сети, сейчас воткнул это все в сетевушки, убрал из правил фаерволла setfib, но вот в чем проблема:


Jul 17 11:22:16 zlon kernel: arp: 84.52.60.1 is on igb0 but got reply from 00:1b:0d:ed:5b:c0 on igb1

Где ип 60.1 ип шлюза для обоих сетевых инетрфейсов. оба воткнуты в один свитч в который приходит много разных ипов

я так понимаю что две сетевухи не могут поделить шлюз, как пофиксить этот момент, при этом не работает инет из сети 192.168.55.0/24

вернул в прафила ipfw setfib, как было, добавил во вторую таблицу дефолт маршрут к 84.52.60.1
вот дефолт моей второй таблицы

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

Destination        Gateway            Flags    Refs      Use  Netif Expire
default            84.52.60.1         UGS         0     4236   igb0
но видно что он используется через интерефейс igb0, может быть можно каким-то образом указать маршрут именно для конерктного интрефейса, прочитал man route что-то не увидел там ничего

Re: два kernel nat

Добавлено: 2009-07-17 11:34:26
terminus
Попробуйте выставить через sysctl настройки net.link.ether.inet.log_arp_wrong_iface=0
Покажите netstat -rn

Re: два kernel nat

Добавлено: 2009-07-17 11:41:41
chillivilli
net.link.ether.inet.log_arp_wrong_iface=0 этм мы просто погасим вывод в консоль ошибок имхо.

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

[Fri 12:37 root@zlon]/usr/home/west#setfib -0 netstat -rn
Routing tables

Internet:
Destination        Gateway            Flags    Refs      Use  Netif Expire
default            84.52.60.1         UGS         0     5018   igb0
84.52.60.0/26      link#1             UC          0        0   igb0
84.52.60.1         00:1b:0d:ed:5b:c0  UHLW        2        0   igb0   1147
127.0.0.1          127.0.0.1          UH          0       34    lo0
192.168.1.0/24     link#6             UC          0        0    em1
192.168.1.21       00:1f:c6:66:3a:27  UHLW        1       13    em1   1195
192.168.1.45       00:01:6c:e0:20:7c  UHLW        1        5    em1   1195
192.168.1.63       00:11:5b:26:19:7e  UHLW        1       14    em1   1197
192.168.1.67       00:1e:8c:ad:4b:64  UHLW        1       27    em1   1196
192.168.1.137      00:0c:6e:a4:fe:b2  UHLW        1       14    em1   1197
192.168.1.154      00:1b:fc:61:94:80  UHLW        1       23    em1   1198
192.168.1.185      00:a0:d1:9f:a7:cb  UHLW        1    10308    em1    902
192.168.1.186      00:1a:4d:f9:42:10  UHLW        1       13    em1   1196
192.168.55.0/24    link#5             UC          0        0    em0

[Fri 12:39 root@zlon]/usr/home/west#setfib -1 netstat -rn
Routing tables

Internet:
Destination        Gateway            Flags    Refs      Use  Netif Expire
default            84.52.60.1         UGS         0        0   igb0
84.52.60.0/26      link#1             UC          0        0   igb0
84.52.60.1         00:1b:0d:ed:5b:c0  UHLW        2        0   igb0   1146
127.0.0.1          127.0.0.1          UH          0        8    lo0
192.168.1.0/24     link#6             UC          0        0    em1
192.168.1.21       00:1f:c6:66:3a:27  UHLW        1        0    em1   1194
192.168.1.45       00:01:6c:e0:20:7c  UHLW        1        0    em1   1199
192.168.1.63       00:11:5b:26:19:7e  UHLW        1        0    em1   1196
192.168.1.67       00:1e:8c:ad:4b:64  UHLW        1        0    em1   1195
192.168.1.137      00:0c:6e:a4:fe:b2  UHLW        1        0    em1   1196
192.168.1.154      00:1b:fc:61:94:80  UHLW        1        0    em1   1197
192.168.1.185      00:a0:d1:9f:a7:cb  UHLW        1        0    em1    901
192.168.1.186      00:1a:4d:f9:42:10  UHLW        1        0    em1   1195
192.168.55.0/24    link#5             UC          0        0    em0

Re: два kernel nat

Добавлено: 2009-07-17 12:09:32
blackjackchik
привет, а я вот делаю два ната вот так

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

ipfw nat 123 config ip xx.xx.xx.xx
ipfw nat 124 config ip yy.yy.yy.yy
после смотрю настройки ната

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

ipfw nat 123 show config
ничего не выводит

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

ipfw nat 124 show config
ipfw nat 124 config ip yy.yy.yy.yy
а здесь все нормально. че за фигня не пойму.

Re: два kernel nat

Добавлено: 2009-07-17 12:34:55
terminus
net.link.ether.inet.log_arp_wrong_iface=0 этм мы просто погасим вывод в консоль ошибок имхо.
Че-то у иеня кризыс идей возник...
Я тут почесал в затылке... короче возникает вопрос: зачем необходимо использовать два внешних интерфейса подключенных к одной сети (igb0 и igb1)? Внешние IP можно же повесить все на одном igb0. Не? :unknown:

Re: два kernel nat

Добавлено: 2009-07-17 12:51:40
chillivilli
по идее да, можно прописать алиас, но тогда в моем представлении начнется путаница в написании правил для ipfw.. в общем, думаю над этим вопросом, если никаких идей не будет - попробую на один nic все прилепить

прописал алиас на igb0, ф фаере по прежнему рулится через две таблицы с одинаковыми default route, все работает вроде бы, конечно фаер нужно ненмого перелопатить... сейчас попробую углубиться в ваш пост относительно правил ipfw

Re: два kernel nat

Добавлено: 2009-07-17 13:19:00
terminus
две таблицы уже не нужны...

Re: два kernel nat

Добавлено: 2009-07-17 13:46:42
chillivilli
Так а касательно шлюза 192.168.1.17 ведь необходимо будет прописать маршрут через него на сервер 192.168.1.2 - на рисунке последнем есть, вот я и думаю что было бы грамотней вписывать этот маршрут во вторую таблицу. или я не правильно думаю? )
да и задача еще усложнится тем что добавится третья внтуренняя сетевуха с подсетью такой-же что и на принадлежащей ем1... и она будет нужна только для тоступа в сеть куда смотрит ем0, вот этот момент осталось уяснить как разрулить.. а в целом картинка общая уже сложилось, осталось отладить фаер добавить пару правил и т.д.

Re: два kernel nat

Добавлено: 2009-07-17 13:59:28
terminus
192.168.1.17 обязательно должен быть в сети 192.168.1.0/24 ? Просто так как вы расписали (когда трафик с 20 на 17 ходит через 2) так обычно не делают... Я не уверен что 2 станет пересылать трафик между зостами из одной подсети.

Не совсем понятно про третью сетевуху. Она тоже будет смотреть в сеть 192.168.88.0 как и em0?

Re: два kernel nat

Добавлено: 2009-07-17 14:34:02
chillivilli
Так ведь на em1 там маска 255.255.255.240 я думаю что тот сервер 192.168.1.2 с другой маской соотвественно в другой подсети находится, следовательно чтобы до него дойти нужно пропистаь маршрут через 192.168.1.17? или не так

А третья сетевушка должна просто пропускать траффик по двум портам туда и сюда из сети 192.168.1.0/24 которая на ней прописана в сеть em0 т.е 88.1, в инет из нее не надо выходить и попадать из нее в сеть привязанную к em1 тоже не надо.

Re: два kernel nat

Добавлено: 2009-07-17 15:06:01
terminus
А блин :fool: я же не саметил, что маска не /24!
Тогда значит просто прописать в таблице маршрутизации на нат рутере путь к сети 192.168.0.16/28
/etc/rc.conf

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

static_routes="route1"
route_route1="-net 192.168.0.0 192.168.0.17 255.255.255.240"
Третей сетевухе тогда назначить адрес из подсети 192.168.1.0/24 и в ipfw прописать

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

ipfw add 17 allow tcp from 192.168.1.0/24 to 192.168.88.1/24 80,443 recv em3 
ipfw add 18 allow tcp from 192.168.88.1/24 80,443 to 192.168.1.0/24 recv em0 xmit em3 out established
ipfw add 19 deny all from any to any in recv em3
---

Вы тогда приведите все свои правила ipfw которые использовать собираетесь - я в своих правилах ставлю номера в соответствии с данными из своего предыдущего примера (там где были keep-state).

---

я че-то уже немного подзапарился :smile:

Re: два kernel nat

Добавлено: 2009-07-20 12:33:13
chillivilli
Ок, обязательно напишу вссе правила, когда окончательно заработает в боевом режиме все, на след неделе начну дописывать конфиг