运维知识
悠悠
2025年9月14日

这个神秘的端口敲门术,让你的服务器隐身术拉满!

前段时间写了一篇关于敲门协议的文章,有粉丝分享了 FireWall Knock OPerator,简称fwknop,感谢这位粉丝的分享!我便花时间学习了下。项目地址:https://github.com/mrash/fwknop

image-20250913164702170

什么是fwknop

fwknop全称是FireWall Knock OPerator,听起来很高大上对吧?其实说白了就是一个基于单包授权(SPA - Single Packet Authorization)的端口敲门工具。

传统的端口敲门(port knocking)大家可能都听过,就是按照特定的顺序敲击几个端口,防火墙检测到正确的敲门序列后就临时开放目标端口。但这种方式有个问题,就是敲门的过程可能被监听和重放攻击。

fwknop就不一样了,它只需要发送一个加密的数据包,这个包里包含了所有必要的信息:要访问的端口、访问时长、时间戳、还有各种验证信息。服务器收到这个包后,验证通过就临时开放对应的端口给你的IP。

我记得第一次用这个工具的时候,感觉就像在玩谍战片一样,发个暗号就能打开秘密通道,贼有意思。

fwknop的工作原理

说到工作原理,其实也不复杂。整个过程分为客户端和服务端两部分。

客户端这边,你需要先配置好要访问的服务器信息和密钥,然后运行fwknop命令。这时候客户端会生成一个SPA包,这个包里面包含了:

  • 当前时间戳
  • 要访问的端口和协议
  • 客户端IP(可选)
  • 访问持续时间
  • 还有一堆加密和认证的数据

这个包会被发送到服务器的指定端口,通常是UDP 62201。

服务器这边运行着fwknopd守护进程,它会监听这个端口。收到SPA包后,守护进程会:

  • 解密数据包
  • 验证时间戳(防重放攻击)
  • 检查HMAC签名
  • 验证访问权限

如果一切都OK,fwknopd就会调用iptables或者其他防火墙工具,临时添加一条规则,允许发送方的IP访问指定的端口。过了设定的时间后,这条规则会被自动删除。

整个过程对外界来说几乎是透明的,因为SPA包看起来就像是随机的网络噪音。

安装配置过程

好了,说了这么多理论,咱们来实际操作一下。我以Rocky Linux release 8.10(老演员了)为例,其他发行版的安装过程大同小异。

服务端安装

首先在服务器上安装fwknop-server:

#下载源码
wget http://www.cipherdyne.org/fwknop/download/fwknop-2.6.8.tar.gz
#解压源码
tar -xf fwknop-2.6.8.tar.gz
#编译
cd fwknop-2.6.8/
#安装,如果你的客户端也是Linux,安装的时候去掉--disable-client
./configure --prefix=/usr --sysconfdir=/etc --disable-client
#安装
make && make install

image-20250913170045231

image-20250913170053137

image-20250913170100161

安装完成后,主要的配置文件在/etc/fwknop/目录下:

  • fwknopd.conf - 主配置文件
  • access.conf - 访问控制配置

先来配置主配置文件。我一般会修改这几个关键参数:

PCAP_INTF                   ens33;

然后是访问控制配置文件access.conf,这个文件定义了哪些客户端可以访问哪些服务:

SOURCE                      ANY;
KEY_BASE64                  your_base64_encoded_key_here;
HMAC_KEY_BASE64            your_hmac_key_here;
FW_ACCESS_TIMEOUT          30;
REQUIRE_SOURCE_ADDRESS     Y;

客户端配置

接下来是安装客户端,先说Linux系统的客户端安装方法,因为安装客户端的方法和安装服务的是步骤完全一致

#把上面服务端的安装步骤加上--disable-server,不加也行,那就是服务端客户端一起安装
./configure --prefix=/usr --sysconfdir=/etc --disable-server

客户端生成配置文件:

fwknop -A tcp/22 -a 192.168.198.128 -D 192.168.198.130 -p 62201 -P udp --key-gen --use-hmac --save-rc-stanza

