Linux防火墙高级配置

AI 生成

Linux防火墙高级配置

防火墙是Linux服务器安全的第一道防线,能有效控制进出服务器的网络流量。本文详细介绍三种主流Linux防火墙工具的配置与使用:UFW、firewalld和iptables。

1. UFW (Uncomplicated Firewall)

UFW是Ubuntu/Debian系统默认的防火墙配置工具,提供了简单易用的命令行界面,适合初学者使用。

1.1 安装与基本使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 安装UFW
apt update
apt install ufw

# 检查UFW状态
ufw status
ufw status verbose # 查看详细状态

# 启用/禁用UFW
ufw enable
ufw disable

# 重置所有规则(恢复默认设置)
ufw reset

1.2 基本规则管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 默认策略
ufw default deny incoming # 拒绝所有入站连接
ufw default allow outgoing # 允许所有出站连接

# 允许特定服务
ufw allow ssh # 允许SSH (22端口)
ufw allow http # 允许HTTP (80端口)
ufw allow https # 允许HTTPS (443端口)
ufw allow 8080/tcp # 允许TCP 8080端口

# 拒绝规则
ufw deny http
ufw deny from 192.168.1.100 # 拒绝特定IP的所有连接

# 删除规则
ufw delete allow http
ufw delete deny from 192.168.1.100

1.3 高级规则配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 允许特定IP访问特定端口
ufw allow from 192.168.1.0/24 to any port 22

# 允许特定IP范围访问
ufw allow from 10.0.0.0/8

# 允许特定网络接口
ufw allow in on eth0 to any port 80

# 限制连接速率(防止DoS攻击)
ufw limit ssh # 限制SSH连接尝试次数

# 允许端口范围
ufw allow 5000:5010/tcp

# 添加注释(Ubuntu 18.04+)
ufw allow http comment "Allow HTTP traffic"

1.4 应用配置文件

UFW允许通过应用配置文件简化规则管理:

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

# 查看应用详情
ufw app info OpenSSH

# 允许应用
ufw allow OpenSSH

1.5 日志管理

1
2
3
4
5
6
7
8
9
# 开启日志
ufw logging on
ufw logging medium # 设置日志级别 (low|medium|high|full)

# 关闭日志
ufw logging off

# 查看日志
tail -f /var/log/ufw.log

2. firewalld

firewalld是CentOS/RHEL 7+和Fedora的默认防火墙管理工具,采用区域(zone)概念组织规则。

2.1 安装与基本使用

1
2
3
4
5
6
7
8
9
10
11
# 安装firewalld
yum install firewalld
dnf install firewalld # Fedora/CentOS 8+

# 启动和启用服务
systemctl start firewalld
systemctl enable firewalld

# 检查状态
firewall-cmd --state
firewall-cmd --list-all # 列出默认区域的所有规则

2.2 区域管理

firewalld使用区域(zone)来组织不同的网络环境规则:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 列出所有区域
firewall-cmd --get-zones

# 查看默认区域
firewall-cmd --get-default-zone

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

# 查看特定区域详情
firewall-cmd --zone=public --list-all

# 将网络接口分配到区域
firewall-cmd --zone=trusted --change-interface=eth0 --permanent

常用区域:

  • public: 公共区域,默认拒绝入站连接,但允许特定服务
  • trusted: 信任区域,允许所有连接
  • home: 家庭区域,允许选择的服务
  • drop: 丢弃区域,丢弃所有入站连接,无回应

2.3 服务管理

firewalld预定义了许多常见服务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 列出所有可用服务
firewall-cmd --get-services

# 在默认区域添加服务
firewall-cmd --add-service=http
firewall-cmd --permanent --add-service=https

# 在特定区域添加服务
firewall-cmd --zone=home --add-service=samba

# 移除服务
firewall-cmd --remove-service=http

# 查询服务状态
firewall-cmd --query-service=ssh

2.4 端口和协议管理

