Debian服务器上线后,默认网络状态并不适合直接暴露在公网。很多攻击并非利用复杂的0day,而是扫描到开放端口后暴力破解或利用已知服务漏洞。端口防护优化的核心思路是:关闭一切非必要服务、限制端口访问来源、对必须开放的服务增加动态防护和审计。下面从端口清单审计、内核参数、防火墙策略、SSH加固、Fail2ban联动、隐藏探测信息六个层面直接给出可落地的操作方案。

先做端口清单审计,关闭非必要监听

登录服务器后第一件事是查看当前所有监听端口。执行以下命令:

ss -tulnp

输出会列出所有TCP和UDP监听项,包括进程名和PID。典型Debian最小化安装通常只有sshd和systemd-resolved。如果看到rpcbind、exim4、avahi-daemon、snmpd等默认服务在监听,而这些服务你根本不用,应该立即卸载或禁用。例如:

systemctl disable --now rpcbind
systemctl disable --now exim4
systemctl disable --now avahi-daemon

对于确实不需要的软件包,直接apt purge掉更彻底。不要只停止服务而不禁止开机启动,否则重启后端口又会重新开放。审计时还要注意UDP端口,UDP虽然不建立连接,但同样可以被用于反射放大攻击或服务探测。如果某个服务只监听在127.0.0.1,说明它仅供本机使用,不要修改为0.0.0.0,保持默认即可。

用内核参数强化网络栈基础行为

Debian默认内核参数偏保守,但有一些安全相关参数需要手动开启。编辑/etc/sysctl.conf或创建/etc/sysctl.d/99-security.conf,加入以下内容:

# 开启反向路径过滤,防止IP欺骗
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

# 忽略所有ICMP重定向
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0

# 不发送ICMP重定向
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0

# 开启TCP SYN Cookie防护
net.ipv4.tcp_syncookies = 1

# 记录可疑的不可达包
net.ipv4.conf.all.log_martians = 1

执行sysctl -p使其生效。SYN Cookie在遭受SYN Flood时能显著提高抗压能力,反向路径过滤可以丢弃源地址明显伪造的数据包。这些参数不会影响正常业务,但对端口扫描和基础DDoS有直接防御效果。

用nftables构建最小化防火墙策略

Debian 11及以后版本默认使用nftables作为防火墙后端。不要再用老旧的iptables规则,nftables语法更清晰、性能更好。先安装nftables:

apt install nftables
systemctl enable --now nftables

编辑/etc/nftables.conf,一个典型的最小化公网服务器策略如下:

#!/usr/sbin/nft -f

flush ruleset

table inet filter {
    chain input {
        type filter hook input priority 0; policy drop;
        
        # 允许本地回环
        iif lo accept
        
        # 允许已建立连接
        ct state established,related accept
        
        # 允许ICMPv6邻居发现
        ip6 nexthdr icmpv6 icmpv6 type { nd-neighbor-solicit, nd-neighbor-advert, nd-router-solicit, nd-router-advert } accept
        
        # 允许ICMP ping(可选,便于排障)
        ip protocol icmp icmp type echo-request limit rate 5/second accept
        
        # 开放SSH端口,限制来源IP
        tcp dport 22 ip saddr { 203.0.113.0/24, 198.51.100.5 } accept
        
        # 开放HTTP/HTTPS
        tcp dport { 80, 443 } accept
        
        # 默认拒绝并记录
        log prefix "nft-drop: " limit rate 10/minute
        counter drop
    }
    
    chain forward {
        type filter hook forward priority 0; policy drop;
    }
    
    chain output {
        type filter hook output priority 0; policy accept;
    }
}

这个策略的核心是默认拒绝所有入站流量,只放行明确需要的端口。SSH端口如果来源IP固定,务必加上ip saddr限制,这是防止暴力破解最有效的手段。如果运维人员IP不固定,至少也要限制SSH端口只允许特定国家或运营商的IP段,或者改用后续介绍的Fail2ban动态封禁。HTTP/HTTPS必须对公网开放,但可以在Web服务器层面再做访问控制。

执行nft -f /etc/nftables.conf加载规则,然后nft list ruleset检查是否生效。注意规则顺序很重要,nftables按顺序匹配,established,related必须放在前面,否则正常回包会被丢弃。

SSH端口是重灾区,单独加固

