如何使用端口敲击来保护 Linux 中的 SSH 服务
端口敲击是一种巧妙的技术,它通过仅允许合法用户访问服务器上运行的服务来控制对端口的访问。它的工作原理是,当进行正确的连接尝试顺序时,防火墙会很乐意打开已关闭的端口。
端口敲击背后的逻辑是保护您的 Linux 系统免受自动端口扫描器的攻击,这些扫描器会寻找开放端口。在本指南中,我们将介绍如何安装端口敲击以及如何配置它以保护 SSH 服务。出于演示目的,我们将使用Ubuntu 18.04。
步骤1:安装并配置knockd
首先,登录到您的 Linux 系统并安装knockd守护进程,如图所示。
$ sudo apt install knockd
安装完成后,使用您喜欢的文本编辑器打开knockd.conf配置。这里我们使用vim命令行文本编辑器。
$ sudo vim /etc/knockd.conf
默认配置文件如下所示。
在本[openSSH]
节下,我们需要将默认的敲击顺序(7000、8000、9000)更改为其他值。这是因为这些值是已知的,可能会危及系统的安全性。
为了测试目的,我们将值设置为10005、10006、10007 。这是从客户端系统打开 SSH 端口时使用的序列。
在第三行 - 以命令开头,更改-A
为-I
在/sbin/iptables
命令 之后和 之前INPUT
。
最后,在[closeSSH]
部分下,再次将默认顺序更改为您的首选。这是用户完成并退出服务器后用于关闭 SSH 连接的顺序。
这是我们的完整配置。
完成后,保存更改并退出。
我们需要修改的另一个配置是/etc/default/knockd。再次使用文本编辑器打开它。
$ sudo vim /etc/default/knockd
找到该行START_KNOCKD=0
。取消注释并将值设置为1
。
接下来,转到取消注释行,并用系统的活动网络接口KNOCKD_OPTS=”-i eth1”
替换默认值。要检查您的网络接口,只需运行ip addr或ifconfig 命令。eth1
对于我们的系统来说,enp0s3是活动网卡。
完整配置如图所示。
保存更改并退出。
然后启动并启用knockd守护进程,如图所示。
$ sudo systemctl start knockd $ sudo systemctl enable knockd
要检查knockd守护进程的状态,请运行以下命令:
$ sudo systemctl status knockd
第 2 步:关闭防火墙上的 SSH 端口 22
由于knockd服务的目的是授予或拒绝对 ssh 服务的访问,我们将关闭防火墙上的 ssh 端口。但首先,让我们检查一下UFW 防火墙的状态。
$ sudo ufw status numbered
从输出中,我们可以清楚地看到SSH端口22在编号分别为5和9 的IPv4和IPv6协议上都打开了。
我们需要删除这两个规则,如图所示,从最高值开始 - 即9。
$ sudo ufw delete 9 $ sudo ufw delete 5
现在,如果您尝试远程登录服务器,您将收到如图所示的连接超时错误。
步骤3:配置knock客户端以连接到SSH服务器
在最后一步中,我们将配置一个客户端,并通过首先发送我们在服务器上配置的敲击序列来尝试登录。
但首先,像在服务器上一样安装knockd守护进程。
$ sudo apt install knockd
安装完成后,使用显示的语法发送敲击序列
$ knock -v server_ip knock_sequence
在我们的例子中,这意味着:
$ knock -v 192.168.2.105 10005 10006 10007
您应该会得到与我们类似的输出,具体取决于您的序列。这表明敲击尝试成功了。
此时,您应该能够使用 SSH 成功登录服务器。
在远程服务器上完成工作后,通过发送关闭敲击序列来关闭 SSH 端口。
$ knock -v 192.168.2.105 10007 10006 10005
正如所演示的,任何登录服务器的尝试都将失败。
结束语
本指南介绍了如何利用端口敲击来保护服务器上的 SSH 服务。更好更简单的方法是使用 SSH 密钥对配置密码 SSH 身份验证。这可确保只有拥有私钥的用户才能向存储公钥的服务器进行身份验证。