Страница 1 из 31
Подробное руководство по ipfw nat
Добавлено: 2009-07-07 12:04:32
terminus
Есть предложение возникщее в этой теме
http://forum.lissyara.su/viewtopic.php?f=8&t=18945
может ipfw кернел нат переписали и не плохо, но документировали препаршиво, да и примеров в инете очень мало
Согласен.
Давайте общими силами всего форума создадим ман/фак/примеры использования кернел ната. Типа берем функционал старого natd и пробуем то же самое с кернеловским. По-ходу описываем подводные камни.
Нужен план составления.
Собственно, есть идея составить детальный обзор кернел ната. Оформим в виде статьи или в вики выложим. Нужен план какие фичи и в какой последовательности расписывать. У кого какие предложения?
Re: Подробное руководство по ipfw nat
Добавлено: 2009-07-07 12:12:37
Larin
хорошая затея:)
ждемс статей.
Re: Подробное руководство по ipfw nat
Добавлено: 2009-07-07 21:05:29
FenX
ну в последовательности, думаю имеет смысл начать с примитивного:
начальная конфигурация,
плюс простейший шлюз: 1 ип на внутреннюю локалку из 1 подсети.
в дальнейшем расписать пример по-сложнее:
нат на одну внутреннюю сеть с внешней локальной сети и с того же впн канала (не редкость среди провов).
далее можно будет уже подробно расписать примеры конфигурации:
проброс портов, проброс ip, etc.
по первым двум примерам могу расписать и я, если надо.
Re: Подробное руководство по ipfw nat
Добавлено: 2009-07-07 21:45:22
terminus
Это все пока только загатовка - типа плана что-то... Если есть предложения или примеры пишите в тему.
--
включение кернел ната в ядро:
Код: Выделить всё
options IPFIREWALL #firewall
options IPFIREWALL_NAT #ipfw kernel nat support
options LIBALIAS # libalias library, performing NAT
или можно просто модули подгружать - не обязательно в ядро вкомпиливать.
--
Для начала просто небольшой пример фаервола на натящем рутере. Тут em0 смотрит в интернет, а fxp0 смотрит в локалку 192.168.1.0/24. Правило net.inet.ip.fw.one_pass=1
В /etc/rc.conf прописано:
Код: Выделить всё
firewall_enable="YES"
firewall_type="/etc/firewall"
gateway_enable="YES"
/etc/firewall
Код: Выделить всё
add check-state
add allow ip from any to any via fxp0
add deny ip from any to 192.168.0.0/16 in via em0
add deny ip from 192.168.0.0/16 to any in via em0
add allow tcp from any to me 6881
add allow udp from any to me 4444
add allow icmp from me to any out keep-state
add allow tcp from me to any out keep-state
add allow udp from me to any out keep-state
nat 1 config if em0 deny_in unreg_only reset
add nat 1 all from any to any via em0
add deny tcp from any to any
add deny udp from any to any
add deny ip from any to any
локальной сети не боимся:
Это дырки в фаерволе для трафика адресованного рутеру:
Код: Выделить всё
add allow tcp from any to me 6881
add allow udp from any to me 4444
---
есть идея рассмотреть следующие конфигурации:
- простой пример как выше для случая "рутер и локалка"
- случай с несколькими экземплярами nat
- использование reverse nat
- использование proxy_only (че-то в мане на ipfw nat ничего не сказано про составление proxy_rule)
- использование dummynet pipe/queue
- обеспечение работы всего этого при случае, когда net.inet.ip.fw.one_pass=0
- скорость бы потестить и сравнить показатель для natd и ipfw nat
- модули протоколов libalias (alias_ftp.ko, alias_irc.ko, etc...)
- мониторинг (использование ресурсов процессора, памяти ядра vmstat -z vmstat -m)
- переодисеское обслуживание (рестарт)
- описание известных проблем/грабелек
- что еще?
---
ipfw nat построен на использовании той же libalias, что и старый natd. По идее весь функционал доступный для natd должен быть доступен и в ipfw nat. Одно из немногих различий про которые я знаю это то, что в 7.х перед отправкой пакета в ipfw nat не происхлдит его дефрагментация (перед дивертом в natd происходит).
Ман на ipfw nat довольно куций, но так как используется та же самая libalias то стоит ожидать, что все то что справедливо для natd будет справедливо и для кернел ната. Есть различие в опциях - у natd побольше всякого...
Список опций доступных при конфигурировании ipfw nat (и для сравнения те же опции из мана natd) :
Код: Выделить всё
ip ip_address
Define an ip address to use for aliasing.
Код: Выделить всё
-alias_address | -a address
Use address as the aliasing address. Either this or the
-interface option must be used (but not both), if the
-proxy_only option is not specified. The specified address
is usually the address assigned to the ``public'' network
interface.
All data passing out will be rewritten with a source address
equal to address. All data coming in will be checked to see
if it matches any already-aliased outgoing connection. If it
does, the packet is altered accordingly. If not, all
-redirect_port, -redirect_proto and -redirect_address assign-
ments are checked and actioned. If no other action can be
made and if -deny_incoming is not specified, the packet is
delivered to the local machine using the rules specified in
-target_address option below.
Код: Выделить всё
if nic Use ip addres of NIC for aliasing, dynamically changing it if
NIC's ip address change.
Код: Выделить всё
-interface | -n interface
Use interface to determine the aliasing address. If there is
a possibility that the IP address associated with interface
may change, the -dynamic option should also be used. If this
option is not specified, the -alias_address option must be
used.
Код: Выделить всё
-log | -l Log various aliasing statistics and information to the file
/var/log/alias.log. This file is truncated each time natd is
started.
Код: Выделить всё
deny_in
Deny any incoming connection from outside world.
Код: Выделить всё
-deny_incoming | -d
Do not pass incoming packets that have no entry in the inter-
nal translation table.
If this option is not used, then such a packet will be
altered using the rules in -target_address below, and the
entry will be made in the internal translation table.
Код: Выделить всё
same_ports
Try to leave the alias port numbers unchanged from the actual
local port numbers.
Код: Выделить всё
-same_ports | -m
Try to keep the same port number when altering outgoing pack-
ets. With this option, protocols such as RPC will have a
better chance of working. If it is not possible to maintain
the port number, it will be silently changed as per normal.
Код: Выделить всё
unreg_only
Traffic on the local network not originating from an unregistered
address spaces will be ignored.
Код: Выделить всё
-unregistered_only | -u
Only alter outgoing packets with an unregistered source
address. According to RFC 1918, unregistered source
addresses are 10.0.0.0/8, 172.16.0.0/12 and 192.168.0.0/16.
Код: Выделить всё
reset Reset table of the packet aliasing engine on address change.
Код: Выделить всё
reverse
Reverse the way libalias handles aliasing.
Код: Выделить всё
-reverse This option makes natd reverse the way it handles
``incoming'' and ``outgoing'' packets, allowing it to operate
on the ``internal'' network interface rather than the
``external'' one.
This can be useful in some transparent proxying situations
when outgoing traffic is redirected to the local machine and
natd is running on the internal interface (it usually runs on
the external interface).
Код: Выделить всё
proxy_only
Obey transparent proxy rules only, packet aliasing is not per-
formed.
Код: Выделить всё
-proxy_only
Force natd to perform transparent proxying only. Normal
address translation is not performed.
Код: Выделить всё
-redirect_address localIP publicIP
Redirect traffic for public IP address to a machine on the
local network. This function is known as static NAT. Nor-
mally static NAT is useful if your ISP has allocated a small
block of IP addresses to you, but it can even be used in the
case of single address:
redirect_address 10.0.0.8 0.0.0.0
The above command would redirect all incoming traffic to
machine 10.0.0.8.
If several address aliases specify the same public address as
follows
redirect_address 192.168.0.2 public_addr
redirect_address 192.168.0.3 public_addr
redirect_address 192.168.0.4 public_addr
the incoming traffic will be directed to the last translated
local address (192.168.0.4), but outgoing traffic from the
first two addresses will still be aliased to appear from the
specified public_addr.
Код: Выделить всё
-redirect_port proto targetIP:targetPORT[-targetPORT]
[aliasIP:]aliasPORT[-aliasPORT]
[remoteIP[:remotePORT[-remotePORT]]]
Redirect incoming connections arriving to given port(s) to
another host and port(s). Argument proto is either tcp or
udp, targetIP is the desired target IP address, targetPORT is
the desired target port number or range, aliasPORT is the
requested port number or range, and aliasIP is the aliasing
address. Arguments remoteIP and remotePORT can be used to
specify the connection more accurately if necessary. If
remotePORT is not specified, it is assumed to be all ports.
Arguments targetIP, aliasIP and remoteIP can be given as IP
addresses or as hostnames. The targetPORT, aliasPORT and
remotePORT ranges need not be the same numerically, but must
have the same size. When targetPORT, aliasPORT or remotePORT
specifies a singular value (not a range), it can be given as
a service name that is searched for in the services(5) data-
base.
For example, the argument
tcp inside1:telnet 6666
means that incoming TCP packets destined for port 6666 on
this machine will be sent to the telnet port on the inside1
machine.
tcp inside2:2300-2399 3300-3399
will redirect incoming connections on ports 3300-3399 to host
inside2, ports 2300-2399. The mapping is 1:1 meaning port
3300 maps to 2300, 3301 maps to 2301, etc.
Код: Выделить всё
-redirect_proto proto localIP [publicIP [remoteIP]]
Redirect incoming IP packets of protocol proto (see
protocols(5)) destined for publicIP address to a localIP
address and vice versa.
If publicIP is not specified, then the default aliasing
address is used. If remoteIP is specified, then only packets
coming from/to remoteIP will match the rule.
Re: Подробное руководство по ipfw nat
Добавлено: 2009-07-07 22:15:36
paradox
выдумайте топологию
и нарисуйте цветныи путями а можно и снекоторыми обьяснениями
что и как работает и как это отобразиться на топологии
Re: Подробное руководство по ipfw nat
Добавлено: 2009-07-07 22:23:29
FenX
попробую расписать топологию на то, что имеется.
на данный момент, под рукой есть 3 варианта ната:
стандартный набор:
1 подсеть, 1 выход на внешку.
1 подсеть, 2 выхода на внешку (с выходом через впн + локалка прова).
3 подсети, 1 выход на вне.
Re: Подробное руководство по ipfw nat
Добавлено: 2009-07-07 22:27:59
paradox
3 подсети, 2 выхода на внешку (с выходом через впн + локалка прова).
распишите такую )))
но смысл именно в том что бы разрисовать наглядно (давно мечтаю сделать такой мануал для начинающих - но время и прочее...)
Re: Подробное руководство по ipfw nat
Добавлено: 2009-07-07 22:32:23
terminus
Нарисовать конечно надо будет - это обязательно (и это не проблема).
Еще есть план активно ссылаться на то прикольное объяснение от Вадима Гончарова
http://nuclight.livejournal.com/124348.html - там отлично расписано как ходят пакетики через ipfw в случае рутера.
Re: Подробное руководство по ipfw nat
Добавлено: 2009-07-07 22:53:57
paradox
лучше не ссылаться а поставить в использованые источники
и нарисовать то как раз самая большая проблема)
поскоку я имел ввду не топологию нарисовать
а нарисоваь НА топологии пути хождения пакетов в случае с правилами и как это будет отображаться
вообщем нарисовать граммотную схему с примерами - это самое сложное
Re: Подробное руководство по ipfw nat
Добавлено: 2009-07-07 23:11:12
FenX
хмм... а разве тупо нарисовать "коробку" с сетевыми и разрисовать "стрелками" - не то?)))
проектировщик из меня хероватый, как и фотожопер в принципе
но что-нить попробую
Re: Подробное руководство по ipfw nat
Добавлено: 2009-07-07 23:16:11
paradox
нет
коробка со стрелками нето
в идеале было бы неплохо нарисовать во флеше
что бы можно было что то понажимать и увидеть как оно бегает итд
Re: Подробное руководство по ipfw nat
Добавлено: 2009-07-07 23:17:03
FenX
ну тогда точно не ко мне))
могу правила написать как и чего
а вот со флешем косяк =\
Re: Подробное руководство по ipfw nat
Добавлено: 2009-07-07 23:33:44
paradox
ну флеш это в идеале
а так можешь попробовать нарисовать жимпе или чем там
просто картинок получиться много
Re: Подробное руководство по ipfw nat
Добавлено: 2009-07-07 23:34:15
terminus
Вот тут статья nuclight'а как раз пригодится - у него там очень понятный ASCII-art где показана схема хождения пакетов. Перерисовать ее красиво и уже отличный наглядный материал на котором указаны все основные этапы и части.
Надо определиться с тем какие именно вещи из функционала ipfw nat описывать, в каком порядке и насколько наглядно. Я до конца недели буду еще прикидывать что и как - на чем тестировать, как описывать...
Наверное надо ориентироваться на что-то вроде:
- проблема (постановка задачи) или рассмотрение функции ipfw nat
- описание конфигурации ipfw
- детальное описание того как ходят пакеты через эту конфигурацию (на словах)
- описание того же на схеме
---
или во как еще можно: идти от самой простой конфигурации ната к более сложным. Начали с обычной конфигурации, потом добавляем dummynet, потом добавляем пробросы портов/адресов, потом второй экземпляр ната и так далее... И попутно все описывать со всеми обяснеиями и схемами.
Re: Подробное руководство по ipfw nat
Добавлено: 2009-07-07 23:45:32
paradox
нет
ненадо от простого к сложному
этот метод устарел
нужно красиво нарисовать схему
от самого начала
ак пакет попадает в компутер
и что с ним происходит
да та аски таблица пригодиться
но она для специалистов
для нуба она непоняна
так вот ее нужно так нарисовать что бы каждый ламмер понял ее
и на той таблице отобразить что произойдет с пекетом в лучае определенных правил
а точнее какая опция правила то будет делать с пакетом
например тот же via
который проверят пакет токо на входе или выходе
Re: Подробное руководство по ipfw nat
Добавлено: 2009-07-08 0:02:44
FenX
ну, думаю если наглядно и понятным языком описать значения ключей,
то можно и просто на словах обойтись.
хотя детальную схему нарисовать конечно не плохо)
надо будет порыться на полках, найти свои залежи книг
думаю так совместными усилиями будет не сложно составить общую схему
ну и тут же встаёт вопрос о рисовании схемы под каждое правило...
этак мы одними картинками полгода заниматься будем
думаю можно попробовать более понятно, но "в двух словах" разрисовать общую схему,
а потом уже просто описанием разъяснить что, куда и зачем.
Re: Подробное руководство по ipfw nat
Добавлено: 2009-07-08 0:08:21
paradox
вы опять нифига не поняли)))
не надо рисовать под каждое правилокартинку
нужно нарисовав ту схему прохождения пакета в ядре+ за пределами ядра
показать за какие участки прохождения икак влияют опции правила ipfw
Re: Подробное руководство по ipfw nat
Добавлено: 2009-07-08 0:47:21
schizoid
что-то типа идет пакет , попадает на локальный интерфейс, попадает в фаервол, проходит по цепочке правил, попадает на НАТ, записывается в базу НАТа, попадает на следующее правило, выходит из фаервола, попадает в начало цепочки правил, но уже с новым ИПом и на выходе с внешного интерфейса...это все разбить по цветам+к каждому сегменту показать пример правила и описать действие...типа так?
Re: Подробное руководство по ipfw nat
Добавлено: 2009-07-08 1:04:07
paradox
ну в общем смысле что то тип так
токо сократить до именно ipfw nat может не получиться
тоесть
прийдеться попутно и работу всего феара описывать
Re: Подробное руководство по ipfw nat
Добавлено: 2009-07-08 1:50:30
MASiK
Офф топ конечно.
Но я так просто представил себе такой мувик на флеше в виде смешариков, только не зайчики и кролики, а такие персонажи в виде буковок ipfw и nat и всякие циферки правила, на типу any allow count deny и т.д. и сразу представил такой сюжет:
"Привет Я NAT! от англ. Network Address Translation — «преобразование сетевых адресов», Я механизм в сетях TCP/IP, позволяющий преобразовывать IP-адреса транзитных пакетов!!! А ты кто?! ПРИВЕТ! А я ipfw я ipfirewall, межсетевой экран, который встроен во FreeBSD начиная с версии 2.0. С моей помощью можно, например, подсчитывать трафик по любым разумным правилам, основывающимся на данных заголовков пакетов протоколов стека TCP/IP, обрабатывать пакеты внешними программами, прятать за одним компьютером целую сеть и т.д. и т.п.!!!"
И тут начинается цензура
"Слушай ipfw! А давай я попробую пройти через тебя, а ты меня Обработаешь? Хмм... Отвечает ipfw: А знаешь NAT! Это не плохая идея!"
и дальше порно про то как nat проходит через ipfw туда и обратно, и как всем Быздато и Ахуэнно и всё это под Ляпис - Ау (Ау ау я тебя найду, ау ау я тебя всё равно найду)
Конечно идей много как у них Трио с VPN'ом и 2 натами, 3-мя подсетями, короче дальше одни Оргии... и Рамштайн
Так вот вопрос, что-то типа того надо?
Re: Подробное руководство по ipfw nat
Добавлено: 2009-07-08 9:28:17
terminus
MASiK
Короче подвязывай со смешариками. Тут решается серьезная проблема сетевого взаимодействия, на самом деле. Из-за невнятной документации и отсутствия хавтушек люди боятся использовать родной нат и переползают на пф или natd. Стоит задача во-первых четко описать функционал ната, а потом привести примеры и разжевать все как можно детальнее.
Re: Подробное руководство по ipfw nat
Добавлено: 2009-07-08 9:50:54
FenX
Мас, надо было тебе вчера вечером всё-таки к Зизи идти))
чет я смотрю у тебя уже чешется... оргии у него ipfw с nat`ом и vpn`ом...
Re: Подробное руководство по ipfw nat
Добавлено: 2009-07-08 10:47:25
Larin
а ядреный нат как я понял появился только в семерке?
Re: Подробное руководство по ipfw nat
Добавлено: 2009-07-08 11:02:16
schizoid
ну он как бы и раньше был, только через нетграф доступен...
Re: Подробное руководство по ipfw nat
Добавлено: 2009-07-08 11:08:37
terminus
netgraph-овский нат к сожалению еще более ограничен в функционале. Он ЕМНИП не может пробрасывать порты, не умеет следить за изменением IP на сетевухе и не поддерживает модули протоколов libalias (ftp, irc, etc...).