
Docker Mailserver 安全防护Fail2Ban 防暴力破解完整配置指南【免费下载链接】docker-mailserverProduction-ready fullstack but simple mail server (SMTP, IMAP, LDAP, Antispam, Antivirus, etc.) running inside a container.项目地址: https://gitcode.com/gh_mirrors/do/docker-mailserverFail2BanF2B是一款基于 Python 编写的入侵防御框架通过监控服务日志中的失败登录记录自动封禁可疑来源 IP是抵御 SSH、SMTP、IMAP 等暴力破解攻击的经典方案。本指南围绕 docker-mailserverDMS内置的 Fail2Ban 集成完整覆盖启用方式、默认防护策略、自定义配置、封禁管理与根容器Rootless场景下的 IP 透传帮助你在生产环境中快速落地邮件服务的暴力破解防护。为什么邮件服务器需要 Fail2Ban邮件服务SMTP/IMAP/POP3长期暴露在公网是暴力破解攻击的高发目标攻击者会持续尝试猜测用户口令或以随机地址投递垃圾邮件。Fail2Ban 通过在服务日志中匹配失败认证模式如 Postfix 的SASL authentication failed、Dovecot 的auth failed在达到阈值后调用防火墙规则DMS 默认使用 NFTables将攻击源 IP 封禁从而在不改变业务配置的前提下显著降低被爆破风险。DMS 将 Fail2Ban 直接内置进镜像Dockerfile省去了额外部署与配置维护的成本你只需通过环境变量开启即可。启用 Fail2Ban前置条件环境变量与内核能力Capabilities开启 Fail2Ban 需要两步设置环境变量ENABLE_FAIL2BAN1为容器授予至少NET_ADMIN内核能力capability使 Fail2Ban 能够与内核交互、执行封禁操作。因为 DMS 默认使用 NFTables 执行封禁若缺少NET_ADMINNFTables 将无法添加规则详见 environment.md 的说明。Docker Compose 方式compose.yamlservices: mailserver: image: ghcr.io/docker-mailserver/docker-mailserver:latest environment: - ENABLE_FAIL2BAN1 cap_add: - NET_ADMINDocker CLI 方式docker run --rm -it \ --cap-addNET_ADMIN \ --env ENABLE_FAIL2BAN1 \ ghcr.io/docker-mailserver/docker-mailserver:latest安全提示非默认 Capability 的风险NET_ADMIN与NET_RAW默认不会授予容器 root 用户因为它们可以被用于绕过安全机制例如修改网络配置、构造任意报文。DMS 出于集成与部署便利将 F2B 打包进镜像但为容器额外添加非默认 Capability 会扩大攻击面。如果该风险令你担忧更稳妥的做法是将这些 Capability 仅授予一个独立专用的 Fail2Ban 容器如 LinuxServer.io 的 fail2ban 镜像方案而不是整个邮件服务容器。老内核兼容性问题NFTables 与 IPTablesDMS 将 F2B 配置为使用NFTablesbanaction nftables-allports而非传统的 IPTableslegacy。在较老的内核环境例如部分 NAS 系统中现代 NFTables 规则可能不被支持此时需要将 F2B 改回 legacy IPTables——通过下面的自定义文件fail2ban-jail.cf即可实现参见下文 自定义文件 一节。DMS 默认防护策略开启 Fail2Ban 后DMS 提供如下开箱即用的默认策略定义在 target/fail2ban/jail.local参数默认值说明bantime1w一周封禁持续时长findtime1w一周统计窗口在此时间段内累计失败次数达到阈值即触发封禁maxretry6封禁阈值findtime内失败 6 次即封禁ignoreip127.0.0.1/8白名单匹配该列表的地址永不封禁支持 IP、CIDR 掩码与 DNS 主机名可用空格或逗号分隔多个地址banactionnftables-allports默认封禁动作阻断该 IP 的所有端口备选为nftables-multiport仅阻断受影响端口核心结论DMS 会自动封禁最近一周内产生 6 次失败尝试的主机封禁时长为一周。同时Postfix 监狱jail被配置为mode extraDMS 默认。extra是 Fail2Ban 为 Postfix 提供的高强度过滤模式覆盖了更多失败场景详见下方 SASL 小节。通过自定义文件调整 Fail2Ban配置文件挂载机制DMS 在容器启动时会将docker-data/dms/config/卷中的以下两个文件复制到容器内实现位于 target/scripts/startup/setup.d/security/misc.sh卷内文件复制目标作用fail2ban-jail.cf/etc/fail2ban/jail.d/user-jail.local调整各监狱jail及其默认配置fail2ban-fail2ban.cf/etc/fail2ban/fail2ban.local调整 Fail2Ban 整体行为日志、数据库、套接字等两个文件的完整示例分别见 config-examples/fail2ban-jail.cf 与 config-examples/fail2ban-fail2ban.cf可直接复制后修改使用。fail2ban-jail.cf 示例解析config-examples/fail2ban-jail.cf 展示了 DMS 推荐的监狱配置[DEFAULT] # 封禁时长1 周 bantime 1w # 统计窗口1 周内累计失败 maxretry 次即封禁 findtime 1w # 失败阈值6 次 maxretry 6 # 白名单永不封禁列表 ignoreip 127.0.0.1/8 # 默认封禁动作阻断所有端口 # nftables-multiport: 仅阻断受影响端口 # nftables-allports: 阻断该 IP 的所有端口 banaction nftables-allports [dovecot] enabled true [postfix] enabled true # 高强度过滤模式覆盖更多失败场景 mode extra # 该监狱用于手动封禁setup.sh fail2ban ban IP [custom] enabled true bantime 180d port smtp,pop3,pop3s,imap,imaps,submission,submissions,sieve要点说明若需在老内核上退回 legacy IPTables可将banaction修改为iptables-allports/iptables-multiport[custom]监狱是 DMS 为setup.sh fail2ban ban手动封禁保留的专用监狱封禁时长为 180 天并覆盖邮件相关的全部端口SMTP、POP3、IMAP、Submission 及其 TLS 变体、Sieve在 target/fail2ban/jail.local 中还额外设置了postfix_backend auto与dovecot_backend autoFail2Ban 1.1.1 在 Debian 上默认将日志源指向 systemd journal而 DMS 通过 rsyslog 将 Postfix/Dovecot 日志写入文件因此需要显式指定auto以确保正确读取日志。fail2ban-fail2ban.cf 示例解析config-examples/fail2ban-fail2ban.cf 控制 F2B 的整体运行行为常用项包括[DEFAULT] # 日志级别CRITICAL / ERROR / WARNING / NOTICE / INFO / DEBUG loglevel INFO # 日志输出目标STDOUT / STDERR / SYSLOG / SYSTEMD-JOURNAL / 文件路径 # 注意若修改此值需同步调整 logrotate 配置 logtarget /var/log/fail2ban.log # 与守护进程通信的 socket 文件运行期间不可删除 socket /var/run/fail2ban/fail2ban.sock # PID 文件路径 pidfile /var/run/fail2ban/fail2ban.pid # 持久化数据库重启后封禁记录不丢失 dbfile /var/lib/fail2ban/fail2ban.sqlite3 # 封禁记录在数据库中的保留时间超出后清理 dbpurgeage 1d例如需要调试时可将loglevel改为DEBUG并观察logtarget指向的日志文件。SASL 场景说明DMS 的postfix监狱默认采用mode extra该模式已覆盖默认 SASL 提供方Dovecot SASL的登录错误因此postfix-sasl监狱默认被禁用。若你切换到其他 SASL 提供方例如 SASLauthd可能希望重新启用postfix-sasl监狱在fail2ban-jail.cf中追加[postfix-sasl] enabled true查看与封禁管理DMS 将 Fail2Ban 的日常管理封装进setup脚本入口见 target/bin/setup具体实现见 target/bin/fail2ban。所有操作通过docker exec 容器名 setup fail2ban ...完成。查看所有封禁直接运行不带子命令即可列出所有被禁止的 IPsetup fail2ban输出形如Banned in postfix: 192.0.2.10若没有封禁则提示No IPs have been banned。实现上该命令会遍历所有监狱jail解析fail2ban-client status jail输出中的Banned IP list见 target/bin/fail2ban。查看详细状态setup fail2ban status该命令对每个监狱输出完整的fail2ban-client status jail视图包含当前封禁数、失败计数与封禁列表等统计信息。手动封禁与解封docker exec CONTAINER NAME setup fail2ban [ban|unban IP]setup fail2ban ban IP将 IP支持单个 IP 或 CIDR 子网如192.0.66.0/24加入custom监狱封禁成功输出Banned custom IP: 1若已封禁则报错提示setup fail2ban unban IP遍历所有监狱解封该 IP成功输出Unbanned IP from jail: 1。上述行为与底层fail2ban-client set custom banip/fail2ban-client set jail unbanip的调用一一对应并且有 BATS 集成测试覆盖见 test/tests/parallel/set1/spam_virus/fail2ban.bats测试中通过一个专门构造失败认证的容器触发真实封禁再用nft list set inet f2b-table addr-set-custom验证 NFTables 规则集确实生效最后执行unban确认解封。查看日志docker exec CONTAINER NAME setup fail2ban log输出/var/log/mail/fail2ban.log的完整内容便于排查封禁判定过程。在 Rootless无根容器中运行RootlessKit 是 Docker 与 Podman 无根模式所依赖的 fakeroot 实现。默认情况下RootlessKit 使用builtin端口转发驱动不会透传真实的源 IP 地址——容器看到的所有连接源 IP 都是本机回环地址。而 Fail2Ban 必须拿到真实源 IP 才能正确识别并封禁攻击者。解决方案是将端口转发驱动切换为slirp4netns虽然性能略低于 builtin 驱动但能够保留真实的源 IP 地址。Docker Rootless在 Docker 的 rootless 模式下创建~/.config/systemd/user/docker.service.d/override.conf[Service] EnvironmentDOCKERD_ROOTLESS_ROOTLESSKIT_PORT_DRIVERslirp4netns然后重载并重启守护进程$ systemctl --user daemon-reload $ systemctl --user restart docker⚠️注意该配置会更改所有rootless 容器由 Docker 管理的端口驱动Docker 不支持按容器单独配置。若需要按容器隔离请考虑改用 Podman。Podman RootlessRootless Podman 需要在--network参数或compose.yaml的network_mode中追加slirp4netns:port_handlerslirp4netnsservices: mailserver: network_mode: slirp4netns:port_handlerslirp4netns environment: - ENABLE_FAIL2BAN1 - NETWORK_INTERFACEtap0 # ... 其他配置同时必须额外设置环境变量NETWORK_INTERFACEtap0因为 Podman 对slirp4netns使用硬编码的接口名tap0。另外需注意slirp4netns不兼容用户自定义网络user-defined networks只能与默认网络配合使用。相关环境变量速查除ENABLE_FAIL2BAN外environment.md 还提供了封禁行为控制变量环境变量默认值说明ENABLE_FAIL2BAN01启用 Fail2Ban 服务启用时需搭配NET_ADMINCapabilityFAIL2BAN_BLOCKTYPEdropdrop丢弃数据包不返回任何响应reject拒绝数据包返回 ICMP unreachable若将FAIL2BAN_BLOCKTYPE设为非reject的其他值启动脚本会在/etc/fail2ban/action.d/nftables-common.local中写入blocktype drop见 target/scripts/startup/setup.d/security/misc.sh即默认采用静默丢弃策略攻击者无法感知端口是否存活。小结Fail2Ban 是 DMS 邮件服务安全体系防暴力破解的关键一环通过ENABLE_FAIL2BAN1NET_ADMIN即可启用默认策略6 次失败 / 一周窗口 / 封禁一周开箱即用借助fail2ban-jail.cf与fail2ban-fail2ban.cf两个自定义文件可以精确控制各监狱与整体行为setup fail2ban系列命令覆盖查看、手动封禁/解封与日志排查。在无根容器环境中务必切换到slirp4netns端口转发驱动以保留真实源 IP否则封禁将形同虚设。【免费下载链接】docker-mailserverProduction-ready fullstack but simple mail server (SMTP, IMAP, LDAP, Antispam, Antivirus, etc.) running inside a container.项目地址: https://gitcode.com/gh_mirrors/do/docker-mailserver创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考