防火墙设置
保护您的服务器免受未授权访问
为什么需要防火墙
防火墙是服务器安全的第一道防线,它可以:
- 阻止未授权的访问尝试
- 限制暴露的服务端口
- 防止恶意扫描和攻击
- 控制进出服务器的流量
Linux 防火墙简介
常见的 Linux 防火墙工具:
- UFW - Ubuntu/Debian 的简易防火墙(推荐新手使用)
- Firewalld - CentOS/RHEL/Rocky/Alma 的默认防火墙
- iptables - 底层防火墙规则系统
- nftables - iptables 的新一代替代品
UFW 防火墙(Ubuntu/Debian)
安装 UFW
Ubuntu 默认已安装 UFW,如未安装:
sudo apt update
sudo apt install ufw
基本命令
# 查看状态
sudo ufw status
sudo ufw status verbose
# 启用/禁用防火墙
sudo ufw enable
sudo ufw disable
# 重置防火墙(清除所有规则)
sudo ufw reset
默认策略
建议的默认策略:
# 默认拒绝所有传入连接
sudo ufw default deny incoming
# 默认允许所有传出连接
sudo ufw default allow outgoing
允许 SSH 连接
重要
在启用防火墙前,必须先允许 SSH 端口,否则会被锁定在服务器外!
# 允许 SSH(端口 22)
sudo ufw allow ssh
# 或
sudo ufw allow 22/tcp
# 如果修改了 SSH 端口(例如 2222)
sudo ufw allow 2222/tcp
常用服务配置
# HTTP 和 HTTPS
sudo ufw allow http
sudo ufw allow https
# 或
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# MySQL/MariaDB(仅限本地访问)
sudo ufw allow from 127.0.0.1 to any port 3306
# PostgreSQL(仅限本地访问)
sudo ufw allow from 127.0.0.1 to any port 5432
# 特定端口范围
sudo ufw allow 1000:2000/tcp
# 特定 IP 地址
sudo ufw allow from 192.168.1.100
sudo ufw allow from 192.168.1.0/24
删除规则
# 查看带编号的规则列表
sudo ufw status numbered
# 按编号删除规则
sudo ufw delete 3
# 按规则内容删除
sudo ufw delete allow http
完整配置示例
#!/bin/bash
# 配置 UFW 防火墙
# 重置
sudo ufw reset
# 默认策略
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 允许 SSH(必须!)
sudo ufw allow ssh
# 允许 Web 服务
sudo ufw allow http
sudo ufw allow https
# 启用防火墙
sudo ufw enable
# 查看状态
sudo ufw status verbose
Firewalld(CentOS/Rocky/Alma)
基本命令
# 查看状态
sudo firewall-cmd --state
sudo systemctl status firewalld
# 启动/停止/重启
sudo systemctl start firewalld
sudo systemctl stop firewalld
sudo systemctl restart firewalld
# 开机自启
sudo systemctl enable firewalld
区域(Zones)
Firewalld 使用区域管理不同网络环境:
- public - 公共区域,默认区域
- trusted - 信任所有连接
- drop - 丢弃所有传入连接
- block - 拒绝所有传入连接
# 查看默认区域
sudo firewall-cmd --get-default-zone
# 列出所有区域
sudo firewall-cmd --get-zones
# 查看区域详情
sudo firewall-cmd --zone=public --list-all
添加服务
# 临时添加(重启后失效)
sudo firewall-cmd --add-service=ssh
sudo firewall-cmd --add-service=http
sudo firewall-cmd --add-service=https
# 永久添加
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
# 重载配置
sudo firewall-cmd --reload
添加端口
# 临时添加端口
sudo firewall-cmd --add-port=8080/tcp
sudo firewall-cmd --add-port=1000-2000/tcp
# 永久添加端口
sudo firewall-cmd --permanent --add-port=8080/tcp
# 重载配置
sudo firewall-cmd --reload
富规则(Rich Rules)
更复杂的规则配置:
# 允许特定 IP 访问 SSH
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" service name="ssh" accept'
# 拒绝特定 IP
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.50" reject'
# 限制连接速率(防暴力破解)
sudo firewall-cmd --permanent --add-rich-rule='rule service name="ssh" limit value="3/m" accept'
完整配置示例
#!/bin/bash
# 配置 Firewalld
# 确保运行中
sudo systemctl start firewalld
sudo systemctl enable firewalld
# 清除现有规则
sudo firewall-cmd --permanent --remove-service=ssh 2>/dev/null
sudo firewall-cmd --permanent --remove-service=http 2>/dev/null
sudo firewall-cmd --permanent --remove-service=https 2>/dev/null
# 添加必要服务
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
# 重载配置
sudo firewall-cmd --reload
# 查看配置
sudo firewall-cmd --list-all
安全最佳实践
最小权限原则
- 只开放必要的端口
- 数据库等敏感服务不暴露到公网
- 使用 VPN 或跳板机访问管理端口
修改默认端口
将常用服务改为非标准端口:
# 修改 SSH 端口
sudo nano /etc/ssh/sshd_config
# 修改:Port 2222
sudo systemctl restart sshd
# 防火墙允许新端口
sudo ufw allow 2222/tcp
# 或
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload
限制管理端口访问
只允许特定 IP 访问 SSH:
# UFW
sudo ufw allow from 192.168.1.0/24 to any port 22
# Firewalld
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept'
使用 Fail2ban
自动封禁暴力破解尝试:
# Ubuntu/Debian
sudo apt install fail2ban
# CentOS/Rocky/Alma
sudo dnf install fail2ban
# 启动
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
故障排除
无法连接 SSH
如果配置防火墙后无法连接:
- 通过 VNC 控制台登录服务器
- 检查防火墙状态
- 确认 SSH 端口已允许
- 临时禁用防火墙测试
# 临时禁用 UFW
sudo ufw disable
# 临时停止 Firewalld
sudo systemctl stop firewalld
服务无法访问
检查步骤:
- 确认服务正在运行:
systemctl status service-name - 检查服务监听端口:
netstat -tulpn - 确认防火墙已允许该端口
- 检查服务是否绑定到正确地址
规则不生效
Firewalld 需要重载配置:
sudo firewall-cmd --reload
防火墙日志
启用日志记录
# UFW
sudo ufw logging on
sudo ufw logging high
# Firewalld
sudo firewall-cmd --set-log-denied=all
sudo firewall-cmd --reload
查看日志
# UFW 日志
sudo tail -f /var/log/ufw.log
# Firewalld 日志
sudo journalctl -u firewalld -f
# 系统日志中的拒绝记录
sudo grep "UFW BLOCK" /var/log/syslog
sudo grep "REJECT\|DROP" /var/log/messages
测试防火墙
端口扫描测试
从另一台服务器扫描开放的端口:
# 使用 nmap 扫描
nmap -p 1-1000 your-server-ip
# 测试特定端口
nc -zv your-server-ip 22
nc -zv your-server-ip 80
在线端口检测工具
- https://www.yougetsignal.com/tools/open-ports/
- https://ping.eu/port-chk/
安全提醒
配置完成后,定期审查防火墙规则,删除不再需要的开放端口。保持系统更新,及时修补安全漏洞。