为什么需要防火墙

防火墙是服务器安全的第一道防线,它可以:

  • 阻止未授权的访问尝试
  • 限制暴露的服务端口
  • 防止恶意扫描和攻击
  • 控制进出服务器的流量

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

如果配置防火墙后无法连接:

  1. 通过 VNC 控制台登录服务器
  2. 检查防火墙状态
  3. 确认 SSH 端口已允许
  4. 临时禁用防火墙测试
# 临时禁用 UFW
sudo ufw disable

# 临时停止 Firewalld
sudo systemctl stop firewalld

服务无法访问

检查步骤:

  1. 确认服务正在运行:systemctl status service-name
  2. 检查服务监听端口:netstat -tulpn
  3. 确认防火墙已允许该端口
  4. 检查服务是否绑定到正确地址

规则不生效

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/

安全提醒

配置完成后,定期审查防火墙规则,删除不再需要的开放端口。保持系统更新,及时修补安全漏洞。