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

已发表: 2022-01-29
手敲着一扇紧闭的门。
摄影者.eu/Shutterstock

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

端口敲门是一种“秘密敲门”

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

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

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

广告

最强大的网络安全方法是多层次的,因此,端口敲门可能应该是这些层次之一。 层数越多越好,对吧? 但是,您可能会争辩说,端口敲击不会对适当强化的安全系统增加太多(如果有的话)。

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

相关:如何从 Linux Shell 创建和安装 SSH 密钥

安装敲门

为了演示端口敲击,我们将使用它来控制端口 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 配置屏幕出现时,按空格键接受“是”选项。

按空格键接受 iptables-persistent IPV4 屏幕中的“是”选项。

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

按空格键接受 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-持久保存

 sudo netfilter-持久重新加载

广告

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

配置 knockd

您可以编辑两个文件来配置knockd 。 首先是下面的knockd配置文件:

 须藤 gedit /etc/knockd.conf 

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

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 配置文件编辑

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

gedit 编辑器中的 knockd 配置文件,其中突出显示了编辑。

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

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

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

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

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

相关:如何在 Linux 上使用 gedit 以图形方式编辑文本文件

knockd 控制文件编辑

knockd控制文件更简单。 然而,在我们深入并编辑它之前,我们需要知道我们的网络连接的内部名称; 要找到它,请键入以下命令:

 ip地址

广告

本机用于研究本文的连接称为enp0s3 。 记下您的连接名称。

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

 sudo gedit /etc/default/knockd 

这是gedit中的knockd文件。

gedit 中的 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 的端口敲击主机上的端口:

 敲 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 戴夫@192.168.4.24

他的连接被接受,他输入他的密码,他的远程会话开始。 他的命令提示符从dave@nostromo变为dave@howtogeek 。 要注销远程计算机,他键入:

 出口

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

 敲 192.168.4.24 9000 8000 7000 -d 500 

广告

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

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

 尾 -f /var/log/syslog 

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

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

敲它的头

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