kernel nat

Обсуждаем OS FreeBSD и сервисы на ней.

kernel nat

Сообщение makky » 17 фев 2009, 02:38

Нашел время, сделал себе ядерный нат на 7.1р2.

До это использовал natd, позже переехал на ipnat (очень удобный потому что). Ну да ладно, сразу к делу, что мне непонятно.

Написал вот такой скриптик:
Код: Выделить всё
#!/bin/sh
out_ip="мой мега-секрет айпи"
out_iface="rl0"
local_iface="rl1"
localnet="192.168.5.0/24"
tcp_services="21,22,25,80,110,143,443,1863,3389,5190"
ipfw="/sbin/ipfw"

#### flush rules ####
${ipfw} -f flush
${ipfw} -f pipe flush
${ipfw} -f queue flush

${ipfw} table 1 flush

${ipfw} add 00300 pass all from any to ${out_ip} 22 via rl0
${ipfw} add 00310 pass all from ${out_ip} 22 to any via rl0

${ipfw} add 01100 allow gre from any to any
${ipfw} add 01200 allow icmp from any to any

${ipfw} add 1600 pass tcp from ${localnet} 1024-65535 to not ${localnet} ${tcp_services} via ${local_iface}
${ipfw} add 1700 pass tcp from not ${localnet} ${tcp_services} to ${localnet} 1024-65535 via ${local_iface} established
${ipfw} add 1800 reset log tcp from ${localnet} 1024-65535 to not ${localnet} via ${local_iface}
${ipfw} add 1900 reset log tcp from not ${localnet} to ${localnet} 1024-65535 via ${local_iface}

${ipfw} add 5000 pass log tcp from any to ${out_ip} 1723 via ${out_iface}
${ipfw} add 5010 pass log tcp from ${out_ip} 1723 to any via ${out_iface}

${ipfw} nat 10000 config if rl0 log unreg_only reset
${ipfw} add 10010 nat 10 log ip4 from any to any via rl0

${ipfw} add 15050 pass log tcp from ${out_ip} 1024-65535 to any via ${out_iface}
${ipfw} add 15060 pass log tcp from any to ${out_ip} 1024-65535 via ${out_iface} established

${ipfw} add 60000 reset log ip from any to any via rl0


Обратите внимание на расположение правил нат и опции, которые я применил. Все класно все работает в тестовом режиме. Даже вот скан прилагаю:
Код: Выделить всё
$ sudo nmap -sS мой мега-секрет айпи
Password:

Starting Nmap 4.76 ( http://nmap.org ) at 2009-02-17 02:17 MSK
Interesting ports on мой мега-секрет айпи:
Not shown: 998 filtered ports
PORT     STATE SERVICE
22/tcp   open  ssh
1723/tcp open  pptp

Nmap done: 1 IP address (1 host up) scanned in 5.01 seconds

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

Но! Как же я удивился, когда увидел, что натится впн клиент!! Такого я не видел при использовании ipnat...
Прилагаю лог:
Код: Выделить всё
Feb 17 02:25:35 mail3 kernel: ipfw: 10010 Nat TCP 192.168.5.13:139 192.168.12.44:3900 out via rl0
Feb 17 02:25:36 mail3 kernel: ipfw: 10010 Nat TCP 192.168.5.13:139 192.168.12.44:3905 out via rl0


Я понимаю, что натится ответ клиента из 5-ого сегмента. Но все попытки избавиться правила "from any to any" не привели к успеху. Я понимаю, что сейчас поздно очень уже, но все же, может есть кому интересно отточить до миллиметра этот момент. Тем более эту тему поднимают все больше и больше, но как-то слабовато, на уровне я не видел ман, зато видал заметку на опенке =)
А что ты сделал ради эксперимента?
Аватара пользователя
makky
посетитель
 
Сообщения: 119
Зарегистрирован: 19 окт 2008, 20:42
Откуда: msk

