Настройка роутера IPFW+natd

Настройка сетевых служб, маршрутизации, фаерволлов. Проблемы с сетевым оборудованием.
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
UsCr
мл. сержант
Сообщения: 77
Зарегистрирован: 2010-09-01 12:16:57

Настройка роутера IPFW+natd

Непрочитанное сообщение UsCr » 2010-09-01 12:30:01

Здравствуйте. Есть роутер на freebsd с настроенным натом. За роутером спрятана машина под Fedora 13.
Сетевые настройки машины следующие:
ip 192.168.1.2/24
gw 192.168.1.1

Конфигурация роутера такая:
ip 192.168.1.1/24 - внутренний интерфейс

внешний такой:
ip 10.44.44.215/16
gw 10.44.0.254
dns 192.168.0.3
(это адреса выданные провайлером)

В rc.conf на роутере написано написано так (именно в такой последовательности):

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

ifconfig_rl0="inet 10.44.44.215 netmask 255.255.0.0" 
defaultrouter="10.44.0.254" 

ifconfig_rl1="inet 192.168.1.1 netmask 255.255.255.0" 
hostname="Progress.localhost" 

gateway_enable="YES" 
natd_enable="YES" 
natd_interface="rl0" 
natd_flags="-l yes"
Конфиги фаервола:

Так всё работает:

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

in=rl1  #to me
out=rl0 #to internet
inip=192.168.1.1
outip=10.44.44.215
maskin=24
netin=192.168.1.0/24

ipfw -f flush

ipfw add allow ip from any to any via lo0
ipfw add deny ip from any to 127.0.0.0/8
ipfw add deny ip from 127.0.0.0/8 to any

ipfw add check-state

ipfw add divert natd all from ${netin} to any out via ${out}
ipfw add divert natd all from any to 10.44.44.215 in via ${out}

ipfw add allow all from me to any keep-state
ipfw add allow all from any to any via ${in}
Так - при попытке пинговать ДНС прова (192.168.0.3) ответы не приходят. Причём, судя по счетчикам - пакеты из локалки натятся, а назад не приходят (счетчик ipfw add divert natd all from any to 10.44.44.215 in via ${out} пустой):

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

...Переменные аналогичны...

ipfw -f flush

ipfw add allow ip from any to any via lo0
ipfw add deny ip from any to 127.0.0.0/8
ipfw add deny ip from 127.0.0.0/8 to any

ipfw add check-state

ipfw add divert natd all from ${netin} to any out via ${out}
ipfw add divert natd all from any to 10.44.44.215 in via ${out}

ipfw add allow all from me to any out xmit ${out} keep-state

ipfw add allow all from any to any via ${in}
Что не так? Я считал что во втором случае пакет из локалки попадает в нат, потом выходит из ната и отправляется в сеть, с адресом отправителя = {ipout}, при этом создаётся динамическое правило разрешающее хождение пакетов по этому пути. По этому динамическому правилу пакет вернётся и снова попадёт в нат, откуда с нужным адресом получателя уйдёт в локалку.

Получается, что "обратный билет" по keep-state не действует...

Что не так?

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2460 рублей (8 CPU, 8Gb RAM, 2x500Gb HDD, RAID 3ware 9750):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
schizoid
подполковник
Сообщения: 3228
Зарегистрирован: 2007-03-03 17:32:31
Откуда: Украина, Чернигов
Контактная информация:

Re: Настройка роутера IPFW+natd

Непрочитанное сообщение schizoid » 2010-09-01 12:58:11

а с самого сервера ДНС пингуется?
ядерный взрыв...смертельно красиво...жаль, что не вечно...

UsCr
мл. сержант
Сообщения: 77
Зарегистрирован: 2010-09-01 12:16:57

Re: Настройка роутера IPFW+natd

Непрочитанное сообщение UsCr » 2010-09-01 14:28:49

Да. С самого сервера всё нормально работает. И с хоста при любой конфигурации пингуется шлюз (192.168.1.1), что, впрочем, очевидно.

Аватара пользователя
hizel
дядя поня
Сообщения: 9031
Зарегистрирован: 2007-06-29 10:05:02
Откуда: Выборг

Re: Настройка роутера IPFW+natd

Непрочитанное сообщение hizel » 2010-09-01 14:46:27

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

ipfw -d show
check-state до natd дурацкая идея, о чем написано в рукокниге ;-)
В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.

UsCr
мл. сержант
Сообщения: 77
Зарегистрирован: 2010-09-01 12:16:57

Re: Настройка роутера IPFW+natd

Непрочитанное сообщение UsCr » 2010-09-01 15:23:55

hizel писал(а):

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

ipfw -d show
check-state до natd дурацкая идея
Я думал об этом, но при переносе check-state под диверт лучше не стало.

Аватара пользователя
hizel
дядя поня
Сообщения: 9031
Зарегистрирован: 2007-06-29 10:05:02
Откуда: Выборг

Re: Настройка роутера IPFW+natd

Непрочитанное сообщение hizel » 2010-09-01 15:25:04

посмотрите как организованы правила во втором примере главы об ipfw английской рукокниги, подумайте почему они организованны именно так
В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.

