написал для 3х IP на основе МэдКоксовских рекомендаций и примеров. Вопрос в цепочке FORWARD :
1. может вместо -i надо -s ??
2. как правильно DROP-нуть
3. вообще правильно я сделал?
#!/bin/sh
###########################################################################
# 1. Конфигурация. #
###########################################################################
# Здесь задаются основные настройки брандмауэра, которые зависят от Вашей конфигурации сети.
#
############################################################################
# 1.1 Настройки интернет.
#
# INET_IP - Здесь должен быть указан реальный IP адрес, выданный провайдером услуг доступа в интернет.
# INET_IFACE - устройство, через которое осуществляется подключение к интернет.
# INET_BROADCAST - широковещательный адрес.
#
INET_IP="xxx.xxx.xxx.xxx"
INET_IFACE="eth0"
#INET_BROADCAST=""
############################################################################
# 1.2 Настройки локальной сети.
#
# Конфигурация локальной сети.
# LAN_IP - локальный IP адрес брандмауэра.
# LAN_IP_RANGE - широковещательный адрес + маска подсети.
# LAN_IFACE - интерфейс, подключенный к локальной сети.
#
LAN_IP="192.168.1.6"
LAN_IP_RANGE="192.168.1.0/24"
LAN_IFACE="eth1"
############################################################################
# 1.4 Локальный интерфейс "loopback".
#
LO_IFACE="lo"
LO_IP="127.0.0.1"
############################################################################
############################################################################
#
# 1.5 Путь к файлу iptables (обычно "/usr/sbin/iptables" или "/sbin/iptables").
#
IPTABLES="/sbin/iptables"
# Очистка всех правил в iptables
$IPTABLES -F
$IPTABLES -t nat -F
$IPTABLES -t mangle -F
$IPTABLES -X
$IPTABLES -t nat -X
$IPTABLES -t mangle -X
#
# 1.6 Дополнительно.
#
# Пользователи.
# Пользователь №1
USER_IP_1="192.168.1.10"
USER_MAC_1="00:1a:4b:c6:bc:6e"
# Пользователь №2
USER_IP_2="192.168.1.11"
USER_MAC_2="00:0f:fe:41:4c:87"
# Пользователь №3
USER_IP_3="192.168.1.12"
USER_MAC_3="00:0f:fe:00:00:87"
############################################################################################
# 2. Загрузка модулей #
############################################################################################
#
# Проверка инициализации модулей
#
/sbin/depmod -a
#
# 2.1 Требуемые модули
#
/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 Нетребуемые модули
#
#/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
# 4. Настройка правил.
#
############################################################################################
# 4.1 Таблица Filter #
############################################################################################
#
# 4.1.1 Политики по умолчанию
#
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP
#
# 4.1.2 Создание пользовательских цепочек
#
#
# Создание цепочки для "плохих" пакетов
#
$IPTABLES -N bad_tcp_packets
#
# Создание отдельных цепочек для различных протоколов
#
$IPTABLES -N allowed
$IPTABLES -N tcp_packets
$IPTABLES -N udp_packets
$IPTABLES -N icmp_packets
#
# Создание цепочек для подсчета трафика
#
# Для общего трафика
$IPTABLES -N trafficcount
# Для https
$IPTABLES -N secured
#
# 4.1.3 Содержимое пользовательских цепочек
#
#
# Цепочка bad_tcp_packets
#
# Отфильтровываются все пакеты, которые распознаются как NEW, но не
# являются SYN пакетами, а также обрабатываются SYN/ACK пакеты,
# имеющие статус NEW.
# Эта цепочка может быть использована для защиты от вторжения
# и сканирования портов.
#
$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
#
# Цепочка allowed
#
# Дополнительная проверка.
# По задумке цепочка вызывается из цепочки tcp_packets, на прошедшие
# проверку пакеты.
# Проверяем, является ли пакет SYN пакетом, т.е. запросом на соединение.
$IPTABLES -A allowed -p TCP --syn -j ACCEPT
# Пропускаем все пакеты с признаком ESTABLISHED и RELATED.
$IPTABLES -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT
# Сбрасываем все остальные пакеты.
$IPTABLES -A allowed -p TCP -j DROP
#
# Цепочка tcp_packets
#
# По идее рулит входящими tcp пакетами из инета.
# Но поскольку у нас нет никаких инет-сервисов в локалке
# мы просто перекидываем все пакеты в allowed.
$IPTABLES -A tcp_packets -p TCP -s0/0 -j DROP
#
# Правила для UDP.
#
#
# В сетях Microsoft Вас может завалить бродкастами.
# Правило блокирует широковещательные пакеты, поступающие на порты
# со 135 по 139. Эти порты используются протоколами SMB и NetBIOS.
# Данное правило предотвращает переполнение таблицы трассировщика в
# сетях Microsoft.
#
$IPTABLES -A udp_packets -p UDP -i $INET_IFACE -d $INET_BROADCAST \
--destination-port 135:139 -j DROP
#
# Это правило блокирует DHCP запросы извне.
#
$IPTABLES -A udp_packets -p UDP -i $INET_IFACE -d 255.255.255.255 \
--destination-port 67:68 -j DROP
#
# Правила для ICMP.
# Тут проверяется тип ICMP сообщения. Пропускаются только
# ICMP Echo Request, TTL equals 0 during transit и
# TTL equals 0 during reassembly. Все остальные типы ICMP
# сообщений должны проходить и так, т.к. имеют состояние RELATED.
#
# Чтобы брандмауэр перестал откликаться на ping -
# закомментируйте эту строчку.
$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j ACCEPT
$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT
$IPTABLES -A icmp_p -p ICMP -s 0/0 -j DROP
#
# Цепочка для подсчета трафика.
#
$IPTABLES -A trafficcount -p ALL -j RETURN
######################################################################
# 4.1.4 Цепочка INPUT. #
######################################################################
#
# Фильтруем "плохие пакеты" через цепочку bad_tcp_packets.
#
$IPTABLES -A INPUT -p tcp -j bad_tcp_packets
#
# Правила для "своих" сетей, т.е. не для интернета.
#
$IPTABLES -A INPUT -p ALL -i $LAN_IFACE -s $LAN_IP_RANGE -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LAN_IFACE -s $LO_IP -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LO_IP -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
#
# Правила для пакетов, приходящих из интернета.
#
# Это правило эквивалентно правилу, стоящему в цепочке alowed и в некоторой степени
# является избыточным, однако, оно несколько разгружает сетевой фильтр,
# поскольку значительная доля трафика пропускается этим правилом и не проходит
# всю последовательность до цепочки alowed.
# Каждое правило тут - сначала запускает пакет в цепочку подсчета трафика, затем обрабатывет далее
$IPTABLES -A INPUT -p ALL -d $INET_IP -m state --state ESTABLISHED,RELATED \
-j trafficcount
$IPTABLES -A INPUT -p ALL -d $INET_IP -m state --state ESTABLISHED,RELATED \
-j ACCEPT
# Отправляем tcp пакеты в соответствующую цепочку.
$IPTABLES -A INPUT -p TCP -i $INET_IFACE -j trafficcount
$IPTABLES -A INPUT -p TCP -i $INET_IFACE -j tcp_packets
# Отправляем udp пакеты в соответствующую цепочку.
$IPTABLES -A INPUT -p UDP -i $INET_IFACE -j trafficcount
$IPTABLES -A INPUT -p UDP -i $INET_IFACE -j udp_packets
# Отправляем icmp пакеты в соответствующую цепочку.
$IPTABLES -A INPUT -p ICMP -i $INET_IFACE -j trafficcount
$IPTABLES -A INPUT -p ICMP -i $INET_IFACE -j icmp_packets
#
# Клиенты Microsoft Network имеют дурную привычку выдавать огромное количесво
# групповых пакетов в диапазоне адресов 224.0.0.0/8. Поэтому можно использовать данное
# правило для предотвращения засорения логов, в случае, если с внешней стороны
# имеется какая либо сеть Microsoft Network. Подобную же проблему решают два последних
# правила в цепочке udp_packets.
#
$IPTABLES -A INPUT -i $INET_IFACE -d 224.0.0.0/8 -j DROP
#
# Весь отбрасываемый траффик журналируется.
#
$IPTABLES -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG \
--log-level DEBUG --log-prefix "IPT INPUT packet died: "
# Все пропускаем.
$IPTABLES -A INPUT -p ALL -i $LAN_IFACE -j ACCEPT
#
# Из петли
#
# Все пропускаем.
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -j ACCEPT
####################################################################
# 4.1.5 Цепочка FORWARD. #
####################################################################
# Фильтруем "плохие пакеты".
$IPTABLES -A FORWARD -p tcp -j bad_tcp_packets
# Пропускаем ответные пакеты в локальную сеть.
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j trafficcount
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
#тут значит весь траф из локалки разрешен в интернет. пока что )
#$IPTABLES -A FORWARD -i $LAN_IFACE -j ACCEPT
$IPTABLES -A FORWARD -i $USER_IP_1 -p tcp -m multiport --destination-port 80,443,2044,5190 -j ACCEPT
$IPTABLES -A FORWARD -i $USER_IP_2 -p tcp -m multiport --destination-port 80,443,5190 -j ACCEPT
$IPTABLES -A FORWARD -i $USER_IP_3 -p tcp -m multiport --destination-port 80,5190 -j ACCEPT
$IPTABLES -A FORWARD -i $LAN_IFACE -j DROP
#
# Весь отбрасываемый траффик журналируется.
#
$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. #
###################################################################
#
# Фильтруем "плохие пакеты".
#
$IPTABLES -A OUTPUT -p tcp -j bad_tcp_packets
#
# Правила OUTPUT, определяющие, какие IP будут допущены.
#
$IPTABLES -A OUTPUT -p ALL -s $LO_IP -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 -m limit --limit 3/minute --limit-burst 3 -j LOG \
--log-level DEBUG --log-prefix "IPT OUTPUT packet died: "
######
# 4.2 Таблица nat.
#
#
# 4.2.1 Задаем политики по умолчанию.
#
#
# 4.2.2 Создаем пользовательские цепочки.
#
#
# 4.2.3 Содежимое пользовательских цепочек.
#
#
# 4.2.4 Цепочка PREROUTING.
#
#
# 4.2.5 Цепочка POSTROUTING.
#
#
# Включаем простой IP форвардинг и преобразование сетевых адресов.
#
$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -j SNAT --to-source $INET_IP
################################################################
# Защита от Syn flood атаки
echo "1" > /proc/sys/net/ipv4/tcp_syncookies
#
# 5. Включение перенаправления пакетов
# Лучше делать это в конце, ибо к моменту включения форвардинга все
# правила уже заданы.
echo "1" > /proc/sys/net/ipv4/ip_forward
exit 0