Страница 1 из 2
freebsd7 nat
Добавлено: 2008-08-28 20:24:15
parad
Hello, world!
Имею FreeBSD 7.0-RELEASE-p3. Раскидал сервисы по jail'ам. Т.к. реальник один, прошлось делать нат на ipfw. Интерфейсы у jail'ов lo*, адреса 10.0.0.*. Для ната использую:
Код: Выделить всё
...
${ipfw} nat 1 config if ${_if_inet} redirect_port tcp ${_ip_jail1_if}:25 25
${ipfw} add 10100 nat 1 ip from any to any
...
Все работает (поднял пока одну виртуалку, доступность порта не тестировал), но для полноты хочется понят смысл any to any: какие бы другие комбинации я не пробывал (а их всего 6: { any to $iif, $iif to any, any to $oif, $oif to any, $iif to $oif, $oif to $iif}) - не работает, а порой сервер перестает отвечать? Из нескольких источников в сети я нашел, что правильно any to $oif, но после такого комп пропадает из сети (предполагаю из-за совпадени адресов сервера и реальника под нат). К сожалению ман достаточно скудно описывает кернеловский нат, и в сети нет исчерповающей информации по этому поводу.
WBR!
Re: freebsd7 nat
Добавлено: 2008-08-28 21:37:21
Alex Keda
предлагаю вкурить в логику работы файрвлла

Re: freebsd7 nat
Добавлено: 2008-08-28 23:02:46
parad
lissyara писал(а):предлагаю вкурить в логику работы файрвлла

Дельное предложение! Рассказывай!

Re: freebsd7 nat
Добавлено: 2008-08-29 0:35:26
Alex Keda
man
хандбук
Re: freebsd7 nat
Добавлено: 2008-08-29 13:22:33
parad
lissyara писал(а):man
хандбук
ёптть, Лешь, я с определенным вопросом, с указанием того, что читал и хендбук и ман, даже читал твои когда-то криво наваеванные конфиги, ну вот нихрена не нашел. если есть ссылки с детальным описанием - кидай, а не пустой палемикой занимайся.
Re: freebsd7 nat
Добавлено: 2008-08-29 15:24:53
bitman
Эмм... ты спрашиваешь, почему НАТится трафик в обе стороны?
Гм... Ну, потому что НАТ должен конвертировать:
серые адреса (во внешний) подсетей, от имени которых идут запросы "наружу";
внешний адрес - назад в "серые". Это когда приходят ответы "снаружи".
А строку ${ipfw} add 10100 nat 1 ip from any to any
можешь разделить на несколько. Например:
Код: Выделить всё
${ipfw} add 10100 nat 1 ip from "внутренняя подсеть" to any //сконвертирует во внешний адрес
${ipfw} add 10110 nat 1 ip from any to "адрес сервера" //отсеет пакеты, идущие в подсеть, от пакетов, идущих непосредственно к серверу; сконвертирует внешний адрес в серый.
До встроенного НАТа я еще не добрался, поэтому могу ошибаться. Но логика подсказывает, что тут все работает как и с natd
Или все просто, или я не понял вопроса

