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实现自动化封禁,隐藏版本信息增加攻击难度。这些措施组合使用后,公网服务器的端口安全性会提升一个量级。所有操作都应该在测试环境验证后再应用到生产服务器,避免因防火墙规则错误导致自己无法登录。
