Linux 防火墙配置完全指南

Linux 防火墙配置完全指南

Someone Lv5

前言

防火墙是 Linux 服务器安全的第一道防线。无论是个人 VPS 还是企业生产环境,正确配置防火墙规则能有效阻止未经授权的网络访问、抵御恶意扫描和攻击。本文将系统介绍 Linux 下主流的三种防火墙方案——iptables、ufw 和 firewalld,涵盖基本概念、配置方法和实战场景。

一、Linux 防火墙基础概念

1.1 Netfilter 框架

Linux 内核的防火墙功能基于 Netfilter 框架实现。Netfilter 是一组内核态的网络数据包处理钩子(hooks),允许用户态程序注册回调函数来检查、修改、丢弃或转发数据包。

Netfilter 支持以下五种钩子点(Hook Points):

  • PREROUTING:数据包进入协议栈后、路由决策前
  • INPUT:数据包目标为本机时触发
  • FORWARD:数据包需要经过本机转发时触发
  • OUTPUT:本机发出的数据包
  • POSTROUTING:路由决策后、数据包离开前

1.2 规则匹配与处理动作

防火墙规则按顺序匹配,一旦匹配即执行对应动作(target),不再继续匹配后续规则。常见处理动作包括:

  • ACCEPT:允许数据包通过
  • DROP:丢弃数据包(不回复任何信息)
  • REJECT:拒绝数据包(回复 ICMP 不可达消息)
  • LOG:记录日志但不影响处理
  • SNAT/DNAT:源/目标地址转换(NAT)

1.3 防火墙方案对比

特性iptablesufwfirewalld
底层引擎直接操作 Netfilter基于 iptables 的封装基于 nftables(新版)
适用发行版所有 Linux 发行版Ubuntu/Debian 为主RHEL/CentOS/Fedora
配置方式命令行规则链简单语法规则区域(zone)管理
学习曲线较陡峭平缓中等
动态更新需手动重载即时生效即时生效
适合场景深度自定义、路由器桌面/简单服务器企业服务器集群

二、iptables 详解

iptables 是最经典、功能最强大的 Linux 防火墙工具,几乎所有的上层防火墙工具底层都使用 iptables 或其继任者 nftables。

2.1 表(Tables)与链(Chains)

iptables 按功能划分为多个表(table),每个表包含若干链(chain):

表名 包含的链 主要用途
filter INPUT, FORWARD, OUTPUT 数据包过滤(默认表)
nat PREROUTING, POSTROUTING, OUTPUT 网络地址转换
mangle PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING 修改数据包头部
raw PREROUTING, OUTPUT 配置连接跟踪例外

2.2 基本命令语法

1
iptables -t <表名> <操作命令> <链名> <匹配条件> -j <动作>

常用操作命令:

命令 含义
-A 在链末尾追加规则
-I 在链开头插入规则
-D 删除匹配的规则
-R 替换指定编号的规则
-L 列出当前规则
-F 清空所有规则
-P 设置链的默认策略

2.3 实战:基础安全配置

以下是一套适用于 Web 服务器的 iptables 安全配置模板:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/bin/bash
# 清空现有规则
iptables -F
iptables -X
iptables -t nat -F
iptables -t mangle -F

# 默认策略:拒绝所有入站,允许所有出站
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# 允许本地回环接口通信
iptables -A INPUT -i lo -j ACCEPT

# 允许已建立的连接(ESTABLISHED, RELATED)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 允许 SSH(22端口)— 建议修改为自定义端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 允许 HTTP 和 HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# 允许 ICMP(ping)— 调试用,生产环境可注释
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

# 记录被丢弃的包(防止日志过多,可限速)
iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables-DROP: " --log-level 4

# 保存规则
iptables-save > /etc/iptables/rules.v4

echo "防火墙规则已应用"

2.4 高级规则示例

限制单个 IP 的并发 SSH 连接数:

1
iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j REJECT

防止端口扫描(SYN Flood 防护):

1
2
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 5 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP

仅允许特定 IP 访问 SSH:

1
2
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP

端口转发(DNAT):

1
2
3
# 将外部 8080 端口流量转发到内网 192.168.1.100:80
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
iptables -A FORWARD -p tcp -d 192.168.1.100 --dport 80 -j ACCEPT

2.5 规则持久化

Debian/Ubuntu:

1
2
3
4
5
6
7
8
9
# 安装 iptables-persistent
apt install iptables-persistent -y

# 手动保存
iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6

# 恢复
iptables-restore < /etc/iptables/rules.v4

CentOS/RHEL 7+:

1
2
3
4
# 安装 iptables-services
yum install iptables-services -y
systemctl enable iptables
service iptables save

三、ufw 详解

ufw(Uncomplicated Firewall)是 Ubuntu 系统默认的防火墙配置工具,对 iptables 进行了友好封装,语法简洁明了,适合初学者和快速配置场景。

3.1 基础命令

1
2
3
4
5
6
7
8
9
10
11
12
# 查看状态
ufw status

# 查看详细状态(包含规则编号)
ufw status numbered

# 启用/禁用
ufw enable
ufw disable

