#!/bin/bash
################################################################################
##########
#1.Конфигурация: интернет, локальная сеть, lo, модули не проверяем каждый раз..
INET_IFACE="ppp0"
LAN1_IP="192.168.10.1"
LAN1_IP_RANGE="192.168.10.0/24"
LAN2_IP="192.168.20.1"
LAN2_IP_RANGE="192.168.20.0/24"
LAN_IFACE="eth1"
LO_IFACE="lo"
LO_IP="127.0.0.1"
IPTABLES="iptables"################################################################################
##########
#2.Очистка цепочек и удаление созданных цепочек.
$IPTABLES -t filter -F
$IPTABLES -t mangle -F
$IPTABLES -t nat -F
$IPTABLES -t filter -X
################################################################################
##########
#3.Установка правил
#3.1.Устанвока политик по-умолчанию
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP
#3.2.Создание собственных цепочек _таблицы_filter_
$IPTABLES -N bad_tcp_packets
$IPTABLES -N allowed
$IPTABLES -N tcp_packets
$IPTABLES -N udp_packets
$IPTABLES -N icmp_packets
#3.3.Наполнение собственных цепочек _таблицы_filter_ правилами
#цепочка bad_tcp_packets (syn/ask пакеты со сброшенным битом syn, со статусом new, но сброшенным битом syn)
$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, udp, icmp пакетов
$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_packets (разрешаем доступ извне по SSH, маскируя порт от сканирования)
#$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 22 -j allowed
$IPTABLES -A tcp_packets -p tcp -s 0/0 --dport 22 -m recent --name ssh --update --seconds 3600 --hitcount 8 -j REJECT
$IPTABLES -A tcp_packets -p tcp -s 0/0 --dport 22 -m recent --name ssh --set
$IPTABLES -A tcp_packets -p tcp -s 0/0 --dport 22 -m recent --name ssh ! --rcheck --seconds 15 --hitcount 2 -j REJECT
$IPTABLES -A tcp_packets -p tcp -s 0/0 --dport 22 -j allowed
#>цепочка udp_packets (разрешаем прохождение ответов от внешнего DNS-сервера, ICQ, udp-наводнение пресекается политикой DROP)
$IPTABLES -A udp_packets -p UDP -s 0/0 --source-port 53 -j ACCEPT
$IPTABLES -A udp_packets -p UDP -s 0/0 --source-port 5190 -j ACCEPT
#цепочка icmp_packets (пинг, ответ об умершем пакете, остальные д. принадлежать либо к ESTABLISHED либо к RELATED соединениям)
$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
#>>дополнительная защита от фрагментированных пакетов (вероятное ping-наводнение)
$IPTABLES -A icmp_packets --fragment -p ICMP -j LOG --log-prefix "fragment icmp packets DROP: "
$IPTABLES -A icmp_packets --fragment -p ICMP -j DROP
#3.4.цепочка PREROUTING
#3.4.1.таблица mangle
$IPTABLES -t mangle -A PREROUTING -m tos --tos Minimize-Delay -j MARK --set-mark 0x6
$IPTABLES -t mangle -A PREROUTING -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j MARK --set-mark 0x6
$IPTABLES -t mangle -A PREROUTING -m tos --tos Maximize-Throughput -j MARK --set-mark 0x6
$IPTABLES -t mangle -A PREROUTING -i $INET_IFACE -j TTL --ttl-inc 1
#пришедшие для SSH, , маркируем эти пакеты (для дальнейшей приоретизации скорости в iproute2)
#$IPTABLES -t mangle -A PREROUTING -p tcp -s 0/0 --dport 22 -j MARK --set-mark 11
#3.4.2.таблица nat
#перенаправление порта для организации прозрачного проксирования в squid (+ открыть в INPUT порт 3128 для LAN)
$IPTABLES -t nat -A PREROUTING -i $INET_IFACE -p tcp --dport 80 -j REDIRECT --to-ports 3128
#3.5.цепочка INPUT
#3.5.1.таблица mangle
#3.5.2.таблица filter
#проверка пакетов, идущих на маршрутизатор (валидность, из локальной сети, от самого себя)
$IPTABLES -A INPUT -p tcp -j bad_tcp_packets
$IPTABLES -A INPUT -p ALL -i $LAN_IFACE -s $LAN1_IP_RANGE -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LAN_IFACE -s $LAN2_IP_RANGE -j ACCEPT
#squid
#iptables -A INPUT -p TCP -s $LAN1_IP_RANGE --dport 3128 -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -j ACCEPT
#остальные либо связанные с ESTABLISHED,RELATED соединениями, либо направляются в соответствующие цепочки
$IPTABLES -A INPUT -p ALL -i $INET_IFACE -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
#логирование не пропущенных пакетов
$IPTABLES -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "IPT INPUT packet died: "
#3.6.цепочка FORWARD
#3.6.1.таблица mangle
#3.6.2.таблица filter
#проверка транзитных пакетов (валидность, идут ли из локальной сети, принадлежат ли ESTABLISHED,RELATED соединениям)
$IPTABLES -A FORWARD -p tcp -j bad_tcp_packets
$IPTABLES -A FORWARD -s $LAN1_IP_RANGE -d $LAN2_IP_RANGE -j DROP
$IPTABLES -A FORWARD -s $LAN2_IP_RANGE -d $LAN1_IP_RANGE -j DROP
$IPTABLES -A FORWARD -i $LAN_IFACE -j ACCEPT
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
#логирование не пропущенных пакетов
$IPTABLES -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "IPT FORWARD packet died: "
#3.7.цепочка OUTPUT
#3.7.1.таблица mangle
#маркировка пакетов для iproute2
$IPTABLES -t mangle -A OUTPUT -m tos --tos Minimize-Delay -j MARK --set-mark 0x3
$IPTABLES -t mangle -A OUTPUT -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j MARK --set-mark 0x4
$IPTABLES -t mangle -A OUTPUT -m tos --tos Maximize-Throughput -j MARK --set-mark 0x4
$IPTABLES -t mangle -A OUTPUT -p ALL -j MARK --set-mark 0x5
#3.7.2.таблица nat
#3.7.2.таблица filter
#проверка исходящих от роутера пакетов (валидность, идут с нашего $INET_IFACE, на $LAN1_IP или $LO_IP)
$IPTABLES -A OUTPUT -p tcp -j bad_tcp_packets
$IPTABLES -A OUTPUT -p ALL -s $LO_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $LAN1_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $LAN2_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -o $INET_IFACE -j ACCEPT
#логирование не прошедших
$IPTABLES -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "IPT OUTPUT packet died: "
#3.8.цепочка POSTROUTING
#3.8.1.таблица mangle
$IPTABLES -t mangle -A POSTROUTING -p udp --dport 53 -j MARK --set-mark 0x1
$IPTABLES -t mangle -A POSTROUTING -p tcp -m tcp --sport 22 -j MARK --set-mark 0x1
$IPTABLES -t mangle -A POSTROUTING -p icmp -j MARK --set-mark 0x2
$IPTABLES -t mangle -A POSTROUTING -m tos --tos Minimize-Cost -j MARK --set-mark 0x8
#<<изменение TTL на стандартное, чтобы замаскировать подсеть по ttl
$IPTABLES -t mangle -A POSTROUTING -o $INET_IFACE -j TTL --ttl-set 64
#$IPTABLES -t mangle -A POSTROUTING -p tcp --sport 80 --dport 80 -j MARK --set-mark 0x2
#3.8.2.таблица nat
#маскарадинг, DNAT на входе (PREROUTING) будет произведено автоматически
$IPTABLES -t nat -A POSTROUTING -s $LAN1_IP_RANGE -o $INET_IFACE -j MASQUERADE
$IPTABLES -t nat -A POSTROUTING -s $LAN2_IP_RANGE -o $INET_IFACE -j MASQUERADE
################################################################################
##########
#4.Настройка /proc
#4.1.Включаем возможность форвардинга
echo "1" > /proc/sys/net/ipv4/ip_forward
#4.2.Для защиты от syn флуда
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
#другие опции