Чтиво: установка сервера часть 017
Перед тем как подключить к серверу модем и подключаться к Интернет,
нужно предварительно хотя бы чуть-чуть обезопасить себя и настроить
фильтрацию трафика, чтобы даже случайное сканирование открытых портов
или попытка взлома окончились у "горе-хакера" неудачей. Излишняя
паранойя в таком деле не помешает. Постепенно правила фильтрации буду
усложняться, чтобы сервер/шлюз был еще неприступней.
Итак, настраиваем файервол или брандмауэр.
Как было сказано в предыдущих выпусках, для настрйки правил фильтрации
используется пакет iptables. Очень хорошую и полную рускоязычную
документацию по этому пакету можно скачать по адресу
http://gazette.linux.ru.net/archive/iptables-tutorial-1.1.19.tar.bz2,
прочитав ее вам многе из ниже описанного станет понятно, я же
постараюсь обойтись лишь краткими комментариями. Правила фильтрации
будем сразу задавать в исполняемом bash-файле.
Что я хочу? Сначала самое простое - недопускать никакие входящие
соединения со стороны Интернета. А со стороны локалки хочу чтобы был
только доступ к SSH, т.е. открыт для подключения 22 порт. И еще кроме
скрипта установки правил фильтрации, должен быть скрипт отмены всех
правил.
Вообщем, скрипт инициализации правил filter.dialup.start
begin filter.dialup.start #!/bin/bash
#******************************************************
# Предопределения
#******************************************************
# Для инета
# Сетеовой инет-интрефейс
INET_IFACE="ppp0"
# Для локальной стороны
# Сетевой интерфейс, свзязанный с локалкой
LAN_IFACE="eth0"
# IP-адрес "локального" сетевого интерфеса
LAN_IP="192.168.2.192"
# Диапазон ip-адресов локальной подсети
LAN_IP_RANGE="192.168.2.0/24"
# Для внутренних дел (интерфейс обратной петли)
# Название
LO_IFACE="lo"
# IP-адрес
LO_IP="127.0.0.1"
# Ускоренное обращение к утилитам
IPTABLES="/sbin/iptables"
DEPMOD="/sbin/depmod"
MODPROBE="/sbin/modprobe"
#******************************************************
# Загрузка модулей, отвечающих за работу фильтрации
#******************************************************
$DEPMOD -a
$MODPROBE ip_tables
$MODPROBE iptable_filter
$MODPROBE ipt_state
#******************************************************
# Работаем с таблицей filter
#******************************************************
# Определение политик по умолчанию
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT ACCEPT
# Отдельно выделим цепочку для "плохих" пакетов
$IPTABLES -N bad_tcp_packets
# Не способствовать спуфинг-атаке "Sequence Number Prediction"
$IPTABLES -A bad_tcp_packets -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state
NEW -j REJECT --reject-with tcp-reset
# Не пропускать пакеты со статусом NEW и со сброшенным битом SYN
# Данное правило я оставляю закомментированным, потому что иначе я не
# смогу запускать сценарий запуска из сессии ssh, потому что она как
# раз попадет под действие этой цепочки
# $IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP
# Отдельно выделим цепочку для прохождения ICMP пакетов
# пропускать будем только icmp-сообщения следующих типов:
# 3 - destination-unreachable (пункт назанчения не доступен)
# 8 - echo-request (запрос на ping)
# 11 - time-exceeded (истекло время (ttl) при traceroute)
$IPTABLES -N icmp_packets
$IPTABLES -A icmp_packets -p ICMP --icmp-type 3 -j ACCEPT
$IPTABLES -A icmp_packets -p ICMP --icmp-type 8 -j ACCEPT
$IPTABLES -A icmp_packets -p ICMP --icmp-type 11 -j ACCEPT
$IPTABLES -A icmp_packets -p ICMP -j DROP
# Отдельно выделим цепочку для прохождения TCP пакетов
# Прорускать будет только tcp-пакеты адресованные к портам:
# 22 - сервис ssh
$IPTABLES -N tcp_packets
$IPTABLES -A tcp_packets -p TCP --dport 22 -j ACCEPT
$IPTABLES -A tcp_packets -p TCP -j DROP
# Отдельно выделим цепочку для прохождения UDP пакетов
# Прорускать будет только udp-пакеты адресованные к портам:
$IPTABLES -N udp_packets
$IPTABLES -A udp_packets -p UDP -j DROP
#******************************************************
# Таблица filter - стандартная цепочка INPUT
#******************************************************
# Обрабатываем входящие плохие пакеты
$IPTABLES -A INPUT -p tcp -j bad_tcp_packets
# Разрешаем все входящие на интерфейс обратной петли
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -j ACCEPT
# Разрешаем все соединения получившие уже маркировку как
# установленное (ESTABLISHED) или связанное с уже
# установленным (RELATED) - для ускорения пропуска
$IPTABLES -A INPUT -p ALL -m state --state ESTABLISHED,RELATED -j ACCEPT
# Обрабатываем ICMP-сообщения: для локалки разрешить все, для инета -
# разрешить определенные
$IPTABLES -A INPUT -p ICMP -i $LAN_IFACE -s $LAN_IP_RANGE -j ACCEPT
$IPTABLES -A INPUT -p ICMP -i $INET_IFACE -j icmp_packets
# Обрабатываем TCP-соединения: для локалки разрешить определенные, для
# инета - запретить
$IPTABLES -A INPUT -p TCP -i $LAN_IFACE -s $LAN_IP_RANGE -j tcp_packets
$IPTABLES -A INPUT -p TCP -i $INET_IFACE -j DROP
# Обрабатываем UDP-соединения: аналогично TCP
$IPTABLES -A INPUT -p UDP -i $LAN_IFACE -s $LAN_IP_RANGE -j udp_packets
$IPTABLES -A INPUT -p UDP -i $INET_IFACE -j DROP
end filter.dialup.start Сейчас, нужно создать скрипт сброса всех правил filter.flush. Сделаем
его сразу универсальный, чтобы потом к нему не возвращаться
end filter.flush #!/bin/bash
#******************************************************
# Предопределения
#******************************************************
# Ускоренное обращение к утилитам
IPTABLES="/sbin/iptables"
#******************************************************
# Работаем с таблицей filter
#******************************************************
# Определение политик по умолчанию
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT
$IPTABLES -P OUTPUT ACCEPT
#******************************************************
# Работаем с таблицей nat
#******************************************************
# Определение политик по умолчанию
$IPTABLES -t nat -P PREROUTING ACCEPT
$IPTABLES -t nat -P POSTROUTING ACCEPT
$IPTABLES -t nat -P OUTPUT ACCEPT
#******************************************************
# Работаем с таблицей mangle
#******************************************************
# Определение политик по умолчанию
$IPTABLES -t mangle -P PREROUTING ACCEPT
$IPTABLES -t mangle -P INPUT ACCEPT
$IPTABLES -t mangle -P FORWARD ACCEPT
$IPTABLES -t mangle -P OUTPUT ACCEPT
$IPTABLES -t mangle -P POSTROUTING ACCEPT
#******************************************************
# Сбрасываем все правила во всех цепочках во всех таблицах
#******************************************************
$IPTABLES -F
$IPTABLES -t nat -F
$IPTABLES -t mangle -F
#******************************************************
# Удаляем все пользовательские цепочки во всех таблицах
#******************************************************
$IPTABLES -X
$IPTABLES -t nat -X
$IPTABLES -t mangle -X
begin filter.flush Данные сценарии положим в созданный нами каталог /etc/netfilter/. Права
на каталог 755 - владелец и группа-владельца root. На сами же файлики
права 744 - владелец и группа-владельца тоже root.
$ su
$ mkdir /etc/netfilter
$ chown root:root /etc/netfilter
$ chmod 755 /etc/netfilter
$ cd /etc/netfilter
$ chown root:root filter*
$ chmod 744 filter*
$ ls -l
Для проверки запустим filter.dialup.start
$ ./filter.dialup.start
Выведем на экран текущие правила фильтрации
$ /sbin/iptables -L
Сбросим правила
$ ./filter.flush
$ /sbin/iptables -L
Все работает.
Для использования данного брандмауэра просто для локальной машины без
использования локальной сети, достаточно просто удалить все строчки
относящиеся к взаимодействию с локалкой.
И еще, гуру, проверте эти правила - все ли нормально? Или есть глюки?
C уважением, Kolotov Alexandr (aka mr. Эбола)
отвечать: myscri***@e*****.ru
-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.linux.kirovlug-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.linux.kirovlug&email=
http://subscribe.ru/ mailto:ask@subscribe.ru