#! /bin/sh
#
# rc.fw версии 20050914, Copyright (c) 2005 Дмитрий Кулаков aka morda <morda89@list.ru>, так-же при участии>:
# Журкин Владимир icCE aka Tuliss (icce@mail.ru)
#
# Чтобы запустить iptables введите команду:
# [root]# /etc/init.d/rc.fw start
#
# Для остановки:
# /etc/init.d/rc.fw stop
#
# Для сохранения списка правил в /etc/rules-save
# /etc/init.d/rc.fw save
#
# Для перезапуска iptables, с восстановлением правил из /etc/rules-save
# /etc/init.d/rc.fw restart
#
# Для журналирования некоторых отброшенных пакетов требуется
# наличие утилиты Ulogd. Действие ULOG означает, что пакет, будет занесен в журнал.
# Чтобы включить журналирования пакетов, раскоментируйте все строчки с -j ULOG
#
# Все предложения и замечания отправляйте на <morda89@list.ru>
#
# Переменная, задающая путь к файлу запуска iptables.
IPT=/sbin/iptables
# Ваш сетевой интерфейс.
INET_IFACE="eth0"
# Номера непривилегированных портов
UNPRIPORTS="1024:65535"
# Задайте в этой переменной порты, которые должны быть открыты в системе.
# Для получения информации обо всех службах, которые могут открыть порты в системе введите команду:
# $ cat /etc/services | grep нужная служба
# Некоторые службы:
# FTP клиент 20, 21
# SMPT клиент 25
# Telnet 23
# Whois 43
# Gopher 70
# Finger 79
# HTTP клиент 80
# POP3 клиент 110
# IMAP4 клиент 143
# Wais 210
# HTTPS клиент 443
OPENPORTS="20,21,25,23,43,70,79,80,110,210,443"
# SSH клиент 22
SSH="22"
# Прописываем порты, которые открыты в системе, но которые не должны быть открыты на сетевых интерфейсах:
CLOSEPORTS="630,640,783,3310,10000"
start_fw()
{
# Включить перенаправление пакетов через ядро.
echo 1 > /proc/sys/net/ipv4/ip_forward
# Загружаем некторое модули. Ip_nat_ftp требуется, чтобы преобразование сетевых адресов (Network Adress Translation)
# производилось корректно с протоколами FTP
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ip_conntrack_ftp
# Удаление правил
$IPT -F
$IPT -t nat -F
$IPT -t mangle -F
# Очищаем нестандартные правила
$IPT -X
$IPT -t nat -X
$IPT -t mangle -X
# Политики по умолчанию.
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT DROP
# Разрешаем прохождение любого трафика по интерфейсу обратной петли.
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT
# Отбрасывать все пакеты, которые не могут быть идентифицированы и поэтому не могут иметь определенного статуса.
$IPT -A INPUT -m state --state INVALID -j DROP
$IPT -A FORWARD -m state --state INVALID -j DROP
# Существует одна из разновидностей спуфинг-атак, которая называется "Предсказание номера TCP-последовательности".
# Смысл атак такого рода заключается в использовании чужого IP-адреса для нападения на какой либо узел сети.
$IPT -A INPUT -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset
# Пакеты со статусом NEW и со сброшенным битом SYN.
#$IPT -A INPUT -p tcp ! --syn -m state --state NEW -j ULOG
$IPT -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
# Принимать все пакеты, которые инициированы из уже установленного соединения, и имеющим признак ESTABLISHED.
# Состояние ESTABLISHED говорит о том, что это не первый пакет в соединении.
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
# Предупреждаю вас о туповатых провайдерах, которые назначают IP адреса, отведенные IANA для локальных сетей.
# Например адреса 10.X.X.X. Для этого надо установить правило, пропускающие трафик с этих серверов, ранее цепочки INPUT.
#$IPT -t nat -I PREROUTING -i $INET_IFACE -s 10.0.0.1/32 -j ACCEPT
# Эти правила предохраняют от некоторых типов атак:
# SYN наводнение.
# Приводит к связыванию системных ресурсов, так что реальных обмен данными становится не возможным.
#$IPT -A INPUT -p tcp ! --syn -m state --state NEW -j ULOG
#$IPT -A OUTPUT -p tcp ! --syn -m state --state NEW -j ULOG
$IPT -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
$IPT -A OUTPUT -p tcp ! --syn -m state --state NEW -j DROP
# UDP наводнение
# Службы использующие UDP, очень часто становятся мишенью для атак с целью вывода системы из строя.
#$IPT -A INPUT -p UDP -s 0/0 --destination-port 138 -j ULOG
$IPT -A INPUT -p UDP -s 0/0 --destination-port 138 -j DROP
$IPT -A INPUT -p UDP -s 0/0 --destination-port 113 -j REJECT
$IPT -A INPUT -p UDP -s 0/0 --source-port 67 --destination-port 68 -j ACCEPT
$IPT -A INPUT -p UDP -j RETURN
$IPT -A OUTPUT -p UDP -s 0/0 -j ACCEPT
# ICMP - перенаправление
# ICMP- сообщение указывает системе изменить содержимое таблиц маршрутизации с тем, что бы направлять
# пакеты по более короткому маршруту. Может быть использовано взломщиком для пере-направления вашего трафика через свою машину.
#$IPT -A INPUT --fragment -p ICMP -j ULOG
#$IPT -A OUTPUT --fragment -p ICMP -j ULOG
$IPT -A INPUT --fragment -p ICMP -j DROP
$IPT -A OUTPUT --fragment -p ICMP -j DROP
# Для VPN
#$IPT -A INPUT -p 47 -m state --state ESTABLISHED,RELATED -i $INET_IFACE -j ACCEPT
#$IPT -A OUTPUT -p TCP --dport 1723 -o eth0 -j ACCEPT
#$IPT -A OUTPUT -p 47 -o eth0 -j ACCEPT
# Разрешаем ICMP соединение. Значительная часть ICMP используется для передачи сообщений о
# том, что происходит с тем или иным UDP или TCP соединением.
$IPT -A INPUT -p icmp -m icmp -i $INET_IFACE --icmp-type source-quench -j ACCEPT
$IPT -A OUTPUT -p icmp -m icmp -o $INET_IFACE --icmp-type source-quench -j ACCEPT
# Разрешаем себе ping наружу, полностью запрещаем ping своей машины.
#$IPT -A INPUT -p icmp -m icmp -i $INET_IFACE --icmp-type echo-reply -j ACCEPT
#$IPT -A OUTPUT -p icmp -m icmp -o $INET_IFACE --icmp-type echo-request -j ACCEPT
# Разрешаем себе ping наружу, ставим ограничение на ping своей машины.
$IPT -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 2 -j ACCEPT
$IPT -A INPUT -p icmp --icmp-type echo-request -j DROP
$IPT -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 2 -j ACCEPT
$IPT -A FORWARD -p icmp --icmp-type echo-request -j DROP
$IPT -A INPUT -p icmp -j ACCEPT
$IPT -A FORWARD -p icmp -j ACCEPT
# Разрешаем передачу пакета - некорректный параметр - используется, если в заголовке пакета содержится недопустимая запись,
# или если контрольная сумма заголовка не соответствует контрольной сумме, указанной передающим узлом.
$IPT -A INPUT -p icmp -m icmp -i $INET_IFACE --icmp-type parameter-problem -j ACCEPT
$IPT -A OUTPUT -p icmp -m icmp -o $INET_IFACE --icmp-type parameter-problem -j ACCEPT
# Запрещаем подключение к X серверу через сетевые интерфейсы.
$IPT -A INPUT -p tcp -m tcp -i $INET_IFACE --dport 6000:6063 -j DROP --syn
# Прописываем порты, которые открыты в системе, но которые не должны быть открыты на сетевых интерфейсах:
$IPT -A INPUT -p tcp -m tcp -m multiport -i $INET_IFACE -j DROP --destination-ports $CLOSEPORTS
# DNS сервер имен разрешаем.
$IPT -A OUTPUT -p udp -m udp -o $INET_IFACE --dport 53 --sport $UNPRIPORTS -j ACCEPT
$IPT -A OUTPUT -p tcp -m tcp -o $INET_IFACE --dport 53 --sport $UNPRIPORTS -j ACCEPT
$IPT -A INPUT -p udp -m udp -i $INET_IFACE --dport $UNPRIPORTS --sport 53 -j ACCEPT
$IPT -A INPUT -p tcp -m tcp -i $INET_IFACE --dport 1024:65353 --sport 53 -j ACCEPT
# Разрешаем AUTH-запросы на удаленные сервера, на свой же компьютер - запрещаем.
$IPT -A OUTPUT -p tcp -m tcp -o $INET_IFACE --dport 113 --sport $UNPRIPORTS -j ACCEPT
$IPT -A INPUT -p tcp -m tcp -i $INET_IFACE --dport $UNPRIPORTS --sport 113 -j ACCEPT ! --syn
$IPT -A INPUT -p tcp -m tcp -i $INET_IFACE --dport 113 -j DROP
# Открываем некоторые порты:
# Открытые порты
$IPT -A OUTPUT -p tcp -m tcp -m multiport -o $INET_IFACE --destination-ports $OPENPORTS --sport $UNPRIPORTS -j ACCEPT
$IPT -A INPUT -p tcp -m tcp -m multiport -i $INET_IFACE --dport $UNPRIPORTS --source-ports $OPENPORTS -j ACCEPT ! --syn
# SSH клиент
$IPT -A OUTPUT -p tcp -m tcp -m multiport -o $INET_IFACE --destination-ports $SSH --sport $UNPRIPORTS -j ACCEPT
$IPT -A INPUT -p tcp -m tcp -m multiport -i $INET_IFACE --dport $UNPRIPORTS --source-ports $SSH -j ACCEPT ! --syn
$IPT -A OUTPUT -p tcp -m tcp -m multiport -o $INET_IFACE --destination-ports $SSH --sport 1020:1023 -j ACCEPT
$IPT -A INPUT -p tcp -m tcp -m multiport -i $INET_IFACE --dport 1020:1023 --source-ports $SSH -j ACCEPT ! --syn
# Samba
#$IPT -A INPUT -p tcp -m tcp -i $INET_IFACE --dport $UNPRIPORTS --sport 137,138,139 -j ACCEPT
#$IPT -A INPUT -p udp -m udp -i $INET_IFACE --dport $UNPRIPORTS --sport 137,138,139 -j ACCEPT
#$IPT -A OUTPUT -p tcp -m tcp -o $INET_IFACE --dport $UNPRIPORTS --sport 137,138,139 -j ACCEPT
#$IPT -A OUTPUT -p udp -m udp -o $INET_IFACE --dport $UNPRIPORTS --sport 137,138,139 -j ACCEPT
$IPT -A OUTPUT -p udp -m udp -m multiport -o $INET_IFACE --destination-ports 139,4444,5554,5555 --sport $UNPRIPORTS -j ACCEPT
$IPT -A INPUT -p udp -m udp -m multiport -i $INET_IFACE --dport $UNPRIPORTS --source-ports 139,4444,5554,5555 -j ACCEPT
$IPT -A OUTPUT -p udp -m udp -o $INET_IFACE --dport 33434:33523 --sport 32769:65535 -j ACCEPT
# Разрешаем прохождение DHCP запросов через iptables. Нужно, если IP адрес динамический.
$IPT -A OUTPUT -p udp -m udp -o $INET_IFACE --dport 67 --sport 68 -j ACCEPT
$IPT -A INPUT -p udp -m udp -i $INET_IFACE --dport 68 --sport 67 -j ACCEPT
# Ставим ловушки.
#iptables -A INPUT -p tcp -m tcp -j TARPIT
}
case "$1" in
start) echo -n "Starting firewall: iptables"
start_fw
echo "."
;;
stop) echo -n "Stopping firewall: iptables"
# Удаление правил.
$IPT -F
$IPT -t nat -F
$IPT -t mangle -F
# Очищаем нестандартные правила.
$IPT -X
$IPT -t nat -X
$IPT -t mangle -X
# Разрешаем весь трафик.
$IPT -P INPUT ACCEPT
$IPT -P FORWARD ACCEPT
$IPT -P OUTPUT ACCEPT
echo "."
;;
save) echo -n "Saving firewall: iptables"
/sbin/iptables-save -c > /etc/iptables
echo "."
;;
restart) echo -n "Restarting firewall: iptables"
# Удаление правил.
$IPT -F
$IPT -t nat -F
$IPT -t mangle -F
# Очищаем нестандартные правила.
$IPT -X
$IPT -t nat -X
$IPT -t mangle -X
/sbin/iptables-restore -c /etc/iptables
echo "."
;;
*) echo "Usage: /etc/init.d/rc.fw start|stop|save"
exit 1
;;
esac
exit 0