Есть крупный TeamSpeak3-голосовой сервер переговоров различного рода людей с разделами и ветками.
TS-server располагается на выделенном сервере и, само собой, имеет определенный IP.
Периодически начинается атака на IP-адрес со множества различных IP из разных стран. Узнают IP очень легко: просматривая текущее соединение с сервером, пингуя IP, просматривая информацию по домену и т.п.
Есть сервис CloudFlare, однако он проксирует только HTTP TCP траффик. Здесь же нужна фильтрация по UDP протоколу...
Задача состоит в следующем: защититься от DDoS-атаки на IP-адрес.
В IPtables прописаны правила.
iptables -P INPUT DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -t filter -A INPUT -i ppp0 -p udp --syn --dport ПОРТ_СЕРВЕРА -m limit --limit 10/s -j ACCEPT
iptables -t filter -A INPUT -i ppp0 -p udp --dport ПОРТ_СЕРВЕРА -m connlimit --connlimit-above 200 --connlimit-mask 0 -j DROP
iptables -t filter -A INPUT -i ppp0 -p udp --dport ПОРТ_СЕРВЕРА -m connlimit --connlimit-above 200 --connlimit-mask 0 -j LOG --log-prefix "DoS200:"
iptables -t filter -A INPUT -i ppp0 -p udp --dport ПОРТ_СЕРВЕРА --syn -m connlimit --connlimit-above 5 -j DROP
iptables -t filter -A INPUT -i ppp0 -p udp --dport ПОРТ_СЕРВЕРА --syn -m connlimit --connlimit-above 5 -j LOG --log-prefix "DoS5:"
iptables -t filter -A INPUT -i ppp0 -p udp --dport ПОРТ_СЕРВЕРА -j ACCEPT
iptables -I UDP -p udp -m recent --update --seconds 60 --name UDP-PORTSCAN -j REJECT --reject-with icmp-port-unreachable
iptables -D INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
iptables -A INPUT -p udp -m recent --set --name UDP-PORTSCAN -j REJECT --reject-with icmp-port-unreachable
iptables -D INPUT -j REJECT --reject-with icmp-proto-unreachable
iptables -A INPUT -j REJECT --reject-with icmp-proto-unreachable
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -I INPUT -i eth0 -s 10.0.0.0/8 -j DROP
iptables -I INPUT -i eth0 -s 172.16.0.0/12 -j DROP
iptables -I INPUT -i eth0 -s 192.168.0.0/16 -j DROP
iptables -I INPUT -i eth0 -s 127.0.0.0/8 -j DROP
iptables -A INPUT -p icmp --icmp-type echo-request -i eth0 -j DROP
iptables -I INPUT -p icmp --icmp-type redirect -j DROP
iptables -I INPUT -p icmp --icmp-type router-advertisement -j DROP
iptables -I INPUT -p icmp --icmp-type router-solicitation -j DROP
iptables -I INPUT -p icmp --icmp-type address-mask-request -j DROP
iptables -I INPUT -p icmp --icmp-type address-mask-reply -j DROP
В /etc/sysctl.d/90-firewall.conf
net.ipv4.icmp_echo_ignore_all = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.tcp_timestamps = 0
net.ipv4.conf.all.send_redirects = 0
net/ipv4/conf/default/accept_redirects=0
net/ipv4/conf/all/accept_redirects=0
net/ipv6/conf/default/accept_redirects=0
net/ipv6/conf/all/accept_redirects=0
net.ipv4.conf.all.accept_source_route=0
net.ipv4.icmp_echo_ignore_broadcasts=1
net.ipv4.icmp_ignore_bogus_error_responses=1
kernel.sysrq = 0
net.ipv4.ip_forward = 0 #это если компьютер не используется как шлюз
net.ipv4.tcp_syncookies = 1
net.ipv6.conf.all.forwarding = 0
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1 #игнорируем broadcasts пакеты
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.conf.all.send_redirects = 0 #это если компьютер не используется как маршрутизатор
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 4294967295
kernel.shmall = 268435456
net.ipv4.tcp_keepalive_time = 60
net.ipv4.tcp_keepalive_intvl = 10
net.ipv4.tcp_max_syn_backlog=2048
net.ipv4.tcp_synack_retries=1
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_fin_timeout = 20
net.ipv4.tcp_window_scaling = 0
net.ipv4.tcp_sack = 0net.ipv4.tcp_timestamps = 0