Re: kernel nat

Сообщение root » 17 фев 2009, 16:39

прошел примерно тот же путь с NAT`ом, но в итоге с kernel nat ушел на ng_nat. Почему ? Я ХЗ, м.б. у меня руки кривые, но поднял это дело, оно заработало, решил сделать NAT на несколько подсетей и в несколько ипов, сделал, поработало мин 15 и все кирдыкнулось. Правила в ipfw отрабатываются, но самого ната не происходит... чего я тока не делал.... помог тока ребут, ребутнулся - опять заработало.... вообщем после этого ушле на ng_nat, работает уже 3-ое суток без вопросов.

1. конфиг ipfw конечно хорошо, но, плиз, выложи вывод
Код: Выделить всё
ipfw show

2. 192.168.12.0/24 это подсеть VPN клиентов ?
3. а что мешает запретить пакеты из 192.168.5.0/24 к 192.168.12.0/24 и наоборот ?
С уважением, root

Изображение
------------
www.mega-net.ru - IT аутсорсинг
Аватара пользователя
root
Site Admin
 
Сообщения: 1894
Зарегистрирован: 11 июн 2008, 13:05
Откуда: Moscow, Russia

Re: kernel nat

Сообщение makky » 17 фев 2009, 18:35

root писал(а):прошел примерно тот же путь с NAT`ом, но в итоге с kernel nat ушел на ng_nat. Почему ? Я ХЗ, м.б. у меня руки кривые, но поднял это дело, оно заработало, решил сделать NAT на несколько подсетей и в несколько ипов, сделал, поработало мин 15 и все кирдыкнулось. Правила в ipfw отрабатываются, но самого ната не происходит... чего я тока не делал.... помог тока ребут, ребутнулся - опять заработало.... вообщем после этого ушле на ng_nat, работает уже 3-ое суток без вопросов.

=) не про natd говоришь? У меня когда редирект на 7 портов работал для почты, такая же история с natd была. Решилось все более четкими правилами и 3мя ночами, сервер был сразу боевой) Ваще я заметил, что кернел нат и натд ооочень похожи и заворачивают все на себя, и если хочешь конкретики (читай избавление от правил "from any to any"), то надо очень сильно понимать как он там внутри.
Могу предположить, что его хотели сделать как можно проще, но в итоге получилось странное поделие, которым гордятся (холивар не разводим я выразил свое мнение, которое вследсвие экспериментов может радикально поменяться).

Про ng_nat я думал, но не увидел его плюсов. Мошь линков не нашел правильных? Есть у тя че на эту тему интересное? Попробую и ng_nat, а пока ipnat рулез и фарева ещё =)

root писал(а):1. конфиг ipfw конечно хорошо, но, плиз, выложи вывод
Код: Выделить всё
ipfw show


Код: Выделить всё
00300   49616    4758836 allow ip from any to сикрет-айпи dst-port 22 via rl0
00310   41379    8767700 allow ip from сикрет-айпи 22 to any via rl0
01100   59830    6184658 allow gre from any to any
01200    1513     195252 allow icmp from any to any
01600 1398753   68003859 allow tcp from 192.168.5.0/24 1024-65535 to not 192.168.5.0/24 dst-port 21,22,25,80,110,143,443,1863,3389,5190 via rl1
01700 2122484 3076195884 allow tcp from not 192.168.5.0/24 21,22,25,80,110,143,443,1863,3389,5190 to 192.168.5.0/24 dst-port 1024-65535 via rl1 established
01800     534      25632 reset log logamount 1000 tcp from 192.168.5.0/24 1024-65535 to not 192.168.5.0/24 via rl1
01900       0          0 reset log logamount 1000 tcp from not 192.168.5.0/24 to 192.168.5.0/24 dst-port 1024-65535 via rl1
05000     630      37524 allow log logamount 1000 tcp from any to сикрет-айпи dst-port 1723 via rl0
05010    1245      59948 allow log logamount 1000 tcp from сикрет-айпи 1723 to any via rl0
10010 3530217 3145226361 nat 10 log logamount 1000 ip4 from any to any via rl0
15050       0          0 allow log logamount 1000 tcp from сикрет-айпи 1024-65535 to any via rl0
15060       0          0 allow log logamount 1000 tcp from any to сикрет-айпи dst-port 1024-65535 via rl0 established
60000       0          0 reset log logamount 1000 ip from any to any via rl0
65535  150450   17383396 allow ip from any to any


root писал(а):2. 192.168.12.0/24 это подсеть VPN клиентов ?

Ну да и таких клиентов около 8. Я так понимаю это поведение спровоцировано правилом 10010. Так что надо более подробно исследовать внутренности kernel nat. Чем сегоня и займусь.
Что интересно, по правилам ната он висит на rl0 и натирующее правило (нах так сделали? Хотя понятно, что это вместо DIVERT), а vpn у меня на ng*, и по-идее должен быть обмен между виртуальным адресом и впн-сервером. Вообщем, есть в сети статья про внутреннее устройство ipfw + natd (на lj видел)... Вот надо её наверное ещё разок перечитать и разжевать.

root писал(а):3. а что мешает запретить пакеты из 192.168.5.0/24 к 192.168.12.0/24 и наоборот ?

[/quote]
Да ничего, кроме того, что это костыли. =)

Вообщем, история продолжается. И мне стало казаться, что сравнительной статьи про реализации натов реально не хватает, толи глаза у меня в инете не туда смотрят.
А что ты сделал ради эксперимента?
Аватара пользователя
makky
посетитель
 
Сообщения: 119
Зарегистрирован: 19 окт 2008, 20:42
Откуда: msk

Re: kernel nat

Сообщение root » 17 фев 2009, 19:34

makky писал(а):=) не про natd говоришь?

нет, с него я как раз когда то и начинал

makky писал(а):Решилось все более четкими правилами

правила всегда должны быть четкими ;)

makky писал(а):Ваще я заметил, что кернел нат и натд ооочень похожи

так это и есть natd тока уже в кернеле ;)

makky писал(а):Про ng_nat я думал, но не увидел его плюсов.

мне понравилась простота применения и он так же совсем мало грузит проц.

makky писал(а):Мошь линков не нашел правильных? Есть у тя че на эту тему интересное? Попробую и ng_nat

ты давно в наш блог заглядывал ? ;)
Статья: Выпускаем локальную сеть в Интернет используя сервер на FreeBSD и ng_nat

makky писал(а):а пока ipnat рулез и фарева ещё =)

ну да, он не плох, но с ним бывают траблы. Ты скока в мбитах на нем натишь ? У меня бывают проблемы с ним при трафике в 300-350 мбит/с, когда оч. много UDP летает. Он начинает затыкаться, кол-во мапингов растет, растет, растет, пока в потолок не упрется. Такое бывает не часто, но бывает и именно когда UDP траф переть сильно начинает. Чего я тока не крутил на эту тему...

makky писал(а):Я так понимаю это поведение спровоцировано правилом 10010

ну ессно эти правилом.
т.к. оно звучит как натить все через rl0
пакет бежит через фаир и ищет совпадение и находит его тока в этом правиле потому что оно для ANY
и посмотри что для 192.168.12.44 в табле роутинга в этот момент.
makky писал(а):Да ничего, кроме того, что это костыли. =)

