如何在 Linux 上使用端口敲门(以及为什么不应该)如何在 Linux 上使用端口敲门(以及为什么不应该)如何在 Linux 上使用端口敲门(以及为什么不应该)如何在 Linux 上使用端口敲门(以及为什么不应该)
  • 文章
  • 正则表达式
    • 工具
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容
发表 admin at 2025年2月28日
类别
  • 未分类
标签

如何在 Linux 上使用端口敲门(以及为什么不应该)

端口敲门是一种通过关闭防火墙端口来保护服务器的方法——即使是那些您知道会被使用的端口。当且仅当连接请求提供秘密敲门时,这些端口才会按需打开。

港口敲门是“秘密敲门”

在 20 年代,当禁酒令如火如荼时,如果你想进入地下酒吧,你必须知道秘密敲门声并正确敲出它才能进入。

端口敲门是现代的等价物。如果您希望人们可以访问您计算机上的服务但又不想向 Internet 打开防火墙,您可以使用端口敲门。它允许您关闭防火墙上允许传入连接的端口,并在进行预先安排的连接尝试模式时让它们自动打开。连接尝试的顺序充当秘密敲门声。另一个秘密敲门声关闭了港口。

端口敲门是一种新奇事物,但重要的是要知道它是通过默默无闻实现安全的一个例子,而这个概念从根本上是有缺陷的。如何访问系统的秘密是安全的,因为只有特定组中的人才知道。但是一旦这个秘密泄露出去——无论是因为它被揭露、观察、猜测还是解决——你的安全感就失效了。您最好以其他更强大的方式保护您的服务器,例如要求 SSH 服务器使用基于密钥的登录。

最强大的网络安全方法是多层的,因此,端口敲门或许应该是其中的一层。层数越多越好,对吧?然而,您可能会争辩说,端口碰撞并没有给一个适当加固的安全系统增加太多(如果有的话)。

网络安全是一个庞大而复杂的话题,但您不应该将端口敲门作为唯一的防御方式。

安装 knockd

为了演示端口碰撞,我们将使用它来控制端口 22,即 SSH 端口。我们将使用一个名为 knockd 的工具。如果您使用 Ubuntu 或其他基于 Debian 的发行版,请使用 apt-get 将此软件包安装到您的系统中。在其他 Linux 发行版上,请改用 Linux 发行版的包管理工具。

输入以下内容:

sudo apt-get install knockd

您可能已经在系统上安装了 iptables 防火墙,但您可能需要安装 iptables-persistent 包。它处理已保存的 iptable 规则的自动加载。

键入以下内容进行安装:

sudo apt-get install iptables-persistent

当 IPV4 配置屏幕出现时,按空格键接受“是”选项。

在 IPv6 配置屏幕中再次按空格键接受“是”选项并继续。

以下命令告诉 iptables 允许已建立和正在进行的连接继续。我们现在将发出另一个命令来关闭 SSH 端口。

如果在我们发出此命令时有人通过 SSH 连接,我们不希望他们被切断:

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

此命令向防火墙添加一条规则,即:

  • -A:将规则附加到防火墙规则表。也就是加到最下面。
  • INPUT:这是关于传入连接的规则。
  • -m conntrack:防火墙规则作用于符合规则条件的网络流量(数据包)。 -m 参数导致 iptables 使用额外的数据包匹配模块——在这种情况下,名为 conntrack 的模块与网络连接跟踪功能一起工作内核。
  • –cstate ESTABLISHED,RELATED:指定规则将应用的连接类型,即 ESTABLISHED 和 RELATED 连接。已建立的连接是已经在进行中的连接。相关连接是由于已建立连接的操作而建立的连接。也许连接的某个人想要下载一个文件;这可能发生在主机发起的新连接上。
  • -j ACCEPT:如果流量符合规则,则跳转到防火墙中的ACCEPT目标。换句话说,流量被接受并允许通过防火墙。

