如何在 Debian 10 上使用端口敲门序列来隐藏网络端口
在此页
- 要求
- 第 1 步:安装 Knockd
- 第 2 步:Knockd 配置
- 第 3 步:防火墙规则
- 第 4 步:测试
- 替代配置
- 结论
端口敲门是一种通过在预定义的端口序列上“敲门”(即连接)来动态打开网络端口的方法。这对于在端口扫描中隐藏开放的网络端口特别有用,因为除非执行端口敲击序列,否则相关端口将被关闭。足够长的端口敲击序列实际上不可能通过暴力破解:例如,要成功猜出(通过暴力破解)3 个 TCP 端口的组合,攻击者必须尝试敲击 281 万亿种可能组合中的每一种,然后扫描在每个端口敲击序列后打开端口。正如您可能想象的那样,这将花费非常非常长的时间。
本指南将帮助您在 Debian 10 上安装 knockd,这是一个灵活的端口敲门守护进程。出于演示目的,我们将其配置为隐藏 SSH 端口,但可以使用此方法保护任何其他端口/服务。
要求
- 运行 Debian 10 的服务器。
- 对您的服务器的根访问权限。
- 应该设置 $EDITOR 环境变量。
- 用于测试的第二个系统。
注意:如果您打算使用端口敲门来隐藏 SSH 端口,请确保您有其他访问方法(例如通过控制台),如果您不小心将自己锁在外面,它会派上用场。
在安装 knockd 之前,请使用以下命令检查系统公共网络接口的名称:
ip link show | grep -v lo
2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
记下接口名称(在本例中为 ens18)。稍后将需要它。
第 1 步:安装 Knockd
knockd 是一个端口敲门守护进程,它监听连接并相应地打开端口。我们将使用带有 iptables 规则的 knockd 来实现端口碰撞。安装所需的包如下:
apt update
apt install knockd iptables-persistent
第 2 步:Knockd 配置
Knockd 使用单个配置文件 /etc/knockd.conf 来定义敲击序列和其他参数。有两种实用的操作模式。第一个需要单个敲击序列来打开和关闭预定义端口,而另一个使用单独的打开和关闭序列。我们将使用前者,因为它需要较少的用户交互。
首先,备份现有的配置文件:
mv /etc/knockd.conf /etc/knockd.conf.bak
其次,在文本编辑器中打开配置文件:
$EDITOR /etc/knockd.conf
并输入如下所示的配置:
(将 ens18 替换为您的网络接口名称。)
[options]
UseSyslog
Interface = ens18
[SSH]
sequence = 1000,2000,3000
seq_timeout = 15
tcpflags = syn
start_command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
stop_command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
cmd_timeout = 20
这将指示 knockd 在收到正确的 knock 序列(在本例中为 1000,2000,3000)后启用到端口 22 的流量,然后在 20 秒延迟后重新禁用流量。因此,SSH 连接将仅在这 20 秒的窗口期间被接受。
接下来,通过编辑文件 /etc/default/knockd 来启用 knockd:
$EDITOR /etc/default/knockd
并将 START_KNOCKD 设置为 1:
START_KNOCKD=1
保存文件并退出。我们还将修改 knockd 的 systemd 单元。为此,创建一个新的单元文件来覆盖默认值:
$EDITOR /etc/systemd/system/knockd.service
并粘贴以下内容:
[Unit]
Description=Port-Knock Daemon
After=network.target
Requires=network.target
Documentation=man:knockd(1)
[Service]
EnvironmentFile=-/etc/default/knockd
ExecStartPre=/usr/bin/sleep 1
ExecStart=/usr/sbin/knockd $KNOCKD_OPTS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
Restart=always
SuccessExitStatus=0 2 15
ProtectSystem=full
CapabilityBoundingSet=CAP_NET_RAW CAP_NET_ADMIN
[Install]
WantedBy=multi-user.target
然后使用以下命令加载并启用新单元:
systemctl daemon-reload
systemctl enable --now knockd.service
第 3 步:防火墙规则
此时,Knockd 已准备就绪,但默认情况下会启用所有流量通过防火墙。我们将创建防火墙规则以拒绝访问端口 22/tcp。
以下命令确保现有连接不会中断。
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
以下是断开与端口 22/tcp 的连接的规则:
iptables -A INPUT -p tcp --destination-port 22 -j DROP
ip6tables -A INPUT -p tcp --destination-port 22 -j DROP
然后,保存当前规则链以在重启后保持持久性:
iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6
第 4 步:测试
从不同的系统,尝试启动一个新的 SSH 会话到您的服务器。您应该无法连接。要执行敲门序列,可以使用不同的工具,尽管我们将使用敲门进行演示,这是 Knockd 中包含的敲门客户端。将步骤 1 中所示的 knockd 包安装到不同的系统,然后执行命令:
knock server_ip_address 1000 2000 3000
ssh _ip_address
SSH 连接现在应该会成功。
替代配置
Knockd 也可以配置为需要两个不同的序列来打开和关闭网络端口。如果您想长时间保持端口打开,这很有用。要以这种方式配置 Knockd,请打开其配置文件:
$EDITOR /etc/knockd.conf
并用以下内容替换现有配置:
[options]
UseSyslog
Interface = your_interface
[openSSH]
sequence = 1000,2000,3000
seq_timeout = 15
tcpflags = syn
start_command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
[closeSSH]
sequence = 3000,2000,1000
seq_timeout = 15
tcpflags = syn
start_command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
然后重新启动服务以加载新配置:
systemctl restart knockd.service
结论
Knockd 可以成为暴力攻击的有效解决方案,暴力攻击在 SSH 和其他服务上非常常见。即使 systemd 会在失败时重新启动 Knockd,如果您使用端口敲门来隐藏 SSH 端口,您应该始终有一种访问服务器的备份方法。