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

два kernel nat

Добавлено: 2009-07-15 12:28:12
chillivilli
есть два прова каждый воткнут в свою сетевушку, есть две лан тоже каждая в своей
em1 - сетка 192.168.1.0/24
em0 - сетка 192.168.55.0/24
igb0 -первый пров 84.11.62.10 такой ип и такой шлюз 84.11.62.1
igb1 -второй пров 195.12.142.54 с таким ип и шлюзом 195.12.142.1

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

nat config if igb0
nat config if igb1

00010 allow ip from any to any via em1
00020 allow ip from any to any via em0
00030 allow ip from any to any via lo0

00100 nat 123 ip from 192.168.1.0/24 to any out via igb0
00105 nat 123 ip from any to 84.11.62.10 in via igb0
00106 nat 124 ip from 192.168.55.0/24 to any out via igb1
00107 fwd 195.12.142.1 ip from 195.12.142.54 to any via igb1
00108 nat 124 ip from any to 195.12.142.54 in via igb1
00120 allow ip from any to any
С такими правилами ходим из 192.168.1.0/24 в инет через прова igb0
Но из сетки 192.68.55.0 вообще ничего не доходит до диверта 124

подскажите где подправить?

Re: два kernel nat

Добавлено: 2009-07-15 13:15:02
chillivilli
пробовал менять правила ната местами - толку нет

Re: два kernel nat

Добавлено: 2009-07-15 13:47:38
chillivilli
Никто не поднимал два кернел ната на разных интерфейсах чтоли?

Re: два kernel nat

Добавлено: 2009-07-15 14:32:23
terminus_
sysctl net.inet.fw.one_pass=1

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

# em0 - igb1 (192.168.55.0/24 <-> 195.12.142.54->195.12.142.1)
# em1 - igb0 (192.168.1.0/24 <-> 84.11.62.10->84.11.62.1)

ipfw add allow all from any to any via lo0

ipfw nat 1 config log if igb0 same_ports reset deny_in
ipfw nat 2 config log if igb1 same_ports reset deny_in

ipfw setfib 0 ip from any to any in recv em0
ipfw setfib 1 ip from any to any in recv em1

ipfw add nat 2 ip from any to any via igb1
ipfw add nat 1 ip from any to any via igb0 

ipfw add deny ip from any to any

Создать вторую таблицу маршрутизации и в ней создать один default route на 195.12.142.1.
Идея ясна? Я думаю это заведется...

Re: два kernel nat

Добавлено: 2009-07-15 14:34:36
mnz_work
chillivilli писал(а):Никто не поднимал два кернел ната на разных интерфейсах чтоли?

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

sysctl net.inet.fw.one_pass=0
...

# NAT wan_local
${FwCmd} nat 10 config if ${wan_local_if} deny_in reset log
${FwCmd} add 7400 nat 10 ip4 from ${int_net},${vpn_net} to ${wan_local_net} via ${wan_local_if} out
${FwCmd} add 7500 nat 10 ip4 from ${wan_local_net} to me via ${wan_local_if} in

# NAT internet
${FwCmd} nat 11 config if ${wan_inet_if} deny_in reset log 
${FwCmd} add 7600 nat 11 ip4 from ${int_net},${vpn_net} to any via ${wan_inet_if} out
${FwCmd} add 7700 nat 11 ip4 from any to me via ${wan_inet_if} in

# NAT on ext LAN
${FwCmd} nat 12 config if ${ext_if} deny_in reset log
${FwCmd} add 7800 nat 12 ip4 from ${int_net},${vpn_net} to ${ext_net} via ${ext_if} out
${FwCmd} add 7900 nat 12 ip4 from ${ext_net} to me via ${ext_if} in

...

Re: два kernel nat

Добавлено: 2009-07-15 15:12:01
chillivilli
terminus_ писал(а):sysctl net.inet.fw.one_pass=1

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

# em0 - igb1 (192.168.55.0/24 <-> 195.12.142.54->195.12.142.1)
# em1 - igb0 (192.168.1.0/24 <-> 84.11.62.10->84.11.62.1)

ipfw add allow all from any to any via lo0

ipfw nat 1 config log if igb0 same_ports reset deny_in
ipfw nat 2 config log if igb1 same_ports reset deny_in

ipfw setfib 0 ip from any to any in recv em0
ipfw setfib 1 ip from any to any in recv em1

ipfw add nat 2 ip from any to any via igb1
ipfw add nat 1 ip from any to any via igb0 

ipfw add deny ip from any to any

Создать вторую таблицу маршрутизации и в ней создать один default route на 195.12.142.1.
Идея ясна? Я думаю это заведется...
Т.е нужно пересобирать ядро с опцией options ROUTETABLES=2 ? Не пойму почему fwd не работает.. setfib 0 в примере это я так понимаю 0 таблица т.е та которая по умолчанию?

Re: два kernel nat

Добавлено: 2009-07-15 15:31:52
terminus_
Да - пересобрать с опцией.

setfib 0 таблица по умолчанию (просто для наглядности - можно было не указывать).

