0x00 起因
最近我自己的 vps 越来越不稳定,开始还以为是因为我自己在路由器里面添加了透明代理使用的流量大造成的,后来越来越发觉不正常,毕竟我也是用了几年 vps 的老手了,总觉的不正常。后来 iftop 发现我的 vps 即使不用的情况下也经常会有 MB/s 级别的流量通信,再用 nethogs 一看更是心惊,原来是大量的只有 0.02 KB 左右的数据流,这才想起来,这台 vps 自打买来就一直在测试使用,但是没有进行安全防护的详细设置只是进行了一些简单的设置。下面详细说说,vps 在购买之后要做哪些安全类型的设置。当然这些设置对于一般的建站之类的已经足够了,如果是明星站请使用专业的设置方法。下面说几个比较有效的常规方法。
0x01 ssh
ssh 是我们最应该去第一个设置的项目。几乎所有的 linux 服务器的使用者都会用 ssh 来进行服务器的管理,生产环境下没有几个人去使用图形界面连接,那么 ssh 的安全防护就成了第一道重要的关卡。默认 ssh 是使用 22 端口进行连接的。我们需要更改掉这个端口,因为一般的脚本首先扫描的就是 22 端口。然后还要更改掉登录的方式,默认大家的都是账号密码登录,这里我们需要更换为密钥证书登录。下面说说如何去设置,不同版本的 sshd 可能会略有不同,但是思路是一样的。改掉默认的 22 端口,改掉密码登录,这两点是内容是不变的。
1.更改默认端口
vim /etc/ssh/sshd_config 此处例子更改为29888
#Port 22
Port 29888
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
2.更改秘钥登录
2.1 生成密钥
生成密钥对,输入命令以后一路回车
ssh-keygen -t rsa
生成的公私钥对默认保存在~/.ssh/
生成两个文件 id_rsa id_rsa.pub 带 pub 的是公钥,上传给服务器公钥
2.2 传输密钥到服务器
可以使用 ssh-copy-id 来一步完成
ssh-copy-id user@serverip
也可以全手动的当时去做
#在本机上执行此命令,上传公钥
cd .ssh
scp -P id_rsa.pub user@serverip:/tmp
#在服务器上执行此命令,追加到authorized_keys
cd /tmp && cat id_rsa.pub >> ~/.ssh/authorized_keys
#更改权限
chmod 600 ~/.ssh/authorized_keys
2.3 配置sshd开启密钥登录
vim /etc/ssh/sshd_config 以下两项更改为yes,第三项采用.ssh下面的文件认证,注释掉 password认证
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
# PasswordAuthentication yes
重启sshd,
service sshd restart
或者systemctl restart sshd.service
。sshd服务重启之后,服务器已经支持远程ssh连接了。
我个人建议是密码认证那个先不要注释掉,以防止手抖打错字母造成的问题,能够正常密钥连接以后,再注释掉不迟。
0x02 防火墙
更改了上面的默认的 ssh 登录的端口以后需要在防火墙里面添加对应的规则,只能能够访问这几个端口,其他端口全部不能访问。几乎所有的 linux 发型版本上都会装防火墙软件,常见的有 iptales 和 firewalld,下面分别介绍一下这两个防火墙的设置设置方法。关于防火墙这里不细讲,因为这两个防火墙如果要详细说都是极大的篇幅这里只说需要做哪些。详细的说明以后的博客中可能会讲。
1. iptables 设置
iptables 的原则是在上面的条目先把开放的端口列出来尤其是 ssh 因为一旦设置错误或者忘记填写ssh那么晚就无法连接了,所以ssh必须写在第一位,然后写其他开发的,最后拒绝所有。这样的原则去设置
#开放指定的端口
#-A 是在 iptables 的最后添加一条规则,-I 是在 iptables 的前面添加一条规则
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
# 允许本地回环接口(即运行本机访问本机)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许已建立的或相关连的通行
iptables -A OUTPUT -j ACCEPT
# 允许所有本机向外的访问
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 允许访问 22 端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 允许访问 80 端口
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
# 允许 FTP 服务的 21 端口
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
# 允许 FTP 服务的 20 端口
iptables -A INPUT -j reject
# 禁止其他未允许的规则访问
iptables -A FORWARD -j REJECT
# 禁止其他未允许的规则访问
屏蔽 IP
iptables -I INPUT -s 123.45.6.7 -j DROP
# 屏蔽单个 IP 的命令
iptables -I INPUT -s 123.0.0.0/8 -j DROP
# 封整个段即从 123.0.0.1 到 123.255.255.254 的命令
iptables -I INPUT -s 124.45.0.0/16 -j DROP
# 封 IP 段即从 123.45.0.1 到 123.45.255.254 的命令
iptables -I INPUT -s 123.45.6.0/24 -j DROP
# 封 IP 段即从 123.45.6.1 到 123.45.6.254 的命令
上面的 端口自己用不上的不要写进去,最小化的原则,用哪个开那个
# service iptables restart
# systemctl enable iptables.service
2. firewald 设置
查看现在已开放的端口情况
firewall-cmd --list-all
添加要开放的端口
firewall-cmd --permanent --zone=public --add-port=要开放的端口号/tcp
firewall-cmd --permanent --zone=public --add-port=要开放的端口号/udp
使新规则生效
firewall-cmd --reload
最后再检查一下有没有生效
如果要删除上面开放出来的端口用下面的命令
firewall-cmd --permanent --zone=public --remove-port=前面添加的端口号/tcp
firewall-cmd --permanent --zone=public --remove-port=前面添加的端口号/udp
0x03 fail2ban
默认的防火墙可以阻挡大量的无意义的访问,但是防火墙也有一点不智能的地方在于,一直被扫描,但是全部手动的去添加这些扫描的 ip 过于不方面,如果有智能的方式进行这项工作就好了。fail2ban就是我推荐的一个好工具去完成这个琐碎的工作。
这里推荐一个比较懒的方法,使用一键 lnmp 脚本 tools 文件夹里面的 fail2ban 脚本去自动编译安装,wget http://soft.vpser.net/lnmp/lnmp1.6beta.tar.gz
下载后解压开就好了。执行tools 里面的fail2ban.sh
wget http://soft.vpser.net/lnmp/lnmp1.6beta.tar.gz
tar xf lnmp1.6beta.tar.gz
cd ./lnmp/tools
./fail2ban.sh
然后修改配置文件 /etc/fail2ban/jail.conf ,写进去这样的内容,这样会用 fail2ban 使用 firewalld 来进行 ip 的拦截。
[DEFAULT]
ignoreip = 127.0.0.1/8
bantime = 86400
findtime = 600
maxretry = 5
banaction = firewallcmd-ipset
action = %(action_mwl)s
[sshd]
enabled = true
filter = sshd
port = 22
action = %(action_mwl)s
logpath = /var/log/secure
0x04 ddos
fail2ban 最大的功能在于常规的 sshd 的暴力扫描破解以及 http https 等常见的协议的被暴力扫描可以起到很好的作用。但是对于全部端口的扫描以及 ddos 这样垃圾的数据攻击就没有什么效果了,所以我们还要加装一个 ddos 防护类型的工具。这里条件使用DDoS-Deflate
安装方法
下载
wget http://www.inetbase.com/scripts/ddos/install.sh
添加执行权限
chmod +x install.sh
执行安装
./install.sh
编辑配置文件修改以下内容
vim /usr/local/ddos/ddos.conf
NO_OF_CONNECTIONS = 100
APF_BAN = 0
BAN_PERIOD = 36000
- 超过一个 ip 超过 100 个连接就判定为恶意
- 使用 iptables 作为拦截的底层功能
- 一个 ip 被加入黑名单的时间 当然是越长越好。
0x05 检验效果
俗话说不看价格,看疗效。同理我们做了这么多是时候该查看一下防护的效果了,这里我推荐使用 iftop nethogs 以及 netstat 这 3 个工具来检验我们的防护效果。正常来说使用了这3种方法以后,即使有脚本扫描的行为也会在扫描一段时间以后得不到任何结果就会自动的放弃掉。如果有专业的团队去攻击那上面的方法就起不到特别大的效果了。
首先使用 iftop 查看一下总的实时流量的数据量有多大
12.5Kb 25.0Kb 37.5Kb 50.0Kb 62.5Kb
└───────────────────┴───────────────────┴───────────────────┴───────────────────┴────────────────────
ivoivo => xxx.xxx.26.21 7.09Kb 5.33Kb 5.33Kb
<= 208b 312b 312b
ivoivo => 8.8.8.8 1.14Kb 1.27Kb 1.27Kb
<= 868b 1.13Kb 1.13Kb
ivoivo => 8.8.4.4 868b 722b 722b
<= 1.13Kb 722b 722b
239.255.255.250 => 104.223.22.46 0b 0b 0b
<= 1.57Kb 1.18Kb 1.18Kb
239.255.255.250 => 104.223.12.74 0b 0b 0b
<= 808b 808b 808b
239.255.255.250 => 85.209.162.79 0b 0b 0b
<= 1.57Kb 804b 804b
224.0.0.252 => 155.254.33.175 0b 0b 0b
<= 0.98Kb 700b 700b
antitm.info => 155.94.158.120.static.quadranet.com 704b 440b 440b
<= 0b 0b 0b
239.255.255.250 => 104.129.12.54 0b 0b 0b
<= 804b 402b 402b
239.255.255.250 => 167.160.187.163 0b 0b 0b
<= 796b 398b 398b
antitm.info => 144.172.92.116 352b 352b 352b
<= 0b 0b 0b
antitm.info => 144.172.92.117 704b 352b 352b
<= 0b 0b 0b
155.94.140.255 => 155.94.140.20 0b 0b 0b
<= 312b 312b 312b
239.255.255.250 => 85.209.162.116 0b 0b 0b
<= 516b 258b 258b
─────────────────────────────────────────────────────────────────────────────────────────────────────
TX: cum: 3.65KB peak: 9.08Kb rates: 9.08Kb 7.31Kb 7.31Kb
RX: 6.15KB 16.2Kb 16.2Kb 12.3Kb 12.3Kb
TOTAL: 9.80KB 25.3Kb 25.3Kb 19.6Kb 19.6Kb
然后用 nethogs 查看具体的有没有大量的数据量 0.02 KB 做有的数据进出
PID USER PROGRAM DEV SENT RECEIVED
? root 144.172.92.117:22-118.89.106.252:21666 0.000 0.346 KB/sec
? root 155.94.158.120:80-93.189.44.132:55733 0.000 0.068 KB/sec
? root 144.172.92.116:22-58.242.83.30:64217 0.000 0.059 KB/sec
28174 root sshd: root@pts/0 eth0 0.480 0.059 KB/sec
? root 144.172.92.116:80-93.189.44.132:48694 0.000 0.057 KB/sec
? root 144.172.92.117:80-93.189.44.132:36359 0.000 0.045 KB/sec
? root 104.223.12.19:445-110.137.177.218:65167 0.000 0.013 KB/sec
? root 96.44.140.222:445-78.188.152.134:55087 0.000 0.013 KB/sec
? root 96.44.140.219:1500-198.108.67.59:13511 0.000 0.011 KB/sec
? root 96.44.140.222:23-175.156.143.43:61938 0.000 0.011 KB/sec
? root unknown TCP 0.000 0.000 KB/sec
TOTAL 0.480 0.680 KB/sec
最后用 netstat -atu 查看一下有多少 tcp 和 udp 建立的连接
[root@ivoivo ~]# netstat -aut
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 localhost:smtp 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:33346 0.0.0.0:* LISTEN
tcp 0 0 localhost:51183 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:29009 0.0.0.0:* LISTEN
tcp 0 0 ivoivo:58132 yx-in-f188.1e10:hpvroom ESTABLISHED
tcp 0 0 ivoivo:33346 xxx.xxx.26.21:59290 ESTABLISHED
tcp 0 0 localhost:51183 localhost:60612 ESTABLISHED
tcp 0 0 ivoivo:29009 xxx.xxx.26.21:55960 ESTABLISHED
tcp 0 0 localhost:60612 localhost:51183 ESTABLISHED
tcp6 0 0 localhost:smtp [::]:* LISTEN
tcp6 0 0 [::]:29009 [::]:* LISTEN
udp 0 0 0.0.0.0:mdns 0.0.0.0:*
udp 0 0 0.0.0.0:23926 0.0.0.0:*
udp 0 0 0.0.0.0:33346 0.0.0.0:*
最后感谢互联网上面的先贤们,他们产出的优质的文章供我参考才有的此篇博文,下面是参考的链接
https://www.seoimo.com/wordpress-vps/
https://blog.csdn.net/koastal/article/details/72426874
https://segmentfault.com/a/1190000015362485