Linux 系统的安全性很大程度上依赖于精细化的访问控制策略,拒绝”机制是构建防御体系的核心,通过在 SSH 服务、防火墙规则及系统权限层面实施多层拒绝策略,管理员可以有效阻断未授权的访问请求,实现纵深防御,核心上文归纳在于:单一层面的防御往往存在漏洞,构建包含应用层配置、网络层过滤以及动态识别的“拒绝”体系,才是保障 Linux 服务器安全的最佳实践。

SSH 服务层的精细化拒绝策略
SSH(Secure Shell)是 Linux 服务器最核心的远程管理服务,也是遭受攻击最频繁的入口,在应用层配置“拒绝”规则,是阻断恶意连接的第一道防线。
利用 /etc/ssh/sshd_config 进行用户限制
在 SSH 配置文件中,DenyUsers、DenyGroups 以及对应的 Allow 指令提供了强大的访问控制能力,与仅依靠密码复杂度不同,直接在配置层面禁止特定用户登录可以从根本上消除风险,系统默认的 root 账户通常是暴力破解的首要目标,通过配置 PermitRootLogin no 并结合 DenyUsers 指令,可以明确禁止高风险账户的登录权限。
使用 AllowUsers 或 AllowGroups 采用白名单机制往往比黑名单更安全,但在必须使用黑名单的场景下,DenyUsers 可以用来限制那些拥有 Shell 权限但仅用于特定业务、不应进行远程 SSH 登录的账户,配置修改后,必须执行 systemctl restart sshd 或 sshd -t 测试配置语法,确保服务不会因配置错误而中断。
基于 TCP Wrappers 的访问控制
尽管 TCP Wrappers(/etc/hosts.allow 和 /etc/hosts.deny)在现代 Linux 发行版中逐渐被 nftables 或 systemd 的 socket 过滤取代,但在许多遗留系统及特定服务中,它依然是一把利器,其核心逻辑遵循“先允许,后拒绝”的原则,当请求到达时,系统先检查 hosts.allow,若匹配则允许;若不匹配,再检查 hosts.deny,若匹配则拒绝。
在 /etc/hosts.deny 中配置 sshd: ALL 可以默认拒绝所有连接,然后在 hosts.allow 中仅开放受信任的网段,这种“默认拒绝”的策略极大地缩小了攻击面,需要注意的是,TCP Wrappers 仅支持基于 TCP 的服务,且依赖于服务程序是否编译了 libwrap 库支持。
网络层防火墙的拒绝机制
如果说应用层的拒绝是“门禁”,那么网络层防火墙的拒绝就是“围墙”,在 Linux 内核层面,iptables 和 nftables 提供了更为高效和底层的流量控制能力。
iptables 中的 DROP 与 REJECT
在使用 iptables 构建拒绝规则时,理解 DROP 和 REJECT 的区别至关重要。DROP 目标会直接丢弃数据包,不向发送方返回任何回应,这使得连接请求超时,对于攻击者来说,仿佛服务器不存在,这在一定程度上增加了扫描的难度和时间成本,相对地,REJECT 会向发送方返回一个拒绝通知(如 ICMP port-unreachable),虽然 REJECT 能让合法客户端快速获知连接失败,但也向攻击者暴露了防火墙的存在和端口状态。

出于安全隐蔽性的考虑,对于公网上的非必要端口,建议使用 DROP 策略,执行 iptables -A INPUT -p tcp --dport 22 -s 192.168.1.100 -j DROP 可以精确拒绝特定 IP 的访问,而不影响其他 IP。
nftables 的现代化管理
作为 iptables 的继任者,nftables 提供了更简洁的配置语法和更好的性能,在 nftables 中,拒绝规则可以通过 reject 或 drop 关键字定义,其优势在于可以将 IPv4 和 IPv6 的防火墙规则统一在一个表结构中管理,减少了配置冗余和错误,通过定义 chain(链),管理员可以灵活地在 input、output 或 forward 链中插入拒绝规则,实现复杂的网络拓扑控制。
动态防御与自动化拒绝
静态的配置文件无法应对瞬息万变的网络攻击,现代 Linux 安全运维中,动态的“拒绝”机制是不可或缺的一环。
Fail2ban 的集成应用
Fail2ban 通过扫描日志文件(如 /var/log/auth.log)来检测恶意行为,如密码失败尝试、漏洞扫描等,一旦检测到 IP 地址超过预设的阈值,Fail2ban 会自动调用防火墙(如 iptables 或 nftables)动态添加一条拒绝规则,将该 IP 封禁一段时间。
这种“检测-响应-拒绝”的闭环机制,能够有效防御暴力破解攻击,在 SSH 服务中,设置 maxretry 为 3,意味着某个 IP 连续输错 3 次密码后,就会被自动加入黑名单,这种策略比单纯的静态拒绝更具灵活性和实战价值。
专业解决方案:构建分层拒绝模型
在实际的企业级运维中,我们建议构建一个分层拒绝模型,第一层为云厂商的防火墙或安全组,直接丢弃已知的恶意 IP 段;第二层为服务器本地的 nftables,限制端口和协议访问;第三层为应用层的 SSH 配置和 TCP Wrappers,进行用户和主机的精细匹配;第四层为 Fail2ban 等工具,进行实时动态封禁,这种多层叠加的“拒绝”策略,确保了即使某一层防线被突破,后续的防御机制依然能够阻断攻击。
权限与文件系统的拒绝
除了网络访问,Linux 的“拒绝”哲学同样体现在文件系统权限中,使用 chmod 和 chattr 命令限制关键系统文件的写入权限,可以防止提权攻击后的恶意篡改,将系统关键配置文件设置为不可变属性(chattr +i),即使攻击者获得了 root 权限,也无法删除或修改该文件,这是最后一道拒绝防线。

Linux 中的“deny”不仅仅是一个命令或配置项,而是一套组合拳,从内核态的包过滤到应用态的用户验证,再到动态的行为分析,只有将静态规则与动态防御有机结合,才能构建出真正坚不可摧的 Linux 服务器安全体系。
相关问答
Q1:在 Linux 防火墙中,使用 DROP 和 REJECT 拒绝数据包有什么本质区别,哪种更安全?
A: DROP 会直接丢弃数据包,不向发送方返回任何信息,导致连接请求超时;而 REJECT 会明确返回一个拒绝错误(如 ICMP Port Unreachable),从安全隐蔽性的角度来看,DROP 通常更安全,因为它让攻击者难以判断端口是关闭了还是被过滤了,增加了扫描和探测的难度,但在需要让合法客户端快速获知连接失败以释放资源的场景下,REJECT 更具用户体验优势,对于公网上的非必要服务,推荐使用 DROP。
Q2:为什么在配置 SSH 访问控制时,推荐使用 AllowUsers(白名单)而不是 DenyUsers(黑名单)?
A: 黑名单策略(DenyUsers)存在天然的局限性,管理员无法预知所有潜在的恶意用户或攻击源,如果攻击者创建了一个新的未被列入黑名单的用户进行攻击,防御就会失效,而白名单策略(AllowUsers)遵循“默认拒绝”的原则,只有明确列在名单中的用户才能登录,这种机制从根本上缩小了攻击面,即使攻击者破解了不在白名单中的账户密码,也无法通过 SSH 登录系统,因此安全性更高。

















