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
| apt update apt install ufw
ufw status ufw status verbose
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 ufw allow http ufw allow https ufw allow 8080/tcp
ufw deny http ufw deny from 192.168.1.100
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
| ufw allow from 192.168.1.0/24 to any port 22
ufw allow from 10.0.0.0/8
ufw allow in on eth0 to any port 80
ufw limit ssh
ufw allow 5000:5010/tcp
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
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
| yum install firewalld dnf install firewalld
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
| firewall-cmd --add-source=192.168.1.0/24 --zone=trusted
firewall-cmd --add-rich-rule='rule family=ipv4 source address=10.1.1.1 reject'
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
| 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'
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 iptables -t nat -L iptables -L --line-numbers
iptables -F iptables -t nat -F
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
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT
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
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
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
| iptables-save > /etc/iptables/rules.v4 ip6tables-save > /etc/iptables/rules.v6
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 default deny incoming ufw default allow outgoing
firewall-cmd --set-default-zone=drop
iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT
|
4.2 允许已建立的连接
1 2 3 4
| iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
|
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 limit ssh
firewall-cmd --add-rich-rule='rule service name=ssh limit value=3/m accept'
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 allow from 192.168.1.0/24 to any port 3306
firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 port port=5432 protocol=tcp accept'
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 logging on
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 -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 -sS -p 1-65535 your_server_ip
nc -zv your_server_ip 22
|
5. 常见防火墙场景配置
5.1 Web服务器配置
1 2 3 4 5 6 7 8 9 10 11 12
| ufw allow 80/tcp ufw allow 443/tcp
firewall-cmd --permanent --add-service=http firewall-cmd --permanent --add-service=https firewall-cmd --reload
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 allow from 192.168.1.0/24 to any port 3306 ufw allow from 192.168.1.0/24 to any port 5432
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 -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 route allow proto tcp from any to any port 80 ufw route allow proto tcp from any to any port 443
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 -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
| ufw allow 1194/udp
firewall-cmd --permanent --add-port=51820/udp firewall-cmd --permanent --add-masquerade firewall-cmd --reload
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 allow 25/tcp ufw allow 465/tcp ufw allow 587/tcp ufw allow 110/tcp ufw allow 995/tcp ufw allow 143/tcp ufw allow 993/tcp
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
| tail -f /var/log/ufw.log
journalctl -xn -u firewalld
grep IPTables /var/log/syslog
|
临时禁用防火墙测试:
1 2 3 4 5 6 7 8
| ufw disable
systemctl stop firewalld
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 status numbered
iptables -L -v -n --line-numbers
|
确保规则已永久保存:
1 2 3 4 5
| firewall-cmd --runtime-to-permanent
iptables-save > /etc/iptables/rules.v4
|
总结
选择合适的防火墙工具并正确配置是Linux服务器安全的关键步骤:
- UFW: 适合初学者和简单场景,Ubuntu/Debian系统首选
- firewalld: 适合中等复杂度场景,CentOS/RHEL系统首选
- iptables: 适合复杂场景和高级用户,提供最大灵活性
无论选择哪种工具,都应遵循”最小权限原则”,只开放必要的端口,并定期审计和更新规则。正确配置的防火墙能有效保护服务器免受网络攻击,是服务器安全体系的重要组成部分。