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

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

敲门是一种“秘密敲门”

在20世纪20年代,当禁酒令如火如荼地进行时,如果你想进入一家地下酒吧,你必须知道秘密,并正确地敲击它才能进入。

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

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

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

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

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

安装Knockd

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

键入以下内容:

sudo apt-get install knockd

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

键入以下命令进行安装:

sudo apt-get install iptables-persistent

出现IPv4配置屏幕时,按空格键接受“Yes”选项。

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

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

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

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

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

-A:将规则追加到防火墙规则表中。也就是说,把它加到底部。 输入:这是关于传入连接的规则。 -m连接跟踪:防火墙规则作用于与规则中的条件匹配的网络流量(数据包)。-m参数会导致iptables使用额外的数据包匹配模块-在本例中,名为ConnTrack的模块使用内核的网络连接跟踪功能。 -cstate established,Related:这指定将应用规则的连接类型,即已建立连接和相关连接。已建立的连接是指已经在进行中的连接。相关连接是由于来自已建立连接的操作而建立的连接。可能已连接的某人想要下载文件;这可能通过主机发起的新连接实现。 -j Accept:如果流量与规则匹配,则跳转到防火墙中的Accept目标。也就是说,接受流量,允许流量通过防火墙。

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

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

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

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

我们必须启动netfilter-sistent守护进程。我们可以使用以下命令执行此操作:

sudo systemctl start netfilter-persistent

我们希望netfilter-Persistent应用程序经历保存和重新加载周期,这样它就可以加载和控制iptable规则。

键入以下命令:

sudo netfilter-persistent savesudo netfilter-persistent reload

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

配置Knockd

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

sudo gedit /etc/knockd.conf

Gedit编辑器打开,其中加载了KNOKKD配置文件。

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

Sequence:打开或关闭端口22必须访问的端口序列。默认端口为7000、8000和9000打开端口,9000、8000和7000关闭端口。您可以更改这些端口或将更多端口添加到列表中。出于我们的目的,我们将坚持使用默认值。 SEQ_TIMEOUT:用户必须访问端口才能触发端口打开或关闭的时间段。 命令:触发打开或关闭操作时发送到iptables防火墙的命令。这些命令可以向防火墙添加规则(打开端口),也可以取消规则(关闭端口)。 tcpflag:每个端口必须在秘密序列中接收的数据包类型。SYN(同步)数据包是TCP连接请求中的第一个数据包,称为三次握手。

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

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

防火墙规则

openSSH和closeSSH部分中的“command”条目保持不变,只有一个参数除外。以下是它们的组成方式:

-A:将规则附加到防火墙规则列表的底部(对于openSSH命令)。 -D:从防火墙规则列表中删除该命令(对于closeSSH命令)。 输入:此规则与传入的网络流量有关。 -s%ip%:请求连接的设备的IP地址。 -p:网络协议;在本例中为TCP。 -dport:目的端口;在我们的示例中,它是端口22。 -j Accept:跳转到防火墙内的Accept目标。换言之,让数据包通过其余规则丢弃,而不对其执行操作。

将编辑KNOKKD配置文件

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

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

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

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

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

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

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

将编辑KNOKKD控制文件

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

ip addr

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

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

sudo gedit /etc/default/knockd

这是Gedit中的KNOCKD文件。

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

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

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

证据就在布丁里

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

sudo systemctrl start knockd

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

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

knock 192.168.4.24 7000 8000 9000 -d 500

这告诉敲门将目标计算机定位在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

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

knock 192.168.4.24 9000 8000 7000 -d 500

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

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

tail -f /var/log/syslog

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

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

敲它的头

那是波特敲门的会客室把戏。把它当作一种消遣,不要在现实世界中这样做。或者,如果你必须的话,不要依赖它作为你唯一的安全形式。

相关文章