цель: защита от syn_flood открыть порты только на кг зону
[spoiler]
Код: Выделить всё
#!/bin/sh
#------------------------------------------------------------------------------
# Переменные
#------------------------------------------------------------------------------
IPT='/sbin/iptables' #iptables
MODPROBE="/sbin/modprobe"
ARP="/usr/sbin/arp"
IP6TABLES=/sbin/ip6tables
TC=/sbin/tc
INDEV=ppp0
#------------------------------------------------------------------------------
# Логи наше все
#------------------------------------------------------------------------------
LOG="LOG --log-level debug --log-tcp-sequence --log-tcp-options"
LOG="$LOG --log-ip-options"
#------------------------------------------------------------------------------
# лимит
#------------------------------------------------------------------------------
RLIMIT="-m limit --limit 3/s --limit-burst 8"
#------------------------------------------------------------------------------
# КГ Сетки
#------------------------------------------------------------------------------
aknet='212.112.96.0/19'
asia='195.38.160.0/19'
bitel='194.176.111.0/24'
bmc='85.26.220.0/22'
city='212.2.224.0/19'
comintech='81.20.16.0/20'
elcat1='212.42.96.0/19'
elcat2='77.95.56.0/21'
elcat3='94.143.192.0/21'
kt1='212.241.0.0/19'
kt2='212.97.0.0/19'
kt3='213.145.128.0/19'
kt4='85.113.0.0/19'
kt5='89.237.192.0/18'
mega1='77.235.0.0/19'
mega2='92.245.96.0/19'
nur1='194.152.36.0/24'
nur2='194.152.37.0/24'
energo1='91.205.48.0/22'
energo2='95.215.244.0/22'
saima='217.29.16.0/20'
totel='85.115.192.0/19'
transfer='81.88.192.0/20'
#------------------------------------------------------------------------------
$MODPROBE ip_conntrack_ftp
$MODPROBE ip_conntrack_irc
# Конфигурация ядра
# Включаем IP forwarding.
#------------------------------------------------------------------------------
echo 1 > /proc/sys/net/ipv4/ip_forward
# Включить защиту IP спуфинга
for i in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > $i; done
# зашита от SYN flood атак
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
# Игнорировать все входящие ICMP echo запросы
echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all
# Игнорировать ICMP echo запросы на broadcast
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
# Регистрировать пакеты с невозможными адресами.
for i in /proc/sys/net/ipv4/conf/*/log_martians; do echo 1 > $i; done
# Не логгировать invalid ответ на broadcast
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
# Не принимать или отправлять ICMP редиректы.
for i in /proc/sys/net/ipv4/conf/*/accept_redirects; do echo 0 > $i; done
for i in /proc/sys/net/ipv4/conf/*/send_redirects; do echo 0 > $i; done
# Не принимать source routed пакеты.
for i in /proc/sys/net/ipv4/conf/*/accept_source_route; do echo 0 > $i; done
# Disable multicast routing
#for i in /proc/sys/net/ipv4/conf/*/mc_forwarding; do echo 0 > $i; done
# отключить proxy_arp.
for i in /proc/sys/net/ipv4/conf/*/proxy_arp; do echo 1 > $i; done
# Включить Секурные Редиректы, то есть только принимаем ICMP редиректы на шлюзы
for i in /proc/sys/net/ipv4/conf/*/secure_redirects; do echo 1 > $i; done
# Отключить bootp_relay
for i in /proc/sys/net/ipv4/conf/*/bootp_relay; do echo 0 > $i; done
# Правила по умолчанию.
#------------------------------------------------------------------------------
# Дропать все
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT DROP
# Включаем nat/mangle/raw Цепочки принимать пакеты
$IPT -t nat -P PREROUTING ACCEPT
$IPT -t nat -P OUTPUT ACCEPT
$IPT -t nat -P POSTROUTING ACCEPT
$IPT -t mangle -P PREROUTING ACCEPT
$IPT -t mangle -P INPUT ACCEPT
$IPT -t mangle -P FORWARD ACCEPT
$IPT -t mangle -P OUTPUT ACCEPT
$IPT -t mangle -P POSTROUTING ACCEPT
# Ебля (зачистка)
#------------------------------------------------------------------------------
# Ебнуть все найух
$IPT -F
$IPT -t nat -F
$IPT -t mangle -F
# Удаляем все
$IPT -X
$IPT -t nat -X
$IPT -t mangle -X
# все обнуляем
$IPT -Z
$IPT -t nat -Z
$IPT -t mangle -Z
# Отключаем IPv6.
#------------------------------------------------------------------------------
# Блочить весь IPv6 Траффик
# если ip6tables Доступна то пытаемся отключить
if test -x $IP6TABLES; then
# По дефолту
# Дропать все
$IP6TABLES -P INPUT DROP 2>/dev/null
$IP6TABLES -P FORWARD DROP 2>/dev/null
$IP6TABLES -P OUTPUT DROP 2>/dev/null
# Таблица mangle может пропустить все
$IP6TABLES -t mangle -P PREROUTING ACCEPT 2>/dev/null
$IP6TABLES -t mangle -P INPUT ACCEPT 2>/dev/null
$IP6TABLES -t mangle -P FORWARD ACCEPT 2>/dev/null
$IP6TABLES -t mangle -P OUTPUT ACCEPT 2>/dev/null
$IP6TABLES -t mangle -P POSTROUTING ACCEPT 2>/dev/null
# Удалить все правила.
$IP6TABLES -F 2>/dev/null
$IP6TABLES -t mangle -F 2>/dev/null
# все цепочки.
$IP6TABLES -X 2>/dev/null
$IP6TABLES -t mangle -X 2>/dev/null
# все обнулить
$IP6TABLES -Z 2>/dev/null
$IP6TABLES -t mangle -Z 2>/dev/null
fi
# А вот тут вот и начинаецца сама ебля с iptables....
#------------------------------------------------------------------------------
# Логгируем и потом принимаем пакеты.
$IPT -N ACCEPTLOG
$IPT -A ACCEPTLOG -j $LOG $RLIMIT --log-prefix "ACCEPT "
$IPT -A ACCEPTLOG -j ACCEPT
# Логгируем и шлем найух.
$IPT -N DROPLOG
$IPT -A DROPLOG -j $LOG $RLIMIT --log-prefix "DROP "
$IPT -A DROPLOG -j DROP
# Логгируем и режектим.
$IPT -N REJECTLOG
$IPT -A REJECTLOG -j $LOG $RLIMIT --log-prefix "REJECT "
$IPT -A REJECTLOG -p tcp -j REJECT --reject-with tcp-reset
$IPT -A REJECTLOG -j REJECT
# Только разрешаем RELATED ICMP типы
$IPT -N RELATED_ICMP
$IPT -A RELATED_ICMP -p icmp --icmp-type any -j ACCEPT
$IPT -A RELATED_ICMP -p icmp --icmp-type time-exceeded -j ACCEPT
$IPT -A RELATED_ICMP -p icmp --icmp-type parameter-problem -j ACCEPT
$IPT -A RELATED_ICMP -j DROPLOG
# против мульти пинга
$IPT -A INPUT -p icmp -m limit --limit 1/s --limit-burst 2 -j ACCEPT
$IPT -A INPUT -p icmp -m limit --limit 1/s --limit-burst 2 -j LOG --log-prefix PING-DROP:
$IPT -A INPUT -p icmp -j DROP
$IPT -A OUTPUT -p icmp -j ACCEPT
# Разрешить только минимально необходимые / рекомендованные части ICMP. Остальное в пезду
# Дропаем все фрагментированные ICMP пакеты ( почти всегда злоебучие)
#$IPT -A INPUT -p icmp --fragment -j DROPLOG
#$IPT -A OUTPUT -p icmp --fragment -j DROPLOG
#$IPT -A FORWARD -p icmp --fragment -j DROPLOG
# Разрешаем ESTABLISHED ICMP траффик.
$IPT -A INPUT -p icmp -m state --state ESTABLISHED -j ACCEPT $RLIMIT
$IPT -A OUTPUT -p icmp -m state --state ESTABLISHED -j ACCEPT $RLIMIT
# Разрешить не весь RELATED ICMP траффик, остальное блочим
$IPT -A INPUT -p icmp -m state --state RELATED -j RELATED_ICMP $RLIMIT
$IPT -A OUTPUT -p icmp -m state --state RELATED -j RELATED_ICMP $RLIMIT
# Разрешить входящие эхо ICMP запросы (пинг), только с ограничением по конекту
$IPT -A INPUT -p icmp --icmp-type echo-request -j ACCEPT $RLIMIT
# ЗА ПИНГЕ ОТВЕЧАЕМ ХУЛЕ!1 %)
$IPT -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT $RLIMIT
# То что не проходит по правилам Шлем в пезду (или найух, кого куда).
$IPT -A INPUT -p icmp -j DROPLOG
$IPT -A OUTPUT -p icmp -j DROPLOG
$IPT -A FORWARD -p icmp -j DROPLOG
#------------------------------------------------------------------------------
# Не ограничиваем lo
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT
# Пропускаем ESTABLISHED и RELATED пакеты (не знаешь чо это то пиздуй кури маны %))
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# отвечаем, кроме invalid
$IPT -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
# ХУЕТА
#------------------------------------------------------------------------------
# Нам ПОХУЙ на Мелкософт, так что шлем его нахуй... No Windows, no Gates :P
$IPT -A INPUT -p tcp -m multiport --dports 135,137,138,139,445,1433,1434 -j DROP
$IPT -A INPUT -p udp -m multiport --dports 135,137,138,139,445,1433,1434 -j DROP
# Дропаем хуйпонятный Входящий траффик (INVALID)
$IPT -A INPUT -m state --state INVALID -j DROP
# Таже фигня с исходящим
$IPT -A OUTPUT -m state --state INVALID -j DROP
# Если мы будем использовать NAT, INVALID пакеты посылаем на...
$IPT -A FORWARD -m state --state INVALID -j DROP
# АА фиг просканишь порты эжжэ ээээ %)
$IPT -A INPUT -m state --state NEW -p tcp --tcp-flags ALL ALL -j DROP
$IPT -A INPUT -m state --state NEW -p tcp --tcp-flags ALL NONE -j DROP
$IPT -A PREROUTING -i $INDEV -t mangle -p tcp --syn \
-j MARK --set-mark 1
# а вот тут вот нам будет похуй на школьнегоф %)
$IPT -N SYN_FLOOD
$IPT -A INPUT -p tcp --syn -j SYN_FLOOD
$IPT -A SYN_FLOOD -m limit --limit 2/s --limit-burst 6 -j RETURN
$IPT -A SYN_FLOOD -j DROP
$IPT -A SYN_FLOOD -j REJECT
# есле мудак какой то накосячил то ебем его вот тут..
# $IPT -A INPUT -s АЙПИ_МУДАКА -j DROPLOG
# разрешаем исходящий трафф
$IPT -A OUTPUT -j ACCEPT
# Входяшие DNS запросы
$IPT -A INPUT -m state --state NEW -p udp --dport 53 -j ACCEPT
$IPT -A INPUT -m state --state NEW -p tcp --dport 53 -j ACCEPT
# а вот тут вот уже правила на то что разрешено %)
$IPT -A INPUT -p tcp -m tcp -s $mega1 --dport 21 -j ACCEPT
$IPT -A INPUT -p tcp -m tcp -s $mega2 --dport 21 -j ACCEPT
$IPT -A INPUT -p tcp -m tcp -s $elcat1 --dport 21 -j ACCEPT
$IPT -A INPUT -p tcp -m tcp -s $elcat2 --dport 21 -j ACCEPT
$IPT -A INPUT -p tcp -m tcp -s $elcat3 --dport 21 -j ACCEPT
$IPT -A INPUT -p tcp -m tcp -s $city --dport 21 -j ACCEPT
$IPT -A INPUT -p tcp -m tcp -s $aknet --dport 21 -j ACCEPT
#ssh но не всем...
$IPT -A INPUT -p tcp -m tcp -s $aknet --dport 22 -j ACCEPT
#$IPT -A INPUT -p tcp -m tcp -s 92.245.108.200 --dport 22 -j ACCEPT
$IPT -A INPUT -p tcp -m tcp -s $mega1 --dport 22 -j ACCEPT
$IPT -A INPUT -p tcp -m tcp -s $mega2 --dport 22 -j ACCEPT
# открываем HTTP трафф на КГ зону
$IPT -A INPUT -p tcp -m tcp -s $mega1 --dport 80 -j ACCEPT
$IPT -A INPUT -p tcp -m tcp -s $mega2 --dport 80 -j ACCEPT
#iptables -t nat -A POSTROUTING -j MASQUERADE
#$IPT -A INPUT -i eth0 -j ACCEPT
#$IPT -A OUTPUT -o eth0 -j ACCEPT
#NAT to vboxnet0
$IPT -t nat -A POSTROUTING -s 192.168.56.3 -o ppp0 -j SNAT --to-source 77.235.12.36
# Ну и то что мы тут забыли то логируем и отправляем далеко %)
#------------------------------------------------------------------------------
$IPT -A INPUT -j REJECTLOG
$IPT -A OUTPUT -j REJECTLOG
$IPT -A FORWARD -j REJECTLOG
# exit 0