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

Подробное руководство по ipfw nat

Добавлено: 2009-07-07 12:04:32
terminus
Есть предложение возникщее в этой теме
http://forum.lissyara.su/viewtopic.php?f=8&t=18945
может ipfw кернел нат переписали и не плохо, но документировали препаршиво, да и примеров в инете очень мало
Согласен.

Давайте общими силами всего форума создадим ман/фак/примеры использования кернел ната. Типа берем функционал старого natd и пробуем то же самое с кернеловским. По-ходу описываем подводные камни.

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

:Bravo:

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
Это все пока только загатовка - типа плана что-то... Если есть предложения или примеры пишите в тему. :smile:

--

включение кернел ната в ядро:

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

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 ip from any to any via fxp0
Это дырки в фаерволе для трафика адресованного рутеру:

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

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     Enable logging on this nat instance.

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

     -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_addr

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

     -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

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

     -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

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

     -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 :-D Короче подвязывай со смешариками. Тут решается серьезная проблема сетевого взаимодействия, на самом деле. Из-за невнятной документации и отсутствия хавтушек люди боятся использовать родной нат и переползают на пф или 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...).