image-20250913172706576

image-20250913172816786

服务端配置:

编辑sudo vim /etc/fwknop/access.conf文件,修改里面的内容如下:

OPEN_PORTS            tcp/22
FW_ACCESS_TIMEOUT     20
SOURCE              ANY
#KEY_BASE64          __CHANGEME__
#HMAC_KEY_BASE64     __CHANGEME__
KEY_BASE64              O7/vpasJBtZr9OtLe5Y2ePLyL3KPPgO0U1moRPhVc2U=
HMAC_KEY_BASE64         jdTRuJYdVPHZRKMvhoi+zW70WHTU853MCD3o85DcLtmfZZG1T3rUPxlXzNUzPyQru/1WgOaHkyRwkef9O8jHbg==

里面的两个KEY必须和客户端的保持一致,否则会验证不过。

FW_ACCESS_TIMEOUT设置20表示敲门,门开会保持20s,20s过了以后,门关闭

配置完成后,启动服务端守护进程:

systemctl start fwknopd
systemctl enable fwknopd

实际使用体验

关闭22端口进行测试测试:

image-20250913175534886

配置完成后,使用起来就很简单了。假设我要SSH连接到服务器,首先发送SPA包:

fwknop -n 192.168.198.130

如果一切正常,你会看到类似这样的输出:

[+] Starting fwknop client (SPA mode)...
[+] Resolving hostname: your_server_ip
[+] SPA packet sent successfully

然后就可以正常SSH连接了:

ssh root@192.168.198.130

我刚开始用的时候,经常忘记先发SPA包就直接SSH,结果当然是连接超时。后来养成习惯了,每次连接前都先敲个门,感觉还挺有仪式感的。

有时候我会写个小脚本把这两个步骤合并:

#!/bin/bash
fwknop -n 192.168.198.130 && sleep 2 && ssh root@192.168.198.130

这样就不用每次都手动执行两个命令了。

高级配置技巧

我发现fwknop还有很多高级功能可以玩。

多端口访问

有时候你可能需要同时访问SSH和Web服务,可以在SPA包中指定多个端口:

fwknop -A tcp/22,tcp/80,tcp/443 -D your_server_ip

或者在配置文件中设置:

ACCESS                      tcp/22,tcp/80,tcp/443

时间窗口控制

默认的访问超时时间是30秒,但你可以根据需要调整。比如我有时候需要做一些耗时较长的操作,就会把超时时间设长一点:

fwknop -A tcp/22 -f 300 -D your_server_ip

这样就设置了5分钟的访问窗口。

IP地址限制

为了更安全,可以限制只有特定IP才能访问:

SOURCE                      192.168.1.100;
REQUIRE_SOURCE_ADDRESS     Y;

这样即使别人拿到了你的密钥,也无法从其他IP访问。

命令执行

这个功能比较危险,但在某些场景下很有用。你可以让SPA包触发服务器执行特定的命令:

CMD_EXEC_USER              nobody;
CMD_EXEC                   /path/to/your/script.sh;

我之前用这个功能做过一个自动备份的触发器,客户端发送特定的SPA包,服务器就开始执行备份脚本。

遇到的坑和解决方案

说实话,fwknop虽然功能强大,但配置过程中还是会遇到一些坑的。

时间同步问题

最常见的问题就是时间同步。SPA包里包含时间戳,如果客户端和服务端的时间差太大,认证就会失败。我之前就因为这个问题折腾了半天,最后发现是服务器的时间慢了几分钟。

解决方案就是确保两边都配置了NTP:

# 安装NTP
yum install ntp
# 同步时间
ntpdate pool.ntp.org
# 启动NTP服务
systemctl start ntpd
systemctl enable ntpd

防火墙规则冲突

有时候现有的iptables规则会和fwknop产生冲突。我遇到过一次,fwknop添加的规则被其他规则覆盖了,导致即使认证成功也无法访问。

