Доброе время суток. Владею небольшой vps-ой(nginx+apache2+mysql) и CMS системой на ней. Сейчас активно работаю над безопасностью ее (iptables+ipset+fail2ban) пока. Веб-сервера только только начинаю изучать. Вот выкладываю свой скрипт iptables. Прошу всех желающих дополнить, покритиковать, дать совет. Возможно куда мне стоит ещё залезть по поводу "защита веб".
Bash:
#!/bin/sh
# Защита от спуфинга (подмена адреса отправителя)
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter
export IPT="iptables"
ipset -N blacklist hash:ip
#Очистка всех цепочек iptables
$IPT -F
$IPT -F -t nat
$IPT -F -t mangle
$IPT -X
$IPT -t nat -X
$IPT -t mangle -X
# Разрешаем исходящий трафик и запрещаем весь входящий и транзитный:
$IPT -P INPUT DROP
$IPT -P OUTPUT ACCEPT
$IPT -P FORWARD DROP
#Состояние ESTABLISHED говорит, о том что это не первый пакет в соединении
#Пропускать все уже инициированные соединения, а так же дочерние от них
$IPT -A INPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT
#Пропускать новые, а так же уже инициированные и их дочерние
$IPT -A OUTPUT -p all -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
#Отбрасываем все пакеты, которые не могут быть идентивицированы
#и поэтому не могут иметь определенного статуса.
$IPT -A INPUT -m state --state INVALID -j DROP
#Cтавим ограничение одновременных число коннектов к веб-серверу с одного ip (в тестовом режиме!!!)
$IPT -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 3 --connlimit-mask 24 -j DROP
#********************************************************************
$IPT -I INPUT -m set --match-set blacklist src -j DROP
#********************************************************************
# SYN
$IPT -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
$IPT -A OUTPUT -p tcp ! --syn -m state --state NEW -j DROP
# Разрешаем ssh и веб сервисы:
$IPT -A INPUT -p tcp --dport 2222 -i enp0s3 -j ACCEPT
$IPT -A INPUT -p tcp -m multiport --dport 80,443 -i enp0s3 -j ACCEPT
$IPT -A INPUT -p tcp -m multiport --dport 21,12000:12100 -i enp0s3 -j ACCEPT
#$IPT -A INPUT -p tcp --dport 53 -i enp0s3 -j ACCEPT
#$IPT -A INPUT -p udp --dport 53 -i enp0s3 -j ACCEPT
# local loopback:
$IPT -A INPUT -i lo -j ACCEPT
# Разрешаем ping:
$IPT -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
$IPT -A INPUT -p icmp --icmp-type source-quench -j ACCEPT
$IPT -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
$IPT -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
#********************************************************************
# Запрет FIN-сканирования
$IPT -A INPUT -p tcp -m tcp --tcp-flags FIN,ACK FIN -j DROP
# Запрет X-сканирования
$IPT -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP
# Запрет N-сканирования
$IPT -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
# Запрещаем сканирование NMAP-ом
$IPT -I INPUT -p tcp -m osf --genre NMAP -j DROP
# Защита от сканирования. +возможно от ddos(не проверял)
$IPT -N syn-flood
$IPT -A INPUT -p tcp --syn -j syn-flood
$IPT -A syn-flood -m limit --limit 30/second --limit-burst 70 -j RETURN
$IPT -A syn-flood -m set --match-set blacklist src -j LOG --log-prefix "DROP blacklist entry"
$IPT -A syn-flood -j SET --add-set blacklist src
#********************************************************************
# Блокируем все остальное
$IPT -A INPUT -j DROP
#Вывод информации о состоянии таблиц
route -n
$IPT -L
$IPT -L -v -n
$IPT -L -v -n -t nat
# Перезапуск fai2ban
service fail2ban restart