Ubuntu服务器安装完成后,默认会启动不少网络服务并监听在特定端口上。这些端口有些是你需要的,比如SSH的22端口,但更多是系统默认开启而你根本用不上的。每多一个监听端口,就多一个潜在的攻击入口。攻击者扫描到开放端口后,可以针对该服务版本寻找已知漏洞进行渗透。所以,服务器上线前最重要的一步就是端口和服务的最小化——只开放必须的,其余全部禁用或关闭。
快速摸清当前有哪些端口在监听动手操作前,先搞清楚系统当前到底开了哪些端口。最直接的工具是ss命令,它比老旧的netstat更快更准。执行以下命令查看所有TCP和UDP的监听端口:
sudo ss -tulnp
输出结果会显示端口号、协议、服务名称以及对应的进程ID。重点关注State列显示为LISTEN的行。你可能会看到22端口(SSH)、53端口(systemd-resolved DNS缓存)、631端口(CUPS打印服务)、123端口(NTP时间同步)等。如果你的服务器不是打印服务器,CUPS就完全没必要运行;如果你不需要本地DNS缓存,systemd-resolved的53端口也可以关掉。逐条审视,凡是与业务无关的监听服务,都是接下来要处理的目标。
用systemctl彻底停掉不需要的服务Ubuntu使用systemd管理服务,禁用服务最彻底的方式就是先停掉再禁止开机自启。以CUPS打印服务为例:
sudo systemctl stop cups sudo systemctl disable cups sudo systemctl mask cups
mask命令比disable更彻底,它会将服务链接到/dev/null,防止被其他依赖项意外拉起来。对于常见的非必要服务,你可以按这个套路逐个处理:avahi-daemon(零配置网络发现,服务器几乎用不到)、bluetooth(蓝牙服务,服务器根本不需要)、whoopsie(错误报告服务,消耗资源还上传数据)。每处理一个服务后,再用ss -tulnp确认对应端口已经消失。如果发现某个服务停掉后又自动恢复,说明有socket激活机制在作祟,需要把对应的socket文件也mask掉,比如cups.socket。
处理systemd-resolved的53端口占用很多人在Ubuntu服务器上安装DNS服务时会发现53端口被systemd-resolved占用。如果你不需要本地DNS缓存,可以直接禁用:
sudo systemctl stop systemd-resolved sudo systemctl disable systemd-resolved sudo systemctl mask systemd-resolved
然后删除/etc/resolv.conf的软链接,重新创建静态DNS配置文件:
sudo rm /etc/resolv.conf sudo echo "nameserver 8.8.8.8" > /etc/resolv.conf sudo echo "nameserver 8.8.4.4" >> /etc/resolv.conf
如果你确实需要systemd-resolved但不想让它监听外部53端口,可以修改/etc/systemd/resolved.conf,设置DNSStubListener=no,这样它只通过D-Bus提供解析服务,不占用网络端口。
关闭不需要的网络文件系统服务NFS和Samba是文件共享常用的服务,但如果你的服务器不充当文件服务器,这些服务就应该关闭。检查是否安装了nfs-kernel-server:
sudo systemctl stop nfs-kernel-server sudo systemctl disable nfs-kernel-server
rpcbind服务通常伴随NFS运行,它监听111端口,是历史悠久的攻击目标。同样处理掉:
sudo systemctl stop rpcbind sudo systemctl disable rpcbind sudo systemctl mask rpcbind
如果安装了samba,检查smbd和nmbd服务状态,不需要就停掉。这些服务不仅开放端口,还可能因为配置不当导致信息泄露或未授权访问。
用UFW防火墙做第二层防护关闭服务是从源头解决问题,防火墙则是兜底策略。Ubuntu自带的UFW可以轻松配置入站和出站规则。先设置默认策略为拒绝所有入站连接、允许所有出站连接:
sudo ufw default deny incoming sudo ufw default allow outgoing
然后按需开放端口,比如只允许SSH和Web服务:
sudo ufw allow 22/tcp sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw enable
启用后用sudo ufw status verbose查看规则列表。UFW的好处是即使某个服务不小心被启动,防火墙也能挡住外部连接。但注意,UFW管不了本地回环接口上的服务,如果某个服务只监听127.0.0.1,它不会暴露给外部网络,这种情况风险较低,可以酌情保留。
锁定SSH服务的监听范围SSH是服务器管理的命脉,但默认配置监听在所有网络接口上。如果你的服务器有内网IP,并且你只从内网登录,可以把SSH绑定到内网地址。编辑/etc/ssh/sshd_config,找到#ListenAddress 0.0.0.0这行,改为:
ListenAddress 192.168.1.100
替换成你实际的内网IP。这样即使外网扫描到22端口,也无法连接。如果必须从公网访问,建议改用非标准端口并配合密钥认证。修改端口在同一个配置文件里改Port参数,然后重启sshd服务。注意,改端口前务必先用UFW放行新端口,否则改完自己就登不上了。
清理Snap带来的额外服务Ubuntu近年来大力推广Snap包,但Snap应用常常自带独立的网络服务。执行snap list查看已安装的Snap包,你可能会发现lxd、core、snapd等。lxd容器服务会监听8443端口,如果你不用容器,直接移除:
sudo snap remove lxd
Snap应用更新后有时会自动启动服务,检查/var/snap目录下各应用的配置,关闭不需要的网络功能。另外,snapd本身也会通过socket激活,如果彻底不用Snap,可以卸载整个snapd包,但注意这会影响预装的一些Ubuntu核心组件,操作前确认清楚。
禁用IPv6以缩小攻击面如果你的网络环境完全不需要IPv6,关闭它可以减少一半的协议栈攻击面。编辑/etc/sysctl.conf,添加以下参数:
net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv6.conf.lo.disable_ipv6 = 1
然后执行sudo sysctl -p使配置生效。再检查ss -tulnp,你会发现所有tcp6和udp6的监听都消失了。有些服务会同时监听IPv4和IPv6,关掉IPv6后这些服务只保留IPv4监听,端口数量直接减半。不过要提醒一点,某些软件依赖IPv6的本地回环通信,关闭后可能出现异常,遇到这种情况就把lo接口的禁用去掉即可。
定期审计端口变化安全不是一次性工作。建议把端口审计加入日常运维流程。你可以写一个简单的脚本,每天定时执行ss -tulnp并把结果与基准配置做对比,发现新增端口就发告警。基准配置的建立很简单:刚完成加固时执行一次ss -tulnp > /root/port-baseline.txt保存快照。后续用diff对比即可。另外,安装debsums工具可以校验已安装软件包的文件完整性,防止服务被篡改后偷偷开启后门端口:
sudo apt install debsums sudo debsums -c
这个命令会列出所有被修改过的配置文件,结合端口审计结果,能快速定位异常服务。
内核参数加固网络层除了关闭服务,调整内核网络参数也能提升安全性。编辑/etc/sysctl.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.icmp_ignore_bogus_error_responses = 1 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0
这些参数分别启用了SYN Cookie防护、反向路径过滤、忽略广播ICMP、忽略伪造错误响应、禁用ICMP重定向。它们不直接关闭端口,但能让已开放的端口更难被利用进行DDoS或欺骗攻击。执行sudo sysctl -p后立即生效。
处理云厂商预置的监控代理如果你用的是云服务器,镜像里通常预装了厂商的监控代理,比如阿里云的云助手、腾讯云的云监控等。这些代理会主动连接厂商的管理平台,开放本地端口用于接收指令。检查/usr/local/目录下是否有类似qcloud、aliyun等文件夹,查看相关服务状态。如果不需要厂商的自动化运维功能,可以停掉这些代理。但注意,有些云平台的安全组规则依赖代理下发,停掉后可能导致安全组变更无法生效。权衡利弊后决定是否保留,至少要把这些代理监听的端口限制在本地回环地址。
经过以上一系列操作,你的Ubuntu服务器监听端口应该能控制在个位数以内。一台典型的Web服务器最终可能只保留22、80、443三个端口,干净利落。每次部署新应用前,养成先审视网络需求再开放端口的习惯,把端口最小化原则刻进运维流程里,服务器安全基线就扎实了。