fwd модет не работать из-за того что в ядре нет опции options IPFIREWALL_FORWARD.

Если так и так ядро пересобирать то красивее сделать через setfib. ИМХО...

Re: два kernel nat

Добавлено: 2009-07-15 15:58:59
chillivilli
[Wed 16:58 root@zlon]/usr/home/west#ipfw setfib
ipfw: bad command `setfib'

как так?

причем
[Wed 16:59 root@zlon]/usr/home/west#setfib
usage: setfib [-[F]]value command

Re: два kernel nat

Добавлено: 2009-07-15 16:09:36
terminus_
ядро уже пересобрали? версия FreeBSD какая?

Re: два kernel nat

Добавлено: 2009-07-15 16:18:38
chillivilli

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

00030     0       0 allow ip from any to any via lo0
00040  6027  519095 setfib 0 ip from any to any in recv em1
00041    10     715 setfib 1 ip from any to any in recv em0
00100  1464  164551 nat 123 ip from 192.168.1.0/24 to any out via igb0
00105  1519  967325 nat 123 ip from any to 84.11.62.10 in via igb0
00106     6     288 nat 124 ip from 192.168.55.0/24 to any out via igb1
00108     0       0 nat 124 ip from any to 195.12.142.54 in via igb1
00120 10297 1777308 allow ip from any to any
65535     3     384 allow ip from any to any

Re: два kernel nat

Добавлено: 2009-07-15 16:20:27
chillivilli
Да ядро пересобрал, теперь видно что из разных сетей поподают в разные таблицы и дальше на нат, но обатно нат не приходит

версия

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

[Wed 17:16 root@zlon]/usr/home/west#uname -a
FreeBSD zlon 7.2-RELEASE FreeBSD 7.2-RELEASE #0: Wed Jul 15 16:22:48 MSD 2009     west@zlon:/usr/obj/usr/src/sys/WESTGATE3  amd64
IPFIREWALL_FORWARD в ядре тоже есть

Re: два kernel nat

Добавлено: 2009-07-15 16:22:27
chillivilli
chillivilli писал(а):[Wed 16:58 root@zlon]/usr/home/west#ipfw setfib
ipfw: bad command `setfib'

как так?

причем
[Wed 16:59 root@zlon]/usr/home/west#setfib
usage: setfib [-[F]]value command
а с этим разобрался, необходимо добавлять как и вдругие правила ipfw add setfib номер. и все ок

Re: два kernel nat

Добавлено: 2009-07-15 16:30:13
terminus_
забавно =) надо бы tcpdump подебажить - посмотреть как хлдят пакеты наружу и внутрь...
вторую fib таблицу корректно настроили?

надобно подумать по дорогу домой... вечером че-нить напишу еще... :smile:

Re: два kernel nat

Добавлено: 2009-07-15 16:46:20
chillivilli
Спасибо добрый человек за помощь, в общем все заработало, просто во втором канале не было инета, т.к был не в тот свитч воткнут. Так что на данный момент вроде все ок - бегают пакетики как надо, сейчас попробую разобраться с пробросом портов, если не сложно, оставьте свой контакт в личном сообщении, т.к в дальнейшем на этой схеме нужно будет реализовать более усложненный вариант с добавлением еще двух сетевых интерфейсов. Еще раз спасибо

Re: два kernel nat

Добавлено: 2009-07-15 18:08:28
chillivilli
Все еще на работе, в общем чего удалось достичь:
Есть две локалки отлично ходят в инет в 1.0 на внутренний сервер 1.185 пробрасываются порты, в 55.0 на 55.2 прописан и работает redirect_addr

Есть следующий этап, в боевой эксплуатации в сети 55.0 будет некий сервер 55.2 доступ к которому будет через шлюз 55.17
соотвественно необходимо реализовать схему # em0 - igb1 (192.168.55.2/24 <-> 192.168.55.17 <-> 195.12.142.54->195.12.142.1)

Я представляю себе это так - прописываем redirect_addr 195.12.142.54 192.168.55.2
добавляем в нужную таблицу маршрутов статический маршрут к 192.168.55.2 через 192.168.55.17

Вопрос будет ли таким образом обеспечен прозрачный обмен сервера 192.168.55.2 с тырнетом?

Re: два kernel nat

Добавлено: 2009-07-15 18:40:42
terminus
оставьте свой контакт в личном сообщении, т.к в дальнейшем на этой схеме нужно будет реализовать более усложненный вариант
Пишите или тут или просто на форуме (так полезнее будет). У меня icq нет, а сам я практически все время тут сижу. :smile: я сейчас тем занят, что составляю статью про настройку ipfw nat - поэтому немного в теме. Кстати, выложите потом, если не затруднит, детальные конфиги ipfw и fib - я их использую в статье как образец конфигурации :smile:
соотвественно необходимо реализовать схему # em0 - igb1 (192.168.55.2/24 <-> 192.168.55.17 <-> 195.12.142.54->195.12.142.1)
Я так понимаю, что подробная схема будет такой:

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

