можно по пробовать вот так
PHP:
iptables -A INPUT -p udp -m udp --dport Порт -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p udp --dport Порт -m state --state NEW -m hashlimit --hashlimit 100/s --hashlimit-burst 100 --hashlimit-mode srcip --hashlimit-name TF -j ACCEPT
iptables -A INPUT -p udp --dport Порт -j DROP
--- добавлено: 2 дек 2012 в 19:56 ---
1) Установим такие переменные sysctl:
fs.file-max=209708
net.core.rmem_default=201250
net.core.wmem_default=201250
net.ipv4.tcp_rmem = 4096 87380 8388608
net.ipv4.tcp_wmem = 4096 87380 8388608
net.core.rmem_max = 8388608
net.core.wmem_max = 8388608
net.core.netdev_max_backlog = 5000
net.core.somaxconn=32768
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_synack_retries = 3
net.ipv4.tcp_fin_timeout=15
net.ipv4.tcp_keepalive_intvl=5
net.ipv4.tcp_keepalive_probes=3
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_mtu_probing=1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_sack=0
net.ipv4.tcp_max_syn_backlog=1280
net.ipv4.conf.all.send_redirects=0
net.ipv4.conf.all.accept_redirects=0
net.ipv4.conf.all.secure_redirects=0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.rp_filter=1
net.ipv4.conf.default.rp_filter=1
net.ipv4.ip_local_port_range=1024 65000
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.tcp_max_tw_buckets = 720000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
kernel.msgmnb = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
2) ipset
IP Sets – расширение пакетного фильтра ядра iptables, которое позволяет комфортно работать с большими наборами адресов/сетей. При написании правил iptables при этом мы оперируем именованными списками.
Дело в том, что при использовании хостов больше 1000 через iptables – load avarage будет большим, так как сам iptables плохо работает с большим количеством хостов. Намного лучше с ним работает сам ipset. Поэтому используйте именно его.
3) Защита от аттак.
- SYN
iptables -A INPUT -p tcp ! –syn -m state –state NEW -j DROP
iptables -A OUTPUT -p tcp ! –syn -m state –state NEW -j DROP
- SYN Flood
Ставим ограничение в 24 подключения за секунду (максимально разрешено 48 подключений)
iptables -t mangle -N syn-flood
iptables -t mangle -A syn-flood -m limit --limit 24/s --limit-burst 48 -j RETURN
iptables -t mangle -A syn-flood -m limit --limit 10/s --limit-burst 10 -j LOG --log-prefix "IPT: DOS (dropped): "
iptables -t mangle -A syn-flood -j DROP
iptables -t mangle -A PREROUTING -p tcp --syn -j syn-flood
Либо так:
Ставим ограничение в 100 подключения за секунду (максимально разрешено 150 подключений)
iptables -N syn-flood
iptables -A syn-flood -m limit --limit 100/second --limit-burst 150 -j RETURN
iptables -A syn-flood -j LOG --log-prefix "SYN flood: "
iptables -A syn-flood -j DROP
- FIN/X/N
iptables -A INPUT –p tcp –m tcp –-tcp-flags FIN,ACK FIN -j DROP
iptables -A INPUT –p tcp –m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG –j DROP
iptables -A INPUT –p tcp –m tcp –-tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE –j DROP
iptables -A FORWARD -p tcp -m tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
iptables -A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP
iptables -A FORWARD -p tcp -m tcp --tcp-flags FIN,RST FIN,RST -j DROP
iptables -A FORWARD -p tcp -m tcp --tcp-flags FIN,ACK FIN -j DROP
iptables -A FORWARD -p tcp -m tcp --tcp-flags ACK,URG URG -j DROP
iptables -A FORWARD -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j DROP
- NMAP сканирование
## nmap -sS (Scan: SYN+ACK = no defense... )
## nmap -sX (Scan: SYN+ACK+FIN+RST [+PSH+URG] = not implemented in TCP)
iptables -A INPUT -p tcp -m state --state ! ESTABLISHED --tcp-flags SYN,ACK,FIN,RST ALL -j LOG --log-prefix "IPT: Scan: XMAS0: "
iptables -A INPUT -p tcp -m state --state ! ESTABLISHED --tcp-flags SYN,ACK,FIN,RST ALL -j REJECT --reject-with tcp-reset
iptables -A INPUT -p tcp -m state --state ! ESTABLISHED --tcp-flags ALL FIN,URG,PSH -j LOG --log-prefix "IPT: Scan: XMAS1: "
iptables -A INPUT -p tcp -m state --state ! ESTABLISHED --tcp-flags ALL FIN,URG,PSH -j REJECT --reject-with tcp-reset
iptables -A INPUT -p tcp -m state --state ! ESTABLISHED --tcp-flags ALL SYN,RST,ACK,FIN,URG -j LOG --log-prefix "IPT: Scan: XMAS2: "
iptables -A INPUT -p tcp -m state --state ! ESTABLISHED --tcp-flags ALL SYN,RST,ACK,FIN,URG -j REJECT --reject-with tcp-reset
iptables -A INPUT -p tcp -m state --state ! ESTABLISHED --tcp-flags ALL ALL -j LOG --log-prefix "IPT: Scan: XMAS2: "
iptables -A INPUT -p tcp -m state --state ! ESTABLISHED --tcp-flags ALL ALL -j REJECT --reject-with tcp-reset
iptables -A INPUT -p tcp -m state --state ! ESTABLISHED --tcp-flags SYN,RST SYN,RST -j LOG --log-prefix "IPT: Scan: SYN-RST: "
iptables -A INPUT -p tcp -m state --state ! ESTABLISHED --tcp-flags SYN,RST SYN,RST -j REJECT --reject-with tcp-reset
#FINGERPRINTING
iptables -A INPUT -p tcp --dport 0 -j DROP
iptables -A INPUT -p udp --dport 0 -j DROP
iptables -A INPUT -p tcp --sport 0 -j DROP
iptables -A INPUT -p udp --sport 0 -j DROP
## nmap -sN (Scan: none of any flags = not implemented in TCP)
iptables -A INPUT -p tcp -m state --state ! ESTABLISHED --tcp-flags SYN,ACK,FIN,RST NONE -m limit --limit 10/minute --limit-burst 10 -j LOG --log-prefix "IPT: Scan: empty flags: "
iptables -A INPUT -p tcp -m state --state ! ESTABLISHED --tcp-flags SYN,ACK,FIN,RST NONE -j REJECT --reject-with tcp-reset
## nmap -sF (Scan: only FIN)
iptables -A INPUT -p tcp -m state --state ! ESTABLISHED --tcp-flags SYN,ACK,FIN,RST FIN -m limit --limit 10/minute --limit-burst 10 -j LOG --log-prefix "IPT: Scan: only FIN: "
iptables -A INPUT -p tcp -m state --state ! ESTABLISHED --tcp-flags SYN,ACK,FIN,RST FIN -j REJECT --reject-with tcp-reset
###[ hach_scan shain ]---------------------------------------------------------------
iptables -t filter -N hack_scan
## nmap -sS (Scan: SYN+ACK = no defense... )
## nmap -sX (Scan: SYN+ACK+FIN+RST [+PSH+URG] = not implemented in TCP)
iptables -t filter -A hack_scan -p tcp -m state --state ! ESTABLISHED --tcp-flags SYN,ACK,FIN,RST ALL -j LOG --log-prefix "IPT: Scan: SYN+ACK+FIN+RST: "
iptables -t filter -A hack_scan -p tcp -m state --state ! ESTABLISHED --tcp-flags SYN,ACK,FIN,RST ALL -j REJECT --reject-with tcp-reset
## NEW, not SYN
iptables -t filter -A hack_scan -p tcp ! --syn -m state --state NEW -m limit --limit 10/minute --limit-burst 10 -j LOG --log-prefix "IPT: NEW not SYN (rejected): "
iptables -t filter -A hack_scan -p tcp ! --syn -m state --state NEW -j REJECT --reject-with tcp-reset
###[ end of hach_scan chain ]==========================================================
iptables -t filter -A INPUT -p ALL -j hack_scan
4) Прочие ограничения.
Максимум 10 одновременных соединений к 80 порту с одного IP
iptables -A INPUT -p tcp --dport 80 -m iplimit --iplimit-above 10 -j REJECT
либо так
iptables -I INPUT -p tcp -m tcp --dport 80 -m connlimit --connlimit-above 10 --connlimit-mask 32 -j DROP
5) Системы обнаружения вторжения.
Такие системы позволяют быстро анализировать log-файлы на предмет совпадения строк и выполнять нужные действия. К примеру, рекомендую использовать fail2ban в связке с ipset. При выявлении нужной строки – просто выполняйте команду заноса нужного IP в набор от ipset.