mbuesch/letmein

GitHub: mbuesch/letmein

一个基于 Rust 和 nftables 的带身份验证的端口敲门工具,用于在认证前隐藏服务端口以减少攻击面。

Stars: 51 | Forks: 4

# letmein - 带认证的端口/防火墙敲门 Letmein 是一个简单的端口敲门工具,具有简单且安全的身份验证机制。 它可以用于加固 SSH、VPN、IMAP 等服务,防止预认证攻击。 Letmein 将服务器上的服务隐藏在敲门认证屏障之后,以减少服务的攻击面。 除非敲门认证成功,否则服务将无法访问。 如果敲门成功,letmeind 服务器将仅为执行敲门的客户端 IP 地址打开被敲门的端口。 具有不同 IP 地址的机器仍然无法访问受保护的服务。 无法成功验证敲门序列的机器将无法访问受保护的服务。 在使用提供的示例 [nftables.conf](doc/nftables.conf) 时,它们将在受保护的服务端口上收到 ICMP `reject`(拒绝)。 (您也可以决定在您的 `nftables.conf` 中改为 `drop`(丢弃)数据包)。 Letmein 需要基于 `nftables` 的防火墙。 它*不*兼容 `iptables`。 如果您使用基于 `iptables` 的防火墙,请在安装 letmein 之前转换为 `nftables`。 互联网上有关于如何执行此操作的说明。 这并不像听起来那么困难和繁琐。 :) Letmein 的控制通信本身默认为 TCP 端口 5800,但可以配置为任何 TCP 或 UDP 端口。 如果您选择 UDP 端口作为控制端口并配置 [control-error-policy=basic-auth](doc/CONFIGURATION.md#control-error-policy),则 letmein 服务本身将以隐蔽模式运行,并且不响应未经身份验证的传入消息。 Letmein 可用于敲开单个端口,或通过在成功敲门后添加 `nftables` `jump` 语句来敲定启用完全用户自定义的 `nftables` 规则。 通过这种方式,您可以例如敲定启用转发规则或任意用户定义的防火墙规则。 ## 典型的 letmein 操作流程 ![image](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/63ed1a8a37094039.png) ## 网络协议和加密 有关线协议和所用加密的详细说明,请参阅 [协议文档](doc/PROTOCOL.md) ## 项目链接 [主页](https://bues.ch/h/letmein) [Git 仓库](https://bues.ch/cgit/letmein.git) [Github 仓库](https://github.com/mbuesch/letmein) ## 使用示例:将 OpenSSH (sshd) 访问置于敲门认证屏障之后 在服务器上安装 letmein 服务器软件(见下面的章节)。 在客户端上安装 letmein 客户端软件(见下面的章节)。 请阅读本项目提供的 [nftables.conf](doc/nftables.conf) 示例配置文件。 需要向您现有的 `nftables` 配置添加一个 letmein 专用的 input 链。 相应地修改您的 `nftables.conf`。 使用以下客户端命令生成要安装在服务器和客户端上的共享密钥和用户标识符: ``` letmein gen-key -u 00000000 ``` gen-key 命令会将生成的密钥字符串打印到控制台。 默认情况下,这将为用户标识符 `00000000` 生成一个安全的随机密钥。 如果您愿意,可以手动编辑用户标识符,或者直接保持原样。 将生成的字符串(用户标识符和共享密钥)添加到 `/opt/letmein/etc/letmeind.conf` 中的服务器配置中。 将生成的密钥字符串连同用户标识符一起放入配置文件的 `[KEYS]` 部分。 将相同的生成字符串(用户标识符和共享密钥)添加到 `/opt/letmein/etc/letmein.conf` 中的客户端配置中。 将生成的密钥字符串连同用户标识符一起放入配置文件的 `[KEYS]` 部分。 在服务器中创建一个描述可以打开的 `sshd` 端口的 `resource`(资源)。 在服务器配置文件 `/opt/letmein/etc/letmeind.conf` 的 `[RESOURCES]` 部分中,必须指定所有可能被打开的端口。一个资源由一个资源标识符后跟一个端口标识符组成,如下所示: ``` [RESOURCES] 00000022 = port: 22 ``` 资源标识符是一个 8 位十六进制数。在此示例中它是 22(hex),但它可以是任何数字。它只需在服务器和客户端上是相同的数字。在 `port:` 之后指定可以被敲开的端口号(十进制)。 将具有相同资源标识符和相同端口号的相同资源添加到 `/opt/letmein/etc/letmein.conf` 中的客户端配置中。 重启 letmein 服务器: ``` systemctl restart letmeind.service ``` 现在从您的 `nftables.conf` 防火墙配置中删除静态 `sshd` 端口 (22) `accept` 规则。 Letmein 将在成功敲门认证后动态地将此类规则安装到 letmein input 链中。 然后重启 nftables: ``` systemctl restart nftables.service ``` 完成!您现在应该能够敲开服务器上的 `sshd` 端口: ``` # 这必须失败!尚未成功 knock 认证。 # 如果未失败,请检查是否已从 nftables.conf 中移除 sshd accept 规则。 ssh your-server.com # 使用 user-id/key 00000000 Knock-open 服务器上的端口 22 (sshd): # (如果这是您的默认用户 (见 config),则不必指定 -u 00000000。) letmein knock -u 00000000 your-server.com 22 # 现在您应该能够成功 ssh 进入您的服务器: ssh your-server.com ``` 要在使用 ssh 连接之前自动敲击端口,您可以在 `~/.ssh/config` 文件中添加一条 `Match exec` 规则: ``` Match host your-server.com exec "letmein knock -u 00000000 your-server.com 22" ``` ## 安装 有关如何构建和安装 letmein 的更多信息,请参阅 [安装说明](doc/INSTALL.md)。 ## 卸载 如果您想从系统中完全删除 letmein,请参阅 [卸载说明](doc/INSTALL.md#uninstalling)。 ## 平台支持 ### 客户端 客户端应用程序 `letmein` 是可移植的,应该可以在所有主要平台上运行。 已测试的平台包括: - Linux - Android,在 [Termux](https://termux.dev/) 下 - Windows - MacOS(仅测试了构建) ### 服务器 服务器应用程序 `letmeind` 仅限 Linux,因为它仅支持 `nftables` 作为防火墙后端。 ## 配置 有关如何配置 letmein 服务器和客户端的详细信息,请参阅 [配置文档](doc/CONFIGURATION.md)。 ## 安全提示:用户标识符和资源标识符 请注意,配置文件中的用户标识符和资源标识符是通过网络以明文形式(未加密)传输的。 请确保用户标识符和资源标识符**不**包含任何私密信息。 这些标识符仅仅是为了管理不同的 `letmein` 密钥、安装和设置而进行的抽象标识。 有关详细信息,请参阅关于 [keys](doc/CONFIGURATION.md#keys) 和 [resources](doc/CONFIGURATION.md#resources) 的文档。 ## 内部机制和设计目标 letmein 的主要设计目标是: - 它是用内存安全的编程语言实现的,这使得某些类的严重错误变得不可能。 - 算法和实现尽可能简单合理。 - 它不实现复杂的加密算法,如非对称公钥/私钥加密。相反,它使用共享密钥结合 HMAC/SHA3 进行身份验证。 - 它具有重放保护。重放敲门数据包序列不会导致成功的身份验证。 - 它仅为发出敲门请求的 IP 地址打开端口。默认情况下,如果可用,同时支持 IPv4 和 IPv6。此行为可以通过 `-4` 和 `-6` 客户端命令行选项进行调整。 - letmein 不链接到用不安全语言编写的库,除了操作系统或 Rust 编译器所需的库之外。唯一动态链接的库是: - libc.so - libm.so - libgcc_s.so - linux-vdso.so - ld-linux-*.so - ld-android.so(仅限 Android) - libdl.so(仅限 Android) - libarmmem-*.so(仅限 Raspberry Pi) # 安全 有关安全和报告漏洞的更多信息,请参阅 letmein 的 [安全文档](SECURITY.md)。 # 发行版打包 如果您想打包软件以进行分发,请参阅 [发行版打包提示](doc/DISTRO_PACKAGING.md)。 # 许可证 Copyright (c) 2024 - 2026 Michael Büsch 根据 Apache 许可证版本 2.0 或 MIT 许可证获得许可,由您选择。
标签:CISA项目, GitHub Advanced Security, JSONLines, Linux运维, nftables, Rust, SSH防护, Streamlit, VPN安全, 单包授权, 可视化界面, 安全加固, 攻击面缩减, 端口保护, 端口敲门, 网络安全, 网络流量审计, 访问控制, 通知系统, 防火墙, 隐私保护, 隐蔽模式, 零信任