用 Rust 实现的端口敲门工具: Knock

296 天前
 timothyye

周末想用最近学的 Rust 来练手一下,于是参考一个很古老的 C 语言实现的端口敲门程序 knock,用 Rust 实现了一个版本。

Port Knocking 是一种网络安全技术,通过对服务器上的一系列预定义端口进行特定顺序的“敲门”(即发送数据包)来触发服务器上的一种反应,通常是打开一个原本关闭的端口,从而允许发起敲门序列的客户端建立连接。这种方法的优点在于,对外界而言,受保护的服务端口在没有接收到正确的敲门序列之前都是不可见的,从而增加了系统的安全性。

这个工具分为客户端和服务器端两部分:

服务器端 (knockd): 在服务器上运行,负责监听预设的一系列端口上的敲门尝试。当它检测到来自同一 IP 的特定序列时,会执行配置文件中定义的命令,如修改防火墙规则来允许来自该 IP 的连接。

客户端 (knock-cli): 用于发起敲门序列。用户可以通过客户端配置文件指定目标服务器地址和敲门的端口序列。执行敲门动作后,如果服务器端正确识别了敲门序列,客户端的 IP 地址将被允许访问原本隐藏或受限的服务。

项目地址: https://github.com/TimothyYe/knock

欢迎 Star 和贡献 Pull Request.

3853 次点击
所在节点    分享创造
33 条回复
ZnductR0MjHvjRQ3
295 天前
@timothyye 那这样的话是不是 vps 没法用这个呀 vps 似乎不像是 ECS 有独立的网卡
timothyye
295 天前
@Motorola3 #21 有的,一般就是 VPS 里面绑定公网 IP 那个网卡,你可以用 ifconfig 看看。我测试这个服务端就是用的 VPS
a1210968738
295 天前
@timothyye 是的
timothyye
295 天前
@a1210968738 这样的话相当于封装了个 iptables 的网页版的功能?
xianzhe
295 天前
感觉五楼的疑问有道理,怎么防止流量重放攻击?
timothyye
295 天前
@8520ccc @xianzhe 不过按照现在的实现,服务端检查客户端的敲门行为是在 TCP 握手的第一阶段,客户端向服务器发送一个 SYN (同步)数据包的时候,这样服务端不用去监听任何端口,也不用占用任何端口。至于如果这种 TCP 握手的包被记录下来重放的话,那应该是防范不了。不过这里提到的密钥加密是指要加密这种 SYN 的数据包吗?

其实如果就算通过流量重放敲门正确打开了服务端的端口,比如 ssh 端口,ssh 本身也有自己的保护和认证。这种端口敲门主要的场景还是防止互联网上大批量的端口扫描和密码暴力猜解的行为。
iqoo
295 天前
命令行版的用在特定用户的场合可以,如果是给公共用户使用就有些麻烦,得下载一个敲门工具。

之前做了个网页版的演示,直接用 JS 发 UDP 包敲门: https://www.etherdream.com/port-knocking/
iqoo
295 天前
可以在这个基础上加强一下,前后端都用 rust 实现。前端编译成 wasm 生成敲门认证串,后端用同一套算法解串,成功后把 ip 加到 ipset 白名单里。
a1210968738
295 天前
@timothyye 对,这样不需要额外的客户端,实用性和易用性都好很多
timothyye
295 天前
@iqoo #27 这样的话服务端需要先监听某个端口来获取网页的 UDP 包?
看来设计的理念有点不同,我是希望服务端不监听和占用任何端口
iqoo
295 天前
@timothyye 不用监听。配个 iptables 策略直接把包从内核转到用户态就可以。或者用 libpcap 抓符合条件的包也可以,目标端口可以任意。
timothyye
294 天前
@timothyye #30 学习了
matate
294 天前

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1020251

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX