这个神秘的端口敲门术,让你的服务器隐身术拉满!
前段时间写了一篇关于敲门协议的文章,有粉丝分享了 FireWall Knock OPerator,简称fwknop,感谢这位粉丝的分享!我便花时间学习了下。项目地址:https://github.com/mrash/fwknop
什么是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
安装完成后,主要的配置文件在/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
服务端配置:
编辑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端口进行测试测试:
配置完成后,使用起来就很简单了。假设我要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。如果你们在使用过程中遇到什么问题,或者有什么好的经验分享,欢迎在评论区交流讨论。
技术这东西就是要多实践多交流,才能不断进步。我也还在学习的路上,和大家一起成长。
如果这篇文章对你有帮助,别忘了点赞转发支持一下!想了解更多运维实战经验和技术干货,记得关注微信公众号@运维躬行录,领取学习大礼包!!!我会持续分享更多接地气的运维知识和踩坑经验。让我们一起在运维这条路上互相学习,共同进步!
公众号:运维躬行录
个人博客:躬行笔记