так что это не костыли. Тебе нужно или написать более точное правило на allow или deny или забить на это. Другого не дано.
Ты определись что ты хочешь сделать разрешить или запретить и напиши правила ДО nat`а.
С уважением, root

Изображение
------------
www.mega-net.ru - IT аутсорсинг
Аватара пользователя
root
Site Admin
 
Сообщения: 1894
Зарегистрирован: 11 июн 2008, 13:05
Откуда: Moscow, Russia

Re: kernel nat

Сообщение makky » 17 фев 2009, 21:17

Цитаты убрал, в тегах запулся =)
Ну, во-первых, спасибо за линк.. Это из серии "слона-то я и не приметил". Ну или "нг_ната я и не приметил тут" :D

Разумеется, правила должны быть четкими, я не совсем то слово применил, лучше было сказать менее обощенными, тк одним правилом можно ого-го-го сколько описать. Про похожесть натд в кернеле, я так же неправильно выразился.

Про ipnat. Вроде там при сборке можно где-то в сорцах указать опцию large что ли (как-то так она называется), и он сразу вроде как меняет свое поведение (понятное дело, что я не проверял, тк негде). Про трафик не могу сказать, что много раздаю, я занимаюсь поддержкой мелких и средних офисов, а там как максимум 2 канала адсл. Ну не всем же быть провайдерами, хотя было наверное интересно и очень ;)

Кстати, про точные правила, у меня есть старый вариант правил где-то, там мне удалось очень точно описать хождение пакетов, а вот в кернел нат - нет. :oops:

Как бы сам набор правил не кажется мне плохим или очень уж неправильным, этим набором несколько другая цель преследовалась. Я думаю, что хочу понять как же тот самый новый нат работает и стоит ли на него вообще обращать внимание, незнаю насколько это надо, просто интересно что ли. Или сравнение провести, даже незнаю.
А что ты сделал ради эксперимента?
Аватара пользователя
makky
посетитель
 
Сообщения: 119
Зарегистрирован: 19 окт 2008, 20:42
Откуда: msk

Re: kernel nat

Сообщение Андрей » 18 фев 2009, 09:03

у меня ng_nat работает уже больше полугода - норм. и смысла не вижу чего-то менять.
.ı|ı..ı|ı.
Андрей
местный житель
 
Сообщения: 1028
Зарегистрирован: 14 янв 2009, 13:37
Откуда: Оренбургская область

Re: kernel nat

Сообщение root » 18 фев 2009, 10:19

makky писал(а):Про ipnat. Вроде там при сборке можно где-то в сорцах указать опцию large

можно, об этом написано у нас в разделе "Советы" ;)
но оно увеличивает кол-во трансляций до 180000, а мне этого было недостаточно :) при трафике о котором я говорил выше

makky писал(а):Кстати, про точные правила, у меня есть старый вариант правил где-то, там мне удалось очень точно описать хождение пакетов, а вот в кернел нат - нет.

я не совсем понимаю почему ты вяжешь kernel nat и правила :shock:
т.к. все что посути изменилось так это то что теперь не надо запускать отдельный процесс natd, а сразу описать все в правилах ipfw
kernel nat не отменяет написания остальных правил для трафа

makky писал(а):Я думаю, что хочу понять как же тот самый новый нат работает

точно также как и natd ;)

makky писал(а):стоит ли на него вообще обращать внимание

стоит, тогда когда natd начнет так нагружать проц, что сервер будет все время близко к 100% по CPU, если траф, а соответственно нагрузка не очень большая, то можно остаться на natd и не париться, а иначе и пошел выбор:
    kernel nat
    ipnat
    pf (с фичей nat`а)
    ng_nat

makky писал(а):Или сравнение провести, даже незнаю.

проведи, если тебе интересно :)
но разницу ты точно поймешь под нагрузкой ;)

Андрей писал(а):у меня ng_nat работает уже больше полугода - норм.

ну вот и я сейчас медленно, но верно начинаю переползать на него :)
С уважением, root

Изображение
------------
www.mega-net.ru - IT аутсорсинг
Аватара пользователя
root
Site Admin
 
Сообщения: 1894
Зарегистрирован: 11 июн 2008, 13:05
Откуда: Moscow, Russia


Вернуться в FreeBSD

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 30