
- ❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️
- ❤️ 本篇创建记录 2022-11-06 ❤️
- ❤️ 本篇更新记录 2022-11-06 ❤️
- 🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言 📝
- 🙏 此博客均由博主单独编写,不存在任何商业团队运营,如发现错误,请留言轰炸哦!及时修正!感谢支持!
- 🔥 Arduino ESP8266教程累计帮助过超过1W+同学入门学习硬件网络编程,入选过选修课程,刊登过无线电杂志🔥
在前面学习 【树莓派不吃灰】使用frp内网穿透,实现远程访问树莓派 的时候,我们涉及到一个SSH安全访问问题。
把内网的服务暴露给外网,意味着如果不加限制,那么在外网的任意一个角落都能访问到我们的内网服务,这就会涉及到安全问题。
- 一些不法分子通过SSH登录你的内网服务器植入病毒,暴力破解,消费你的服务器资源
- …
所以这篇我们讲一些SSH常规安全策略。
对于外网的访问,我们按照TCPIP协议分层从下往上来分析:
建议安全策略流程:
优先使用sshKey的方式 —— 对应 2.3方式其次如果发现还是有人尝试破解,再限制IP以及防火墙在Linux系统/etc目录下,有两个配置文件:hosts.allow & hosts.deny。
允许某些ip地址/地址段访问某些资源或服务禁止某些ip地址/地址段访问某些资源或服务这两个文件配置选项一样,主要是功能刚好相反。
记住:
当两个文件有同样的配置(比如针对同一个IP)时,hosts.allow的优先级更高,也就是说以hosts.allow配置为准。allow设定可越过deny限制。
两个文件配置格式一样,如下:
服务:地址:允许/禁止
其中,各个参数如下:
sshd、vsftpd、smbd、telnetd、httpd,也可以是all(所有服务)。看名字就知道对应哪些服务。某个具体的ip地址,也可以是地址段,比如192.168.1.1,192.168.1.0/24,192.168.1.,192.168.3.* 等等allow或者deny,其中,:deny 和:allow可以省略不写。编辑
hosts.allow文件,
- 写入
sshd:192.168.1.1:allow- 或者
sshd:192.168.1.1
编辑
hosts.allow文件,
- 写入
all:192.168.1.0/24:allow- 或者
all:192.168.1.
编辑
hosts.deny文件,
- 写入
telnetd:192.168.1.*:deny- 或者
telnetd:192.168.1.0/24
编辑
hosts.allow文件,
- 写入
sshd:192.168.1.0/255.255.255.128:allow编辑
hosts.deny文件,
- 写入
sshd:all:deny
编辑
hosts.allow文件,
- 写入
all:192.168.1.0/255.255.255.128:allow编辑
hosts.deny文件,
- 写入
all:all:deny
编辑
hosts.deny文件,
- 写入
all:192.168.1.0/255.255.255.128:deny
知识点:
IP地址范围的写法有若干种,主要的三种是:
- 网络地址——子网掩码方式:192.168.1.0/255.255.255.0
- 网络地址方式:218.64.(即以218.64打头的IP地址)
- 缩略子网掩码方式,既数一数二进制子网掩码前面有多少个“1”比如:218.64.87.0/255.255.255.0《====》218.64.87.0/24
一般情况下,hosts.allow和hosts.deny结合起来一起使用,才能保证更好的安全性。即在hosts.deny文件中写入“all:all:deny”,禁止一切ip地址远程访问所有资源,然后在hosts.allow文件中添加特定的ip地址允许远程访问资源即可。
设置拒绝所有之前,务必先配置好allow中的规则。
ip地址可以是私网地址,也可以是主机所在的公网地址。
当hosts.allow和hosts.deny有ip地址冲突时,以hosts.allow的设置为准。
假如我们经常在公司家里两边跑,并且公司有一个固定IP地址段。那么我们就可以设置。
sshd:all
sshd:111.222.333.444
结果就是只允许 IP 111.222.333.444 的主机登录(如果IP地址经常变,这个是有点麻烦!建议可以设置固定IP)。但是记住,这里ssh是应用层协议,外面访问的流量还是会流入树莓派。
流量 -> 物理网卡 -> 网络层 -> 传输层 -> 应用层
所以如何只是配置了sshd,只是说明被ssh应用层拦截而已。要想狠一点,sshd可以换成all。
那有没有办法在更底层拦截呢?
从
网络层和传输层阻止了进来的流量
UFW,或称 Uncomplicated Firewall,是 iptables 的一个接口,为不熟悉防火墙概念的初学者提供了易于使用的界面,同时支持 IPv4 和 IPv6,广受欢迎。
UFW本质上就是配置黑名单、白名单规则。
输入命令:
sudo apt-get install ufw -y