这种情况下需要仔细检查iptables规则的顺序,确保fwknop添加的规则能够生效:

iptables -L -n --line-numbers

网络环境限制

在某些网络环境下,UDP包可能被过滤或者修改,导致SPA包无法正常传输。我在一个比较严格的企业网络环境中就遇到过这个问题。

解决方案是使用TCP模式:

fwknop -P tcp -A tcp/22 -D your_server_ip

相应地,服务端配置也要修改:

PCAP_FILTER                 tcp port 62201;

安全性分析

从安全角度来看,fwknop确实比传统的端口敲门要强很多。

首先,SPA包是加密的,即使被截获也很难破解。而且每个包都包含时间戳,可以有效防止重放攻击。我测试过,即使在同一个网络环境下抓包,也很难从SPA包中提取出有用的信息。

另外,fwknop支持多种加密算法,包括AES、Blowfish等。我一般用AES-256,安全性足够了。HMAC认证也增加了额外的安全层,确保数据包的完整性。

但是话说回来,任何安全工具都不是万能的。fwknop也有一些潜在的风险点需要注意。

密钥管理

这是最关键的一点。如果密钥泄露了,整个防护就形同虚设。我的做法是定期更换密钥,特别是在有人员变动的时候。

还有就是密钥的存储,不要明文保存在容易被访问的地方。我一般会把客户端配置文件的权限设置为600:

chmod 600 ~/.fwknoprc

拒绝服务攻击

虽然fwknop可以防止端口扫描,但攻击者仍然可以通过发送大量伪造的SPA包来消耗服务器资源。不过这种攻击的成本比较高,而且fwknopd的处理效率还是很高的,一般不会造成太大影响。

如果真的遇到这种攻击,可以通过iptables限制单个IP的连接频率:

iptables -A INPUT -p udp --dport 62201 -m limit --limit 5/min -j ACCEPT
iptables -A INPUT -p udp --dport 62201 -j DROP

网络监听

虽然SPA包是加密的,但攻击者还是可以通过流量分析来获取一些信息,比如你什么时候访问服务器,访问频率等等。

对于这种情况,可以考虑使用VPN或者Tor来隐藏真实的网络流量。当然,这样做会增加复杂性,需要根据实际的安全需求来权衡。

写在最后

写了这么多,感觉还有很多细节没有涉及到。fwknop确实是一个功能丰富的工具,值得深入研究。

从我的使用经验来看,fwknop最大的优点就是简单有效。配置虽然稍微复杂一点,但一旦配置好了,使用起来非常方便。而且安全性确实比直接暴露端口要好很多。

当然,它也不是万能的,不适合所有场景。如果你的服务需要频繁的外部访问,或者有很多不同的客户端,fwknop可能就不太合适了。但对于个人服务器或者小团队的内部服务,我觉得还是很值得尝试的。

最重要的是,任何安全工具都需要正确配置和使用才能发挥作用。不要指望一个工具就能解决所有安全问题,最好的做法是多层防护,fwknop只是其中的一环。

而且安全是一个持续的过程,不是一次性的工作。需要定期更新配置,监控日志,跟上最新的安全威胁和防护技术。

希望这篇文章能帮助大家更好地理解和使用fwknop。如果你们在使用过程中遇到什么问题,或者有什么好的经验分享,欢迎在评论区交流讨论。

技术这东西就是要多实践多交流,才能不断进步。我也还在学习的路上,和大家一起成长。


如果这篇文章对你有帮助,别忘了点赞转发支持一下!想了解更多运维实战经验和技术干货,记得关注微信公众号@运维躬行录,领取学习大礼包!!!我会持续分享更多接地气的运维知识和踩坑经验。让我们一起在运维这条路上互相学习,共同进步!

公众号:运维躬行录

个人博客:躬行笔记

文章目录

博主介绍

热爱技术的云计算运维工程师,Python全栈工程师,分享开发经验与生活感悟。
欢迎关注我的微信公众号@运维躬行录,领取海量学习资料

微信二维码