Мы — долго запрягаем, быстро ездим, и сильно тормозим.

FreeBSD
Очумелые Ручки
OpenBSD
  Демоны
  Web
  Packet Filter
  Настройка
  Установка OpenBSD
  src & ports
  Upgrading OpenBSD
  Шлюз: Часть 1
  Шлюз: Часть 2
  Шлюз: Часть 3
  Шлюз: Часть 4
  Файловая система
Cisco


www.lissyara.su —> статьи —> OpenBSD —> Настройка —> Шлюз: Часть 2

Часть 2 - Более функциональная настройка pf(4)

Автор: BlackCat.


Оглавление

  • 1. Полезные команды
  • 2. Проброс портов
  • 2.1. Простой проброс портов
  • 2.2. Проброс с изменением порта назначения
  • 3. Активный режим FTP через NAT
  • 4. Ограничение максимального размера сегмента TCP (MSS)
  • 5. Список литературы

    Просто закрыться от внешнего мира и запустить NAT - это только начало. Часто от межсетевого экрана требуется дополнительный функционал. Самый простой пример - проброс портов (port forwarding) маршрутизатора во внутреннюю сеть. Хороший материал по конфигурационному файлу pf.conf(5) и его структуре на русском в [1]. Далее подразумевается, что модифицируется конфигурация приведенная в части первой (листинг 3.1).

    1. Полезные команды
                                       "Управление невозможно без контроля."
                                          Народная управленческая мудрость.

    Документация по pf.conf(5) и pfctl(8) достаточна проста и понятна, здесь приведу список моих top 7 команд.

    Листинг 1.1. Проверка синтаксиса pf.conf(5)
    # pfctl -nf /etc/pf.conf


    Листинг 1.2. Загрузка нового конфигурационного файла
    # pfctl -f /etc/pf.conf


    Листинг 1.3. Просмотр полного состояния
    # pfctl -sa


    Листинг 1.4. Просмотр правил фильтрации
    # pfctl -sr


    Листинг 1.5. Просмотр правил трансляции адресов
    # pfctl -sn


    Листинг 1.6. Просмотр всего дерева якорей
    # pfctl -s Anchors -v


    Листинг 1.7. Просмотр правил фильтрации добавленных для определенного якоря
    # pfctl -sr -a <anchor_path>


    Где <anchor_path> - полный путь до якоря (подробнее в pfctl(8)).

    2. Проброс портов

    2.1. Простой проброс портов

    В качестве примера рассмотрим проброс порта для работы Torrent клиента. В начале конфига добавим два макроса: порт для проброса и адрес узла в локальной сети на который будет осуществляться проброс. Назовем из t_port и t_host соответственно. Далее потребуется добавить правило переадресации и разрешить данный трафик на внешнем интерфейсе, т.к. весь входящий трафик по-умолчанию блокируется. В итоге получим конфигурационный файл следующего содержания.

    Листинг 2.1.1. Усовершенствованый pf.conf(5) с пробросом портов
    # cat /etc/pf.conf
    ############################################################
    # Simple pf configuration
    ############################################################
    
    #
    # Macroses
    #
    
    # External interface
    if_ext="pppoe0"
    # Internal interface
    if_int="rl1"
    
    # Torrent client incoming connection support
    t_port = "31337"
    t_host = "192.168.0.3"
    
    #
    # Options
    #
    
    # Soft packet reject
    set block-policy return
    
    # Don't filter loopback traffic
    set skip on lo
    
    #
    #  Translations
    #
    
    # Translate network addresses on external interface
    nat on $if_ext from !($if_ext) -> ($if_ext)
    
    # Port forwarding
    rdr on $if_ext proto tcp from any to any port $t_port -> $t_host
    
    #
    # Filtering
    #
    
    # Default - block all
    block all
    
    # Allow outgoing traffic
    pass out keep state
    
    # Allow all local traffic
    pass quick on $if_int keep state
    
    # Allow forwarded port incoming traffic
    pass in on $if_ext proto tcp from any to any port $t_port keep state
    


    2.2. Проброс с изменением порта назначения

    В качестве примера рассмотрим случай, когда необходимо пробросить порт 8082 шлюза на 80 порт узла 192.168.0.3. Как и в предыдущем примере введем несколько макросов:

  • h_port_in - порт шлюза, на который придет пакет из внешней сети (8082);
  • h_port_out - порт, на который осуществляется проброс (80);
  • h_host - узел локальной сети, на который будет переадресован трафик (192.168.0.3).

    После создания правила проброса потребуется создать правило разрешающее данный трафик на внешнем интерфейсе шлюза. Beastie, как всегда, скрывается в мелочах: пакеты сначала проходят преобразования и только потом список фильтров. Именно по этому следует разрешать трафик не на порт h_port_in, а на h_port_out! С учетом всего вышесказанного, получаем следующий конфигурационный файл.

    Листинг 2.2.1. Усовершенствованный pf.conf(5) с пробросом портов и изменением порта назначения
    # cat /etc/pf.conf
    ############################################################
    # Simple pf configuration
    ############################################################
    
    #
    # Macroses
    #
    
    # External interface
    if_ext="pppoe0"
    # Internal interface
    if_int="rl1"
    
    # HTTP server
    h_port_in = "8082"
    h_port_out= "80"
    h_host = "192.168.0.3"
    
    #
    # Options
    #
    
    # Soft packet reject
    set block-policy return
    
    # Don't filter loopback traffic
    set skip on lo
    
    #
    #  Translations
    #
    
    # Translate network addresses on external interface
    nat on $if_ext from !($if_ext) -> ($if_ext)
    
    # Redirect port
    rdr on $if_ext proto tcp from any to any port $h_port_in \
      -> $h_host port $h_port_out
    
    #
    # Filtering
    #
    
    # Default - block all
    block all
    
    # Allow outgoing traffic
    pass out keep state
    
    # Allow all local traffic
    pass quick on $if_int keep state
    
    # Allow incoming ssh
    pass in on $if_ext proto tcp from any to ($if_ext) port ssh keep state
    
    # Allow forwarded port incoming traffic
    pass in on $if_ext proto tcp from any to any port $h_port_out keep state
    


    3. Активный режим FTP через NAT

    Задачу с обеспечением работы активного FTP через транслятор адресов разработчики OpenBSD решили просто - весь FTP-трафик переадресовывается на FTP proxy (ftp-proxy(8)), который добавляет необходимые правила для прохождения трафика через шлюз[2].
    Сначала необходимо включить ftp-proxy(8) и разрешить его запуск при запуске системы.

    Листинг 3.1. Разрешение запуска ftp-proxy(8)
    # echo ftpproxy_flags="" >> /etc/rc.conf.local


    Листинг 3.2. Запуск ftp-proxy
    # ftp-proxy


    ftp-proxy прослушивает порт 127.0.0.1:8021, на него и необходимо пересылать FTP-трафик. Так же необходимо добавить якоря (точки автоматического добавления правил). В итоге получаем вот такой конфигурационный файл.

    Листинг 3.3. Усовершенствованный pf.conf(5) с поддержкой активного режима FTP
    # cat /etc/pf.conf
    ############################################################
    # Simple pf configuration
    ############################################################
    
    #
    # Macroses
    #
    
    # External interface
    if_ext="pppoe0"
    # Internal interface
    if_int="rl1"
    
    
    #
    # Options
    #
    
    # Soft packet reject
    set block-policy return
    
    # Don't filter loopback traffic
    set skip on lo
    
    #
    #  Translations
    #
    
    # Translate network addresses on external interface
    nat on $if_ext from !($if_ext) -> ($if_ext)
    
    # Active FTP
    nat-anchor "ftp-proxy/*"
    rdr-anchor "ftp-proxy/*"
    rdr on $if_int proto tcp from any to any port ftp -> 127.0.0.1 port 8021
    
    #
    # Filtering
    #
    
    # Default - block all
    block all
    
    # Allow outgoing traffic
    pass out keep state
    
    # Allow all local traffic
    pass quick on $if_int keep state
    
    # Active FTP on-the-fly rules anchor
    anchor "ftp-proxy/*"
    


    4. Ограничение максимального размера сегмента TCP (MSS)

    Примечание: MSS для TCP имеет такой же смысл, как и параметр MTU для интерфейса - максимальное количество данных, которое можно добавить в TCP пакет. При неправильной конфигурации, слишком большие пакеты могут быть просто отброшены на одном из маршрутизаторов, в худшем случае без какого либо ICMP-уведомления. MSS рассчитывается исходя из величины MTU и размеров заголовков. Для PPPoE соединения MTU меньше стандартного (Ethernet). Но узлы внутренней (и внешней тоже) сети не подозревают, что пакеты будут передаваться через соединения с меньшим MTU, и используют стандартный максимальный размер сегмента. Последствия вполне логичны - найдется такой случай, что большие пакеты просто не будут проходить по маршруту. Выходов из этой ситуации может быть несколько, но один из оптимальных - это уменьшать MSS для TCP-соединений проходящих через PPPoE-интерфейс.

    Установка MSS задается одной строкой "match on <interface> scrub (max-mss 1440)", при добавлении которой получим конфигурационный файл следующего содержания.

    Листинг 4.1. Усовершенствованный pf.conf(5) с ограничением MSS
    # cat /etc/pf.conf
    ############################################################
    # Simple pf configuration
    ############################################################
    
    #
    # Macroses
    #
    
    # External interface
    if_ext="pppoe0"
    # Internal interface
    if_int="rl1"
    
    #
    # Options
    #
    
    # Soft packet reject
    set block-policy return
    
    # Don't filter loopback traffic
    set skip on lo
    
    #
    #  Translations
    #
    
    # Translate network addresses on external interface
    nat on $if_ext from !($if_ext) -> ($if_ext)
    
    #
    # Filtering
    #
    
    # Default - block all
    block all
    
    # Reduce MSS
    match on $if_ext scrub (max-mss 1440)
    
    # Allow outgoing traffic
    pass out keep state
    
    # Allow all local traffic
    pass quick on $if_int
    


    4. Список литературы

    1. Разбираем простой конфиг PF // http://www.lissyara.su/articles/openbsd/pf/pf/
    2. PF: Issues with FTP // http://www.openbsd.org/faq/pf/ftp.html



    Ссылка на обсуждение: http://forum.lissyara.su/viewtopic.php?f=14&t=24465.

    размещено: 2010-03-01,
    последнее обновление: 2010-03-14,
    автор: BlackCat

    оценить статью:

    abigor, 2010-03-04 в 18:03:54

     Исправьте опечатку с интерфейсами замыкания на себя

    Linxpro, 2010-03-11 в 14:26:22

    Я бы еще добавил для надежности:
    scrub in all

    block in quick from any os nmap to any
    block in quick proto tcp from any to any flags /S
    block in quick proto tcp from any to any flags /SFRA
    block in quick proto tcp from any to any flags /SFRAU
    block in quick proto tcp from any to any flags A/A
    block in quick proto tcp from any to any flags F/SFRA
    block in quick proto tcp from any to any flags U/SFRAU
    block in quick proto tcp from any to any flags SF/SF
    block in quick proto tcp from any to any flags SF/SFRA
    block in quick proto tcp from any to any flags SR/SR
    block in quick proto tcp from any to any flags FUP/FUP
    block in quick proto tcp from any to any flags FUP/SFRAUPEW
    block in quick proto tcp from any to any flags SFRAU/SFRAU
    block in quick proto tcp from any to any flags SFRAUP/SFRAUP
    block in quick proto tcp from any to any flags FPU/SFRAUP
    block in quick proto tcp from any to any flags F/SFRA
    block in quick proto tcp from any to any flags P/P

    BlackCat, 2010-03-14 в 4:46:44

    2 abigor: lo - это не опечатка, это группа интерфейсов.
    2 Linxpro: статья по больше части посвящена вопросам настройки взаимодействия сетей, а не тонкой настройке pf.

    ОЛОЛО, 2010-12-16 в 5:04:12

    2 Linxpro

    Я бы добавил в начало конфига
    scrub in all
    block all

    и не засорял бы конфиг всякой хуитой.


    Оставьте свой комментарий:
    Ваше имя:   *
    e-mail:  
    жирный
    наклонный
    подчёркнутый
    ссылка
    цвет
    Нынешний год:   *
     


  • Хостинг HOST-FOOD

    2014-07-27, lissyara
    gmirror

    Удалённое создание софтверного зеркала средствами gmirror, на диске разбитом с использованием gpart. Использование меток дисков для монтирования разделов.
    2013-08-20, zentarim
    Scan+Print server FreeBSD 9

    Настройка сервера печати и сервера сканирования под управлением операционной системы FreebSD 9 для МФУ Canon PIXMA MP540
    2011-11-20, BlackCat
    Разъём на WiFi-карту

    Делаем съёмной несъёмную антену на WiFi-карте путём установки ВЧ-разъёма
    2011-09-14, manefesto
    Настройка git+gitosis

    Настройка системы контроля версия исходного кода в связке git+gitosis+ssh
    2011-08-14, zentarim
    Wi-FI роутер + DHCP + DNS

    Настройка Wi-Fi роутера на Freebsd 8 + DNS сервер + DHCP сервер: чтобы Wi-Fi клиенты были в одной подсети с проводными, проводные и беспроводные клиенты получали адреса автоматически по DHCP, кэширующ
    2011-06-15, -ZG-
    Охранная система на FreeBSD+LPT

    В этой статье описана попытка реализации простой охранной системы на базе FreeBSD с подключением к ней охранных устройтсв на LPT порт и видеорегистрацией.
    2011-03-13, terminus
    ng_nat

    Описание работы ng_nat, практическое использование, достоинства и недостатки в сравнении с ipfw nat
    2011-02-20, Капитан
    Nagios+Digitemp

    Статья описывает создание системы оповещения о превышении температуры в специальных помещениях на основе Nagios с использованием программы Digitemp.
    2011-02-17, Le1
    Zyxel Configuration

    Скрипт для массового изменения конфига свичей Zyxel. Берет из файла iplist список ip-шек, заходит последовательно на каждый и выполняет комманды из файла commands, записывая происходящее в лог файл.
    2011-02-16, fox
    hast carp zfs ucarp cluster

    HAST (Highly Available Storage), CARP, UCARP, ZFS, Cluster настройка и одаптация плюс личные размышления…
    2011-02-04, BlackCat
    Восстановление ZFS

    История о том, как был восстановлен развалившийся RAIDZ ZFS-пул (перешедший в FAULTED) с помощью скотча и подручных средств. Или о том, какие приключения ожидают тех, кто не делает резервных копий.
    2011-02-03, Капитан
    1-Wire

    Статья описывает самостоятельное изготовление контроллера DS9097 для съёма показаний с датчиков температуры DS1820 с помощью программы Digitemp.
    2011-01-28, Капитан
    Температура в серверной

    Статья описывает построение системы наблюдения за температурой в помещении серверной с использованием программы Digitemp и выводом графиков в MRTG
    2011-01-21, m4rkell
    Syslog server

    Как то буквально на днях, у нас завалилось, что то в еве) или не в еве не суть. Суть в том, что когда захотели снять логи с хостов esx обнаружили, что хранят эти негодяи логии только за последнии сутк
    2011-01-07, lissyara
    Canon/gphotofs

    Монтирование цифровых фотоаппаратов Canon (PTP) как файловой системы, автоматизация этого процесса через события devd и внешние скрипты.
    2010-12-13, Al
    IPSec

    Описание принципов работы IPSEC и способов аутентификации.
    2010-12-07, manefesto
    FreeBSD on flash

    Было принято решении переехать на USB Flash и установить минимальный джентельменский набор для работы своего роутера. Делаем =)
    2010-12-05, Fomalhaut
    root ZFS, GPT

    Инструкция по установке FreeBSD с использованием в качестве таблицы разделов GPT и в качестве основной файловой системы - ZFS
    2010-09-05, Cancer
    Настройка аудиоплеера на ximp3

    Цели: Простенький аудиоплеер, для того что бы тетя продавец в магазине утром пришла нажала на кнопку Power и заиграла в зале музыка, так же был доступ по сети, общая шара куда можно заливать музыку, к
    2010-08-31, Cancer
    Установка и настройка OpenVPN

    На днях появилась задача - объединить головной офис и 3 филиала в одну сеть через интернет посредством OpenVPN, чтобы люди могли подключаться через RDP к базам 1С на серверах.
    2010-08-25, manefesto
    freebsd lvm

    Использование linux_lvm для работы с LVM разделами из-под FreeBSD. Проблемы которые возники при монтирование lvm раздела
    2010-04-30, gonzo111
    proftpd file auth&quota

    Proftpd - квоты и авторизация из файлов, без использования базы данных и/или системных пользователей
    2010-04-22, lissyara
    tw_cli

    Пошаговая инструкция по восстановлению RAID на контроллере 3ware, из которого выпал один диск. Настройка мониторинга состояния рейда и отчётов о его состоянии на email.
    2010-04-14, fox
    MySQL Master+Master

    MySQL (Master Master) and (Master Slave) Как настроить репликацию…
    2010-03-09, terminus
    DNS zones

    Краткий ликбез про управление DNS зонами. Примеры проведения делегирования прямых и обратных DNS зон.
    2010-03-09, aspera
    Squid+AD (group access)

    Настройка прокси сервера SQUID с автроризацией пользователей в AD. Разделение пользователей на группы
    2010-03-02, BlackCat
    Шлюз: Часть 4

    Настройка дополнительных сервисов: синхронизация времени (OpenNTPD), клиент DynDNS.org.
    2010-03-01, BlackCat
    Шлюз: Часть 3

    Настройка DHCP и DNS серверов для работы внутри частной сети, c поддержкой внутренних (частных зон) DNS, а так же интеграция DHCP и DNS сервисов.
    подписка

        вверх      
    Статистика сайта
    Сейчас на сайте находится: 52 чел.
    За последние 30 мин было: 292 человек
    За сегодня было
    4761 показов,
    1186 уникальных IP
     

      Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
      Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

    © lissyara 2006-10-24 08:47 MSK

    Время генерации страницы 0.042 секунд
    Из них PHP: 33%; SQL: 67%; Число SQL-запросов: 61 шт.
    Исходный размер: 94099; Сжатая: 17982