您的系统上可能已经安装了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 save
sudo 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现在再次关闭。
敲它的头
那是波特敲门的会客室把戏。把它当作一种消遣,不要在现实世界中这样做。或者,如果你必须的话,不要依赖它作为你唯一的安全形式。