现在我们可以发出关闭端口的命令:

sudo iptables -A INPUT -p tcp --dport 22 -j REJECT

此命令向防火墙添加一条规则,即:

  • -A:将规则附加到防火墙规则表中,即添加到底部。
  • INPUT:此规则与传入连接有关。
  • -p tcp:此规则适用于使用传输控制协议的流量。
  • –dport 22:此规则特别适用于以端口 22(SSH 端口)为目标的 TCP 流量。
  • -j REJECT:如果流量符合规则,则跳转到防火墙中的REJECT目标。因此,如果流量被拒绝,则不允许它通过防火墙。

我们必须启动 netfilter-persistent 守护程序。我们可以用这个命令来做到这一点:

sudo systemctl start netfilter-persistent

我们希望 netfilter-persistent 经历保存和重新加载周期,因此它加载并控制 iptable 规则。

键入以下命令:

sudo netfilter-persistent save
sudo netfilter-persistent reload

您现在已经安装了实用程序,并且 SSH 端口已关闭(希望不会终止任何人的连接)。现在,是时候配置秘密敲门了。

配置敲门

您可以编辑两个文件来配置 knockd。第一个是以下 knockd 配置文件:

sudo gedit /etc/knockd.conf

gedit 编辑器打开,加载了 knockd 配置文件。

我们将编辑此文件以满足我们的需要。我们感兴趣的部分是“openSSH”和“closeSSH”。每个部分中有以下四个条目:

  • sequence:打开或关闭端口 22 必须访问的端口顺序。默认端口为 7000、8000 和 9000 用于打开它,9000、8000 和 7000 用于关闭它.您可以更改这些或将更多端口添加到列表中。出于我们的目的,我们将坚持使用默认值。
  • seq_timeout:有人必须访问端口以触发它打开或关闭的时间段。
  • command:触发打开或关闭动作时发送到iptables防火墙的命令。这些命令要么向防火墙添加规则(以打开端口),要么将其删除(以关闭端口)。
  • tcpflags:每个端口在秘密序列中必须接收的数据包类型。 SYN(同步)数据包是 TCP 连接请求中的第一个数据包,称为三向握手。

“openSSH”部分可以理解为“必须在 5 秒内按顺序向端口 7000、8000 和 9000 发出 TCP 连接请求,以便将打开端口 22 的命令发送到防火墙。”

“closeSSH”部分可以理解为“必须在 5 秒内按顺序向端口 9000、8000 和 7000 发出 TCP 连接请求,以便将关闭端口 22 的命令发送到防火墙。”

防火墙规则

除了一个参数外,openSSH 和 closeSSH 部分中的“命令”条目保持不变。它们是这样组成的:

  • -A:将规则附加到防火墙规则列表的底部(对于 openSSH 命令)。
  • -D:从防火墙规则列表中删除命令(针对closeSSH命令)。
  • INPUT:此规则与传入网络流量有关。
  • -s %IP%:请求连接的设备的IP地址。
  • -p:网络协议;在这种情况下,它是 TCP。
  • –dport:目的端口;在我们的示例中,它是端口 22。
  • -j ACCEPT:跳转到防火墙内的接受目标。换句话说,让数据包通过其余规则丢弃而不对其采取任何行动。

knockd 配置文件编辑

我们将对文件进行的编辑在下面以红色突出显示:

我们将“seq_timeout”延长至 15 秒。这很慷慨,但如果有人手动触发连接请求,他可能需要这么多时间。

在“openSSH”部分,我们将命令中的-A(附加)选项更改为-I(插入)。此命令在防火墙规则列表的顶部 插入一个新的防火墙规则。如果您保留 -A 选项,它会附加防火墙规则列表并将其放在底部。

传入流量根据列表中的每个防火墙规则从上到下进行测试。我们已经有一个关闭端口 22 的规则。因此,如果传入流量在看到允许流量的规则之前根据该规则进行测试,则连接将被拒绝;如果它首先看到这条新规则,则允许连接。