# 重置为默认状态
ufw reset

3.2 常用规则配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 默认策略:拒绝所有入站,允许所有出站
ufw default deny incoming
ufw default allow outgoing

# 允许 SSH
ufw allow ssh
# 或指定端口
ufw allow 22/tcp

# 允许 HTTP/HTTPS
ufw allow 80/tcp
ufw allow 443/tcp

# 允许特定端口范围
ufw allow 3000:4000/tcp

# 拒绝特定 IP
ufw deny from 203.0.113.4

# 仅允许特定 IP 访问 SSH
ufw allow from 192.168.1.0/24 to any port 22

# 删除规则(按编号)
ufw status numbered
ufw delete 3

# 删除规则(按内容)
ufw deny 23/tcp

3.3 应用配置文件

ufw 支持通过应用配置文件管理复杂规则,配置文件位于 /etc/ufw/applications.d/

1
2
3
4
5
6
7
8
# 查看所有可用的应用配置
ufw app list

# 查看应用的端口详情
ufw app info 'Nginx Full'

# 允许应用
ufw allow 'Nginx Full'

自定义应用配置示例(/etc/ufw/applications.d/myapp):

1
2
3
4
[MyApp]
title=My Custom Application
description=My web service running on port 8080
ports=8080/tcp

3.4 日志与限速

1
2
3
4
5
6
7
8
# 启用日志
ufw logging on

# 日志级别:low/medium/high
ufw logging medium

# 限速(防止暴力破解)
ufw limit ssh/tcp

ufw limit 会在 30 秒内拒绝超过 6 次连接的 IP 地址,非常适合保护 SSH 端口。

3.5 完整配置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/bin/bash
# ufw 安全配置脚本

# 先禁用以重置
ufw disable

# 默认策略
ufw default deny incoming
ufw default allow outgoing

# SSH(建议改端口后配置)
ufw limit 22/tcp

# Web 服务
ufw allow 80/tcp
ufw allow 443/tcp

# 邮件服务(如需)
# ufw allow 25/tcp # SMTP
# ufw allow 587/tcp # SMTP Submission
# ufw allow 993/tcp # IMAPS

# 数据库(仅限内网)
ufw allow from 10.0.0.0/8 to any port 3306 proto tcp # MySQL
ufw allow from 10.0.0.0/8 to any port 6379 proto tcp # Redis

# 监控和日志
ufw allow 9100/tcp # Node Exporter
ufw allow 9090/tcp # Prometheus

# 启用防火墙
ufw enable

# 查看最终结果
ufw status verbose

四、firewalld 详解

firewalld 是 RHEL/CentOS 7+ 和 Fedora 的默认防火墙管理工具,基于 区域(zone) 概念管理规则,支持动态更新无需重启。

4.1 区域(Zone)概念

firewalld 通过将网络接口分配到不同区域来管理信任级别:

区域名信任级别默认策略适用场景
trusted最高全部接受内网可信网络
home有限接受家庭网络
internal有限接受内部网络
work中高有限接受工作网络
public仅允许 SSH/DHCP公共网络(默认)
external最低禁止入站,NAT 出站外部网络、网关
dmz隔离禁止入站DMZ 区域
block拒绝全部拒绝(reject)黑名单
drop丢弃全部丢弃(drop)最高安全级别

4.2 基本命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看状态
firewall-cmd --state

# 查看当前区域
firewall-cmd --get-default-zone

# 列出当前区域的规则
firewall-cmd --list-all

# 列出所有区域的规则
firewall-cmd --list-all-zones

# 查看支持的服务
firewall-cmd --get-services

4.3 配置服务与端口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 允许服务(推荐方式)
firewall-cmd --add-service=http
firewall-cmd --add-service=https

# 允许端口
firewall-cmd --add-port=8080/tcp
firewall-cmd --add-port=3000-4000/tcp

# 移除规则
firewall-cmd --remove-service=http
firewall-cmd --remove-port=8080/tcp

# 重新加载规则
firewall-cmd --reload

重要:不加 --permanent 的规则是运行时规则,重启后会丢失。如需永久生效,需加 --permanent 参数并执行 --reload

1
2
3
4
# 永久生效的规则
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --reload

4.4 高级配置

限制来源 IP:

1
2
3
# 仅允许内网访问 SSH
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept'
firewall-cmd --reload

端口转发:

1
2
3
4
5
6
7
8
9
# 将 8080 端口流量转发到 80
firewall-cmd --permanent --add-forward-port=port=8080:proto=tcp:toport=80

# 转发到其他主机
firewall-cmd --permanent --add-forward-port=port=8080:proto=tcp:toport=80:toaddr=192.168.1.100

# 启用 masquerade(IP 伪装)
firewall-cmd --permanent --add-masquerade
firewall-cmd --reload

速率限制:

1
2
3
# 限制 SSH 连接频率
firewall-cmd --permanent --add-rich-rule='rule service name="ssh" limit value="3/m" accept'
firewall-cmd --reload

自定义区域:

1
2
3
4
5
6
7
# 将 eth0 接口分配到 trusted 区域
firewall-cmd --permanent --zone=trusted --add-interface=eth0