[192.168.55.2] <-> [192.168.55.17] <-> [192.168.55.1 (NAT машина) 195.12.142.54] ->[195.12.142.1]
Тут есть проблема с 192.168.55.17 - если 55.2 и 55.1 в одной области широковещания/подсети с ним то он может отказаться маршрутизировать трафик между хостами из одной подсети (вообще по RFC так должно быть).

Re: два kernel nat

Добавлено: 2009-07-16 11:20:28
chillivilli
Перезагрузил сервер, дефаулт роутер из второй таблицы слетел, как его прописать грамотно тчоб не слетал?

Re: два kernel nat

Добавлено: 2009-07-16 11:42:19
terminus
Через rc.conf наверное пока никак(кажется еще не прикрутили такой штуки туда)...
Создайте отдельный rc скрипт для установки маршрута и закиньте в /usr/local/etc/rc.c/

Re: два kernel nat

Добавлено: 2009-07-16 12:19:06
chillivilli
в rc.conf пишем
setfib_enable="YES"

создаем файл setfib делаем его исполняемым chmod +X setfib кладем в /usr/local/etc/rc.d

#!/bin/sh
setfib -1 add default router x.x.x.x

Все верно?

Re: два kernel nat

Добавлено: 2009-07-16 12:45:19
chillivilli
Заметил интересную особенность - делаю так 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 - ничего не открвается

Re: два kernel nat

Добавлено: 2009-07-16 12:55:53
terminus
Попробуйте вот это.

/etc/rc.conf

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

setfib1_enable="YES"
setfib1_defaultroute="1.2.3.4"
/usr/local/etc/rc.d/setfib1

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

#!/bin/sh
# PROVIDE: SETFIB1
# REQUIRE: NETWORKING
# BEFORE: DAEMON
# 
# Add the following lines to /etc/rc.conf to enable setfib -1 at startup
# setfib1 (bool): Set to "NO" by default.
#                Set it to "YES" to enable setfib1
# setfib1_defaultroute (str): Set to "" by default
#		 Set it to ip address of default gateway for use in fib 1

. /etc/rc.subr

name="setfib1"
rcvar=`set_rcvar`

load_rc_config $name

[ -z "$setfib1_enable" ] && setfib1_enable="NO"
[ -z "$setfib1_defaultroute" ] && setfib1_defaultroute=""

start_cmd="${name}_start"
stop_cmd="${name}_stop"

setfib1_start()
{
        if [ ${setfib1_defaultroute} ]
        then
          setfib 1 route add -net default ${setfib1_defaultroute}
        else
          echo "Can not set default route for fib 1 - setfib1_defaultroute is not assigned in rc.conf!"
        fi
}

setfib1_stop()
{
	  setfib 1 route del -net default
}
run_rc_command "$1"
---

18.07.2009
нашел ошибку в скрипте - исправил. теперь работает.

Re: два kernel nat

Добавлено: 2009-07-16 13:07:39
terminus
chillivilli писал(а):Заметил интересную особенность - делаю так ifconfig igb0 down
Прикольно :pardon:
А что будет, если сделать ifconfig igb1 down - тоже все у всех остановиться?

---

DNS у этих двух локалок прописан один и тот же или у каждой свой (доступный через ее интренет-подключение)?
Если пинговать только по IP эффект тот же?

Re: два kernel nat

Добавлено: 2009-07-16 14:34:43
chillivilli
Нет, если кладу ifconfig igb1 down , то основной канал с дефолтным маршрутом прописанным в rc.conf работает нормально.


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

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

             inet       /\               inet   /\
           		|                       |
			|			|	
			|			|			
			\/                      \/
----------------------------------------------------------------------------------
                  igb0             ||            igb1
               84.52.60.241        ||           84.52.60.41
               255.255.255.192     ||           255.255.255.192 
               84.52.60.1          ||            84.52.60.1
                        /\         ||              /\
                        |          ||              |
FreeBSD router 7.2      |          ||              |
amd64 KERNEL NAT        |          ||              |
                        |          ||              | 
                        |          ||              | 
                        |          ||              |
                        \/         ||              \/ 
                   em0             ||            em1                              em2
                 192.168.88.1      ||           192.168.1.20
                 255.255.255.0     ||           255.255.255.240
                                   ||           192.168.1.17
------------------------------------------------------------------------------------
                        /\                         /\
                        |                           |
                        |                           |
                        \/                         \/   
                     сервер                        шлюз 
                    192.168.88.2                 192.168.1.17
                    192.168.88.1                    /\
                    255.255.255.0                    |
                                                     |
                                                    \/
                                                   сервер
                                                  192.168.1.2

Re: два kernel nat

Добавлено: 2009-07-16 14:36:31
chillivilli
За скрипт спасибо, сейчас попробую его

скрипт в том виде которы есть не работает, пока не разбирался с ним

Re: два kernel nat

Добавлено: 2009-07-16 14:38:28
terminus
а все таки - как там на счет днсов и пингов/крннекций по IP?
Мне очень интересно - это проблема ipfw nat или нет...