SSH是Linux服务器被暴力破解最集中的目标。除了防火墙限制来源IP外,还应该在SSH配置层面做深度加固。编辑/etc/ssh/sshd_config:

# 禁止root直接登录
PermitRootLogin no

# 仅允许密钥登录
PasswordAuthentication no
PubkeyAuthentication yes

# 限制登录用户
AllowUsers deploy

# 修改默认端口(可选,降低扫描噪音)
Port 22022

# 空闲超时断开
ClientAliveInterval 300
ClientAliveCountMax 0

# 限制同时未认证连接数
MaxStartups 10:30:60

# 禁用空密码
PermitEmptyPasswords no

# 禁用不安全的旧协议
Protocol 2

修改后执行systemctl restart sshd。如果必须保留密码登录(例如无法使用密钥的极端场景),至少设置强密码策略并配合Fail2ban。但强烈建议所有公网服务器都关闭密码登录,仅使用SSH密钥。密钥登录配合防火墙来源限制,基本可以杜绝暴力破解。

如果修改了SSH端口,记得同步更新防火墙规则。修改端口并不能提升安全性本身,但可以过滤掉大量自动化扫描流量,减少日志噪音和Fail2ban的误封概率。

用Fail2ban实现动态封禁

防火墙静态规则无法应对来源IP不断变化的攻击。Fail2ban通过分析日志,对多次失败的认证尝试自动添加临时封禁规则。安装:

apt install fail2ban

创建/etc/fail2ban/jail.local,不要直接修改jail.conf:

[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 5
ignoreip = 127.0.0.1/8 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16

[sshd]
enabled = true
port = 22022
logpath = /var/log/auth.log
backend = systemd

如果SSH端口已修改,port字段要同步修改。Fail2ban默认使用iptables,但Debian 11+的nftables后端也支持。检查/etc/fail2ban/action.d/目录下是否有nftables相关动作,可以在jail.local中指定banaction = nftables。重启服务后,可以通过fail2ban-client status sshd查看当前封禁情况。

除了SSH,如果服务器还运行了其他需要认证的服务(如Postfix、Dovecot、Pure-FTPd),Fail2ban都有对应的过滤器,在jail.local中启用即可。但注意不要对Web登录表单启用过于激进的规则,否则可能误封正常用户。

隐藏服务版本信息,降低针对性攻击概率

端口扫描工具通常会抓取服务Banner来判断软件版本,然后针对特定版本漏洞发起攻击。Debian上可以通过修改服务配置来隐藏或伪造版本信息。对于SSH,在sshd_config中设置:

DebianBanner no

这不会隐藏OpenSSH版本号(版本号在握手阶段就发送了),但可以去掉Debian发行版信息。要彻底隐藏SSH版本需要修改源码或使用代理,性价比不高,不建议在生产环境操作。

对于Apache或Nginx,可以关闭Server头或修改为通用值。Nginx在http块中加入:

server_tokens off;

Apache在配置中加入:

ServerTokens Prod
ServerSignature Off

这些措施不能阻止攻击,但可以增加自动化扫描工具识别服务类型的难度,减少针对性漏洞利用尝试。

定期复查端口和连接状态

端口安全不是一次性配置,需要定期审计。建议每周执行一次以下检查:

ss -tulnp
nft list ruleset
fail2ban-client status

同时查看/var/log/auth.log中是否有异常登录尝试,以及/var/log/kern.log中是否有内核丢弃的可疑包记录。如果发现新的监听端口,立即确认是否为自己安装的服务,如果不是则可能服务器已被入侵。

另外,使用nmap从外部扫描自己的服务器端口,验证防火墙策略是否按预期工作。注意扫描前确认自己有权限,且扫描行为不会触发云服务商的安全告警。外部扫描能看到的是防火墙放行后的结果,与内部ss -tulnp看到的监听端口对比,可以确认防火墙规则是否有效。

总结

Debian服务器端口安全防护的核心是减少暴露面、限制访问来源、动态响应攻击。关闭非必要服务是第一步,内核参数提供基础抗压能力,nftables构建最小化访问控制,SSH加固消除暴力破解风险,Fail2ban实现自动化封禁,隐藏版本信息增加攻击难度。这些措施组合使用后,公网服务器的端口安全性会提升一个量级。所有操作都应该在测试环境验证后再应用到生产服务器,避免因防火墙规则错误导致自己无法登录。