UsCr
мл. сержант
Сообщения: 77
Зарегистрирован: 2010-09-01 12:16:57

Re: Настройка роутера IPFW+natd

Непрочитанное сообщение UsCr » 2010-09-01 21:38:39

Посмотрел.
Если я правильно понял, то там сначала натят и отправляют в сеть, потом запрещают всё плохое, а вернувшиеся по keep-state пакеты в обход запретов опять кидают в нат, откуда они возвращаются на правило allow all from any to any. Но я хочу всё запретить и разрешить только то, что мне нужно.

Вдохновлённый хендбучным примером я наваял вот что:

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

1 divert natd all from any to any out via rl0
2 check-state
3 divert natd all from any to any in via rl0
4 allow all from any to any out via rl0 keep-state
5 allow all from any to any in via rl1
И опять не заработало (неожиданно, да?).

В моём представлении пакет по вышеописанным правилам путешествует так:
Из локальной сети он по правилу 1 попадает в нат.
Из ната он по правилу 4 уходит в сеть, создаётся динамическое правило.
Из сети по правилу 2 не будет уничтожен, а по правилу 3 попадёт в нат.
Из ната он по правилу 5 придёт на хост.

Вас не затруднит ткнуть меня носом в ошибку в данном конкретном случае?

Аватара пользователя
hizel
дядя поня
Сообщения: 9031
Зарегистрирован: 2007-06-29 10:05:02
Откуда: Выборг

Re: Настройка роутера IPFW+natd

Непрочитанное сообщение hizel » 2010-09-01 21:58:13

UsCr писал(а): Из сети по правилу 2 не будет уничтожен, а по правилу 3 попадёт в нат.
нет по правилу 2 к пакету будет применено allow, а так как он без nat то получится кака :-)

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

allow all from any to any in via rl1
divert natd all from any to any in via rl0
check-state
skipto 64000 all from any to any out via rl0 keep-state
64000 divert natd all from any to any in via rl0
64001 allow all from any to any
такой порядок будет правилен

в сторону локалки не рассматриваем

для пакета исходящего из rl0 будет созданно динамическое правило которое будет все из сессии кидать на
правило 64000 где будет изменятся исходящий адрес и выпускатся в мир

для пакета входящего будет произведено обратное преобразование адресов и попадать под опять же динамическое правило которое
все равно его швырнет к правилу 64000 гдев конце концов пропустицо по правилу 64001

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

как то так
В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.

UsCr
мл. сержант
Сообщения: 77
Зарегистрирован: 2010-09-01 12:16:57

Re: Настройка роутера IPFW+natd

Непрочитанное сообщение UsCr » 2010-09-01 22:09:35

Ога... Моя ошибка в том, что я:
а) Забываю что пакет проверяется до первого совпадения.
б) check-state тоже правило.

Спасибо. Завтра высплюсь и разберусь в ваших правилах.

Аватара пользователя
hizel
дядя поня
Сообщения: 9031
Зарегистрирован: 2007-06-29 10:05:02
Откуда: Выборг

Re: Настройка роутера IPFW+natd

Непрочитанное сообщение hizel » 2010-09-01 22:18:43

если freebsd >=7.0
красивее использовать kernel nat и tag\tagged
В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.

UsCr
мл. сержант
Сообщения: 77
Зарегистрирован: 2010-09-01 12:16:57

Re: Настройка роутера IPFW+natd

Непрочитанное сообщение UsCr » 2010-09-05 21:00:09

hizel писал(а):

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

allow all from any to any in via rl1
divert natd all from any to any in via rl0
check-state
skipto 64000 all from any to any out via rl0 keep-state
64000 divert natd all from any to any in via rl0
64001 allow all from any to any
А не работает...
И я по разному извращался... Ни как не работает. Может быть такое, что у меня демон не так работает или ядро поломано?...

Аватара пользователя
hizel
дядя поня
Сообщения: 9031
Зарегистрирован: 2007-06-29 10:05:02
Откуда: Выборг

Re: Настройка роутера IPFW+natd

Непрочитанное сообщение hizel » 2010-09-06 8:16:48

хз, у меня такой вариант работает:

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

#!/bin/sh

fadd="/sbin/ipfw -q add"
fw="/sbin/ipfw -qf"

$fw flush
$fw disable one_pass

$fw nat 1 config if em0

$fadd allow ip from any to any via lo0
$fadd allow all from any to any in via em1
$fadd nat 1 all from any to any in via em0
$fadd check-state
$fadd skipto 64000 all from any to any out via em0 keep-state
$fadd 64000 nat 1 all from any to any out via em0
$fadd 64001 allow all from any to any

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

[9:16] root@olo ~ #ipfw -d show
00100   0     0 allow ip from any to any via lo0
00200  13  1026 allow ip from any to any in via em1
00300 123  9328 nat 1 ip from any to any in via em0
00400   0     0 check-state
00500 204 34134 skipto 64000 ip from any to any out via em0 keep-state
64000  81 25058 nat 1 ip from any to any out via em0
64001 217 35658 allow ip from any to any
65535   0     0 deny ip from any to any
## Dynamic rules (5):
00500   5   420 (5s) STATE icmp 192.168.0.2 0 <-> 77.88.21.3 0
00500   4   304 (1s) STATE tcp 192.168.22.244 22 <-> 192.168.22.240 38166
00500   2   348 (9s) STATE udp 192.168.0.2 43303 <-> 192.168.22.193 53
В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.

