FireHOL — файрволл для невежд за пять минут

    Это даже не статья и не полноценное руководство, а маленький сниппет, который поможет вам в наикратчайшие сроки поднять хорошо защищенный и правильно настроенный роутер на любой GNU/Linux машине. И это при полном отсутствии необходимости знания iptables.

    Firehol, в отличие от shorewall, это даже не набор скриптов, а всего лишь один bash скрипт. Поэтому для его использования необходимость в perl и других интерпретаторах отпадает.

    Firehol ближе к старому доброму narc (netfilter automatic rule configurator), но последний не обновлялся уже 6 лет и представляет из себя достаточно простой скрипт, который не совместим с последними версиями iptables. Ближе он тем, что позволяет писать правила практически на родном человеческом языке.


    emerge or not apt-get?


    Для gentoo это как всегда emerge -av net-firewall/firehol (не забудьте добавить ~arch в /etc/portage/package.keywords или использовать ACCEPT_KEYWORDS= «~arch»)

    После установки, извлекаем из архива firehol-1.273.tar.bz2 файл get-iana.sh и запускаем его. Возможно, в других дистрибутивах этот файл копируется в систему. В gentoo ebuild его налево не трогает. Суть работы данного скриптика — загрузить зарезервированные IP'шники прямо из IANA.

    Самая распространённая конфигурация.

    Пример конфигурации для роутера в небольшой компании. Разрешены все исходящие соединения, одно входящее ssh на нестандартном порту, кроме того весь http трафик будет заворачиваться на squid. Для экономии места опущу некоторые блоки комментариев.

    cat /etc/firehol/firehol.conf


    # ----------------------------------------------------------------------------
    # НЕСТАНДАРТНЫЕ СЛУЖБЫ
    # ----------------------------------------------------------------------------

    server_ssh_ports="tcp/2202" # Демон SSH слушает на порту 2202

    # ----------------------------------------------------------------------------
    # СЕТЕВЫЕ НАСТРОЙКИ
    # ----------------------------------------------------------------------------

    # --- ВНУТРЕННИЙ ИНТЕРФЕЙС ---

    HOME_MYIP="192.168.1.1" # Статический IP адрес нашего внутреннего интерфейса
    HOME_MYIF="eth1" # Собственно сам интерфейс
    HOME_BCAST="192.168.1.255" # броадкаст
    HOME_LAN="192.168.1.0/24" # сеть
    HOME_SERVICES="all" # службы, в нашей сети

    HOME_DHCP=1 # Устанавливаем в 1, если наш сервер также предоставляет службу DHCP
    FIREHOL_LOG_MODE="LOG" # Уровни логирования
    FIREHOL_LOG_LEVEL="error" #Он очень разговорчив даже на этом уровне :)

    # --- ВНЕШНИЙ ИНТЕРФЕЙС ---

    PUBLIC_MYIP="87.250.251.11" # Оставьте пустым, если IP является динамическим
    PUBLIC_MYIF="eth0" # Собственно сам публичный интерфейс
    PUBLIC_SERVICES="ssh" # Службы, которые видны извне для всех.

    DIAL_ON_DEMAND=0 # Устанавливаем в 1, если внешний интерфейс нуждается в автодозвоне

    # --- ДОВЕРЕННАЯ ЗОНА ---

    TRUSTED_PCS="209.85.135.104" # Этому IP адресу разрешено подключаться к
    TRUSTED_SERVICES="ssh http" # ssh и http службам.
    #Обратите внимание, что http будет доступен только IP из TRUSTED_PCS.

    # --- ПРОЗРАЧНЫЙ ПРОКСИ ---

    SQUID_PORT="3128" # Оставляем пустым, если прокси не используется
    SQUID_USERS="squid" # Пользователи, которых пропускать напрямую
    SQUID_EXCLUDE="192.168.1.1" # IP адреса, которые пропускать напрямую

    # --- ЧЕРНЫЙ СПИСОК ---

    blacklist="" # Запрещенные IP адреса

    # ----------------------------------------------------------------------------
    # ПОМОЩНИКИ (ниже редактировать только после ознакомления с параметрами firehol)
    # ----------------------------------------------------------------------------

    if [ ! -z "${blacklist}" ]
    then
    blacklist full "${blacklist}"
    fi

    if [ ! -z "${SQUID_PORT}" ]
    then
    transparent_squid "${SQUID_PORT}" "${SQUID_USERS}" \
    inface "${HOME_MYIF}" src "${HOME_LAN}" \
    `test ! -z "${SQUID_EXCLUDE}" && echo "dst not ${SQUID_EXCLUDE}"`
    fi

    if [ ! -z "${PUBLIC_MYIP}" ]
    then
    snat to "${PUBLIC_MYIP}" \
    outface "${PUBLIC_MYIF}" \
    src "${HOME_LAN}" dst not "${UNROUTABLE_IPS}"
    else
    masquerade "${PUBLIC_MYIF}"
    fi

    interface "${HOME_MYIF}" home src "${HOME_LAN}" dst "${HOME_MYIP} ${HOME_BCAST}"
    policy reject
    server "${HOME_SERVICES}" accept

    client all accept

    if [ ${HOME_DHCP} -eq 1 ]
    then
    interface "${HOME_MYIF}" dhcp
    server dhcp accept
    fi

    interface "${PUBLIC_MYIF}" internet \
    src not "${UNROUTABLE_IPS}" \
    `test ! -z "${PUBLIC_MYIP}" && echo "dst ${PUBLIC_MYIP}"`
    protection strong
    policy drop
    if [ ! -z "${TRUSTED_PCS}" -a ! -z "${TRUSTED_SERVICES}" ]
    then
    server "${TRUSTED_SERVICES}" accept src "${TRUSTED_PCS}"
    fi
    server "${PUBLIC_SERVICES}" accept

    client all accept

    if [ ${DIAL_ON_DEMAND} -eq 1 ]
    then
    interface "${PUBLIC_MYIF}" dialup
    client all accept
    fi

    router internet2lan inface "${PUBLIC_MYIF}" outface "${HOME_MYIF}" \
    src not "${UNROUTABLE_IPS}" dst "${HOME_LAN}"

    client all accept


    Забыли что-то закрыть/запретить?


    Политика построения правил в firehol: запретить всё, разрешить только явно указанное.

    Пример, указанный выше создаёт около 400(!) правил, включая правила против атак типа флуда или xmas.

    Ага, вот это правило… Не-не-не!


    С Firehol также можно не бояться внести какие-то изменения в конфиг, превращающие удаленный сервер в груду неотзывчивого железа. Он всегда оставит вашу текущую сессию ssh открытой, даже если вы в правилах напортачили с настройками ssh! Во-вторых, rc скрипт имеет несколько полезнейших параметров. Пожалуй, наиболее используемый из них — try.

    Перед окончательным применением параметров у вас есть возможность проверить их работоспособность. Для этого достаточно вызвать скрипт с параметром try: /etc/init.d/firehol try

    Firehol загрузит свежепоправленные конфигурационные файлы и будет покорно ждать от вас слова commit. Если такового не поступит в течении тридцати секунд, то будут восстановлены прежние работоспособные параметры.

    Помимо стандартных start,stop,restart и только что описанного try существуют ещё три:
    status — выводит текущие правила iptables
    save — сохраняет текущие правила iptables
    panic — используется при обнаружении вторжения, перекрываются ВСЕ контакты с внешним миром, включая внутреннюю сеть.

    Гиммемоа


    Заинтересовавшихся, милости просим на сайт программы, где вы найдёте исчерпывающую документацию по этому прекрасному продукту, а также множество примеров конфигураций от домашнего NAT до межофисного маршрутизатора с DMZ, внутренними группами и пр. тонкостями.

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 14

      +1
      Очень понятная и грамотная надстройка над iptables,
      Жаль только не реализован шейпинг:-)
        +2
        htb.init — отличнейший шейпер. В свзяке с этим скриптом — самое то.
        +2
        Хорошая тулза. В закладочки :-)
          0
          Shell-like синтаксис конфига файрволла. Хм, прикольная идея. Спасибо за статью.
            +1
            вы никогда не настраивали pf или ipfw?
              0
              Стыдно. ipfw видел слегка, а pf — никогда. И в ближайшее время не светит.
              В конфиге ipfw я как-то не встречал конструкций с оператором if. Возможно, это был плохой конфиг.
            0
            недостаток всех таких тулзов (включая shorewall) в том, что когда возникает необходимость добавить «нестандартное» правило, котрое слишком заковыристо для скрипта —
            ВСЕ правила файрвола приходится переписывать вручную, с нуля.
              +1
              Уж лучше сразу Iptables курить. Сначала будет трудно, зато потом такие задачи будут решаться на раз, и без особых затрат умственного труда.
                0
                +1. без поверхностного (хотя бы) представления о фильтрации пакетов с надстройками мало чего хорошего получится.
                0
                Незнаю, мне кажется если вам домой и на 1 раз, то и заморачиваться с ним не стоит, лучше взять готовое (прмиеров тьма). А если вы часто с этим, то легче выучить iptables, оно и нужнее будет и полезнее. К тому же если часто, то у вас у самого вырастит горка примеров :) Да и iptables не сложен, громоздкий просто
                  0
                  >Уж лучше сразу Iptables курить
                  >А если вы часто с этим, то легче выучить iptables, оно и нужнее будет и полезнее.

                  Повторюсь: это руководство для тех кому некогда. Когда вам шеф или обстоятельства диктуют «А ну-ка быстро поднял интернет». Начинать читать man iptables в этом случае как минимум нерационально. Кроме того прямое вбивание правил iptables не даёт права на ошибку, что новичкам будет понятно уже после какого-нибудь злосчастного… -j DROP
                    +1
                    это что за новички, разруливающие интернеты? вы с квалификацией шефа обманываете? :-))
                      +1
                      В точку. Я как раз хотел на эту тему написать :)

                      Заниматься такими вопросами, лучше квалифицированному специалисту. Дальше могут быть задачи, которые так просто не решатся :)
                  0
                  отличное название — «огненная дыра» ;)
                  надеюсь не оправдается

                  Only users with full accounts can post comments. Log in, please.