如何在 Debian 10 上使用端口敲门序列来隐藏网络端口如何在 Debian 10 上使用端口敲门序列来隐藏网络端口如何在 Debian 10 上使用端口敲门序列来隐藏网络端口如何在 Debian 10 上使用端口敲门序列来隐藏网络端口
  • 文章
  • 正则表达式
    • 工具
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

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

如何在 Debian 10 上使用端口敲门序列来隐藏网络端口

在此页

  1. 要求
  2. 第 1 步:安装 Knockd
  3. 第 2 步:Knockd 配置
  4. 第 3 步:防火墙规则
  5. 第 4 步:测试
  6. 替代配置
  7. 结论

端口敲门是一种通过在预定义的端口序列上“敲门”(即连接)来动态打开网络端口的方法。这对于在端口扫描中隐藏开放的网络端口特别有用,因为除非执行端口敲击序列,否则相关端口将被关闭。足够长的端口敲击序列实际上不可能通过暴力破解:例如,要成功猜出(通过暴力破解)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 端口,您应该始终有一种访问服务器的备份方法。

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