UsCr
мл. сержант
Сообщения: 77
Зарегистрирован: 2010-09-01 12:16:57

Re: Настройка роутера IPFW+natd

Непрочитанное сообщение UsCr » 2010-09-06 8:33:45

hizel писал(а):хз, у меня такой вариант работает:

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

#!/bin/sh

fadd="/sbin/ipfw -q add"
fw="/sbin/ipfw -qf"

$fw flush
$fw disable one_pass

$fw nat 1 config if em0

$fadd allow ip from any to any via lo0
$fadd allow all from any to any in via em1
$fadd nat 1 all from any to any in via em0
$fadd check-state
$fadd skipto 64000 all from any to any out via em0 keep-state
$fadd 64000 nat 1 all from any to any out via em0
$fadd 64001 allow all from any to any

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

[9:16] root@olo ~ #ipfw -d show
00100   0     0 allow ip from any to any via lo0
00200  13  1026 allow ip from any to any in via em1
00300 123  9328 nat 1 ip from any to any in via em0
00400   0     0 check-state
00500 204 34134 skipto 64000 ip from any to any out via em0 keep-state
64000  81 25058 nat 1 ip from any to any out via em0
64001 217 35658 allow ip from any to any
65535   0     0 deny ip from any to any
## Dynamic rules (5):
00500   5   420 (5s) STATE icmp 192.168.0.2 0 <-> 77.88.21.3 0
00500   4   304 (1s) STATE tcp 192.168.22.244 22 <-> 192.168.22.240 38166
00500   2   348 (9s) STATE udp 192.168.0.2 43303 <-> 192.168.22.193 53
em1 у вас в локалку смотрит, да?

А может мне быть мужиком и использовать таки ipfw nat? А может мне быть мужиком и таки собрать ядро с опцией IPDIVERT?

Аватара пользователя
hizel
дядя поня
Сообщения: 9031
Зарегистрирован: 2007-06-29 10:05:02
Откуда: Выборг

Re: Настройка роутера IPFW+natd

Непрочитанное сообщение hizel » 2010-09-06 8:42:48

em1 локалка, типа, это все в виртуальной машине, в двух
бздя какая? если >= 7.x то зачем вам natd :)

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

#kldstat
Id Refs Address    Size     Name
 1    6 0xc0400000 d814b8   kernel
 2    1 0xc2e07000 12000    ipfw.ko
 3    1 0xc2e19000 f000     libalias.ko

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

#uname -a
FreeBSD olo.vyborg.ru 9.0-CURRENT FreeBSD 9.0-CURRENT #0 r211430: Tue Aug 17 23:46:13 MSD 2010     root@olo.vyborg.ru:/usr/obj/usr/src/sys/GENERIC  i386
с возрастом становишься ленивее :)

да и причем тут DIVERT и kernel nat ?
В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.

UsCr
мл. сержант
Сообщения: 77
Зарегистрирован: 2010-09-01 12:16:57

Re: Настройка роутера IPFW+natd

Непрочитанное сообщение UsCr » 2010-09-06 8:57:48

hizel писал(а): да и причем тут DIVERT и kernel nat ?
Ни при чём. Это я говорил про natd.

Фряха у меня 8.0, natd пытался прикрутить, боясь страшного ipfw nat, по которому мало доки на русском. Нашёл тут статью не плохуюhttp://www.lissyara.su/articles/freebsd ... /ipfw_nat/.

Попробую по ней сделать (ну и ядро переберу, очень уж хочется, тем более что нужно включить поддержку вафельного адаптера).

UsCr
мл. сержант
Сообщения: 77
Зарегистрирован: 2010-09-01 12:16:57

Re: Настройка роутера IPFW+natd

Непрочитанное сообщение UsCr » 2010-09-11 18:43:30

При попытке собрать ядро, выплыла битая планка памяти. Из за неё не хотел работать нат.
Теперь прошу помощи в окончательном доведении до ума роутера. На этот раз всё таки перелез на ядерный нат.
Такой конфиг:

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

#разрешаем трафик по локалке
add 1040 allow ip from any to any via rl1
# нат работает на внешнем интерфейсе и не пускает то, что не уходило (deny_in)
nat 1 config log if rl0 reset same_ports deny_in
# заварачиваем все что проходит через внешний интерфейс в нат
add 10130 nat 1 ip from any to any via em0
Всё это работает для локальной сети. Машина за натом видит всё в локальной сети. Когда на роутере поднимаю ВПН, то машина за натом НЕ видит днс. Когда на роутере прописываю роут до ДНС сервера, машина за натом видит ДНС сервер, но не получает ответы от ya.ru.

Вопрос:
Нужно ли поднять ещё один нат на tun0, если да, то как это оформить?
А может быть это проблема сетевых путей?