Ubuntu服务器暴露在公网后,端口被扫描和暴力破解几乎是每分钟都在发生的事。很多管理员只装了系统、开了SSH和Web服务就上线,结果几天后发现CPU跑满、多了陌生账号或者被挂上了挖矿程序。端口漏洞防护的核心不是“装个防火墙就行”,而是要把默认暴露面、服务自身配置、内核参数和审计手段组合起来,形成一层层收缩的防线。
先看最直接的暴露面:当前系统到底监听了哪些端口。执行
ss -tulnp能看到所有TCP和UDP监听项。重点不是看有没有监听,而是看监听地址是0.0.0.0还是127.0.0.1。很多数据库、缓存服务默认绑定所有网卡,例如Redis、MongoDB、MySQL,如果不需要被外部访问,必须改成只监听本机。以MySQL为例,在/etc/mysql/mysql.conf.d/mysqld.cnf里设置
bind-address = 127.0.0.1然后重启服务。Redis则修改redis.conf中的
bind 127.0.0.1并设置
protected-mode yes。这一步能直接消除一大类未授权访问漏洞。
对于必须对外开放的端口,比如22、80、443,第一层防护是Ubuntu自带的Uncomplicated Firewall(UFW)。很多人以为UFW只是iptables的简化前端,但实际上它足够应对大多数场景。先设置默认拒绝所有入站、允许所有出站:
ufw default deny incoming ufw default allow outgoing然后按需放行:
ufw allow 22/tcp ufw allow 80/tcp ufw allow 443/tcp如果SSH端口改成了非标准端口比如2222,就放行2222而不是22。启用前务必确认已放行自己的SSH端口,否则会把自己锁在外面:
ufw enable。UFW还有一个容易被忽略的用法是限制暴力破解,例如对SSH端口做连接频率限制:
ufw limit 22/tcp这个规则会自动拒绝30秒内发起超过6次连接的IP,对脚本扫描有很好的抑制作用。
SSH是Ubuntu服务器上被攻击最密集的服务。除了改端口,更有效的做法是直接禁用密码登录,只允许密钥认证。编辑/etc/ssh/sshd_config,确认以下配置:
PasswordAuthentication no PubkeyAuthentication yes PermitRootLogin no MaxAuthTries 3 ClientAliveInterval 300 ClientAliveCountMax 2其中PermitRootLogin no是硬性要求,很多自动化攻击直接尝试root加弱密码。改完后执行
systemctl restart ssh。如果必须保留密码登录,至少安装fail2ban:
apt install fail2ban默认配置就能对SSH暴力破解进行封禁,封禁时长和尝试次数在/etc/fail2ban/jail.local中调整。fail2ban不仅能保护SSH,还能给Nginx、Apache、Postfix等写过滤规则,但要注意不要把自己的IP误封。
Web服务端口漏洞的防护要分两层。第一层是Web服务器本身,Nginx或Apache不要暴露版本号。Nginx在http块里加
server_tokens off;Apache在配置中设置
ServerTokens Prod ServerSignature Off。第二层是应用层漏洞,比如PHP、WordPress、框架的已知漏洞。Ubuntu的unattended-upgrades可以自动安装安全更新:
apt install unattended-upgrades dpkg-reconfigure --priority=low unattended-upgrades这样内核和软件包的安全补丁会自动应用,减少已知漏洞窗口期。对于Web应用,定期用
apt list --upgradable检查可更新包,尤其是php、openssl、libssl等关键组件。
内核层面的端口防护参数经常被忽略,但对抗SYN Flood和端口扫描很有效。编辑/etc/sysctl.conf或/etc/sysctl.d/99-security.conf,加入以下内容:
net.ipv4.tcp_syncookies = 1 net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 net.ipv4.icmp_echo_ignore_broadcasts = 1 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.all.secure_redirects = 0 net.ipv4.conf.default.secure_redirects = 0 net.ipv4.conf.all.log_martians = 1 net.ipv4.tcp_max_syn_backlog = 4096 net.ipv4.tcp_synack_retries = 2然后执行
sysctl -p生效。其中tcp_syncookies开启SYN Cookie防护,能缓解SYN Flood导致的半连接队列耗尽;rp_filter开启反向路径过滤,防止IP欺骗;关闭ICMP重定向和源路由,减少中间人攻击面。这些参数不会影响正常业务,但对扫描器和DDoS工具有明显干扰。
端口漏洞还有一个隐蔽来源:系统服务本身开启了不必要的监听。Ubuntu默认安装后可能有一些服务在后台监听,比如cups打印服务、avahi-daemon、snmpd等。用
systemctl list-units --type=service --state=running查看运行中的服务,把不需要的停掉并禁止开机启动:
systemctl disable --now cups systemctl disable --now avahi-daemon。如果发现某个进程监听可疑端口,用
lsof -i :端口号反查进程和可执行文件路径,确认是否为正常服务。对于确实需要但存在历史漏洞的服务,比如旧版Samba或Exim,优先升级到Ubuntu仓库里的最新版本,或者用UFW限制只允许特定IP访问该端口。
端口扫描检测和主动防御方面,可以安装psad(Port Scan Attack Detector)。它会分析iptables日志,检测端口扫描行为并自动封禁来源IP:
apt install psad安装后修改/etc/psad/psad.conf,设置
EMAIL_ADDRESSES root@localhost HOSTNAME your-server-name ENABLE_AUTO_IDS Y然后启用日志记录规则。psad的独特价值在于能识别FIN扫描、NULL扫描、XMAS扫描等隐蔽扫描方式,而普通防火墙日志只记录被拒绝的连接。对于有公网业务且经常被扫描的服务器,psad能提供早期预警。
还有一个常被忽视的端口漏洞场景:Docker容器。很多人以为容器隔离了网络,但实际上Docker默认会修改iptables规则,绕过UFW的限制。如果容器映射了端口到0.0.0.0,即使UFW没有放行,外部依然能访问。解决方法是给Docker daemon配置
{
"iptables": false,
"ip-forward": false
} 或者更稳妥的做法是在docker run时明确绑定IP:docker run -p 127.0.0.1:8080:80 ...。如果必须暴露容器端口到公网,要在容器内部再做一层认证或访问控制,不能依赖宿主机防火墙。
审计和持续监控是端口防护的最后一环。定期执行
nmap -sV -p- 服务器IP从外部视角扫描自己的服务器,看是否有意外开放的端口。内部用
netstat -tulpn或
ss -tulpn对比。把关键日志集中起来,比如/var/log/auth.log中的SSH登录失败记录、UFW的拒绝日志,用logwatch或自写脚本每天汇总一次异常。如果发现某个端口持续被同一IP段探测,直接在UFW里加拒绝规则:
ufw deny from 192.168.1.0/24 to any port 22。端口防护不是一次配置就结束的事,攻击手法在变,业务也在变,每增加一个新服务、新容器、新端口映射,都要重新评估暴露面。
Ubuntu服务器端口漏洞防护的优先级应该是:先收缩监听地址,再上防火墙默认拒绝,然后加固SSH和Web服务,最后用内核参数和审计工具兜底。不要一上来就堆工具,很多漏洞其实是因为默认配置太宽松造成的。把基础配置做扎实,比装一堆安全软件更有效。
