前置知识: 网络安全

防火墙配置(ufw/firewalld)

2 min入门

Linux 防火墙配置命令:ufw 与 firewalld 规则管理、iptables 基础语法、默认策略设计与常见服务放通

ufw 基础操作

基本写法:启用 ufw 防火墙 ufw enable

# 启用 ufw 防火墙(会提示会中断现有 SSH 连接)
sudo ufw enable

基本写法:禁用 ufw 防火墙 ufw disable

# 关闭 ufw 防火墙
sudo ufw disable

基本写法:查看 ufw 状态 ufw status verbose

# 查看 ufw 详细状态与规则
sudo ufw status verbose

基本写法:重置 ufw 规则 ufw reset

# 重置所有 ufw 规则到默认状态
sudo ufw reset

基本写法:重载 ufw 规则 ufw reload

# 重新加载 ufw 规则使配置生效
sudo ufw reload

ufw 默认策略

基本写法:设置默认拒绝入站 ufw default deny incoming

# 默认拒绝所有入站流量
sudo ufw default deny incoming

基本写法:设置默认允许出站 ufw default allow outgoing

# 默认允许所有出站流量
sudo ufw default allow outgoing

基本写法:设置默认拒绝转发 ufw default deny forward

# 默认拒绝转发流量
sudo ufw default deny forward

基本写法:查看默认策略 ufw status verbose | grep Default

# 查看 ufw 当前默认策略
sudo ufw status verbose | grep Default

ufw 规则管理

基本写法:允许 SSH 服务 ufw allow <端口>/<协议>

# 允许 SSH 服务
sudo ufw allow 22/tcp

基本写法:允许 HTTP/HTTPS ufw allow <服务名>

# 允许 Web 服务
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

基本写法:限制特定 IP 访问 ufw allow from <IP> to any port <端口>

# 仅允许特定 IP 访问 SSH
sudo ufw allow from 192.168.1.100 to any port 22

基本写法:拒绝特定 IP ufw deny from <IP>

# 拒绝特定 IP 所有访问
sudo ufw deny from 203.0.113.10

基本写法:限制连接速率 ufw limit <端口>/<协议>

# 限制 SSH 连接速率防爆破
sudo ufw limit 22/tcp

基本写法:删除规则 ufw delete allow <端口>/<协议>

# 删除指定端口允许规则
sudo ufw delete allow 80/tcp

ufw IPv6 与应用配置

基本写法:启用 IPv6 支持 sed -i 's/IPV6=no/IPV6=yes/' /etc/default/ufw

# 修改 ufw 配置启用 IPv6
sudo sed -i 's/IPV6=no/IPV6=yes/' /etc/default/ufw

基本写法:使用应用配置文件 ufw app list

# 列出所有可用应用配置
sudo ufw app list

基本写法:启用应用配置 ufw allow <应用名>

# 使用应用配置文件开放端口
sudo ufw allow "Nginx Full"

基本写法:查看应用信息 ufw app info <应用名>

# 查看应用配置文件详情
sudo ufw app info "Nginx Full"

基本写法:创建自定义应用配置 cat /etc/ufw/applications.d/<应用>

# 创建自定义应用配置文件
sudo tee /etc/ufw/applications.d/myapp << 'EOF'
[myapp]
title=My Application
description=Custom application
ports=8080/tcp
EOF

firewalld 基础操作

基本写法:启动 firewalld systemctl start firewalld

# 启动 firewalld 服务
sudo systemctl start firewalld
sudo systemctl enable firewalld

基本写法:查看 firewalld 状态 firewall-cmd --state

# 查看 firewalld 运行状态
sudo firewall-cmd --state

基本写法:重载 firewalld 配置 firewall-cmd --reload

# 重载防火墙配置不中断连接
sudo firewall-cmd --reload

基本写法:完全重载 firewall-cmd --complete-reload

# 完全重载会中断现有连接
sudo firewall-cmd --complete-reload

基本写法:panic 模式 firewall-cmd --panic-on

# 紧急情况阻断所有流量
sudo firewall-cmd --panic-on

firewalld 区域管理

基本写法:列出所有区域 firewall-cmd --get-zones

# 列出所有预定义区域
sudo firewall-cmd --get-zones

基本写法:查看默认区域 firewall-cmd --get-default-zone

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

基本写法:设置默认区域 firewall-cmd --set-default-zone=<区域>

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

基本写法:查看区域配置 firewall-cmd --zone=<区域> --list-all

# 查看 public 区域详细配置
sudo firewall-cmd --zone=public --list-all

基本写法:更改接口区域 firewall-cmd --zone=<区域> --change-interface=<接口>