Re: freebsd7 nat
Добавлено: 2008-08-29 15:40:13
parad
Код: Выделить всё
${ipfw} add 10100 nat 1 ip from "внутренняя подсеть" to any //сконвертирует во внешний адрес
${ipfw} add 10110 nat 1 ip from any to "адрес сервера" //отсеет пакеты, идущие в подсеть, от пакетов, идущих непосредственно к серверу; сконвертирует внешний адрес в серый.
Со второй строчкой проблема - перестает отвечать сервак, т.к. он и и порт ssh заварачивает на ип jail'а, а с первой не работает виртуалка. перепробывал все варианты, но работает только с any to any. хотелось бы, чтобы из каждой виртуалки можно было выходить в мир, а из мира достучаться до каждой виртуалки, имеющей свой сервис на каком-то порту.
Re: freebsd7 nat
Добавлено: 2008-08-29 15:51:54
bitman
Ну давай подумаем вместе...
В jail-е, по-моему, запускается свой экземпляр ОС. ipfw работает один для всех, или в каждой "клетке" отдельно?
Если один для всех, то попробуй для каждой клетки определить свой НАТ:
Код: Выделить всё
${ipfw} add 10100 nat 1 ip from "внутр. подсеть jail-а №1" to any
${ipfw} add 10110 nat 1 ip from any to "внешн. айпишник jail-а №1"
//и по аналогии:
${ipfw} add 10200 nat 2 ip from "внутр. подсеть jail-а №2" to any
${ipfw} add 10210 nat 2 ip from any to "внешн. айпишник jail-а №2"
ну и так далее.
А если в каждой клетке работает свой экземпляр файрвола, то в каждом укажи по одному НАТу:
Код: Выделить всё
//для jail #1
${ipfw} add 10100 nat 1 ip from "внутр. подсеть jail-а №1" to any
${ipfw} add 10110 nat 1 ip from any to "внешн. айпишник jail-а №1"
//для jail #2
${ipfw} add 10100 nat 1 ip from "внутр. подсеть jail-а №2" to any
${ipfw} add 10110 nat 1 ip from any to "внешн. айпишник jail-а №2"
Re: freebsd7 nat
Добавлено: 2008-08-29 15:53:55
bitman
ну и для сервера не забудь (на реальной, внешней системе):
Код: Выделить всё
${ipfw} add 10100 nat 1 ip from "внутр. подсеть РЕАЛЬНОГО сервера" to any
${ipfw} add 10110 nat 1 ip from any to "внешн. айпишник РЕАЛЬНОГО сервера"
Re: freebsd7 nat
Добавлено: 2008-08-29 15:58:42
bitman
А вообще-то, в jail-ах, по-моему только один интерфейс - внешний. Зачем ему НАТ? НАТ нужен для выхода "наружу" машин из внутренних сетей с серыми адресами...
Просто разреши в файрволе обращаться к внешним айпишникам "клеток".
Re: freebsd7 nat
Добавлено: 2008-08-29 16:14:11
paix
bitman писал(а):А вообще-то, в jail-ах, по-моему только один интерфейс - внешний. Зачем ему НАТ? НАТ нужен для выхода "наружу" машин из внутренних сетей с серыми адресами...
Просто разреши в файрволе обращаться к внешним айпишникам "клеток".
несколько джайлов нельзя повесить на один айпишник (без левых кастылей)
поэтому (если реальн. адрес один на машину), джайлы делаем на серых адресах.
Для того чтобы эти джайлы умели ходить в мир(не рубаясь на шлюзовых фаервовалах) нужно всеголишь одно правило.
занаитить серые адреса джайлов на реальный айпишник сервера.
Re: freebsd7 nat
Добавлено: 2008-08-29 16:21:29
bitman
Еще раз прочитал твой ворпос, и что я тут нагородил
Теперь решение выделить для каждой клетки свой НАТ мне не нравится

Потому что на обратном пути (из Интернета) какому НАТу отдать пакет? Они же все будут идти на реальный адрес сервера.
Предлагаю на одном нате прописать все редиректы, а затем -
Код: Выделить всё
${ipfw} add 10100 nat 1 ip from 10.0.0.0/24 to any
${ipfw} add 10110 nat 1 ip from any to "внешн. айпишник РЕАЛЬНОГО сервера"
А вот и paix подтверждает мои подозрения

Спасибо.
Re: freebsd7 nat
Добавлено: 2008-08-29 16:33:20
parad
bitman писал(а):Ну давай подумаем вместе...
В jail-е, по-моему, запускается свой экземпляр ОС. ipfw работает один для всех, или в каждой "клетке" отдельно?
Если один для всех, то попробуй для каждой клетки определить свой НАТ:
Из jail'а, из того, что я помню по его архитектуре, нельзя обращаться к фаерволу.
bitman писал(а):А вообще-то, в jail-ах, по-моему только один интерфейс - внешний. Зачем ему НАТ? НАТ нужен для выхода "наружу" машин из внутренних сетей с серыми адресами...
Просто разреши в файрволе обращаться к внешним айпишникам "клеток".
На серваке без проблем - 18 виртуалок и у каждой свой ип. На домашнем - 1 ип, и несколько виртуалок. Собственно в этом вопрос.
paix писал(а):несколько джайлов нельзя повесить на один айпишник (без левых кастылей)
поэтому (если реальн. адрес один на машину), джайлы делаем на серых адресах.
Для того чтобы эти джайлы умели ходить в мир(не рубаясь на шлюзовых фаервовалах) нужно всеголишь одно правило.
занаитить серые адреса джайлов на реальный айпишник сервера.
И по-порту вывести обратно, для доступности сервисов джайла...

