| L0rd_Ha0S |
13.02.2007 19:07 |
Rules for Iptables
Давно собирался настроить на своем десктопе фаервол (iptables), наконец дошли руки и до него :) Настроил, но теперь вот интересуют любые интересные правила, к примеру правила для защиты от разного вида атак и т.п. Интересно было бы посмотреть на правила/скрипты, которыми пользуетесь Вы. Возможно там найдутся какие-нибудь полезные строки :). Кому не жалко, выкладывайте сюда. Начну с себя, вот мой стартовый скрипт инициализации фаервола, который я написал для удобства запуска/остановки фаервола(вообще,у меня он запускается во время загрузки системы INIT'ом, но иногда бывает нужно временно отключить его), все правила написаны исключительно по моим потребностям, немного переделав правила "под себя" (если, конечно, они вас не устраивают) можете использовать его для своих целей.
Вот сам скрипт:
Код:
#!/bin/bash
# iptables-control
# Author: L0rd_Ha0S
# Скрипт для запуска/остановки iptables
# Правила построены по принципу "что не разрешено-то запрещено"
# Charset for comments: UTF-8
# Date: Feb 12, 2007
#
# Parameters
IPTABLES="/sbin/iptables"
INET_IFACE="ppp+"
DNS1="`cat /etc/ppp/pppoe.conf|grep DNS1|grep -v "#"|sed 's/DNS1=//g'`"
DNS2="`cat /etc/ppp/pppoe.conf|grep DNS2|grep -v "#"|sed 's/DNS2=//g'`"
LAN_IFACE="eth0"
LAN_IP="192.168.1.52"
LAN_ADDR="192.168.1.0/24"
LO_IFACE="lo"
# Functions: stop_firewall, start_firewall
stop_firewall()
{
echo -ne " \033[01;36m*\033[00m Stopping firewall"
# Перенаправляем stdout и stderr в /dev/null
exec 3>&1 4>&2 1>/dev/null 2>/dev/null
# Сбрасываем все правила
$IPTABLES -F
# Удаляем все пользовательские цепочки
$IPTABLES -X
# Устанавливаем политику по умолчанию ACCEPT
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT
# Восстанавливаем stdout и stderr
exec 1>&3 2>&4
echo -e "\t\t\t\t\t\t\t\t\t\t\t\t\t \033[01;32m[ ok ]\033[00m"
}
start_firewall()
{
echo -e " \033[01;36m*\033[00m Starting firewall"
# Перенаправляем stdout и stderr в /dev/null
exec 3>&1 4>&2 1>/dev/null 2>/dev/null
## Загрузка модулей
/sbin/depmod -a
/sbin/modprobe ip_tables
/sbin/modprobe ip_conntrack
/sbin/modprobe iptable_filter
/sbin/modprobe iptable_mangle
/sbin/modprobe ipt_LOG
/sbin/modprobe ip_conntrack_ftp
## Определяем правила фаервола
# Устанавливаем политики по умолчанию
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP
# Сбрасываем старые правила, чтобы они не смешивались с новыми
$IPTABLES -F
# Удаляем все пользовательские цепочки
$IPTABLES -X
## Общие правила
# Разрешаем руту доступ в сеть
$IPTABLES -A OUTPUT -m owner --uid-owner root -j ACCEPT
# Запрещаем nobody доступ в сеть
$IPTABLES -A OUTPUT -m owner --uid-owner nobody -j DROP
# icmp
$IPTABLES -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
$IPTABLES -A INPUT -p icmp --icmp-type 13 -j DROP # Deny Timestamp request
$IPTABLES -A INPUT -p icmp --icmp-type 15 -j DROP # Deny Information request
$IPTABLES -A INPUT -p icmp --icmp-type 17 -j DROP # Deny Address mask request
$IPTABLES -A INPUT -p icmp -j ACCEPT
$IPTABLES -A OUTPUT -p icmp -j ACCEPT
## loopback
# Разрешаем весь обмен данными через loopback
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -o $LO_IFACE -j ACCEPT
## Локальная сеть
# Тут разрешаем необходимые порты
# Заносим в лог все попытки соединения с 21,22,23,80 портами из сети $LAN_ADDR
$IPTABLES -A INPUT -i $LAN_IFACE -p tcp --dport 21 -s $LAN_ADDR -m state --state NEW -j ULOG --ulog-prefix "FTP REQUESTS FROM LAN:"
$IPTABLES -A INPUT -i $LAN_IFACE -p tcp --dport 22 -s $LAN_ADDR -m state --state NEW -j ULOG --ulog-prefix "SSH REQUESTS FROM LAN:"
$IPTABLES -A INPUT -i $LAN_IFACE -p tcp --dport 23 -s $LAN_ADDR -m state --state NEW -j ULOG --ulog-prefix "TELNET REQUESTS FROM LAN:"
$IPTABLES -A INPUT -i $LAN_IFACE -p tcp --dport 80 -s $LAN_ADDR -m state --state NEW -j ULOG --ulog-prefix "WEB REQUESTS FROM LAN:"
# Заносим в лог и уничтожаем все пакеты, которые имеют статус NEW, но SYN-флаг в которых не установлен
$IPTABLES -A INPUT -i $LAN_IFACE -p tcp ! --syn -m state --state NEW -j ULOG --ulog-prefix "NEW NOT SYN FROM LAN:"
$IPTABLES -A INPUT -i $LAN_IFACE -p tcp ! --syn -m state --state NEW -j DROP
# Уничтожаем все пакеты, имеющие статус INVALID
$IPTABLES -A INPUT -i $LAN_IFACE -p tcp -m state --state INVALID -j DROP
$IPTABLES -A OUTPUT -o $LAN_IFACE -p tcp -m state --state INVALID -j DROP
# Запрещаем все попытки установления соединения
$IPTABLES -A INPUT -i $LAN_IFACE -p tcp --syn -j REJECT
# Что-то вроде политики по умолчанию для $LAN_IFACE
$IPTABLES -A INPUT -i $LAN_IFACE -s $LAN_ADDR -d $LAN_IP -p ! icmp -j ACCEPT
$IPTABLES -A OUTPUT -o $LAN_IFACE -s $LAN_IP -d $LAN_ADDR -p ! icmp -j ACCEPT
## Интернет
# Тут разрешаем необходимые порты
# Заносим в лог все попытки соединения с 21,22,23,80 и непривилегированными портами
$IPTABLES -A INPUT -i $INET_IFACE -p tcp --dport 21 -m state --state NEW -j ULOG --ulog-prefix "FTP REQUESTS FROM INET:"
$IPTABLES -A INPUT -i $INET_IFACE -p tcp --dport 22 -m state --state NEW -j ULOG --ulog-prefix "SSH REQUESTS FROM INET:"
$IPTABLES -A INPUT -i $INET_IFACE -p tcp --dport 23 -m state --state NEW -j ULOG --ulog-prefix "TELNET REQUESTS FROM INET:"
$IPTABLES -A INPUT -i $INET_IFACE -p tcp --dport 80 -m state --state NEW -j ULOG --ulog-prefix "WEB REQUESTS FROM INET:"
$IPTABLES -A INPUT -i $INET_IFACE -p tcp --dport 1024:65535 -m state --state NEW -j ULOG --ulog-prefix "ATTEMPT TO CONNECT TO UNPORT:"
# Заносим в лог и уничтожаем все пакеты, которые имеют статус NEW, но SYN-флаг в которых не установлен
$IPTABLES -A INPUT -i $INET_IFACE -p tcp ! --syn -m state --state NEW -j ULOG --ulog-prefix "NEW NOT SYN FROM INET:"
$IPTABLES -A INPUT -i $INET_IFACE -p tcp ! --syn -m state --state NEW -j DROP
# Уничтожаем все пакеты, имеющие статус INVALID
$IPTABLES -A INPUT -i $INET_IFACE -p tcp -m state --state INVALID -j DROP
$IPTABLES -A OUTPUT -o $INET_IFACE -p tcp -m state --state INVALID -j DROP
# Запрещаем все попытки установления соединения
$IPTABLES -A INPUT -i $INET_IFACE -p tcp --syn -j DROP
# Разрешаем пакеты из установленных соединений
$IPTABLES -A INPUT -i $INET_IFACE -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
# принимаем DNS-ответы
$IPTABLES -A INPUT -i $INET_IFACE -p udp --sport 53 -s $DNS1 -j ACCEPT
$IPTABLES -A INPUT -i $INET_IFACE -p udp --sport 53 -s $DNS2 -j ACCEPT
# Заносим в лог и разрешаем исходящие соединения только на эти порты
$IPTABLES -A OUTPUT -o $INET_IFACE -p tcp -m multiport --dports 20,21,23,25,110,465,989,990,994,995 -m state --state NEW -j ULOG --ulog-prefix "OUTGOING REQUESTS"
$IPTABLES -A OUTPUT -o $INET_IFACE -p tcp -m multiport --dports 1080,8080,1194,1433,1434,1723,3306,9999 -m state --state NEW -j ULOG --ulog-prefix "OUTGOING REQUESTS"
$IPTABLES -A OUTPUT -o $INET_IFACE -p tcp -m multiport --dports 20,21,22,23,25,80,110,443,465,989,990,994,995 -j ACCEPT
$IPTABLES -A OUTPUT -o $INET_IFACE -p tcp -m multiport --dports 1080,8080,1194,1433,1434,1723,3306,5190,9999 -j ACCEPT
# Разрешаем DNS-запросы
$IPTABLES -A OUTPUT -o $INET_IFACE -p udp --dport 53 -d $DNS1 -j ACCEPT
$IPTABLES -A OUTPUT -o $INET_IFACE -p udp --dport 53 -d $DNS2 -j ACCEPT
# Устанавливаем ловушки. Работает только при устновленном Patch-o-matic
#$IPTABLES -A INPUT -p tcp -j TARPIT
# Восстанавливаем stdout и stderr
exec 1>&3 2>&4
echo -e "\t\t\t\t\t\t\t\t\t\t\t\t\t \033[01;32m[ ok ]\033[00m"
}
if [ $UID = 0 ]; then
case "$1" in
start)
start_firewall
exit 0
;;
restart|reload|force-reload)
stop_firewall
start_firewall
exit 3
;;
stop)
stop_firewall
exit 0
;;
*)
progname=`echo $0|sed 's/\/usr//g'|sed 's/\/local//g'|sed 's/\/sbin//g'|sed 's/\/bin//g'|sed 's/\///g'|sed 's/\.//g'`
echo -e " Usage: $progname \033[01;32m{\033[00mstart\033[01;32m|\033[00mrestart\033[01;32m|\033[00mstop\033[01;32m}\033[00m"
exit 1
;;
esac;
else
echo -e " \033[31mYou must be root!\033[00m";
fi
exit 0
|