Pull to refresh

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

Reading time 4 min
Views 8.8K
Это даже не статья и не полноценное руководство, а маленький сниппет, который поможет вам в наикратчайшие сроки поднять хорошо защищенный и правильно настроенный роутер на любой 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, внутренними группами и пр. тонкостями.
Tags:
Hubs:
+27
Comments 14
Comments Comments 14

Articles