远程防爆破
远程防爆破
功能简介
远程防爆破保护的是 SamWaf 所在这台机器自身 的 SSH / RDP 远程登录,而不是你在 SamWaf 里配置的那些网站。
它通过读取操作系统的登录失败日志来发现爆破:某个 IP 在统计窗口内失败次数达到阈值,就调用系统防火墙把它挡在门外,到期自动解封。反复来犯的 IP 封禁时间会逐级递增。页面同时提供一个 连接监控 看板,可以直观看到当前有哪些 IP 连着这台机器。
菜单位置:系统设置 → 远程防爆破。页面分为 概览、失败事件、封禁列表、攻击者档案、连接监控、设置 六个页签。
前置条件
检测能力(读登录失败日志)
| 操作系统 | 支持情况 |
|---|---|
| Linux | 支持 SSH。自动探测 /var/log/secure、/var/log/auth.log;都不存在时改用 journalctl(同时订阅 sshd、sshd-session、sshd-auth 三个标识,兼容 OpenSSH 9.8+ 拆分认证进程后的日志)。 |
| Windows | 支持 RDP 与网络登录。读取安全事件日志中的 4625 事件(登录类型 10 远程桌面 / 3 网络登录),并结合 RemoteDesktopServices-RdpCoreTS 频道补全来源 IP。需要管理员权限:以系统服务方式安装时默认以 LocalSystem 运行,权限足够;普通用户双击运行会读不到安全日志。 |
| macOS | 不支持自动检测。macOS 从 10.12 起改用统一日志系统(os_log),sshd 认证失败细节不再写入 syslog,格式与 Linux 完全不同,暂未支持采集。本页的 连接监控、手工封禁、封禁列表与到期自动解封仍可正常使用。 |
若当前环境无法采集,页面顶部会出现红色提示条,说明具体原因。
Windows 上的两种采集方式
Windows 默认使用事件订阅(wevtapi)实时接收登录失败事件;少数系统上订阅可能建立成功却收不到任何事件,SamWaf 会在 1 分钟内自动发现并降级为轮询采集(wevtutil,每 5 秒一轮,功能完全一致,只是实时性略有下降)。降级会写入日志,概览页的 事件源 也会相应变化,无需人工干预。
如果想直接指定轮询方式,可设置系统环境变量后重启 SamWaf:
SAMWAF_HOSTGUARD_WINSRC=wevtutil封禁能力(调用系统防火墙)
封禁执行依赖操作系统防火墙,要求与 防火墙IP封禁 一致(Linux 需 iptables/ipset 与相应权限,Windows 需开启防火墙,macOS 需启用 pf)。
若防火墙不可用,功能会自动降级为观察模式(继续记录失败事件,但不执行封禁),页面顶部显示黄色提示条并给出原因。
检测不依赖端口
sshd 日志里记录的是攻击者的源端口,Windows 4625 事件则不含服务端口。因此把 SSH 改到 22222、把 RDP 改到 33890,检测照常工作。设置 里的 SSH/RDP 端口只用于「仅远程登录端口」这种封禁范围,以及连接监控里的端口高亮。
操作步骤
第一步:先用观察模式跑一段时间
功能默认关闭,且默认工作模式就是 观察模式。强烈建议保持这个顺序:
- 进入 设置 页签,把顶部的 启用主机远程登录爆破防护 打开。
- 弹出的确认框会列出哪些地址会被自动豁免,确认后生效。
- 保持 工作模式 为 观察模式,运行几天。
观察模式下只记录不封禁:一条防火墙规则都不会写,也不会发送封禁通知。
第二步:检查有没有误伤
到 失败事件 页签,按 来源、IP地址、尝试账号、处置 筛选,重点确认列表里没有你自己人的 IP。
处置列有四种取值:
| 处置 | 含义 |
|---|---|
| 已封禁 | 达到阈值并已执行封禁。 |
| 已计数 | 计入了统计窗口,尚未达到阈值。 |
| 观察记录 | 观察模式下「本应封禁,但只做了记录」。 |
| 未计数 | 命中白名单被豁免,或属于不计入阈值的软失败。 |
在某一行的操作列可以直接 封禁、加白名单,或点 查该IP 快速筛出这个 IP 的全部事件。
第三步:切换到封禁模式
确认无误后,回到 设置 把 工作模式 改为 封禁模式 并保存。此后达到阈值的 IP 会被真正封禁,并在 封禁列表 中出现。
管理封禁
封禁列表 页签展示封禁账本,可按 IP、来源、状态(封禁中 / 已到期 / 已解封 / 全部)筛选。对处于 封禁中 的记录可以:
- 解封 —— 提前解除封禁。
- 改为永久 —— 把一条有期限的封禁变成永久封禁(仅对未永久的记录显示)。
点击 手工封禁 可以直接指定一个 IP 封禁,填写 封禁时长(分钟,填 0 表示永久)与 封禁原因。手工封禁不受白名单与观察模式限制。
查看攻击者档案
攻击者档案 页签记录每个 IP 累计被封了多少次。封禁阶梯就是按这个次数递进的:封得越多,下次封得越久;超过累犯记忆期没有再犯的,会自动从第 1 级重新开始。
操作列提供 重置阶梯(下次被封从第 1 级重新开始)、永久封禁、加白名单、删除。
连接监控
连接监控 页签展示当前这台机器上的 TCP 连接,顶部有连接总数、已建立、监听端口、远程登录端口连接、采集耗时五个统计卡片。
- 可按 本机端口、状态、来源IP 筛选,或勾选 只看SSH/RDP端口。
- SSH / RDP 端口的连接会被标上 远程登录 标签,已被封禁的来源 IP 会标上 已封禁。
- 支持手动 刷新 与 自动刷新(关闭 / 5s / 10s / 30s,默认关闭)。
- 对未封禁的来源 IP,操作列提供 封禁此IP。
调整封禁阶梯
设置 页签底部是封禁阶梯编辑器。同一个 IP 第几次被封,就套用第几级的时长;次数超过最高级时一直用最高级。默认阶梯如下:
| 级别 | 封禁时长 | 说明 |
|---|---|---|
| 1 | 5 分钟 | 首次触发,多半是自己敲错密码或扫描器路过,短封即可。 |
| 2 | 15 分钟 | 第二次。 |
| 3 | 60 分钟 | 第三次。 |
| 4 | 1440 分钟(1 天) | 第四次。 |
| 5 | 0 = 永久 | 惯犯母机,永久封禁。 |
可以 新增一级、修改时长与备注、用开关禁用某一级、删除某一级,改完点 保存阶梯。封禁时长填 0 表示永久封禁。
第一级为什么这么短
绝大多数触发阈值的其实是管理员自己敲错密码。第一级只封 5 分钟,最坏情况下等 5 分钟就自动恢复。
防止把自己锁在门外
这是本功能最需要注意的地方。SamWaf 提供了多重保护:
白名单(自动 + 手工)
以下地址永不封禁,命中任意一条即豁免:
- 环回地址(
127.0.0.0/8、::1)—— 始终豁免,不受开关控制。 - 本机所有网卡 IP —— 始终豁免,不受开关控制。
- 常见内网段(
10/8、172.16/12、192.168/16等)—— 由 自动豁免内网 开关控制,默认开启。 - 白名单 里手工填写的地址 —— 支持单 IP / CIDR / 通配符 / 区间,逗号分隔。
- 管理端 IP 白名单中收窄过的网段。
- 你当前正在使用管理端的出口 IP —— 30 分钟内有效,只要你还在用管理端就会一直续期。
设置 页签提供 白名单自测 工具:输入一个 IP 点 检测,会告诉你它是否会被豁免以及命中了哪一条。启用封禁模式前建议先用它验证一下自己的出口 IP。
万一真被锁在门外
设置 页签底部也写了这份自救清单,按顺序尝试:
- 在本页把顶部的总开关关掉(管理端还能进的话,这是最快的)。
- 在服务器上编辑
conf/config.yml,把security.host_guard_force_disable改为true,重启 SamWaf。 - 容器部署可以设置环境变量
SAMWAF_HOSTGUARD_DISABLE=1后重启。 - 上面第 2、3 条只阻止新的封禁,已经下发的防火墙规则要手工清掉(通过物理控制台或云厂商 VNC 执行):
# Linux:解封单个 IP / 清空整个封禁集合
ipset del samwaf_hostguard <IP>
ipset flush samwaf_hostguard
# Windows:删除封禁规则(分片规则可能有多条,序号从 0 递增)
netsh advfirewall firewall delete rule name=SamWAF_Set_samwaf_hostguard_0缩小误封的杀伤面
把 封禁范围 设为 仅SSH/RDP端口,一旦误封,被挡住的只有远程登录,Web 与业务端口照常可用,排查余地大得多。该选项在 macOS 与「逐条规则」执行方式下不可用(届时选项会置灰并给出说明)。
字段说明
检测策略
| 字段 | 说明 |
|---|---|
| 启用主机远程登录爆破防护 | 总开关,默认关闭。关闭时不采集日志、不自动封禁、不自动解封。 |
| 工作模式 | 观察模式(默认)只记录登录失败事件,不封禁也不发通知;封禁模式 达到阈值即执行封禁。 |
| 失败统计窗口 | 统计失败次数的时间窗口,单位分钟,默认 10。 |
| 触发阈值 | 统计窗口内失败次数达到该值即触发处置,默认 8。 |
| 累犯记忆期 | 单位天,默认 7。超过这么久没有再犯,下次封禁从第 1 级重新开始。 |
| 软失败计入阈值 | 默认关闭。软失败包括认证前断连(端口扫描与健康探针大量产生)、用户名枚举与 PAM 失败行(会与密码失败行成对出现,一并计数会让阈值实际减半)。 |
白名单(防误封)
| 字段 | 说明 |
|---|---|
| 白名单 | 永不封禁的地址,逗号分隔,支持单 IP / CIDR / 通配符 / 区间,如 1.2.3.4,10.0.0.0/8,192.168.1.*。 |
| 自动豁免内网 | 默认开启。自动豁免本机所有网卡 IP、环回地址与常见内网段。 |
| 白名单自测 | 输入一个 IP,检测它是否会被豁免并显示命中原因。 |
事件源与端口
| 字段 | 说明 |
|---|---|
| 自定义日志路径 | 逗号分隔。留空则自动探测 /var/log/secure、/var/log/auth.log,都没有则用 journalctl。容器部署请把宿主机日志只读挂载进来后在此指定。 |
| SSH端口 / RDP端口 | 留空自动发现,右侧会显示已探测到的端口。仅用于端口级封禁与连接看板高亮,检测本身不依赖端口。 |
封禁执行
| 字段 | 说明 |
|---|---|
| 封禁范围 | 全部端口(默认)或 仅SSH/RDP端口。后者误封时杀伤面更小,但部分系统与执行方式不支持。 |
| 执行方式 | 自动(默认,平台自适应)/ 集合(ipset) / 逐条规则。右侧显示当前实际采用的方式。 |
| Windows同步去抖 | 单位秒,默认 5。Windows 没有 ipset,只能全量重建防火墙规则,去抖可把一阵爆发合并成一次重建。该值也是封禁真正写入防火墙的最大延迟——从触发封禁到规则生效最多等这么久,通知则是立即发出的。Linux / macOS 走增量、立即生效,不受此项影响。 |
洪泛保护
| 字段 | 说明 |
|---|---|
| 封禁条目上限 | 默认 10000。超过上限时优先淘汰剩余时间最短的临时封禁,永久封禁不会被淘汰。 |
| 每分钟新增上限 | 默认 200。防止分布式爆破在短时间内把封禁集合打满。 |
| 网段聚合封禁 | 默认关闭。同一 /24 网段内被封 IP 数达到右侧阈值(默认 10)时,升级为封禁整个网段。对僵尸网络有效,但可能误伤整个机房或运营商网段,请谨慎开启。 |
| 封禁时发送通知 | 默认开启。触发封禁时发送 IP封禁 类型的通知,需要在 通知订阅 中订阅该类型才会真正送达。 |
远程连接看板
| 字段 | 说明 |
|---|---|
| 启用连接看板 | 默认开启。关闭后 连接监控 页签不再采集数据。 |
| 快照缓存时长 | 单位秒,默认 3。Linux 下采集连接表需要遍历 /proc 建立 inode 到进程的映射,连接数上万时开销明显,建议不低于 3 秒。 |
失败事件列表
| 字段 | 说明 |
|---|---|
| 时间 | 事件被采集到的时间。 |
| 来源 | SSH 或 RDP。 |
| IP地址 / 归属地 | 来源 IP 及其地理归属。 |
| 尝试账号 | 攻击者尝试登录使用的用户名。 |
| 失败类型 | 密码错误 / 公钥认证失败 / 用户名不存在 / 尝试次数超限 / 账号不在允许列表 / PAM认证失败 / 认证前断开 / 端口扫描探测 / 远程桌面登录失败。 |
| 处置 | 已封禁 / 已计数 / 观察记录 / 未计数。 |
| 窗口内次数 | 该 IP 在统计窗口内已累计的失败次数。 |
| 源端口 | 攻击者的来源端口。 |
| 原始日志 | 采集到的原始日志行,鼠标悬停可查看完整内容。 |
封禁列表
| 字段 | 说明 |
|---|---|
| IP地址 | 被封禁的 IP;若为网段聚合产生的封禁,会带 整段 标签。 |
| 阶梯 | 该次封禁使用的阶梯级别;手工封禁显示为 手工。 |
| 封禁时长 / 剩余时间 | 本次封禁的时长与剩余时间,永久封禁不会倒计时。 |
| 封禁时间 | 开始封禁的时刻。 |
| 状态 | 封禁中 / 已到期 / 已解封。 |
| 原因 | 触发封禁的原因描述。 |
攻击者档案
| 字段 | 说明 |
|---|---|
| 封禁次数 | 该 IP 历史上被封禁的总次数,决定下次封禁套用第几级阶梯。 |
| 当前阶梯 | 当前所处的阶梯级别。 |
| 累计失败 | 累计的登录失败次数。 |
| 首次封禁 / 最近封禁 | 第一次与最近一次被封禁的时间。 |
| 最近原因 | 最近一次封禁的原因。 |
连接监控
| 字段 | 说明 |
|---|---|
| 来源IP / 来源端口 | 连接发起方的地址与端口;已被封禁的来源 IP 会带 已封禁 标签。 |
| 本机端口 | 本机被连接的端口;属于 SSH / RDP 的会带 远程登录 标签。 |
| 状态 | TCP 连接状态,如 ESTABLISHED、LISTEN、TIME_WAIT、CLOSE_WAIT。 |
| 进程名 | 占用该连接的进程名。 |
| 归属地 | 来源 IP 的地理归属。 |
常见问题
改过 SSH / RDP 端口还能检测吗? 能。检测读的是登录失败日志,与服务端口无关。设置 里的端口项只影响「仅SSH/RDP端口」这种封禁范围和连接监控里的端口高亮。
Windows 上「失败事件」一直是空的怎么排查? 按顺序看三点:
是否以管理员身份运行。读取安全事件日志需要管理员或 LocalSystem 权限,装成系统服务即可满足。
系统是否在记录登录失败。管理员 PowerShell 执行(GUID 要加引号,否则 PowerShell 会把
{}当成脚本块):auditpol /get /subcategory:"{0CCE9215-69AE-11D9-BED3-505054503030}"「登录」一项应为 成功和失败;若只有成功,用
/set ... /failure:enable打开。看 SamWaf 日志。
logs/log.log中搜索「主机登录防护」,正常应依次出现「已建立事件订阅」和「已收到第一条 Windows 安全日志事件,采集链路正常」。若只有前者,SamWaf 会在 1 分钟内自动降级为轮询采集并记录原因。
Windows 上封禁为什么不是立刻生效? Windows 没有 ipset,只能整体重建防火墙规则,因此自动封禁会按「Windows同步去抖」设定的窗口(默认 5 秒)合并后统一下发——这个值就是封禁生效的最大延迟,通知则是立即发出的,所以会看到「通知先到、规则稍后出现」。手工封禁、手工解封与到期解封都是立即生效,不受此项影响;Linux / macOS 走增量更新,也是立即生效。
页面顶部提示「系统防火墙不可用,已自动降级为观察模式」怎么办? 说明当前环境不满足封禁的前置条件,提示语里会给出具体原因。按 防火墙IP封禁 的要求补齐即可;容器部署还需要
--cap-add=NET_ADMIN与--network host。容器里采集不到日志? 容器内看不到宿主机的
/var/log。需要把宿主机日志目录只读挂载进来(如-v /var/log:/host/var/log:ro),再在 自定义日志路径 中填写/host/var/log/secure。观察模式下会不会误伤? 不会。观察模式下不会写入任何防火墙规则,也不会发送封禁通知,只在事件列表里留下「观察记录」。
我把自己封了怎么办? 见上文 万一真被锁在门外。最常见的情况是第一级封禁 5 分钟,等一会儿就会自动解封。
已经装了 fail2ban,会冲突吗? 两者各自维护独立的规则与集合,不会互相删除,但会对同一个 IP 重复封禁。建议二选一。
封禁的规则重启机器后还在吗? Linux 的 ipset 是内核内存态,机器重启会清空。SamWaf 启动时会把数据库中未过期的封禁重新灌回系统防火墙,因此不需要手工恢复。
