配置 Sysctl 和 Iptables 防攻击

Posted by Sunday on 2018-08-20

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 = 1NAT环境 不要开启 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