如何使用端口敲门保护 SSH 服务

如果你想让用户在不打开防火墙的情况下访问你服务器上的特定服务,你可以使用端口敲门。 端口敲门是一种方法,可让我们保护我们的服务免受未经授权的用户的侵害。 当接收到正确的连接尝试序列时,端口敲击允许传入连接。

在这篇文章中,我们将通过端口敲门保护开放的 SSH 端口 22。 只有当有人依次请求端口 7000、8000、9000 时,才会打开该端口。

先决条件

  • 云平台上的 Ubuntu 20.04 服务器
  • 在我们的服务器上配置的 root 密码

第 1 步 – 创建 云服务器

首先,登录到我们的 云服务器。 创建一个新服务器,选择 Ubuntu 20.04 作为至少 2GB RAM 的操作系统。 通过 SSH 连接到我们的云服务器并使用页面顶部突出显示的凭据登录。

登录到 Ubuntu 20.04 服务器后,运行以下命令以使用最新的可用软件包更新基本系统。

apt-get update -y

第 2 步 – 安装和配置 Knockd

默认情况下,knockd 包包含在 Ubuntu 20.04 默认存储库中。 我们可以使用以下命令安装它:

apt-get install knockd -y

安装软件包后,编辑端口敲击默认配置文件:

nano /etc/knockd.conf

找到如下所示的默认序列:

        sequence    = 7000,8000,9000
        sequence    = 9000,8000,7000

并用以下顺序替换它们:

        sequence    = 7777,8888,9999
        sequence    = 9999,8888,7777

另外,找到以下行:

        command     = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT

并将其替换为以下行:

        command     = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT

完成后保存并关闭文件。

在上面的配置文件中,序列7777、8888、9999用于打开客户端系统的22端口,序列9999、8888、7777用于关闭客户端系统的22端口。

接下来,编辑 /etc/default/knockd 配置文件:

nano /etc/default/knockd

更改以下行:

# Start the Knockd service
START_KNOCKD=1

# Name of wer network interface
KNOCKD_OPTS="-i eth0"

完成后保存并关闭文件,然后重新启动 Knockd 服务并使其在系统重新启动时启动:

systemctl restart knockd
systemctl enable knockd

接下来,使用以下命令验证 Knockd 服务的状态:

systemctl status knockd

样本输出:

● knockd.service - Port-Knock Daemon
     Loaded: loaded (/lib/systemd/system/knockd.service; disabled; vendor preset: enabled)
     Active: active (running) since Sun 2021-08-15 13:26:31 UTC; 5s ago
       Docs: man:knockd(1)
   Main PID: 6555 (knockd)
      Tasks: 1 (limit: 2353)
     Memory: 296.0K
     CGroup: /system.slice/knockd.service
             └─6555 /usr/sbin/knockd -i eth0

Aug 15 13:26:31 ubuntu2004 systemd[1]: Started Port-Knock Daemon.
Aug 15 13:26:31 ubuntu2004 knockd[6555]: starting up, listening on eth0

第 3 步 – 安装和配置 Iptables

Knockd 使用 Iptables 规则来打开和关闭 SSH 端口,因此我们需要在服务器上安装 Iptables 包。

运行以下命令安装 Iptables 包:

apt-get install iptables iptables-persistent -y

安装软件包后,创建一个 Iptables 规则以阻止所有用户的 SSH 端口 22:

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j REJECT

接下来,保存 Iptables 规则并使用以下命令重新加载它:

netfilter-persistent save
netfilter-persistent reload

此时,在我们的服务器中为 OpenSSH 配置了端口敲击。

第 4 步 – 从客户端系统检查 OpenSSH 连接

接下来,进入客户端系统,检查 OpenSSH 22 端口是否被阻塞。

我们可以使用 NMAP 命令检查它:

nmap wer-server-ip

我们应该看到在服务器上过滤了端口 22。

Nmap scan report for wer-server-ip
Host is up (0.38s latency).
Not shown: 998 closed ports
PORT   STATE    SERVICE
21/tcp open     ftp
22/tcp filtered ssh
Nmap done: 1 IP address (1 host up) scanned in 277.58 seconds

现在,尝试使用来自客户端计算机的 SSH 连接到我们的服务器:

ssh root@wer-server-ip

我们应该看到连接被拒绝消息:

ssh: connect to host wer-server-ip port 22: Connection refused

第 5 步 – 在客户端上配置 Knockd 以连接 SSH 服务器

现在我们需要在客户端系统上安装 Knock 客户端以连接到 SSH 服务器。

首先,运行以下命令安装 Knockd 客户端包:

apt-get install knockd -y

现在使用以下敲击序列打开服务器上的 SSH 端口 22。

knock -v wer-server-ip 7777 8888 9999

当我们的服务器收到我们在 Knockd 配置文件中定义的正确序列时,它将为我们的客户端计算机打开 SSH 端口 22,我们将能够连接到 SSH 服务器。

ssh root@wer-server-ip

在远程 SSH 服务器上完成任务后,我们可以从客户端计算机使用以下序列再次关闭 SSH 端口。

knock -v wer-server-ip 9999 8888 7777

在上面的指南中,我们学习了如何使用端口敲门保护 SSH 服务器。 我们可以使用相同的方法来保护 Linux 服务器上的其他端口。 在 的 VPS 主机上试一试!

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
评论 抢沙发

请登录后发表评论