# 创建新区域
firewall-cmd --permanent --new-zone=myzone
firewall-cmd --permanent --zone=myzone --add-service=http
firewall-cmd --reload

4.5 完整配置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/bin/bash
# firewalld 安全配置脚本

# 设置默认区域为 public
firewall-cmd --set-default-zone=public

# 添加运行时规则
firewall-cmd --add-service=ssh
firewall-cmd --add-service=http
firewall-cmd --add-service=https

# 永久保存规则
firewall-cmd --runtime-to-permanent

# 或直接添加永久规则
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.0/8" port protocol="tcp" port="5432" accept'
firewall-cmd --reload

# 允许内置服务
firewall-cmd --permanent --add-service=dhcp
firewall-cmd --permanent --add-service=dns

# 拒绝 ICMP 重定向
firewall-cmd --permanent --add-rich-rule='rule protocol value="icmp" reject'
firewall-cmd --reload

echo "firewalld 配置完成"
firewall-cmd --list-all

五、常见问题排查

5.1 查看当前规则状态

1
2
3
4
5
6
7
8
# iptables
iptables -L -n -v --line-numbers

# ufw
ufw status verbose

# firewalld
firewall-cmd --list-all

5.2 测试端口是否开放

1
2
3
4
5
6
7
8
9
10
11
# 本机测试
nc -zv localhost 80
telnet localhost 80

# 远程测试
nc -zv <服务器IP> 80
curl -v http://<服务器IP>:80

# 在线端口扫描(外部视角)
# 使用 https://tool.chinaz.com/port 或 nmap
nmap -p 80,443,22 <服务器IP>

5.3 查看连接跟踪

1
2
3
4
5
# 查看当前连接跟踪表
conntrack -L

# 或者
cat /proc/net/nf_conntrack

5.4 防火墙导致常见问题

SSH 连接断开后无法重连:

  • 检查 SSH 端口规则是否被覆盖
  • 使用 VNC/IPMI/KVM 等带外管理接入
  • 检查默认策略是否为 DROP

Web 服务无法访问:

1
2
3
4
5
6
7
8
# 确认防火墙未阻止端口
iptables -L INPUT -n | grep 80
ufw status | grep 80
firewall-cmd --query-service=http

# 暂关防火墙测试(定位问题用,切勿长期关闭)
# ufw disable
# systemctl stop firewalld

防火墙规则太多导致性能下降:

  • 使用 ipset 管理大量 IP 集合
  • 合理使用连接跟踪(--state ESTABLISHED,RELATED
  • 将常用规则放在链的前面

六、安全最佳实践

6.1 通用原则

  1. 最小权限原则:只开放必要的端口,能不开就不开
  2. 白名单优先:默认为 DROP,仅允许明确需要的流量
  3. SSH 保护:修改默认端口 + 密钥登录 + fail2ban + ufw limit
  4. 定期审计:每周检查防火墙规则,清理过期规则
  5. 规则备份:将配置文件纳入版本管理(如 Git)
  6. 双层防护:云服务商安全组 + 系统防火墙

6.2 常用端口速查表

端口号协议用途建议策略
22TCPSSH限制来源 IP + 限速
80TCPHTTP公开开放
443TCPHTTPS公开开放
3306TCPMySQL/MariaDB仅限内网
5432TCPPostgreSQL仅限内网
6379TCPRedis仅限内网
27017TCPMongoDB仅限内网
8080TCPHTTP 备用/代理按需
8443TCPHTTPS 备用按需
9090TCPPrometheus限制来源 IP
9100TCPNode Exporter限制来源 IP

6.3 结合 fail2ban

fail2ban 能自动检测恶意登录尝试并添加临时防火墙规则:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 安装 fail2ban
apt install fail2ban -y

# 创建本地配置
cat > /etc/fail2ban/jail.local << 'EOF'
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 5

[sshd]
enabled = true
port = ssh
action = iptables[name=SSH, port=ssh, protocol=tcp]
logpath = /var/log/auth.log
EOF

# 启动并启用
systemctl enable --now fail2ban

总结

无论使用哪种防火墙工具,核心原则是一致的:

  1. 理解网络流量模型——只有确定哪些端口需要开放,才能精确配置规则
  2. 从严格开始,逐步开放——先设默认 DROP,再逐步添加 ACCEPT 规则
  3. 持久化配置——确保规则在重启后依然生效
  4. 定期维护——随着业务变化调整防火墙策略

对于初学者,推荐从 ufw 入门(Ubuntu)或 firewalld(CentOS),简单直观;对于需要精细控制的场景,iptables 仍然是最强大的选择。同时建议所有服务器都启用 fail2ban 作为第二道防线,形成纵深防御体系。


本文由AI辅助生成,内容仅供参考

  • 标题: Linux 防火墙配置完全指南
  • 作者: Someone
  • 创建于 : 2026-06-07 16:31:00
  • 更新于 : 2026-06-18 08:39:57
  • 链接: https://demo-blog.qusite.cn/2026-06-07-linux-firewall-guide/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。