Правила iplables для сервера OpenVZ
#!/bin/bash ####################################################################################################### ### Переменные окружения ####################################################################################################### IPT="/sbin/iptables" WAN1_IF="eth0" # внешний интерфейс WAN1_IP="91.189.82.156" # внешний IP адрес VPS_LAN="192.168.0.0/24" # внутренняя сеть VPS LO_IF="lo" # loopback-интерфейс LO_IP="127.0.0.1" # loopback-адрес LOOPBACK="127.0.0.0/8" # loopback-петля POLICY="ACCEPT" # политика по умолчанию (ACCEPT/DROP) ####################################################################################################### ### Сброс правил ####################################################################################################### $IPT -F $IPT -X $IPT -t nat -F $IPT -t mangle -F $IPT -P INPUT $POLICY $IPT -P FORWARD $POLICY $IPT -P OUTPUT $POLICY modprobe ip_conntrack ip_conntrack_enable_ve0=1 modprobe ip_conntrack_ftp ####################################################################################################### ### Переброс портов в VPS ####################################################################################################### ## VPS ns1 (DNS) $IPT -t nat -A PREROUTING -p tcp -d $WAN1_IP --dport 53 -i $WAN1_IF -j DNAT --to-destination 192.168.0.11:53 $IPT -t nat -A PREROUTING -p udp -d $WAN1_IP --dport 53 -i $WAN1_IF -j DNAT --to-destination 192.168.0.11:53 $IPT -t nat -A PREROUTING -p tcp -d 91.189.83.156 --dport 53 -i $WAN1_IF -j DNAT --to-destination 192.168.0.11:53 $IPT -t nat -A PREROUTING -p udp -d 91.189.83.156 --dport 53 -i $WAN1_IF -j DNAT --to-destination 192.168.0.11:53 ## VPS proxy (nginx) $IPT -t nat -A PREROUTING -p tcp -d $WAN1_IP --dport 80 -i $WAN1_IF -j DNAT --to-destination 192.168.0.10:80 ## VPS site (ftp, ssh, mail, smtp, pop3, imap) $IPT -t nat -A PREROUTING -p tcp -d $WAN1_IP --dport 12021 -i $WAN1_IF -j DNAT --to-destination 192.168.0.20:21 $IPT -t nat -A PREROUTING -p tcp -d $WAN1_IP --dport 12022 -i $WAN1_IF -j DNAT --to-destination 192.168.0.20:22 $IPT -t nat -A PREROUTING -p tcp -d $WAN1_IP --dport 25 -i $WAN1_IF -j DNAT --to-destination 192.168.0.20:25 $IPT -t nat -A PREROUTING -p tcp -d $WAN1_IP --dport 143 -i $WAN1_IF -j DNAT --to-destination 192.168.0.20:143 ####################################################################################################### ### Правила фильтрации ####################################################################################################### ## защита ssh через sshguard $IPT -N sshguard # Максимум 2 новых запроса в минуту для одного ip $IPT -A sshguard -m state --state NEW -m recent --name SSH --update --seconds 60 --hitcount 2 -j DROP $IPT -A sshguard -m state --state NEW -m recent --name SSH --set -j ACCEPT ## Общий список заблокированных IP $IPT -N blacklist $IPT -F blacklist $IPT -A blacklist -s 211.48.62.181 -j DROP $IPT -A blacklist -s 211.48.62.182 -j DROP $IPT -A blacklist -s 202.30.143.105 -j DROP $IPT -A blacklist -s 203.116.61.214 -j DROP $IPT -A blacklist -s 82.100.5.251 -j DROP $IPT -A blacklist -s 62.24.64.34 -j DROP $IPT -A blacklist -s 212.70.224.47 -j DROP $IPT -A blacklist -s 212.70.224.66 -j DROP $IPT -A blacklist -s 195.239.64.17 -j DROP $IPT -A blacklist -s 213.166.201.0/24 -j DROP $IPT -A blacklist -s 203.116.61.0/24 -j DROP $IPT -A blacklist -s 203.116.255.0/24 -j DROP $IPT -A blacklist -s 77.222.41.0/24 -j DROP ## Базовая проверка пакетов $IPT -N common-check $IPT -F common-check # Отбрасываем невалидные пакты $IPT -A common-check -m state --state INVALID -j DROP $IPT -A common-check -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset $IPT -A common-check -p tcp ! --syn -m state --state NEW -j DROP $IPT -A common-check -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP $IPT -A common-check -p tcp --tcp-flags ALL ALL -j DROP $IPT -A common-check -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP $IPT -A common-check -p tcp --tcp-flags ALL NONE -j DROP $IPT -A common-check -p tcp --tcp-flags SYN,RST SYN,RST -j DROP $IPT -A common-check -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP ## Правила для входящего трафика c VPS $IPT -N vps-in $IPT -F vps-in # можно всё :) $IPT -A vps-in -j ACCEPT ## Входящие icmp запросы (пинг etc) $IPT -N icmp-in $IPT -F icmp-in $IPT -A icmp-in -m state --state NEW -p icmp --icmp-type echo-request -j ACCEPT $IPT -A icmp-in -m state --state NEW -p icmp --icmp-type time-exceeded -j ACCEPT $IPT -A icmp-in -m state --state NEW -p icmp --icmp-type destination-unreachable -j ACCEPT ## Исходящие icmp запросы (пинг etc) $IPT -N icmp-out $IPT -F icmp-out ## Разрешаем icmp-reply в ответ на icmp-request'ы $IPT -A icmp-out -p icmp --icmp-type 8 -j ACCEPT $IPT -A icmp-out -m state --state NEW -p icmp --icmp-type time-exceeded -j ACCEPT $IPT -A icmp-out -m state --state NEW -p icmp --icmp-type destination-unreachable -j ACCEPT ## Разрешает пакеты с уже установленный соединений $IPT -N statefull $IPT -F statefull $IPT -A statefull -m state --state ESTABLISHED,RELATED -j ACCEPT ## Веб траффик $IPT -N http-in $IPT -F http-in # Максимум 3 новых запроса в секунду для одного ip $IPT -A http-in -m state --state NEW -m recent --name HTTP --update --seconds 1 --hitcount 3 -j DROP $IPT -A http-in -m state --state NEW -m recent --name HTTP --set -j ACCEPT $IPT -A http-in -j ACCEPT ## Почтовый траффик (smtp) $IPT -N smtp-in $IPT -F smtp-in # Максимум 2 новых запроса в секунду для одного ip $IPT -A smtp-in -m state --state NEW -m recent --name SMTP --update --seconds 1 --hitcount 2 -j DROP $IPT -A smtp-in -m state --state NEW -m recent --name SMTP --set -j ACCEPT $IPT -A smtp-in -j ACCEPT ####################################################################################################### ### Применение правил фильтрации ####################################################################################################### ## Задание правил для входящего траффика $IPT -A INPUT -j common-check $IPT -A INPUT -p tcp --dport 22 -j sshguard $IPT -A INPUT -s $VPS_LAN -j vps-in $IPT -A INPUT -p icmp -j icmp-in # Переправляем входящие на петлю, при его включении заметно улучшение отклика при ssh-авторизации # (хотя это сомнительно) $IPT -A INPUT -i $LO_IF -d $LOOPBACK -j ACCEPT $IPT -A INPUT -j statefull ## Задание правил для сквазного траффика в VPS $IPT -A FORWARD -j common-check $IPT -A FORWARD -j blacklist $IPT -A FORWARD -i $WAN1_IF -p tcp --dport 80 -j http-in $IPT -A FORWARD -i $WAN1_IF -p tcp --dport 25 -j smtp-in $IPT -A FORWARD -s $VPS_LAN -j ACCEPT $IPT -A FORWARD -j statefull $IPT -t nat -A POSTROUTING -s $VPS_LAN -o $WAN1_IF -j SNAT --to $WAN1_IP ## Задание правил для исходящего траффика $IPT -A OUTPUT -j common-check $IPT -A OUTPUT -s $VPS_LAN -j ACCEPT $IPT -A OUTPUT -p icmp -j icmp-out $IPT -A OUTPUT -o $LO_IF -j ACCEPT $IPT -A OUTPUT -o $WAN1_IF -j ACCEPT $IPT -A OUTPUT -j statefull
Обсуждение