Общие слова.
IpTables — файервол применяемый в операционных системах Linux. Необходим для защиты самого сервера и других компьютеров, которые он защищает.
Состоит из набора правил, которые определяют, что делать с пакетом данных, в зависимости от протокола (TCP, UDP…), направления (входящий, исходящий, проходящий ), интерфейса и еще нескольких параметров.
Очень прост и популярен. Для меня он даже более привычен, чем работа с виндовыми файерволлами имеющими графический интерфейс. Настраивается выполнением команд в командной строке.
Для удобства, обычно последовательность команд пишется в текстовый файл (скрипт) и выполняется автоматически при запуске или вручную в нужный вам момент.
Приведу пример первоначальной, самой простой настройки, которую по мере необходимости можно дополнить правилами до нужной функциональности.
Все манипуляции происходят в Ubuntu Server 12.04. Практически без изменений все будет аналогично в других версиях Ubuntu и Debian. В остальных дистрибутивах могут быть непринципиальные отличия связанные с разным расположением необходимых файлов и каталогов.
Написать хочу кратко, с минимальными пояснениями — ничего лишнего, чтобы долго не вчитываться, а сразу можно было выполнять. Больше для того, чтобы вспомнить слегка забытое, чем научиться неизвестному.
=> Скриптовый файл.
Первое — создать файл для будущего набора правил. Обычно файлы выполняемые при загрузке системы располагаются в директории /etc/init.d/
Переходим в этот каталог и выполняем:
touch firewall.sh
firewall.sh — имя создаваемого файла, который будем заполнять.
=>Вводная часть скрипта (описательная)
Открыть его для редактированияможно несколькими способами. Обычно я использую встроенный редактор Midnight Commander (MC) или идущий в операционной системе NANO. Мне больше нравится первый вариант, но Nano позволяет при работе через Putty (виндовый SSH-клиет) работать с буфером обмена. Так что если у вас есть уже записанные команды, которые надо только вставить, выполняем:
nano ./firewall.sh
Вставляем в него
#!/bin/sh
Эта строка говорит, что данный скрипт при запуске выполняет программа /bin/sh
Вводим
IPT="/sbin/iptables"
Эта обозначает, что переменной присваивается значение, указанное в кавычках. В данном случае путь к программе IpTables. В разных дистрибутивах Linux может различаться. В дальнейшем, чтобы не писать полный путь, будем использовать переменную. В довесок, переменным можно давать более «человеку понятные» имена — для удобочитаемости.
Пропишем интерфейсы, с которыми будем работать.
IF_LOCAL="eth0"
IF_LO="lo"
Интерфейс обычно это сетевая карта, но в более сложных конфигурациях могут присутствовать и виртуальные устройства. Название берется из вывода волшебной команды ifconfig
Теперь перечислим наши IP-адреса.
IP_GW="10.1.1.1"
LOOP="127.0.0.1"
IP_ADM="10.1.1.2"
lo — интерфейс обратной петли, а 127.0.0.1 — его адрес.
IP_ADM — адрес админской машины
Наша локальная сеть:
NET_LOCAL="10.1.1.0/24"
Настройки по умолчанию
Переходим непосредственно к настройке iptables.
По умолчанию запрешаем всю сетевую активность:
$IPT -P INPUT DROP $IPT -P OUTPUT DROP $IPT -P FORWARD DROP
Эта секция запрещает прием, отправку, форвардинг любых пакетов на всех интерфейсах.
$IPT -F $IPT -t nat -F $IPT -t mangle -F $IPT -X
Очистка всех правил в цепочках IpTables.
Теперь в IpTables нет никаких правил и все запрещено. Чистый лист, который можно заполнять. Перечислены только объекты (интерфейсы и адреса) с которыми будем работать.
Наполнение правилами обработки соединений
$IPT -A INPUT -p icmp --icmp-type 8 -j ACCEPT $IPT -A OUTPUT -p icmp -j ACCEPT
Разрешаем пинговать наш сервер и ему пинговать окружающих.
$IPT -A INPUT -p tcp -i $IF_LOCAL -s $IP_ADM --dport 22 -j ACCEPT
Разрешаем доступ по протоколу tcp на интерфейс eth0 с адреса 10.1.1.2 на порт 22.
Переведя на русский. Доступ к серверу по SSH (управление из командной строки) при установке связи из сетей подключенных к интерфейсу eth0 и только с компьютеры с адресом 10.1.1.2
Компы с другими IP получить управление сервером не смогут — файервол отбросит их пакеты. Но пинговать его смогут, предыдущее правило позволяет.
$IPT -A INPUT -p tcp -i $IF_LOCAL -s $NET_LOCAL --dport 21 -j ACCEPT
Разрешаем доступ из всей нашей локальной сети к FTP серверу (22 порт), запущенному на нашем компьютере.
$IPT -A INPUT -i $IF_LOCAL -m state --state ESTABLISHED,RELATED -j ACCEPT $IPT -A OUTPUT -o $IF_LOCAL -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
Эти правила позволяют принимать пакеты на интерфейск eth0 связанные с уже установленным соединением (-m state —state ESTABLISHED,RELATED). Например отправляем пинг и получаем ответ от удаленного компа. И разрешают устанавливать новые соединения с интерфейса eth0 (-m state —state NEW,ESTABLISHED,RELATED).
Все, сервер работает, ничего не принимает, кроме SSH с админского компьютера для управления.
Теперь можно настраивать дальше, по вашим потребностям (разрешать соединения для сервисов на этом компьютере, например, веб-сервер).
Весь скрипт полностью:
#!/bin/sh IPT="/sbin/iptables" IF_LOCAL="eth0" IF_LO="lo" LOOP="127.0.0.1" IP_GW="10.1.1.1" IP_ADM="10.1.1.2" NET_LOCAL="10.1.1.0/24" $IPT -P INPUT DROP $IPT -P OUTPUT DROP $IPT -P FORWARD DROP $IPT -F $IPT -t nat -F $IPT -t mangle -F $IPT -X $IPT -A INPUT -p icmp --icmp-type 8 -j ACCEPT $IPT -A OUTPUT -p icmp -j ACCEPT $IPT -A INPUT -p tcp -i $IF_LOCAL -s $IP_ADM --dport 22 -j ACCEPT $IPT -A INPUT -p tcp -i $IF_LOCAL -s $NET_LOCAL --dport 21 -j ACCEPT $IPT -A INPUT -i $IF_LOCAL -m state --state ESTABLISHED,RELATED -j ACCEPT $IPT -A OUTPUT -o $IF_LOCAL -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
P.S.
Совсем забыл. Просто написать скрипт с правилами для IPTables недостаточно. Необходимо его запускать при каждой загрузке системы.
Путь к нашему файлу /etc/init.d/firewall.sh
Набираем в консоли с правами root-а:
chmod u+x /etc/init.d/firewall.sh
Эта команда делает его исполняемым для владельца (root). Далее :
update-rc.d firewall.sh defaults
Теперь скрипт будет запускаться при каждой загрузке системы автоматически.