Ubuntu服务器暴露在公网环境时,端口就是最直接的攻击面。每多开放一个端口,就多一条被入侵的通道。很多运维人员习惯用默认配置部署服务,防火墙规则也不做精细化控制,这等于把服务器大门敞开。端口安全管控的核心思路其实就两条:最小化暴露面,以及对所有访问行为做实时感知和拦截。
明确当前端口开放状态动手加固之前,必须先搞清楚服务器上到底哪些端口在监听。很多服务会默认监听0.0.0.0,也就是所有网络接口,这会把服务直接暴露给公网。用ss命令可以精确查看当前监听状态:
ss -tlnp
这条命令列出所有TCP监听端口、对应的进程和服务名称。重点关注监听地址是0.0.0.0还是127.0.0.1。如果是0.0.0.0,说明该端口对外网可达。再结合netstat或lsof交叉验证,确认每个端口对应的进程是否都是业务必需的。比如一台只跑Nginx的Web服务器,就不应该出现MySQL的3306端口监听在0.0.0.0上。
UFW防火墙精细化规则Ubuntu自带的UFW(Uncomplicated Firewall)足够应对绝大多数场景。默认策略应该是拒绝所有入站流量,只放行明确需要的端口。先设置默认规则:
ufw default deny incoming ufw default allow outgoing
然后逐条添加放行规则。注意不要直接ufw allow 22就完事,这样SSH端口对所有来源IP开放,等于把登录入口暴露给全球扫描器。应该限制来源IP范围:
ufw allow from 192.168.1.0/24 to any port 22
这条规则只允许内网网段访问SSH。如果运维人员需要从公网远程登录,应该限定为自己公司或家庭的固定公网IP,而不是全放。对于Web服务,80和443端口需要对外开放,但也可以结合CDN或反向代理的IP段做限制,避免源站直接被扫描。UFW启用前记得先确认已放行自己的管理IP,否则可能把自己锁在外面:
ufw enable ufw status verbose
status verbose能显示每条规则的详细信息,包括序号、动作、协议、端口和来源IP。定期检查规则列表,清理不再需要的旧规则。
服务级别的绑定控制防火墙是第一道防线,但服务自身的监听配置同样关键。很多服务默认监听0.0.0.0,即使防火墙做了限制,一旦规则被误删或绕过,服务就直接暴露。修改服务配置文件,让非必要对外服务只监听本地回环地址。以MySQL为例,编辑/etc/mysql/mysql.conf.d/mysqld.cnf:
bind-address = 127.0.0.1
Redis同样需要修改redis.conf中的bind参数,并设置requirepass密码。Memcached默认没有认证机制,如果必须监听外网,至少用防火墙限制来源IP,或者改用Unix Socket通信。对于确实需要跨服务器通信的服务,比如微服务架构中的内部API,应该使用内网IP绑定,而不是0.0.0.0。
SSH端口加固与暴力破解防御SSH是服务器管理的命脉,也是被攻击最频繁的服务。默认22端口每天会被无数扫描器探测。更换SSH端口能减少大量自动化扫描的噪音,但这只是障眼法,不能依赖。编辑/etc/ssh/sshd_config:
Port 2222 PermitRootLogin no PasswordAuthentication no PubkeyAuthentication yes
禁止root直接登录,禁用密码认证,强制使用密钥对登录。这两项配置比改端口重要得多。密钥登录消除了密码被暴力破解的可能性。如果必须保留密码登录给某些用户,至少安装fail2ban做动态封禁。fail2ban通过监控日志中的失败登录记录,自动在iptables中添加临时封禁规则:
apt install fail2ban cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
在jail.local中调整[sshd]段的配置,设置最大尝试次数和封禁时间。默认封禁10分钟,可以根据实际攻击频率调整到数小时甚至永久。fail2ban不仅适用于SSH,还可以为Nginx、Apache等Web服务配置规则,拦截恶意爬虫和漏洞扫描。
实时连接监控与异常检测端口管控不是一次性配置就完事,需要持续监控连接状态。ss命令可以实时查看当前连接:
ss -tan state established
这条命令列出所有已建立的TCP连接,包括源IP、目标端口。配合watch命令做持续观察:
watch -n 1 'ss -tan state established | wc -l'
如果某个端口突然出现大量ESTABLISHED连接,可能是被DDoS攻击或者服务被利用做反向代理。iftop和nethogs可以按进程和IP查看实时流量,快速定位异常流量来源。对于更精细的监控,可以用auditd记录关键端口的访问行为,或者部署osquery做系统级别的持续查询。
内核参数加固Linux内核提供了不少网络层面的安全参数,通过sysctl调整能增强抗扫描和抗攻击能力。编辑/etc/sysctl.conf或/etc/sysctl.d/下的配置文件:
net.ipv4.tcp_syncookies = 1 net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 net.ipv4.icmp_echo_ignore_all = 1 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.all.send_redirects = 0
tcp_syncookies开启SYN Cookie防护,抵御SYN Flood攻击。rp_filter启用反向路径过滤,防止IP地址欺骗。icmp_echo_ignore_all禁止响应ping,减少被扫描发现的概率。关闭ICMP重定向和源路由,防止中间人攻击。修改后执行sysctl -p生效。这些参数对性能影响极小,但能有效过滤掉大量畸形包和扫描探测。
基于IPSet的动态封禁当需要封禁的IP数量很大时,逐条添加iptables规则会严重影响性能。ipset把IP集合存储在哈希表中,匹配效率远高于线性遍历iptables规则链。先创建ipset集合:
ipset create blacklist hash:ip timeout 86400
这个集合中的IP会在86400秒后自动过期。然后在iptables中引用:
iptables -I INPUT -m set --match-set blacklist src -j DROP
配合脚本或fail2ban,把检测到的恶意IP动态加入blacklist。比如从Nginx日志中提取扫描特定路径的IP,或者SSH暴力破解的来源IP。ipset还支持hash:net类型,可以封禁整个IP段。对于大规模的自动化攻击,这种方式比单独处理每个IP高效得多。
Nginx反向代理的端口隐藏很多应用服务本身的安全配置薄弱,直接暴露端口风险很高。通过Nginx反向代理,可以把后端服务隐藏在内网,只暴露Nginx的80和443端口。后端服务改为监听127.0.0.1,Nginx通过本地回环地址转发请求。这样即使后端服务存在漏洞,攻击者也无法直接访问。配置示例:
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
后端应用监听在127.0.0.1:8080,外网完全不可达。Nginx还可以在这一层做访问控制、速率限制和WAF规则过滤,把安全防护集中到统一的入口点。
端口敲门技术隐蔽管理端口对于SSH这类管理端口,即使改了端口号,扫描器通过全端口扫描依然能发现。端口敲门(Port Knocking)提供了一种隐蔽方案:默认状态下SSH端口对所有人关闭,只有按特定顺序访问几个指定端口后,防火墙才临时放行访问者IP。这相当于一个暗号,只有知道正确敲门序列的人才能打开管理入口。用knockd实现:
apt install knockd
# 编辑 /etc/knockd.conf
[openSSH]
sequence = 7000,8000,9000
seq_timeout = 5
command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
[closeSSH]
sequence = 9000,8000,7000
seq_timeout = 5
command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
客户端通过nmap或knock命令按顺序发送SYN包,服务器验证序列后动态添加iptables规则。这种方式让SSH端口在常规扫描中完全不可见,极大降低了被攻击的概率。但要注意敲门序列本身的安全性,避免被嗅探。
日志审计与自动化响应所有端口层面的访问控制,最终都要落到日志审计上。仅靠防火墙静默丢包是不够的,必须记录被拒绝的连接尝试,这些日志是发现攻击行为的第一手数据。UFW默认会记录被拒绝的包,日志通常在/var/log/ufw.log。可以用rsyslog或syslog-ng集中收集,再导入ELK或Grafana Loki做可视化分析。当某个IP在短时间内触发大量拒绝记录时,自动化脚本应该将其加入ipset黑名单。这种从检测到响应的闭环,才能让端口安全从静态防御变成动态对抗。
端口安全管控本质上是一个持续收敛暴露面的过程。每一条防火墙规则、每一个服务监听地址、每一次异常连接的处置,都在缩小攻击者可以利用的窗口。把默认策略设为拒绝,把服务绑定到最小范围,把管理入口隐藏起来,把监控和自动化响应跑起来,这四件事做到位,服务器的端口层面就已经具备了相当强的抗攻击能力。