close 命令从防火墙规则中删除 openSSH 添加的规则。 SSH 流量再次由预先存在的“端口 22 已关闭”规则处理。

进行这些编辑后,保存配置文件。

knockd 控制文件编辑

knockd 控制文件非常简单。不过,在我们深入研究和编辑之前,我们需要知道网络连接的内部名称;要找到它,请键入以下命令:

ip addr

这台机器用来研究这篇文章的连接称为 enp0s3。记下您的连接名称。

以下命令编辑 knockd 控制文件:

sudo gedit /etc/default/knockd

这是 gedit 中的 knockd 文件。

我们需要进行的少量编辑以红色突出显示:

我们将“START_KNOCKD=”条目从 0 更改为 1。

我们还从“KNOCKD_OPTS=”条目的开头删除了哈希值 #,并将“eth1”替换为我们的网络连接名称 enp0s3。当然,如果您的网络连接是 eth1,则不会更改它。

证据就在布丁里

是时候看看这是否有效了。我们将使用以下命令启动 knockd 守护进程:

sudo systemctrl start knockd

现在,我们将跳到另一台机器上并尝试连接。我们在那台计算机上也安装了 knockd 工具,不是因为我们要设置端口敲门,而是因为 knockd 包提供了另一个名为 knock。我们将使用这台机器在我们的秘密序列中开火并为我们敲门。

使用以下命令将您的连接请求的秘密序列发送到 IP 地址为 192.168.4.24 的端口敲门主机上的端口:

knock 192.168.4.24 7000 8000 9000 -d 500

这告诉 knock 将 IP 地址为 192.168.4.24 的计算机作为目标,并依次向端口 7000、8000 和 9000 发出连接请求,并使用 -d(延迟) 500 毫秒之间。

然后,名为“dave”的用户向 192.168.4.24 发出 SSH 请求:

ssh dave@192.168.4.24

他的连接被接受,他输入密码,然后他的远程会话开始。他的命令提示符从 dave@nostromo 更改为 dave@howtogeek。要退出远程计算机,他键入:

exit

他的命令提示符返回到他的本地计算机。他再次使用 knock,这一次,它以相反的顺序针对端口关闭远程计算机上的 SSH 端口。

knock 192.168.4.24 9000 8000 7000 -d 500

诚然,这不是一个特别富有成效的远程会话,但它演示了通过端口敲门打开和关闭端口,并适合单个屏幕截图。

那么,从另一面看这是什么样的呢?端口碰撞主机上的系统管理员使用以下命令查看到达系统日志的新条目:

tail -f /var/log/syslog

  • 您会看到三个 openSSH 条目。当每个端口都是远程敲门实用程序的目标时,就会引发这些问题。
  • 当满足触发序列的所有三个阶段时,将记录一条“OPEN SESAME”条目
  • 将规则插入iptables 规则列表的命令已发送。它允许通过端口 22 上的 SSH 从提供正确秘密敲门的 PC 的特定 IP 地址 (192.168.4.23) 进行访问。
  • 用户“dave”只连接了几秒钟,然后就断开了。
  • 您会看到三个 closeSSH 条目。当每个端口都是远程敲门实用程序的目标时,这些就会被引发——它告诉端口敲门主机关闭端口 22。
  • 所有三个阶段都被触发后,我们再次收到“OPEN SESAME”消息。该命令被发送到防火墙以删除规则。 (为什么在关闭端口时不“CLOSE SESAME”?谁知道呢?)

现在 iptables 规则列表中关于端口 22 的唯一规则是我们在开始时键入的关闭该端口的规则。因此,端口 22 现在再次关闭。

敲它的头

这是港口敲门的客厅把戏。把它当作一种消遣,不要在现实世界中这样做。或者,如果必须,不要将其作为唯一的安全形式。

©2015-2025 艾丽卡 support@alaica.com