1
2
3
4
5
6
7
8
9
10
11
12
# 添加端口
firewall-cmd --add-port=8080/tcp
firewall-cmd --permanent --add-port=8443/tcp

# 添加端口范围
firewall-cmd --add-port=5000-5100/tcp

# 添加协议
firewall-cmd --add-protocol=icmp

# 移除端口
firewall-cmd --remove-port=8080/tcp

2.5 IP管理与端口转发

1
2
3
4
5
6
7
8
9
10
11
# 允许特定IP或网络
firewall-cmd --add-source=192.168.1.0/24 --zone=trusted

# 禁止特定IP或网络
firewall-cmd --add-rich-rule='rule family=ipv4 source address=10.1.1.1 reject'

# 端口转发(将外部80端口转发到内部8080端口)
firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080

# 将外部端口转发到其他主机
firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=10.0.0.10

2.6 高级规则配置

富规则(Rich Rules)提供更复杂的规则配置能力:

1
2
3
4
5
6
7
8
9
10
11
# 允许特定IP访问特定端口
firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.1.10 port port=22 protocol=tcp accept'

# 限制连接速率
firewall-cmd --add-rich-rule='rule service name=http limit value=10/m accept'

# 拒绝特定IP访问特定服务
firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.1.11 service name=http reject'

# 添加日志规则
firewall-cmd --add-rich-rule='rule service name=ssh log prefix="SSH connection: " level="notice" limit value="3/m" accept'

2.7 配置持久化

默认情况下,firewall-cmd的更改在重启后会丢失:

1
2
3
4
5
6
7
8
# 使更改永久生效
firewall-cmd --runtime-to-permanent

# 直接添加永久规则
firewall-cmd --permanent --add-service=http

# 重新加载规则(应用永久规则到运行时)
firewall-cmd --reload

3. iptables

iptables是Linux内核的包过滤功能接口,功能强大但配置复杂。虽然UFW和firewalld在底层使用iptables,但直接使用iptables可以实现更复杂的规则。

3.1 基本概念

iptables使用表(tables)和链(chains)组织规则:

主要表:

  • filter: 默认表,用于过滤数据包
  • nat: 用于网络地址转换
  • mangle: 用于特殊包修改
  • raw: 用于配置豁免连接跟踪

主要链:

  • INPUT: 处理发往本机的包
  • OUTPUT: 处理本机发出的包
  • FORWARD: 处理通过本机转发的包
  • PREROUTING: 用于NAT表,包进入路由前
  • POSTROUTING: 用于NAT表,包通过路由后

3.2 基本操作

1
2
3
4
5
6
7
8
9
10
11
12
13
# 查看规则
iptables -L # 查看filter表规则
iptables -t nat -L # 查看nat表规则
iptables -L --line-numbers # 显示规则编号

# 清除规则
iptables -F # 清除所有规则
iptables -t nat -F # 清除nat表规则

# 设置默认策略
iptables -P INPUT DROP # 默认丢弃入站包
iptables -P OUTPUT ACCEPT # 默认接受出站包
iptables -P FORWARD DROP # 默认丢弃转发包

3.3 添加基本规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 允许已建立的连接和相关连接
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

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

# 允许SSH连接
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

# 拒绝特定IP
iptables -A INPUT -s 192.168.1.100 -j DROP

# 允许特定网段访问特定端口
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 3306 -j ACCEPT

# 记录丢弃的包
iptables -A INPUT -j LOG --log-prefix "IPTables-Dropped: "

3.4 高级规则配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 限制连接速率(防止暴力破解)
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP

# 端口转发
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

# 源地址转换(NAT)
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# 丢弃无效包
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP

# 防止SYN洪水攻击
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP

# 将特定流量分流到特定用户空间程序
iptables -A INPUT -p tcp --dport 80 -j NFQUEUE --queue-num 0

3.5 保存和恢复规则

iptables规则在重启后会丢失,需要保存:

1
2
3
4
5
6
7
8
9
10
# Debian/Ubuntu
iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6

# CentOS/RHEL
iptables-save > /etc/sysconfig/iptables
ip6tables-save > /etc/sysconfig/ip6tables

# 手动恢复规则
iptables-restore < /etc/iptables/rules.v4

安装iptables-persistent自动保存和恢复规则(Debian/Ubuntu):

1
2
apt install iptables-persistent
netfilter-persistent save # 保存当前规则

4. 防火墙最佳实践

无论使用哪种防火墙工具,以下都是推荐的最佳实践:

4.1 默认拒绝策略

1
2
3
4
5
6
7
8
9
10
11
# UFW
ufw default deny incoming
ufw default allow outgoing

# firewalld
firewall-cmd --set-default-zone=drop # 然后添加需要的服务

# iptables
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

4.2 允许已建立的连接

1
2
3
4
# iptables
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# 在UFW和firewalld中,这是默认行为

4.3 只开放必要端口

仅开放服务所需的最少端口:

1
2
3
4
5
6
7
8
# 常见开放端口
22/tcp (SSH)
80/tcp, 443/tcp (HTTP/HTTPS)
25/tcp, 465/tcp, 587/tcp (SMTP)
110/tcp, 995/tcp (POP3)
143/tcp, 993/tcp (IMAP)
3306/tcp (MySQL)
5432/tcp (PostgreSQL)

4.4 限制SSH访问

1
2
3
4
5
6
7
8
9
# 使用UFW限制SSH连接尝试
ufw limit ssh

# 使用firewalld限制SSH连接
firewall-cmd --add-rich-rule='rule service name=ssh limit value=3/m accept'

# 使用iptables限制SSH连接
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 3 -j DROP

4.5 仅允许特定IP访问管理服务

1
2
3
4
5
6
7
8
9
# UFW允许特定IP访问MySQL
ufw allow from 192.168.1.0/24 to any port 3306

# firewalld允许特定IP访问PostgreSQL
firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 port port=5432 protocol=tcp accept'

# iptables允许特定IP访问Redis
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 6379 -j ACCEPT
iptables -A INPUT -p tcp --dport 6379 -j DROP

4.6 记录被拒绝的连接

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

# firewalld启用日志
firewall-cmd --add-rich-rule='rule family=ipv4 source address="0.0.0.0/0" port port=80 protocol=tcp log prefix="HTTP connection: " level="notice" limit value="3/m" accept'

# iptables启用日志
iptables -A INPUT -j LOG --log-prefix "IPTables-Dropped: " --log-level 4

4.7 定期审计防火墙规则

定期检查和更新防火墙规则:

1
2
3
4
5
6
7
8
9
10
# 查看当前规则
ufw status numbered
firewall-cmd --list-all
iptables -L -n -v

# 查找未使用的规则
# 可通过分析连接和日志确定

# 测试规则变更后的连通性
nc -zv <server-ip> <port>

4.8 使用工具测试防火墙

1
2
3
4
5
# 使用nmap扫描开放端口
nmap -sS -p 1-65535 your_server_ip

# 使用netcat测试端口连通性
nc -zv your_server_ip 22

5. 常见防火墙场景配置

5.1 Web服务器配置

1
2
3
4
5
6
7
8
9
10
11
12
# UFW配置
ufw allow 80/tcp
ufw allow 443/tcp

# firewalld配置
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload

# iptables配置
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

5.2 数据库服务器配置

1
2
3
4
5
6
7
8
9
10
11
# UFW配置
ufw allow from 192.168.1.0/24 to any port 3306 # MySQL
ufw allow from 192.168.1.0/24 to any port 5432 # PostgreSQL

# firewalld配置
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 port port=3306 protocol=tcp accept'
firewall-cmd --reload

# iptables配置
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 3306 -j ACCEPT
iptables -A INPUT -p tcp --dport 3306 -j DROP