# 将 eth0 接口加入 trusted 区域
sudo firewall-cmd --zone=trusted --change-interface=eth0

firewalld 服务与端口管理

基本写法:添加服务 firewall-cmd --permanent --add-service=<服务>

# 永久添加 HTTP 服务
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --reload

基本写法:开放端口 firewall-cmd --permanent --add-port=<端口>/<协议>

# 永久开放 8080 端口
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload

基本写法:限制特定 IP 访问 firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="<IP>" port port="<端口>" protocol="<协议>" accept'

# 仅允许特定 IP 访问 MySQL
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port port="3306" protocol="tcp" accept'
sudo firewall-cmd --reload

基本写法:拒绝特定 IP firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="<IP>" reject'

# 拒绝特定 IP 所有访问
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.10" reject'
sudo firewall-cmd --reload

基本写法:端口转发 firewall-cmd --permanent --add-forward-port=port=<端口>:proto=<协议>:toport=<目标端口>

# 端口转发 80 到 8080
sudo firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toport=8080
sudo firewall-cmd --reload

iptables 高级配置

基本写法:查看 iptables 规则 iptables -L -n -v --line-numbers

# 查看所有链的规则带行号
sudo iptables -L -n -v --line-numbers

基本写法:阻止 IP iptables -A INPUT -s <IP> -j DROP

# 丢弃特定 IP 所有数据包
sudo iptables -A INPUT -s 203.0.113.10 -j DROP

基本写法:限速防爆破 iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP

# 60 秒内超过 4 次 SSH 连接则丢弃
sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP

基本写法:保存 iptables 规则 iptables-save > <文件>

# 保存 iptables 规则到文件
sudo iptables-save > /etc/iptables/rules.v4

基本写法:恢复 iptables 规则 iptables-restore < <文件>

# 从文件恢复 iptables 规则
sudo iptables-restore < /etc/iptables/rules.v4

防火墙日志审计

基本写法:启用 ufw 日志 ufw logging on

# 开启 ufw 日志记录
sudo ufw logging on
sudo ufw logging medium

基本写法:查看 ufw 日志 tail -f /var/log/ufw.log

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

基本写法:统计被拦截的 IP grep "UFW BLOCK" /var/log/ufw.log | awk '{print $NF}' | sort | uniq -c | sort -rn

# 统计被 ufw 拦截的 IP 排行
sudo grep "UFW BLOCK" /var/log/ufw.log | grep -oE "SRC=[0-9.]+" | sort | uniq -c | sort -rn | head

基本写法:firewalld 日志查看 journalctl -u firewalld -f

# 查看 firewalld 服务日志
sudo journalctl -u firewalld -f

基本写法:iptables 记录日志 iptables -A INPUT -j LOG --log-prefix "iptables-drop: " --log-level 4

# 记录被丢弃的数据包
sudo iptables -A INPUT -j LOG --log-prefix "iptables-drop: " --log-level 4
sudo iptables -A INPUT -j DROP

防火墙安全自检

基本写法:扫描开放端口 nmap -sT -p- <本机IP>

# 扫描本机所有开放端口
nmap -sT -p- 127.0.0.1

基本写法:从外部验证端口 nc -zv <IP> <端口>

# 测试目标端口是否可达
nc -zv 192.168.1.10 22

基本写法:检查 ufw 规则顺序 ufw status numbered

# 查看带编号的 ufw 规则
sudo ufw status numbered

基本写法:批量检查防火墙配置 ufw status && firewall-cmd --list-all && iptables -L -n

# 一次性查看各类防火墙配置
sudo ufw status verbose && sudo firewall-cmd --list-all && sudo iptables -L -n

防火墙规则备份与恢复

基本写法:备份 ufw 规则 tar -czf ufw-backup.tar.gz /etc/ufw /lib/ufw

# 备份 ufw 配置文件
sudo tar -czf ufw-backup-$(date +%F).tar.gz /etc/ufw /lib/ufw

基本写法:备份 firewalld 配置 tar -czf firewalld-backup.tar.gz /etc/firewalld

# 备份 firewalld 配置
sudo tar -czf firewalld-backup-$(date +%F).tar.gz /etc/firewalld

基本写法:导出 firewalld 配置 firewall-cmd --permanent --list-all-zones > <文件>

# 导出所有区域配置到文件
sudo firewall-cmd --permanent --list-all-zones > firewalld-export.txt

基本写法:导出 iptables 规则 iptables-save > <文件>; ip6tables-save > <文件>

# 导出 IPv4 与 IPv6 规则
sudo iptables-save > iptables-v4.rules
sudo ip6tables-save > iptables-v6.rules