any to any - работает, а так, чтобы 'per jail' и понимаючи, что значить из чего - куда?
Re: freebsd7 nat
Добавлено: 2008-08-29 17:00:27
parad
bitman писал(а):
Предлагаю на одном нате прописать все редиректы, а затем -
Код: Выделить всё
${ipfw} add 10100 nat 1 ip from 10.0.0.0/24 to any
${ipfw} add 10110 nat 1 ip from any to "внешн. айпишник РЕАЛЬНОГО сервера"
Нашел в чем беда - забыл указать pass для lo*.
Всем спасибо за помощь. Кому интересно - могу выложить полный конфиг. ))
Re: freebsd7 nat
Добавлено: 2008-08-29 17:02:52
dikens3
Выложи..
Re: freebsd7 nat
Добавлено: 2008-09-02 8:38:55
Div
Выложи, будем посмотреть, а то у меня ядерный нат чет тоже не хочет как надо работать...
Re: freebsd7 nat
Добавлено: 2008-09-04 1:58:54
parad
По просьбам и согласно обещянию выкладываю.
Для работы необходимо выставить net.inet.ip.fw.one_pass=1.
ПС. Любые замечания - пишите. Интересно будет обсудить.
ПСС. Мое мнение, как человека перешедшего с pf - косячный этот нат (в ipfw).
ПССС не в тему. Нашел багу в генерик-ядре i386 7.0, но по-ангийски тока читать умею. Кто поможет составить письмо о баге?
Сам конфиг:
Код: Выделить всё
#!/bin/sh
ipfw="/sbin/ipfw"
_if_inet="rl0"
_ip_inet="xxx.xxx.xxx.xxx"
_if_local="nfe0"
_if_jail1="lo1"
_if_jail2="lo2"
_if_jail3="lo3"
_ip_jail1="10.0.0.1"
_ip_jail2="10.0.0.2"
_ip_jail3="10.0.0.3"
###########################################################################
# Инициализация фаервола.
${ipfw} -f flush
${ipfw} -f pipe flush
${ipfw} -f queue flush
# Таблица для постоянно черного списка.
${ipfw} -f table 0 flush
# Таблица для временной блокировки.
${ipfw} -f table 1 flush
###########################################################################
### Функции для обработки стандартных правил.
# Запрещаем приходить пакетам из RFC-сетей.
_deny_rfc_nets()
{
_no=$1;
${ipfw} add ${_no} deny all from any to 240.0.0.0/4 in
${ipfw} add ${_no} deny all from 240.0.0.0/4 to any in
${ipfw} add ${_no} deny all from any to 0.0.0.0/8 in
${ipfw} add ${_no} deny all from 0.0.0.0/8 to any in
${ipfw} add ${_no} deny all from any to 10.0.0.0/8 in
${ipfw} add ${_no} deny all from 10.0.0.0/8 to any in
${ipfw} add ${_no} deny all from any to 172.16.0.0/12 in
${ipfw} add ${_no} deny all from 172.16.0.0/12 to any in
${ipfw} add ${_no} deny all from any to 169.254.0.0/16 in
${ipfw} add ${_no} deny all from 169.254.0.0/16 to any in
${ipfw} add ${_no} deny all from any to 192.168.0.0/16 in
${ipfw} add ${_no} deny all from 192.168.0.0/16 to any in
${ipfw} add ${_no} deny all from any to 255.255.255.255 in
${ipfw} add ${_no} deny all from 255.255.255.255 to any in
}
# Определяем список разрешенных типов ICMP.
_icmp_protection()
{
_no=$1;
# 0 echorep Echo reply
# 3 unreach Destination unreachable
# 4 squench Packet loss, slow down
# 5 redir Shorter route exists
#-6 althost Alternate host address
# 8 echoreq Echo request
# 9 routeradv Router advertisement
# 10 routersol Router solicitation
# 11 timex Time exceeded
# 12 paramprob Invalid IP header
# 13 timereq Timestamp request
# 14 timerep Timestamp reply
# 15 inforeq Information request
# 16 inforep Information reply
# 17 maskreq Address mask request
# 18 maskrep Address mask reply
#-30 trace Traceroute
#-31 dataconv Data conversion problem
#-32 mobredir Mobile host redirection
#-33 ipv6-where IPv6 where-are-you
#-34 ipv6-here IPv6 i-am-here
#-35 mobregreq Mobile registration request
#-36 mobregrep Mobile registration reply
#-39 skip SKIP
#-40 photuris Photuris
${ipfw} add ${_no} pass icmp from any to me in icmptype 0,3,4,11,12,30
${ipfw} add ${_no} pass icmp from me to any out icmptype 3,4,8,11,12,30
${ipfw} add ${_no} deny icmp from any to any frag
}
###########################################################################
### Основные, нестираемые правила [00000 - 00099].
# Интерфейс lo0.
${ipfw} add 00011 pass all from any to any via lo0
${ipfw} add 00012 deny all from any to 127.0.0.0/8
${ipfw} add 00012 deny all from 127.0.0.0/8 to any
# Сплиттер.
${ipfw} add 00094 skipto 10000 all from any to any via ${_if_inet}
${ipfw} add 00095 skipto 64000 all from any to any via ${_if_local}
${ipfw} add 00096 skipto 64000 all from any to any via ${_if_jail1}
${ipfw} add 00097 skipto 64000 all from any to any via ${_if_jail2}
${ipfw} add 00098 skipto 64000 all from any to any via ${_if_jail3}
${ipfw} add 00099 skipto 65000 all from any to any
###########################################################################
### Интерфейс _if_inet [10000 - 63999].
# Фильтруем негодяев [10000 - 10999].
${ipfw} add 10000 deny all from table\(1\) to any
${ipfw} add 10001 deny all from table\(2\) to any
_deny_rfc_nets 10002
_icmp_protection 10003
${ipfw} add 10004 deny tcp from any to any tcpflags fin, syn, rst, psh, ack, urg
${ipfw} add 10004 deny tcp from any to any tcpflags !fin, !syn, !rst, !psh, !ack, !urg
# NAT [11000 - 11999].
${ipfw} nat 1 config if ${_if_inet} redirect_port tcp ${_ip_jail1}:25 25 \
redirect_port udp ${_ip_jail2}:53 53 \
redirect_port tcp ${_ip_jail3}:443 443
${ipfw} add 11000 nat 1 all from ${_ip_jail1} to any
${ipfw} add 11001 nat 1 all from ${_ip_jail2} to any
${ipfw} add 11002 nat 1 all from ${_ip_jail3} to any
${ipfw} add 11003 nat 1 all from any to ${_ip_inet} not 60022
# Фильтр [11000 - 59999].
${ipfw} add 12000 check-state
${ipfw} add 12001 deny tcp from any to any established
${ipfw} add 12002 pass tcp from me to any out setup keep-state
${ipfw} add 12002 pass udp from me to any out keep-state
${ipfw} add 12003 pass tcp from any to me 60022 in setup keep-state
# Концовка.
${ipfw} add 63999 skipto 65000 all from any to any
###########################################################################
# Концовка #1 (pass).
${ipfw} add 64000 pass all from any to any
###########################################################################
# Концовка #2 (deny).
${ipfw} add 65000 deny all from any to any
Re: freebsd7 nat
Добавлено: 2008-09-04 9:35:17
dikens3
ПС. Любые замечания - пишите. Интересно будет обсудить.
Код: Выделить всё
${ipfw} add ${_no} deny all from any to 240.0.0.0/4 in
${ipfw} add ${_no} deny all from 240.0.0.0/4 to any in
${ipfw} add ${_no} deny all from any to 0.0.0.0/8 in
${ipfw} add ${_no} deny all from 0.0.0.0/8 to any in
${ipfw} add ${_no} deny all from any to 10.0.0.0/8 in
${ipfw} add ${_no} deny all from 10.0.0.0/8 to any in
${ipfw} add ${_no} deny all from any to 172.16.0.0/12 in
${ipfw} add ${_no} deny all from 172.16.0.0/12 to any in
${ipfw} add ${_no} deny all from any to 169.254.0.0/16 in
${ipfw} add ${_no} deny all from 169.254.0.0/16 to any in
${ipfw} add ${_no} deny all from any to 192.168.0.0/16 in
${ipfw} add ${_no} deny all from 192.168.0.0/16 to any in
Таблицу создай и не парься с таким количеством правил. Или хотя бы списком можно прибивать:
Код: Выделить всё
${ipfw} add ${_no} deny all from any to 240.0.0.0/4,0.0.0.0/8,10.0.0.0/8,... in
Код: Выделить всё
${ipfw} add 00095 skipto 64000 all from any to any via ${_if_local}
${ipfw} add 00096 skipto 64000 all from any to any via ${_if_jail1}
${ipfw} add 00097 skipto 64000 all from any to any via ${_if_jail2}
${ipfw} add 00098 skipto 64000 all from any to any via ${_if_jail3}
Тут можно тоже оптимизировать:
Код: Выделить всё
${ipfw} add 00095 skipto 64000 all from any to any ( via ${_if_local} or via ${_if_jail1} ....)
Re: freebsd7 nat
Добавлено: 2008-09-05 7:59:53
Alex Keda
лучше расскажи чего за багу нашёл.
может давно задокументированная фича

))
Re: freebsd7 nat
Добавлено: 2008-09-05 10:51:10
parad
Возможно и задукоментированная. Вчера привезли еще один сервак на базе CoreQuad (дистр 7.0-amd64), на нем та-же фитча повторилась. При остановке ОС на экран пишет:
Код: Выделить всё
Sep 5 00:34:38 test kernel: Waiting (max 60 seconds) for system process `vnlru' to stop...done
Sep 5 00:34:38 test kernel: Waiting (max 60 seconds) for system process `bufdaemon' to stop...done
Sep 5 00:34:38 test kernel: Waiting (max 60
Sep 5 00:34:38 test kernel: seScyonncdisn)g fdoirs kssy,s tvenmo dperso creesmsa i`nsiynngc.e.r.' to3 stop...0 0 done
Sep 5 00:34:38 test kernel: All buffers synced.
Складывается впечетление, что у него терминальный вывод идет из разных потоков одновременно и мьютекс никакой на блокировку не заложен, чтобы сообщение не перехлестывались (могу ошибаться, но на всякий чп откатился до 6.3).
Этот баг не проявляется на athlon64.
ПС. Ядро генерик.
Re: freebsd7 nat
Добавлено: 2008-09-05 11:15:17
Alex Keda
в карренте такое частенько....
а вот в семёрке не видел
Re: freebsd7 nat
Добавлено: 2008-09-05 13:54:20
zingel
терминальный вывод тут вообще не причём, перед тем как ребутаться стоит делать
Re: freebsd7 nat
Добавлено: 2008-09-05 15:57:00
parad
zingel писал(а):терминальный вывод тут вообще не причём, перед тем как ребутаться стоит делать
нет, этого делать не надо, т.к. при остановке сервака и сервисов на нем крутящихся он будет сбрасывать на диск данные, вот только после остановки всех сервисов он сам делает синк. есть еще одна особенность - на обоих серваках LSI MegaRAID.
В общем кто-нибудь может перевести на английский что я рассказал, всетаки хочется чтобы пофиксили и со спокойной душой начать переходить на 7... ))
Re: freebsd7 nat
Добавлено: 2008-09-05 17:51:35
zingel
видно, что две строки ядерный лог лепит в одну, это говорит о том, что в этот момент происходит рассинхронизация потоков
делать sync в этот момент с 2 секундным слипом
Re: freebsd7 nat
Добавлено: 2008-09-05 20:09:38
parad
zingel писал(а):видно, что две строки ядерный лог лепит в одну, это говорит о том, что в этот момент происходит рассинхронизация потоков
делать sync в этот момент с 2 секундным слипом
синк после остановки сервера? предположений много можно сделать и в сорцы залезть, покавырять и с каждой версией вручную патчит; я же хочу отправить разработчикам, чтоб пофиксили и эта лажа благопалучно миновала. английский никто не знает?