直接输入 ufw --help 查看命令:
ufw --help

包括了配置命令以及app命令。
sudo ufw app list

sudo ufw app info 应用名字

备注:在服务器上正式启用 UFW 防火墙之前,需要事先添加允许 SSH 连接的传入规则;否则,即使UFW开启SSH连接命令,也无效。
- sudo ufw allow ssh
- sudo ufw allow http

以下命令主要是针对tcp连接:
- sudo ufw allow 3306/tcp
- sudo ufw allow 80/tcp
- sudo ufw allow 8080/tcp
- sudo ufw allow 22/tcp

除允许单个端口连接之外,UFW 还允许直接配置端口范围。在使用 UFW 的端口范围时,必需指定 tcp 或 udp 协议。
- sudo ufw allow 7100:7200/tcp
- sudo ufw allow 7100:7200/udp
- sudo ufw allow from XX.YY.ZZ.MM
XX.YY.ZZ.MM 表示对应的ip地址。
- sudo ufw deny from XX.YY.ZZ.MM
XX.YY.ZZ.MM 表示对应的ip地址。
sudo ufw enable

sudo ufw status numbered

上面就是我们刚刚配置的全部规则。
编号,如果要删掉某一条规则可以用到它ALLOW IN (允许流量进入)From (从哪里来)To(到哪里去,也就是我们本机树莓派)方式1:指定删除编号为XX的防火墙策略
sudo ufw delete XX
方式2:直接删除配置的规则,只需在原始规则前加上 delete 即可
sudo ufw delete allow http
sudo ufw delete allow 7100:7200/tcp
sudo ufw delete allow 80/tcp
sudo ufw disable
sudo ufw rest
重置 UFW配置项时,系统会禁用 UFW 并删除所有活动规则。
出去的流量全部放行,进来的流量全部阻止。
sudo ufw default allow outgoing
sudo ufw default deny incoming
sudo ufw reload
即可完成 UFW 配置。
我们一般使用 PuTTY 等 SSH 客户端来远程管理 Linux 服务器。但是,一般的密码方式登录,容易有密码被暴力破解的问题。所以,一般我们会将 SSH 的端口设置为默认的 22 以外的端口,或者禁用 root 账户登录。其实,有一个更好的办法来保证安全,而且让你可以放心地用 root 账户从远程登录——那就是通过密钥方式登录。所以我们这里就尝试制作公钥登录。
了解内容:如果是经常玩github、gitee、gitlab这些的同学,就一定知道ssh-key的重要性,当我们把我们本地生成的ssh公钥上传到服务器后台的时候,后面所有的提交内容都不需要输入账号密码了。
还记得
讲到一个ssh连接失败问题,它本质上也是依赖于本地SSH缓存去校验一些认证信息。
这里我们会用到一个好用的ssh工具——FinalShell(FinalShell - 一个免费且好用的ssh工具) 。
Windows版下载地址:
macOS版下载地址:
操作步骤:






创建公钥我们要使用到 ssh-keygen
#命令格式
ssh-keygen -m PEM -t rsa -b 4096 -f ~/.ssh/filename
其中参数说明:
-m 参数指定密钥的格式,PEM(也就是RSA格式)是以前使用的旧格式,很多ssh客户端都用这个格式。
-t:指定要建立的密钥类型
-b:指定密钥长度
-f:指定用来保存密钥的文件名 (~/.ssh/filename,这里我定义为Rpi3B.pem)
配置过程(最好输入一个密码,比如123456):


密钥对成功创建,文件所在位置:/home/pi/.ssh/。其中 :
Rpi3B.pem 私钥Rpi3B.pem.pub 公钥完成公钥的安装后,为确保连接成功,文件权限也要确保配置正确。
pi@raspberrypi:~ $ cd .ssh/
pi@raspberrypi:~/.ssh $ cat Rpi3B.pem.pub >> authorized_keys
pi@raspberrypi:~/.ssh $ ls -al
pi@raspberrypi:~/.ssh $ chmod 600 authorized_keys
pi@raspberrypi:~/.ssh $ chmod 700 ~/.ssh



这个文件非常重要,好好保存。


登录成功。
sudo nano /etc/ssh/sshd_config
找到几个关键的配置点:



我们可以结合ufw配置,密码登录只有内网生效即可。
如果设备暴露在公网上,当你完成全部设置,并以密钥方式登录成功后,同时禁用密码登录功能,就可以加强其安全性防止ssh暴力破解。
配置改完之后重启ssh服务:
sudo service sshd restart



本篇围绕着如何在外网上面更安全访问我们的树莓派服务,并且接受了多种方式进行限制,但是博主还是比较建议方式3。