Мы — долго запрягаем, быстро ездим, и сильно тормозим.
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



    размещено: 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

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



  •  

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

    © lissyara 2006-10-24 08:47 MSK

    Время генерации страницы 0.0401 секунд
    Из них PHP: 34%; SQL: 66%; Число SQL-запросов: 61 шт.
    Исходный размер: 36730; Сжатая: 7677