5.3 负载均衡器配置

1
2
3
4
5
6
7
8
9
10
11
12
13
# UFW端口转发
ufw route allow proto tcp from any to any port 80
ufw route allow proto tcp from any to any port 443

# firewalld端口转发
firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=10.0.0.10
firewall-cmd --permanent --add-forward-port=port=443:proto=tcp:toport=8443:toaddr=10.0.0.10
firewall-cmd --reload

# iptables负载均衡配置
iptables -t nat -A PREROUTING -p tcp --dport 80 -m state --state NEW -m statistic --mode nth --every 3 --packet 0 -j DNAT --to-destination 10.0.0.10:80
iptables -t nat -A PREROUTING -p tcp --dport 80 -m state --state NEW -m statistic --mode nth --every 2 --packet 0 -j DNAT --to-destination 10.0.0.11:80
iptables -t nat -A PREROUTING -p tcp --dport 80 -m state --state NEW -j DNAT --to-destination 10.0.0.12:80

5.4 VPN服务器配置

1
2
3
4
5
6
7
8
9
10
11
12
# OpenVPN服务器 (UFW)
ufw allow 1194/udp

# WireGuard VPN (firewalld)
firewall-cmd --permanent --add-port=51820/udp
firewall-cmd --permanent --add-masquerade
firewall-cmd --reload

# L2TP/IPsec VPN (iptables)
iptables -A INPUT -p udp --dport 500 -j ACCEPT
iptables -A INPUT -p udp --dport 4500 -j ACCEPT
iptables -A INPUT -p esp -j ACCEPT

5.5 邮件服务器配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# UFW配置
ufw allow 25/tcp # SMTP
ufw allow 465/tcp # SMTPS
ufw allow 587/tcp # Submission
ufw allow 110/tcp # POP3
ufw allow 995/tcp # POP3S
ufw allow 143/tcp # IMAP
ufw allow 993/tcp # IMAPS

# firewalld配置
firewall-cmd --permanent --add-service=smtp
firewall-cmd --permanent --add-service=smtps
firewall-cmd --permanent --add-service=imap
firewall-cmd --permanent --add-service=imaps
firewall-cmd --permanent --add-service=pop3
firewall-cmd --permanent --add-service=pop3s
firewall-cmd --reload

6. 故障排查

6.1 连接被拒绝

检查防火墙是否阻止连接:

1
2
3
4
5
6
7
8
# 查看UFW日志
tail -f /var/log/ufw.log

# 查看firewalld拒绝的连接
journalctl -xn -u firewalld

# 查看iptables日志
grep IPTables /var/log/syslog

临时禁用防火墙测试:

1
2
3
4
5
6
7
8
# 临时禁用UFW
ufw disable

# 临时禁用firewalld
systemctl stop firewalld

# 临时清除iptables规则
iptables -F

6.2 网络服务无法启动

检查是否是因为端口被占用:

1
2
3
4
# 检查端口占用情况
ss -tulpn | grep <port>
netstat -tulpn | grep <port>
lsof -i :<port>

6.3 规则不生效

检查规则顺序和冲突:

1
2
3
4
5
# 查看UFW规则顺序
ufw status numbered

# 查看iptables规则详情
iptables -L -v -n --line-numbers

确保规则已永久保存:

1
2
3
4
5
# firewalld规则持久化
firewall-cmd --runtime-to-permanent

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

总结

选择合适的防火墙工具并正确配置是Linux服务器安全的关键步骤:

  • UFW: 适合初学者和简单场景,Ubuntu/Debian系统首选
  • firewalld: 适合中等复杂度场景,CentOS/RHEL系统首选
  • iptables: 适合复杂场景和高级用户,提供最大灵活性

无论选择哪种工具,都应遵循”最小权限原则”,只开放必要的端口,并定期审计和更新规则。正确配置的防火墙能有效保护服务器免受网络攻击,是服务器安全体系的重要组成部分。