Фаерволл мой — сон мой!
Что такое фаерволл? Это обычная программа которая выполняет какие-то функции, а именно фактически управляет правилами (разрешениями) управления трафика вашей сети. Фаерволов есть много, разных, хороших и плохих, вкусных, и кислых, но в операционных системах семейства linux в основном используется программа iptables.
Вот о ней мы сегодня и будем говорить и на основе ee строить фаерволл начального уровня для защиты сети и маршрутизатора!
Прежде чем строить фаерволл важна задача, нужно четко понимать, что мы хотим!
Чтобы было проще я всегда задачи разбиваю на под задачи, таким образом проще решать глобальную задачу, вот и теперь разберем задачу фаерволл на несколько подзадач.
Нарисуем некий мифический маршрутизатор на котором нужно установить фаерволл .
На нашем маршрутизаторе установлена linux и установлена программа iptables, наш linux имеет две сетевые карты. Одна из них включена в локальную сеть, другая включена в сеть интернет, которую предоставляет провайдер!
Вижу сразу несколько задач которые нужно решать :
-
Управлять теми кто стремиться подключиться к нашему серверу извне
-
Управлять пользователями сети которые находятся в нашей локальной сети и которые стремятся подключиться к ресурсам интернет.
-
Управлять трафиком который может быть порожден самим маршрутизатором.
Как ни странно, в программе iptables происходит точно такое же деление на задачи по управлению трафиком . Это так называемые цепочки INPUT, FORWARD,OUTPUT, есть еще таблица NAT она также относится к задачам по управлению трафиком для пользователей нашей локальной сети .
Итак подчеркнем :
-
Управлять теми кто стремиться подключиться к нашему серверу — это цепочка INPUT
-
Управлять пользователями сети которые находятся в нашей локальной сети и которые стремятся подключиться к ресурсам интернет те. за пределы нашей сети — это цепочки FORWARD, NAT
-
Управлять трафиком который может быть порожден самим маршрутизатором — это цепочка OUTPUT.
Теперь читайте выше изложенного несколько раз и как говорится до просветления, если вы четко не поймете чем отличается трафик цепочки INPUT от цепочки FORWARD то все таки обратитесь к профессионалу с просьбой построить фаерволл либо же просто экспериментируйте не на живом сервере!
Авторизуйтесь в системе под root и создайте простой текстовый файл .
Root#>./my
После открываем этот файл в любом текстовом редакторе и добавляем туда следующие строки :
#! /bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo 200 > /proc/sys/net/ipv4/icmp_ratelimit
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
echo 256 > /proc/sys/net/ipv4/tcp_max_syn_backlog
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
#Здесь мы разрешили ядру пропускать через себя трафик типа FORWARD и несколько
#ограничили и обезопасили себя ограничив стандартные параметры ядра.
INET_IFACE="eth0" #имя интерфейса который подключен к интернету
LOCAL_FACE="eth1" #имя интерфейса подключенного к локальной сети
UNPRIPORTS="1024:65535"
IP="реальный айпи" #наш реальный айпи
my="айпи с которого управляю маршрутизатором "
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ip_gre
modprobe ip_nat_pptp
modprobe ip_conntrack_pptp
# это модули к айпитаблес которые реализуют некий функционал, видно из названия
iptables -F -t filter
iptables -F -t nat
iptables -F -t mangle
#Эти команды очищают все таблицы .
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
# устанавливаем значения таблиц по умолчания. То есть все запретили , а разрешать будем #только то, что нам нужно ! #Управление цепочкой OUTPUT выходит за рамки этой статьи
#поэтому ее мы разрешили по умолчанию.
#Против подтелки адресов
iptables -A INPUT -i $INET_IFACE -s 192.168.0.0/16 -j DROP
iptables -A INPUT -i $INET_IFACE -s 10.0.0.0 -j DROP
iptables -A INPUT -i $INET_IFACE -s 224.0.0.0/8 -j DROP
iptables -A INPUT -i $INET_IFACE -s 127.0.0.0/4 -j DROP
iptables -A INPUT -i $INET_IFACE -s 172.16.0.0/12 -j DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -i $LOCAL_FACE -j ACCEPT
iptables -A FORWARD -i $LOCAL_FACE -j ACCEPT
#Здесь мы разрешили принимать и отправлять пакеты , для интерфейса обратной связи и
#интерфейса локальной сети, причем дополнительно разрешили транзитный трафик для
#интерфейса локальной сети.
iptables -A FORWARD -p tcp -i $INET_IFACE -m multiport --dports 135,137,138,139,445 -j DROP
#Запрещаем подключаться к ресурсам файлового сервера из вне
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
#полезное правило которое избавляет нас от всяких там не до маршрутизаторов на основе
#cisco и иже с ними у которых вечно какие то проблемы с mtu и фрагментированием пакетов
iptables -A INPUT -p tcp -m tcp -i $INET_IFACE --dport $UNPRIPORTS --sport $UNPRIPORTS -j ACCEPT
iptables -A INPUT -i $INET_IFACE -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -i $INET_IFACE -p icmp --icmp-type 0 -j ACCEPT
iptables -A INPUT -i $INET_IFACE -p icmp --icmp-type 3 -j ACCEPT
iptables -A INPUT -i $INET_IFACE -p icmp --icmp-type 5 -j ACCEPT
iptables -A INPUT -i $INET_IFACE -p icmp --icmp-type 11 -j ACCEPT
#это тем кто не может жить без пинга, чтобы машина пинговалась из мира.
Вот пожалуй и все, это так сказать базовая настройка маршрутизатора. Дальше осталось только открывать и закрывать доступ в интернет, тут уж на ваше личное усмотрение.
Например наш маршрутизатор работает почтовым сервером , тогда нужно ему открыть 25 порт , чтобы он мог принимать и отправлять почту !
iptables -A INPUT -p tcp -m tcp -i $INET_IFACE --dport 25 -j ACCEPT
а если у нас есть выездные пользователи которые хотят смотреть свою почту то:
iptables -A INPUT -p tcp -m tcp -i $INET_IFACE --dport 110 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -i $INET_IFACE --dport 143 -j ACCEPT
Здесь же разрешим подключение по протоколу ssh ,управлять то надо как-то всем этим добром. Если давать доступ из вне не планируется это правило можно опустить так как из локальной сети и так подключимся(мы это разрешили выше).
iptables -A INPUT -p tcp -m tcp -i $INET_IFACE --dport 22 -j ACCEPT
хотя вернее это правило будет выглядеть так
iptables -A INPUT -p tcp -m tcp -i $INET_IFACE --dport 22 -j ACCEPT -s $my
таким образом мы сказали, что управлять сервером можем только мы с нашего айпи. (например домашнего)
Переменная $my Задается в самом начале файла.
К тому же я рекомендую перевешивать стандартный порт на не стандартный :)
по умолчанию демон ssh ставится на 22 порт :) ну переставьте его на 922, и 90% атак на ваш сервер снимет как рукой :)
далее добавляйте правила на сое усмотрение , кому , что надо … если установлен сервер www нужно открыть 80 и 443 порты и т.д.
Теперь дадим пользователям интернет для этого добавим правило в таблицу NAT
iptables -t nat -A POSTROUTING -o $INET_IFACE -p tcp -s 192.168.0.1 -j SNAT --to-source $IP
Теперь у пользователя с айпи адрессом 192.168.0.1 будет иметь доступ в интернет !
Или дадим всем сразу:
iptables -t nat -A POSTROUTING -o $INET_IFACE -p tcp -s 192.168.0.0/24 -j SNAT --to-source $IP
Чем плохи эти правила, а тем , что дают полный доступ , а это плохо :) Любой червь тут же начнет рассылать спам , поэтому модернизируем наш доступ в интернет
iptables -t nat -A POSTROUTING -o $INET_IFACE -p tcp -s 192.168.0.1 -m multiport --dports 20,21,80,443,5190 -j SNAT --to-source $IP
Теперь гораздо эффективнее, пользователь будет иметь доступ к интернету , а именно имеет право смотреть страницы, аська подключится , а также будет работать по протоку фтп, Все остальное для него будет закрыто.
Поехали дальше, иногда возникает задача дать доступ определенному порту и только когда доступ идет к определенному айпиадрессу !
Следующее правило решает эту задачу:
iptables -t nat -A POSTROUTING -o $INET_IFACE -p tcp -s 192.168.0.1 -m multiport --dports 5080,8081,80 -d www.uitg.kiev.ua t -j SNAT --to-source $IP
этим правилом мы разрешили пользователю с айпиадрессом 192.168.0.1 подключаться к портам 5080,8081,80 только в том случае если он обращается к хосту www.uitg.kiev.ua.
Для тех у кого интернет ассоциируется с работает или не работает, обязательно , добавляем следующее правило :
iptables -t nat -A POSTROUTING -o $INET_IFACE -p udp -s 192.168.0.1 -m multiport --dports 53 -j SNAT --to-source $IP
сделаем файл my исполняемым
#chmod ./my 777
Ну и запустим его, после проверки записываем его в стартовые скрипты
Посмотреть на правила в работе можно выполнив команду
iptables -L -nv
Вот пожалуй и все удачи.
Первая Украинская Информационная Группа благодарит за написание статьи
Миненко Олега, системного администратора.
Копирование статьи разрешенио только с сохранением