#!/bin/sh
####
# 1. Настройка
## 1.1 Интернет
### 1.1.1 DHCP
### 1.1.2. PPPoE
## 1.2 LAN
LAN_IP_RANGE="172.20.16.0/23"
LAN_IFACE="eth0"
LAN_BROADCAST="172.20.255.255"
## 1.3 DMZ
## 1.4 Localhost
LO_IFACE="lo"
LO_IP="127.0.0.1"
## 1.5 IPTables
IPTABLES="/sbin/iptables"
## 1.6 Прочее
################
# 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 Необязательные модули
#################
# 3. Настройки /proc
## 3.1 Обязательная конфигурация proc
#echo "1" > /proc/sys/net/ipv4/ip_forward
## 3.2 Non-required proc cfg
#################
# 4. Rules set up
## 4.1 Таблица Filter
### 4.1.1 Установка политик по умолчанию
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP
###
### 4.1.2 Создание пользовательских цепочек
###
### Не корректные TCP-пакеты
$IPTABLES -N bad_tcp_packets
### Раздельные цепочки для TCP-, UDP- и ICMP- пакетов
$IPTABLES -N tcp_packets
$IPTABLES -N udp_packets
$IPTABLES -N icmp_packets
### Цепочка для разрешенных TCP-пакетов
$IPTABLES -N allowed
###
### 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 "IPT. New not SYN: "
$IPTABLES -A bad_tcp_packets -p TCP ! --syn -m state --state NEW -j DROP
### Фильтрация разрешенных TCP-пакетов (цепочка allowed)
$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_packets)
#### Разрешаю SSH с компьютеров инженеров
$IPTABLES -A tcp_packets -p TCP -s 172.20.16.2 --dport 22 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 172.20.16.3 --dport 22 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 172.20.17.1 --dport 22 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 172.20.17.2 --dport 22 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 172.20.17.3 --dport 22 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 172.20.17.4 --dport 22 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 172.20.17.5 --dport 22 -j allowed
#### Разрешаю FTP (порты 20 и 21)
$IPTABLES -A tcp_packets -p TCP -s $LAN_IP_RANGE --dport 20:21 -j allowed
### Разрешаю HTTP- и HTTPS- пакеты (порты 80 и 443, соответственно)
$IPTABLES -A tcp_packets -p TCP -s $LAN_IP_RANGE --dport 80 -j allowed
$IPTABLES -A tcp_packets -p TCP -s $LAN_IP_RANGE --dport 443 -j allowed
#### Блокирую SMB-пакеты
$IPTABLES -A tcp_packets -p TCP -s $LAN_IP_RANGE --dport 137:139 -j DROP
$IPTABLES -A tcp_packets -p TCP -s $LAN_IP_RANGE --dport 445 -j DROP
### Правила для UDP-пакетов (цепочка udp_packets)
#### Блокирую шароковещательные пакеты, характерные для сетей Microsoft
$IPTABLES -A udp_packets -p UDP -i $LAN_IFACE --dport 135:139 -j DROP
$IPTABLES -A udp_packets -p UDP -i $LAN_IFACE -d $LAN_BROADCAST -j DROP
#### Блокирую прием DHCP-запросов
$IPTABLES -A udp_packets -p UDP -i $LAN_IFACE -d 255.255.255.255 --dport 67:68 -j DROP
#### Блокирую широковещательные пакеты Kaspersky Administracion Kit (порты 13000 и 15000)
$IPTABLES -A udp_packets -p UDP -i $LAN_IFACE --dport 13000 -j DROP
$IPTABLES -A udp_packets -p UDP -i $LAN_IFACE --dport 15000 -j DROP
#### Правила ICMP-пакетов (цепочка icmp_packets)
$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
###
### 4.1.4 Цепочка INPUT
###
### Фильтрация некорректных TCP-пакетов
$IPTABLES -A INPUT -p TCP -j bad_tcp_packets
### Правила для петлевого интерфейса
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LO_IP -j ACCEPT
### Распределение входящих пакетов по цепочкам на основе протокола
$IPTABLES -A INPUT -p ALL -i $LAN_IFACE -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
### Отбрасываем multicast-пакеты
$IPTABLES -A INPUT -i $LAN_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: "
###
### 4.1.5 Цепочка FORWARD
###
### Фильтрация некорректных TCP-пакетов
$IPTABLES -A FORWARD -p TCP -j bad_tcp_packets
### Принимаемые к маршрутизации пакеты
### Записываем в лог все остальные пакеты, для которых нет правил
$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
### Пакеты, которым разрешено покидать сервер
$IPTABLES -A OUTPUT -p ALL -o $LAN_IFACE -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -o $LO_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: "