The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Интернет-шлюз с использованием PF
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 = dns

   pass 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_if

   pass 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-сервера провайдера.
 
10.12.2008 , Автор: vitalic
Ключи: firewall, nat, pf, freebsd / Лицензия: CC-BY
Раздел:    Корень / Администратору / Сетевая подсистема, маршрутизация / Пакетные фильтры и фаерволы / Пакетный фильтр в FreeBSD: ipfw, IP-Filter

Обсуждение [ Линейный режим | Показать все | RSS ]
  • 1.1, skif (??), 09:50, 10/12/2008 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    мда ну и пояснения у вас :) что пояснил что не пояснил :)
     
     
  • 2.2, artemrts (ok), 10:23, 10/12/2008 [^] [^^] [^^^] [ответить]  
  • +/
    А что не понятно-то?
     
     
  • 3.5, skif (??), 11:11, 10/12/2008 [^] [^^] [^^^] [ответить]  
  • +/
    да я не об этом, ну просто я не вижу смысла например выкладывания конфига просто так, ну вот сами посудите, те кто опытные и так все знают и видят и простые правила сами пишут :)
    я так полагаю все же сей конфиг расчитан как раз для молодых, а раз для молодых то трудитесь объяснять ибо смысла нет в нем:)
     

  • 1.3, abigor (?), 10:42, 10/12/2008 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    что-то ни чего нового я для себя тут не нашел
    кажется лучше всего не городить такие вот рецеплы (статьи) а почитать либо man pf.conf ну а если туго с en то обратиться по ссылке http://house.hcn-strela.ru/BSDCert/BSDA-course/apcs02.html и написать правила для себя.
     
     
  • 2.4, abigor (?), 10:43, 10/12/2008 [^] [^^] [^^^] [ответить]  
  • +/
    это я именно в виду не для автора, а для молодых админов которые первый раз с данным вопросом сталкнулись
     

  • 1.6, muaddib (??), 12:11, 10/12/2008 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    "Интернет шлюз" ну веб и аська с игрушками работать так будут, а ftp, DC++ в активном режиме, IP-TV (IGMP-multicast) ?
    Лучше было назвать статью "Простой пример тэгирования пакетов на BSD PF" - в этом ключе хорошая статья, спасибо :)
    А если поподробнее и для полноценного шлюза - то нет лучше доки по PF чем выше указанный раздел из курса подготовки к BSDA - все разъяснено практически, есть примеры, есть переведенный вариант :-) P.S. отличный пакетный фиьтр, жаль на линукс его не портировали ещё.
     
     
  • 2.7, artemrts (ok), 12:22, 10/12/2008 [^] [^^] [^^^] [ответить]  
  • +/
    >"Интернет шлюз" ну веб и аська с игрушками работать так будут, а
    >ftp, DC++ в активном режиме, IP-TV (IGMP-multicast) ?
    >Лучше было назвать статью "Простой пример тэгирования пакетов на BSD PF" -
    >в этом ключе хорошая статья, спасибо :)
    >А если поподробнее и для полноценного шлюза - то нет лучше доки
    >по PF чем выше указанный раздел из курса подготовки к BSDA
    >- все разъяснено практически, есть примеры, есть переведенный вариант :-) P.S.
    >отличный пакетный фиьтр, жаль на линукс его не портировали ещё.

      FTP работает отлично.
      Я привел лишь небольшую часть, что использую сам на своих серверах. Ничто не мешает добавить правила для того же IGMP. Здесь просто изложил один из способов раздачи инета, используя теггирование в PF.


     
     
  • 3.8, muaddib (??), 12:58, 10/12/2008 [^] [^^] [^^^] [ответить]  
  • +/
    Было бы здорово если бы вторым вашим примером использования тэгирования было их применение на практике например в т.н. траффик-шейпинге c ALTQ. Обычные задачи можно и без тегирования сделать, а хорошо бы было показать где тэгирование вне конкуренции.
    P.S.
    про IP-TV вопрос был с подвохом, имхо просто правил не достаточно будет (и вообще просто PF) -  но это решабельно, если кому известен способ кроме самопальной переделки линуксового igmpproxy - поделитесь ссылкой если не затруднит.
     
     
  • 4.13, linked (ok), 23:05, 10/12/2008 [^] [^^] [^^^] [ответить]  
  • +/
    Мне так и не удалсь победить мультикаст. Пытался через mrouted.
     
     
  • 5.18, muaddib (??), 16:43, 11/12/2008 [^] [^^] [^^^] [ответить]  
  • +/
    IP-TV на IGMP multicast я нашел только способ описанный на форуме корбины
    http://homenet.corbina.net/index.php?showtopic=86926&pid=1063533812&st=120
    мне повторить удалось (хотя и другой провайдер) на 7.0. Жалко что автор там не облек в форму порта freebsd вариант igmpproxy.
     
  • 5.20, pepelac (?), 00:25, 13/12/2008 [^] [^^] [^^^] [ответить]  
  • +/
    Аналогично - воевал очень долго. pf+mrouted+multicast!=friendship. ipfw+mrouted работает замечательно, а с pf ни в какую.
     
     
  • 6.23, muaddib (??), 14:53, 13/12/2008 [^] [^^] [^^^] [ответить]  
  • +/
    2 pepelac: pf+igmpproxy=IP-TV/friendship - работает, если сделать так как написано по указанной мной ссылке
     
  • 3.9, abigor (?), 13:31, 10/12/2008 [^] [^^] [^^^] [ответить]  
  • +/
    При таком подходе, да клиенты внутри сети смогут ходить на ftp в инете, а вот публиковать внутренней ftp придется все же с использованием proxy-ftp иначе для нормальной работы ни как.
    ----------------------------------
    P.S. но если я ошибаюсь то покажите пальцем примером или линком
     
     
  • 4.10, artemrts (ok), 13:46, 10/12/2008 [^] [^^] [^^^] [ответить]  
  • +/
    >При таком подходе, да клиенты внутри сети смогут ходить на ftp в
    >инете, а вот публиковать внутренней ftp придется все же с использованием
    >proxy-ftp иначе для нормальной работы ни как.
    >----------------------------------
    >P.S. но если я ошибаюсь то покажите пальцем примером или линком

    Ошибаетесь. необходимо просто добавить правило редиректа для внешнего интерфейса + разрешить исходящий траффик для внутреннего на сервер, на котором запущена служба ftp.

     
     
  • 5.14, abigor (?), 05:19, 11/12/2008 [^] [^^] [^^^] [ответить]  
  • +/
    Да? а мы говорим по активный или пассивные режимы?
     
  • 5.15, muaddib (??), 12:56, 11/12/2008 [^] [^^] [^^^] [ответить]  
  • +/
    Просто rdr aka порт-маппинг даст только пассивный режим, делал, уперся в это, переделал на ftp-proxy с помощью anchor как учат в доках. Вы не ответили про шейпинг - у меня есть гипотеза что с помощью тегирования можно приоритеты для входящего трафика сделать на основании тегов в зависимости от того на какие порты порты/службы хотел клиент из внутренней сети обратиться (маркируем пришедшее на внутренний интерфейс, шейпим то маркерам на внешнем интерфейсе) но я сомневаюсь.
     
     
  • 6.16, artemrts (ok), 13:04, 11/12/2008 [^] [^^] [^^^] [ответить]  
  • +/
    >Просто rdr aka порт-маппинг даст только пассивный режим, делал, уперся в это,
    >переделал на ftp-proxy с помощью anchor как учат в доках. Вы
    >не ответили про шейпинг - у меня есть гипотеза что с
    >помощью тегирования можно приоритеты для входящего трафика сделать на основании тегов
    >в зависимости от того на какие порты порты/службы хотел клиент из
    >внутренней сети обратиться (маркируем пришедшее на внутренний интерфейс, шейпим то маркерам
    >на внешнем интерфейсе) но я сомневаюсь.

    Чесно сказать, шейпить таким образом не пробовал. В тех случаях где нужно ограничение, использую думминет.

     
  • 6.17, abigor (?), 16:34, 11/12/2008 [^] [^^] [^^^] [ответить]  
  • +/
    Мой вопрос был больше адресован для пользователя artemrts, но оно так и есть, если хочется оба режима, хочешь не хочешь придется пользовать якоря и proxy-ftp
     

  • 1.11, slepnoga (??), 16:15, 10/12/2008 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    PPtP,IPsec,PnP kak sdelat ?
     
     
  • 2.12, iZEN (ok), 19:05, 10/12/2008 [^] [^^] [^^^] [ответить]  
  • +/
    https://www.opennet.ru/base/net/mpd_pptp_vpn.txt.html
     
     
  • 3.19, Добрый Дохтур (?), 12:31, 12/12/2008 [^] [^^] [^^^] [ответить]  
  • +/
    и где там про pf, точнее, про пропуск pptp из "серой"  сети силами pf?
     
     
  • 4.21, q (??), 02:37, 13/12/2008 [^] [^^] [^^^] [ответить]  
  • +/
    Пропуск PPTP делается средствами какого-нибудь PPTP-прокси, а не файрвола. pf не лезет на прикладной уровень, в отличие от iptables.
     
     
  • 5.22, Добрый Дохтур (?), 03:10, 13/12/2008 [^] [^^] [^^^] [ответить]  
  • +/
    угу. а ещё в отличие от ipfilter, natd, ng_nat и ipfw nat.
    Гонять данные из ядра в юзерспей и обратно - это очень полезно.
     
  • 4.27, baradatiy (?), 12:13, 15/12/2008 [^] [^^] [^^^] [ответить]  
  • +/
    А на чем споткнулись, когда pptp из серой сети хотели пропустить?
     
     
  • 5.29, slepnoga (??), 18:02, 26/12/2008 [^] [^^] [^^^] [ответить]  
  • +/
    на трекинге соединеии (openBSD);
    больше 1 коннекта не проходит;


    Так как все таки  с UPnp ?

     
  • 2.25, iZEN (ok), 14:28, 14/12/2008 [^] [^^] [^^^] [ответить]  
  • +/
    http://ezine.daemonnews.org/200406/mpd.html

    http://fiery-fenix.kiev.ua/archives/17-FreeBSD_i_GRE._Proksirovanie_na_odin_V

    оно?

     
     
  • 3.33, slepnoga (??), 01:52, 08/06/2010 [^] [^^] [^^^] [ответить]  
  • +/
    >http://ezine.daemonnews.org/200406/mpd.html
    >
    >http://fiery-fenix.kiev.ua/archives/17-FreeBSD_i_GRE._Proksirovanie_na_odin_V
    >
    >оно?

    я же написал - опенок.
    где там ipfw в базе, покажи

     

  • 1.24, ugenk (?), 01:37, 14/12/2008 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    "из ICMP разрешен только ping"
    Руки за такое отрывать
     
     
  • 2.26, vitalic (?), 17:56, 14/12/2008 [^] [^^] [^^^] [ответить]  
  • +/
    >"из ICMP разрешен только ping"
    >Руки за такое отрывать

    Да что ты говоришь.
    Вот таких так ты, таким да отрывать нада))

     
     
  • 3.28, fank (?), 11:33, 16/12/2008 [^] [^^] [^^^] [ответить]  
  • +/
    PMTU Discover
    почитай, умник
     
     
  • 4.31, artemrts (??), 17:27, 01/08/2009 [^] [^^] [^^^] [ответить]  
  • +/
    Это ты читай, умник...
    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...

     
     
  • 5.32, Sem (ok), 15:32, 03/08/2009 [^] [^^] [^^^] [ответить]  
  • +/
    >[оверквотинг удален]
    >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"?

     

  • 1.30, Sem (??), 02:01, 06/02/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Не вижу смысла делать два тега LAN_INET_TCP_UDP и LAN_INET_ICMP.
     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру