sysctl 可以显示和修改内核参数,包含一些 TCP/IP 堆栈和虚拟内存系统的高级选项,合理设置可以显著提高系统性能。iptables 是 Linux 下最常用的防火墙软件,也是很多 Linux 发行版自带的默认防火墙软件。通过设置 sysctl 和 iptables,可以有效防范中小程度的攻击。
查看状态
查看TCP连接状态
1 2
| #netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn netstat -n | awk '/^tcp/ {++S[$NF]};END {for(a in S) print a, S[a]}'
|
查找请求数请20个IP
1
| netstat -anlp|grep 80|grep tcp|awk '{print $5}'|sort|uniq -c|sort -nr|head -n20
|
查看nginx日志时段访问前20的IP
1
| sed '#20/Aug/2018#p' /data/logs/nginx/xxx.cn.log | awk '{print $1}' | sort | uniq -c| sort -nr | head -n20
|
防范DDOS攻击
防止SYN攻击 轻量级预防 三次握手攻击
1 2 3 4
| iptables -N syn-flood iptables -A INPUT -p tcp --syn -j syn-flood iptables -I syn-flood -p tcp -m limit --limit 3/s --limit-burst 6 -j RETURN iptables -A syn-flood -j REJECT
|
防止DOS太多连接进来,可以允许外网网卡每个IP最多15个初始连接,超过的丢弃
1 2
| iptables -A INPUT -i eth0 -p tcp --syn -m connlimit --connlimit-above 15 -j DROP iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
|
用Iptables抵御DDOS (参数与上相同)
1 2
| iptables -A INPUT -p tcp --syn -m limit --limit 12/s --limit-burst 24 -j ACCEPT iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
|
常用命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| # 屏蔽一个IP iptables -I INPUT -s 192.168.0.1 -j DROP
# 防 Ping iptables -A INPUT -p icmp -j DROP
# 限制与80端口连接的IP最大连接数为10,可自定义修改。 iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 10 -j DROP
# 防止同步包洪水(Sync Flood)每秒中最多允许5个新连接 iptables -A FORWARD -p tcp --syn -m limit --limit 1/s --limit-burst 5 -j ACCEPT
# 防止端口扫描 iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
# 防止 Ping 洪水攻击(Ping of Death) iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
# 控制ip碎片 允许每秒通过100个碎片 iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
--------------------------------------------------------------------------------------
# 防止 NMAP FIN/URG/PSH iptables -A INPUT -i eth0 -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
# Xmas Tree iptables -A INPUT -i eth0 -p tcp --tcp-flags ALL ALL -j DROP
# Another Xmas Tree iptables -A INPUT -i eth0 -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
# Null Scan(possibly) iptables -A INPUT -i eth0 -p tcp --tcp-flags ALL NONE -j DROP
# SYN/RST iptables -A INPUT -i eth0 -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
# SYN/FIN -- Scan(possibly) iptables -A INPUT -i eth0 -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
# 限制对内部封包的发送速度 iptables -A INPUT -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
# 限制建立联机的转 iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
|
sysctl配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| # 同时保持 time-wait 状态的 socket 数量,超过此数目的 time-wait 状态的 socket 会被关闭并打印出错误信息。 #请根据服务端并发连接数和内存大小适当增加这个值。 net.ipv4.tcp_max_tw_buckets = 1440000
# 关闭快速回收 time-wait 状态的 socket net.ipv4.tcp_tw_recycle = 0 # 开启复用 time-wait 状态的 socket net.ipv4.tcp_tw_reuse = 1
# 开启此选项可以防范一般的 SYN flood 攻击 # 注意:syncookies严重违反了 TCP 协议,可能会对 SMTP 转发等服务造成严重影响。 net.ipv4.tcp_syncookies = 1
# 记录未收到客户端确认的连接请求的最大值。 # 请根据服务器大小和内存大小适当增加这个值。 net.ipv4.tcp_max_syn_backlog = 262144
# 对于一个新建连接,重复发送多少个 SYN 仍未收到响应后放弃连接。 net.ipv4.tcp_syn_retries = 2 # 对于客户端发来的新建连接请求(SYN),重复发送多少个 SYN/ACK 仍未收到响应后放弃此连接。 net.ipv4.tcp_synack_retries = 2 # 请根据网络环境适当调整这两个值,比如:如果服务器在国外,而用户只主要为国内访客,请增加这两个值。 # 如果服务器和用户都在内网中,可以把这两个值都设为 0。
# 当 keepalive 打开的情况下,多长时间发送一次 keepalive。 # 当攻击者建立大量连接后,不发送或回应任何请求,直到 keepalive 时间过后,服务端通过发送 keepalive 才能确认连接已关闭。 # 减少这个值可以降低服务器资源浪费,但当正常的长连接过多时,会造成增加服务器负载。 net.ipv4.tcp_keepalive_time = 300 # 发送 keepalive 的次数,当发送多少个 keepalive 仍未收到响应后,认为放弃连接。 net.ipv4.tcp_keepalive_probes = 5 # 发送 keepalive 的频率,tcp_keepalive_intvl x tcp_keepalive_probes = 自第一次发送 keepalive 到放弃连接。 # 比如每次发送间隔 10 秒,共发送 5 次,如果期间没有收到任何响应,则 50 秒后放弃连接。 net.ipv4.tcp_keepalive_intvl = 10
# 已被进程断开的连接(此连接不再属于任何进程),如果客户端没有正常响应,以关闭连接,那么在服务端,此连接会一直处于 FIN_WAIT_2 状态。 # 此选项设置当多长时间后,放弃此连接。 net.ipv4.tcp_fin_timeout = 15
# 忽略 ICMP ECHO 请求,也就是禁止 ping。 net.ipv4.icmp_echo_ignore_all = 1
# 已建立连接的超时时间。减少这个值可以更快速地释放已不用的连接。 net.netfilter.nf_conntrack_tcp_timeout_established = 3600
|
net.ipv4.tcp_tw_reuse = 1
很安全,可以不用过多关注。
需要注意的是net.ipv4.tcp_tw_recycle = 1
,NAT
环境 不要开启 net.ipv4.tcp_tw_recycle,原因见这篇文章。
Coping with the TCP TIME-WAIT state on busy Linux servers
https://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial-cn-1.1.19.html