Размещаю свой переработанный под шаблон скрипт настройки сетевого экрана.
Код снабжен комментариями, и адаптирован под следующие задачи:
1 Сетевой экран с политикой "что не разрешено, то запрещено"
2 Работа с тремя сетями: LOCAL- некоторая районная домашняя сеть, DMZ-ваша личная квартирная сетка, INET-интернет
3 Выполнение трансляции сетевых адресов получателя в направлениях DMZ->INET, DMZ->LOCAL, INET->DMZ. В случаях как статического, так и динамического внешнего IP.
4 Фильтрация некорректного траффика
Это должен быть хороший шаблон для индивидуальной настройки.
Перед применением внимательно прочитать и задать необходимые переменные.
# !bin/sh
###########################################################################
#
# Очистка таблиц, установка политик в значения "по умолчанию"
#
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 OUTPUT ACCEPT
#
# Удаление всех правил во всех таблицах.
#
$IPTABLES -F
$IPTABLES -t nat -F
$IPTABLES -t mangle -F
#
# Удаление пользовательских правил во всех таблицах.
#
$IPTABLES -X
$IPTABLES -t nat -X
$IPTABLES -t mangle -X
###########################################################################
# 1. Конфигурационные настройки.
#
#
# 1.1 Конфигурация интернет.
#
INET_IP="77.222.234.151"
INET_IFACE="ppp0"
# Очевидно, что это интернет ip адрес и интерфейс через который осуществляется доступ в интернет.
# Если у Вас динамически изменяющийся интернет ip адрес, в этом случае переменная INET_IP не устанавливается.
#
# 1.1.1 DHCP
#
#
# 1.1.2 PPPoE
#
#
# 1.2 Конфигурация локальной сети.
#
LAN_IP="10.2.10.146"
LAN_IP_RANGE="10.0.0.0/8"
LAN_IFACE="eth0"
# Здесь добавилась переменная LAN_IP_RANGE это диапазон ip адресов относящихся к сети LOCAL, (Некий районный провайдер), заданный новомодным способом, могло быть и так 10.0.0.0/255.0.0.0
#
# 1.3 DMZ.
#
DMZ_IP="10.11.11.1"
DMZ_IP_RANGE="10.11.11.0/28"
DMZ_IFACE="eth1"
DMZ_HTTP_IP="10.11.11.2"
DMZ_FTP_IP="10.11.11.2"
DMZ_GAME_IP="10.11.11.2"
DMZ_MYSQL_IP="10.11.11.2"
# Всё ясно, конфигурация маленькой сетки на 14 машин. Видно, что http/ftp/game/mysql-сервер это один и тот же хост. Разумеется ip адреса и размер сети вы определяете самостоятельно. (Это ваша квартирная сеть)
#
# 1.4 Конфигурация обратной петли Loopback.
#
LO_IFACE="lo"
LO_IP="127.0.0.1"
LO_IP_RANGE="127.0.0.0/8"
# Без комментариев.
#
# 1.5 Настройка IPTables.
#
IPTABLES="/sbin/iptables"
#Это путь до iptables, проверьте и исправьте если он иной.
#
# 1.6 Друзья
#
FRIEND_1="10.2.10.146" # Вася
#Это адреса друзей или доверенных хостов, список можно и не создавать.
#
# 1.6 Порты
#
MYSQL_PORT="3306"
HTTP_PORT="80"
HTTPS_PORT="443"
FTP_PORT="21"
TORRENT_PORT="6881"
# Это список портов которые используются вашими сетевыми приложениями. При написании правил эти переменные можно и не использовать.
###########################################################################
#
# 2. Module loading.
#
#
# Needed to initially load modules
#
#/sbin/depmod -a
#
# 2.1 Required modules
#
#/sbin/modprobe ip_tables
#/sbin/modprobe ip_conntrack
#/sbin/modprobe iptable_filter
#/sbin/modprobe iptable_mangle
#/sbin/modprobe iptable_nat
#/sbin/modprobe ipt_LOG
#/sbin/modprobe ipt_limit
#/sbin/modprobe ipt_state
#
# 2.2 Non-Required modules
#
#/sbin/modprobe ipt_owner
#/sbin/modprobe ipt_REJECT
#/sbin/modprobe ipt_MASQUERADE
/sbin/modprobe ip_conntrack_ftp
#/sbin/modprobe ip_conntrack_irc
#/sbin/modprobe ip_nat_ftp
#/sbin/modprobe ip_nat_irc
###########################################################################
#
# 3. /proc set up.
#
#
# 3.1 Required proc configuration
#
echo "1" > /proc/sys/net/ipv4/ip_forward
# Разрешаем компьютеру выступать в роли маршрутизатора.
#
# 3.2 Non-Required proc configuration
#
echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter
# Смысл этого параметра достаточно прост -- все, что поступает к нам, проходит проверку на соответствие исходящего адреса с нашей таблицей маршрутизации и такая проверка считается успешной, если принятый пакет предполагает передачу ответа через тот же самый интерфейс.
#echo "1" > /proc/sys/net/ipv4/conf/all/proxy_arp
#echo "1" > /proc/sys/net/ipv4/ip_dynaddr
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
# Игнорируются широковещательные пинги.
#echo "128" > /proc/sys/net/ipv4/ip_default_ttl
# Здесь можно изменить TTL по умоглчанию
# Второй и третий разделы посвящены тонкой настройке и загружаемым модулям, их описание несколько выходит за рамки тематики этой статьи, хотя при необходимости будут ссылки и на эти разделы.
###########################################################################
#
# 4. Установка правил.
#
######
# 4.1 Таблица filter
#
#
# 4.1.1 Установка политик
#
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD ACCEPT
# Этим мы зададим политики «по умолчанию» для цепочек в таблице filter, выполняющиеся если пакет данных не подойдёт ни под одно из правил в цепочке. Если цепочка и таблица не указаны специально то используется таблица filter и цепочка input.
#
# 4.1.2 Создание пользовательских цепочек
#
# Никто не говорил, что нельзя создать свои цепочки для правил и рулить пакеты для проверки в них.
#
# Создание цепочки для некорректных TCP пакетов
#
$IPTABLES -N bad_tcp_packets
#
# Создание раздельных цепочек для ICMP, TCP и UDP to traverse
#
$IPTABLES -N allowed
$IPTABLES -N tcp_packets
$IPTABLES -N udp_packets
$IPTABLES -N icmp_packets
#
# 4.1.3 Заполнение пользовательских цепочек
#
#
# bad_tcp_packets цепочка
#
$IPTABLES -A bad_tcp_packets -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset
$IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "New not syn:"
$IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP
# Этими правилами отсекаются некорректные tcp пакеты. В неё они попадут в первую очередь.
#
# Допускающая цепочка
#
$IPTABLES -A allowed -p TCP --syn -j ACCEPT
$IPTABLES -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A allowed -p TCP -j DROP
# Эта цепочка пропустит далее только те пакеты которые корректно пытаются открыть новое соединение или относятся к уже открытому, прочие сбрасываются. На эту цепочку будут ссылаться все правила для TCP.
#
# TCP правила
#
$IPTABLES -A tcp_packets -p TCP --dport $FTP_PORT -j allowed
$IPTABLES -A tcp_packets -p TCP --dport $HTTP_PORT -j allowed
# Добавте сюда аналогичные правила для разрешения соединения с вашими сетевыми приложениями по протоколу TCP.
#
# UDP порты
#
$IPTABLES -A udp_packets -p UDP --destination-port 123 -j ACCEPT
# Это правило позволяет получать информацию от служб точного времени. Добавте сюда аналогичные правила для разрешения соединения с вашими сетевыми приложениями по протоколу UDP.
#
# In Microsoft Networks you will be swamped by broadcasts. These lines
# will prevent them from showing up in the logs.
#
$IPTABLES -A udp_packets -p UDP -i $INET_IFACE -d 255.255.255.255 --dport 135:139 -j DROP
$IPTABLES -A udp_packets -p UDP -i $LAN_IFACE -d 255.255.255.255 --dport 135:139 -j DROP
# Это защита от мусора рассылаемого компами со службой мелкомягких сетей.
#
# If we get DHCP requests from the Outside of our network, our logs will
# be swamped as well. This rule will block them from getting logged.
#
$IPTABLES -A udp_packets -p UDP -i $INET_IFACE -d 255.255.255.255 --destination-port 67:68 -j DROP
$IPTABLES -A udp_packets -p UDP -i $LAN_IFACE -d 255.255.255.255 --destination-port 67:68 -j DROP
# Эти правила отсекают широковешательные запросы к DHCP серверу, если у вас функционирует служба DHCP закомментируйте эти правила.
#
# ICMP правила
#
$IPTABLES -A icmp_packets -p ICMP --icmp-type 8 -j ACCEPT
$IPTABLES -A icmp_packets -p ICMP --icmp-type 11 -j ACCEPT
# Здесь указываем какие типы ICMP пакетов пропустит сетевой экран.
#
# 4.1.4 INPUT цепочка
#
#
# Некорректные и недопустимые пакеты не ждут
#
$IPTABLES -A INPUT -p tcp -j bad_tcp_packets
# Это правило заруливает все пакеты на проверку корректности в цепочку bad_tcp_packets, созданную ранее, затем они попадут на проверку соответсвия портов назначения (tcp_packets) и если на запрашиваемый порт соединение разрешено происходит заключительная проверка корректности (allowed).
#
# Правила для безопасных маршрутов
#
$IPTABLES -A INPUT -p ALL -i $DMZ_IFACE -s $DMZ_IP_RANGE -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LO_IP_RANGE -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LAN_IP -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $INET_IP -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $DMZ_IP -j ACCEPT
# Здесь укажем направления по которому движется безопасный траффик.
#
# Правила для входящих пакетив из локальной сети.
#
$IPTABLES -A INPUT -p ALL -d $LAN_IP -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -p TCP -i $LAN_IFACE -j tcp_packets
$IPTABLES -A INPUT -p UDP -i $LAN_IFACE -j udp_packets
$IPTABLES -A INPUT -p ICMP -i $LAN_IFACE -j icmp_packets
# Этими правилами разруливаем пакеты по цепочкам в зависимости от протокола для траффика из сети LOCAL и пропустим траффик относящийся к уже открытым соединениям (первое правило)
#
# Правила для входящих пакетив из интернета.
#
$IPTABLES -A INPUT -p ALL -d $INET_IP -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -p TCP -i $INET_IFACE -j tcp_packets
$IPTABLES -A INPUT -p UDP -i $INET_IFACE -j udp_packets
$IPTABLES -A INPUT -p ICMP -i $INET_IFACE -j icmp_packets
# Этими правилами разруливаем пакеты по цепочкам в зависимости от протокола для траффика из сети INET и пропустим траффик относящийся к уже открытым соединениям (первое правило)
#
# Журналируются сброшенные пакеты для отладки.
#
$IPTABLES -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "IPT INPUT packet died: "
#
# 4.1.5 FORWARD цепочка
#
# В цепочку FORWARD попадают только те пакеты, которые адресованы не нашему хосту, либо они переадресованы нами принудительно, здесь я ограничиваюсь проверкой на корректность и разрешаю прохождение всего траффика, ограничившись некоторой проверкой по принципу "что не запрещено, то разрешено".
#
# Некорректные TCP пакеты не ждут
#
$IPTABLES -A FORWARD -p tcp -j bad_tcp_packets
# Это правило заруливает все пакеты на проверку корректности в цепочку bad_tcp_packets, созданную ранее, затем они попадут на проверку соответсвия портов назначения (tcp_packets) и если на запрашиваемый порт соединение разрешено происходит заключительная проверка корректности (allowed).
#
# Пропускаются актуальные пакеты.
#
$IPTABLES -A FORWARD -s ! $DMZ_IP -d $DMZ_MYSQL_IP -p tcp --sport $MYSQL_PORT -j REJECT --reject-with tcp-reset
$IPTABLES -A FORWARD -s ! $DMZ_IP -d $DMZ_FTP_IP -p tcp --sport $FTP_PORT -j REJECT --reject-with tcp-reset
# Из правил видно, что если к MySQL серверу и FTP серверу обращаются с ip отличного от $DMZ_IP то соединение запрещается.
#
# Журналируются сброшенные пакеты для отладки.
#
$IPTABLES -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "IPT FORWARD packet died: "
#
# 4.1.6 OUTPUT цепочка
#
#
# Некорректные TCP пакеты не ждут.
#
$IPTABLES -A OUTPUT -p tcp -j bad_tcp_packets
# Это правило заруливает все пакеты на проверку корректности в цепочку bad_tcp_packets, созданную ранее, затем они попадут на проверку соответсвия портов назначения (tcp_packets) и если на запрашиваемый порт соединение разрешено происходит заключительная проверка корректности (allowed)
#
# Специальные OUTPUT правила разрешающие который IP's разрешены.
#
$IPTABLES -A OUTPUT -p ALL -s $LO_IP_RANGE -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $LAN_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $INET_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $DMZ_IP -j ACCEPT
# Разрешаем уходить с нашего сетевого экрана только траффику с указанными ip адресами или их диапазоном.
#
# Журналируются сброшенные пакеты для отладки.
#
$IPTABLES -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "IPT OUTPUT packet died: "
######
# 4.2 nat table
#
#
# 4.2.1 Установка политик
#
#
# 4.2.2 Создание пользовательских цепочек
#
#
# 4.2.3 Заполнение пользовательских цепочек
#
#
# 4.2.4 PREROUTING chain
#
$IPTABLES -t nat -A PREROUTING -d $LAN_IP -p tcp -m tcp --dport $HTTP_PORT -j DNAT --to-destination $DMZ_HTTP_IP
#$IPTABLES -t nat -A PREROUTING -d $LAN_IP -p tcp -m tcp --dport $FTP_PORT -j DNAT --to-destination $DMZ_FTP_IP
# Это правило заменит адрес получателя в запросе к HTTP сервру с адреса $LAN_IP на адрес $DMZ_HTTP_IP, перебросив этим соединение в вашу домашнюю сеть, обратная подстановка будет осуществляться автоматически. Раскомментируйте второе правило если у вас есть в домашней сети ftp сервер, к которому вы хотите разрешить доступ из сети LOCAL, добавляйте свои правила при необходимости. Аналогично будут выглядеть правила для переброса траффика из интернета (INET), только переменная $LAN_IP меняется на $INET_IP.
#
# 4.2.5 POSTROUTING chain
#
$IPTABLES -t nat -A POSTROUTING -s $DMZ_IP_RANGE -o $LAN_IFACE -j SNAT --to-source $LAN_IP
$IPTABLES -t nat -A POSTROUTING -s $DMZ_IP_RANGE -o $INET_IFACE -j SNAT --to-source $INET_IP
#$IPTABLES -t nat -A POSTROUTING -s $DMZ_IP_RANGE -o $INET_IFACE -j MASQUERADE
# Эти правила нужны для того что бы на машинах в вашей домашней сети (DMZ) были доступны сеть LOCAL и INET. Если у вас в сети LOCAL есть друзья и ваш компьютер работает круглосуточно вы можете существенно сэкономить на оплате интернета грамотно использовав эту цепочку ;)
# Если у Вас нет "белого" ip адреса раскомментируйте третие правило, удалите или закомментируйте второе и раскомментируйте строку [echo "1" > /proc/sys/net/ipv4/ip_dynaddr] в третьем разделе.
#
# 4.2.6 OUTPUT chain
#
$IPTABLES -t nat -A OUTPUT -d $LAN_IP -p tcp -m tcp --dport 80 -j DNAT --to-destination $DMZ_HTTP_IP
$IPTABLES -t nat -A OUTPUT -d $INET_IP -p tcp -m tcp --dport 80 -j DNAT --to-destination $DMZ_HTTP_IP
# Эти правила нужны для корректной связи с вашим HTTPсервером в сети DMZ при соединениях исходящих с брандмауэра
######
# 4.3 mangle table
#
#
# 4.3.1 Установка политик
#
#
# 4.3.2 Создание пользовательских цепочек
#
#
# 4.3.3 Заполнение пользовательских цепочек
#
#
# 4.3.4 PREROUTING chain
#
#
# 4.3.5 INPUT chain
#
#
# 4.3.6 FORWARD chain
#
#
# 4.3.7 OUTPUT chain
#
#
# 4.3.8 POSTROUTING chain
#