O пакетном фильтре (PF) написано довольно много статей. Вот и я хочу предложить свою реализацию Интернет-шлюза с
использованием PF. Раздача Интернета для локальной сети происходит через NAT и основана на Packet Tagging. Плюсом этого
метода является то что упрощается настройка правил для FTP (ftp-proxy не используется), как для клиентов за шлюзом, так и для
возможной публикации "внутреннего" ftp-сервера в мир.Для простоты приведу пример с 1 внешним и 1 внутренним интерфейсом. На шлюзе также запущен DNS-сервер. Пользователям
локальной сети разрешен доступ на все порты без исключений по протоколам TCP, UDP, из ICMP разрешен только ping. В качестве
ОС выступает FreeBSD7.0Для начала определим интерфейсы с помощью макросов
ext_if="rl0"
int_if="sk1"dns="ААА.ААА.ААА.ААА"
lan="192.168.1.0/24"table <no_if> {BBB.BBB.BBB.BBB, 192.168.1.1, 127.0.0.1} persist
set skip on lo
set loginterface rl0
set ruleset-optimization basic
set block-policy return
scrub in all no-df random-id##### INET FOR LAN
nat on $ext_if tag LAN_INET_NAT_TCP_UDP tagged LAN_INET_TCP_UDP -> $ext_if:0
nat on $ext_if tag LAN_INET_NAT_ICMP tagged LAN_INET_ICMP -> $ext_if:0######
block in
block out
antispoof quick for { lo $int_if }############## EXT_IF_OUT
pass out quick on $ext_if inet tagged LAN_INET_NAT_TCP_UDP
pass out quick on $ext_if inet tagged LAN_INET_NAT_ICMP
pass out quick on $ext_if inet proto {tcp udp} from $ext_if to $dns port = dnspass out quick on $ext_if inet proto icmp from $ext_if to any icmp-type echoreq
############## EXT_IF_IN
pass in quick on $ext_if inet proto tcp from any to $ext_if port = ssh synproxy state (max 10)
pass in quick on $ext_if inet proto icmp from any to $ext_if icmp-type echoreq############## INT_IF_IN
pass in quick on $int_if inet proto {tcp udp} from $lan to !<no_if> tag LAN_INET_TCP_UDP
pass in quick on $int_if inet from $lan to $int_ifpass in quick on $int_if inet proto icmp from $lan to !<no_if> icmp-type echoreq tag LAN_INET_ICMP
pass in quick on $int_if inet proto icmp from $lan to $int_if icmp-type echoreqПояснения.
Пришедшие на внутр. интерфейс пакеты "метятся". Метятся только те пакеты, у которых dst addr любой, кроме всех внутренних и
внешних интерфейсов. Это необходимо, если есть несколько подсетей и вы не хотите, что бы кто-либо из одной сети мог
подключится к висящему сервису на другом интерфейсе.Впринципе здесь можно вместо !<no_if> указать any.
Весь исходящий трафик с сервера в "мир" (кроме ДНС) и локальную сеть блокируется.ААА.ААА.ААА.ААА - IP DNS-сервера провайдера.
URL:
Обсуждается: http://www.opennet.me/tips/info/1867.shtml
мда ну и пояснения у вас :) что пояснил что не пояснил :)
А что не понятно-то?
да я не об этом, ну просто я не вижу смысла например выкладывания конфига просто так, ну вот сами посудите, те кто опытные и так все знают и видят и простые правила сами пишут :)
я так полагаю все же сей конфиг расчитан как раз для молодых, а раз для молодых то трудитесь объяснять ибо смысла нет в нем:)
что-то ни чего нового я для себя тут не нашел
кажется лучше всего не городить такие вот рецеплы (статьи) а почитать либо man pf.conf ну а если туго с en то обратиться по ссылке http://house.hcn-strela.ru/BSDCert/BSDA-course/apcs02.html и написать правила для себя.
это я именно в виду не для автора, а для молодых админов которые первый раз с данным вопросом сталкнулись
"Интернет шлюз" ну веб и аська с игрушками работать так будут, а ftp, DC++ в активном режиме, IP-TV (IGMP-multicast) ?
Лучше было назвать статью "Простой пример тэгирования пакетов на BSD PF" - в этом ключе хорошая статья, спасибо :)
А если поподробнее и для полноценного шлюза - то нет лучше доки по PF чем выше указанный раздел из курса подготовки к BSDA - все разъяснено практически, есть примеры, есть переведенный вариант :-) P.S. отличный пакетный фиьтр, жаль на линукс его не портировали ещё.
>"Интернет шлюз" ну веб и аська с игрушками работать так будут, а
>ftp, DC++ в активном режиме, IP-TV (IGMP-multicast) ?
>Лучше было назвать статью "Простой пример тэгирования пакетов на BSD PF" -
>в этом ключе хорошая статья, спасибо :)
>А если поподробнее и для полноценного шлюза - то нет лучше доки
>по PF чем выше указанный раздел из курса подготовки к BSDA
>- все разъяснено практически, есть примеры, есть переведенный вариант :-) P.S.
>отличный пакетный фиьтр, жаль на линукс его не портировали ещё.FTP работает отлично.
Я привел лишь небольшую часть, что использую сам на своих серверах. Ничто не мешает добавить правила для того же IGMP. Здесь просто изложил один из способов раздачи инета, используя теггирование в PF.
Было бы здорово если бы вторым вашим примером использования тэгирования было их применение на практике например в т.н. траффик-шейпинге c ALTQ. Обычные задачи можно и без тегирования сделать, а хорошо бы было показать где тэгирование вне конкуренции.
P.S.
про IP-TV вопрос был с подвохом, имхо просто правил не достаточно будет (и вообще просто PF) - но это решабельно, если кому известен способ кроме самопальной переделки линуксового igmpproxy - поделитесь ссылкой если не затруднит.
Мне так и не удалсь победить мультикаст. Пытался через mrouted.
IP-TV на IGMP multicast я нашел только способ описанный на форуме корбины
http://homenet.corbina.net/index.php?showtopic=86926&pid=106...
мне повторить удалось (хотя и другой провайдер) на 7.0. Жалко что автор там не облек в форму порта freebsd вариант igmpproxy.
Аналогично - воевал очень долго. pf+mrouted+multicast!=friendship. ipfw+mrouted работает замечательно, а с pf ни в какую.
2 pepelac: pf+igmpproxy=IP-TV/friendship - работает, если сделать так как написано по указанной мной ссылке
При таком подходе, да клиенты внутри сети смогут ходить на ftp в инете, а вот публиковать внутренней ftp придется все же с использованием proxy-ftp иначе для нормальной работы ни как.
----------------------------------
P.S. но если я ошибаюсь то покажите пальцем примером или линком
>При таком подходе, да клиенты внутри сети смогут ходить на ftp в
>инете, а вот публиковать внутренней ftp придется все же с использованием
>proxy-ftp иначе для нормальной работы ни как.
>----------------------------------
>P.S. но если я ошибаюсь то покажите пальцем примером или линкомОшибаетесь. необходимо просто добавить правило редиректа для внешнего интерфейса + разрешить исходящий траффик для внутреннего на сервер, на котором запущена служба ftp.
Да? а мы говорим по активный или пассивные режимы?
Просто rdr aka порт-маппинг даст только пассивный режим, делал, уперся в это, переделал на ftp-proxy с помощью anchor как учат в доках. Вы не ответили про шейпинг - у меня есть гипотеза что с помощью тегирования можно приоритеты для входящего трафика сделать на основании тегов в зависимости от того на какие порты порты/службы хотел клиент из внутренней сети обратиться (маркируем пришедшее на внутренний интерфейс, шейпим то маркерам на внешнем интерфейсе) но я сомневаюсь.
>Просто rdr aka порт-маппинг даст только пассивный режим, делал, уперся в это,
>переделал на ftp-proxy с помощью anchor как учат в доках. Вы
>не ответили про шейпинг - у меня есть гипотеза что с
>помощью тегирования можно приоритеты для входящего трафика сделать на основании тегов
>в зависимости от того на какие порты порты/службы хотел клиент из
>внутренней сети обратиться (маркируем пришедшее на внутренний интерфейс, шейпим то маркерам
>на внешнем интерфейсе) но я сомневаюсь.Чесно сказать, шейпить таким образом не пробовал. В тех случаях где нужно ограничение, использую думминет.
Мой вопрос был больше адресован для пользователя artemrts, но оно так и есть, если хочется оба режима, хочешь не хочешь придется пользовать якоря и proxy-ftp
PPtP,IPsec,PnP kak sdelat ?
http://www.opennet.me/base/net/mpd_pptp_vpn.txt.html
и где там про pf, точнее, про пропуск pptp из "серой" сети силами pf?
Пропуск PPTP делается средствами какого-нибудь PPTP-прокси, а не файрвола. pf не лезет на прикладной уровень, в отличие от iptables.
угу. а ещё в отличие от ipfilter, natd, ng_nat и ipfw nat.
Гонять данные из ядра в юзерспей и обратно - это очень полезно.
А на чем споткнулись, когда pptp из серой сети хотели пропустить?
на трекинге соединеии (openBSD);
больше 1 коннекта не проходит;
Так как все таки с UPnp ?
http://ezine.daemonnews.org/200406/mpd.htmlhttp://fiery-fenix.kiev.ua/archives/17-FreeBSD_i_GRE._Proksi...
оно?
>http://ezine.daemonnews.org/200406/mpd.html
>
>http://fiery-fenix.kiev.ua/archives/17-FreeBSD_i_GRE._Proksi...
>
>оно?я же написал - опенок.
где там ipfw в базе, покажи
"из ICMP разрешен только ping"
Руки за такое отрывать
>"из ICMP разрешен только ping"
>Руки за такое отрыватьДа что ты говоришь.
Вот таких так ты, таким да отрывать нада))
PMTU Discover
почитай, умник
Это ты читай, умник...
http://en.wikipedia.org/wiki/Path_MTU_discovery
Там же четко написано
Path MTU discovery works by setting the DF (Don't Fragment) option bit in the IP headers of outgoing packets. Then, any device along the path whose MTU is smaller than the packet will drop it, and send back an ICMP "Fragmentation Needed" (Type 3, Code 4) message containing its MTU, allowing the source host to reduce its path MTU appropriately. The process repeats until the MTU is small enough to traverse the entire path without fragmentation.Тут либо ты на en не понимаеш, либо не понимаеш принципы работы keep state в PF...
>[оверквотинг удален]
>Path MTU discovery works by setting the DF (Don't Fragment) option bit
>in the IP headers of outgoing packets. Then, any device along
>the path whose MTU is smaller than the packet will drop
>it, and send back an ICMP "Fragmentation Needed" (Type 3, Code
>4) message containing its MTU, allowing the source host to reduce
>its path MTU appropriately. The process repeats until the MTU is
>small enough to traverse the entire path without fragmentation.
>
>Тут либо ты на en не понимаеш, либо не понимаеш принципы работы
>keep state в PF...Ну и как это будет работать, если "из ICMP разрешен только ping"?
Не вижу смысла делать два тега LAN_INET_TCP_UDP и LAN_INET_ICMP.