当前位置:首页>Linux>Linux 防火墙深度实战——iptables 与 nftables 全面解析

Linux 防火墙深度实战——iptables 与 nftables 全面解析

  • 2026-10-11 05:37:29
Linux 防火墙深度实战——iptables 与 nftables 全面解析

Linux 防火墙深度实战——iptables 与 nftables 全面解析

一、Netfilter 框架与 iptables 工作原理

Netfilter 是 Linux 内核包过滤框架,提供 Hook 点让数据包经过时被处理。iptables 是用户态工具,用于向 Netfilter 添加规则。

五大表:

  • raw:最早处理,连接跟踪豁免(NOTRACK)。
  • mangle:修改包(TOS、TTL、MARK)。
  • nat:地址转换(SNAT、DNAT、MASQUERADE)。
  • filter:核心过滤(ACCEPT/DROP/REJECT)。
  • security:SELinux 相关。

主要链(Hook 点):

  • PREROUTING:进入路由决策前(nat/mangle/raw)。
  • INPUT:目的地为本机。
  • FORWARD:路由转发。
  • OUTPUT:本机发出。
  • POSTROUTING:离开路由决策后(nat/mangle)。

数据包流程简图(运维必背): 入站:PREROUTING → 路由 → INPUT → 本地进程。 转发:PREROUTING → 路由 → FORWARD → POSTROUTING。 出站:OUTPUT → POSTROUTING。

状态跟踪(conntrack): nf_conntrack 模块记录连接状态(NEW、ESTABLISHED、RELATED、INVALID)。高并发服务器需调整最大值。

二、iptables 基础命令与规则编写

查看与管理:

iptables -t filter -L -n -v --line-numbers   # 详细带序号
iptables -t nat -L
iptables-save > /etc/iptables.rules          # 备份
iptables-restore < /etc/iptables.rules

常用匹配:

  • 协议:-p tcp/udp/icmp
  • 端口:--dport 80、--sport 22
  • IP:-s 192.168.1.0/24、-d 8.8.8.8
  • 接口:-i eth0、-o eth1
  • 状态:-m state --state ESTABLISHED,RELATED
  • 限速:-m limit --limit 5/s
  • MARK:-m mark --mark 1

基础安全策略(生产最小化模板):

# 清空并设置默认策略
iptables -F
iptables -X
iptables -Z
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# 允许 loopback
iptables -A INPUT -i lo -j ACCEPT

# 允许已建立连接
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# 允许 SSH(限制源 IP 更安全)
iptables -A INPUT -p tcp --dport 22 -s 203.0.113.0/24 -j ACCEPT

# Web 服务
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# ICMP 限制(防 Ping Flood)
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 10/s -j ACCEPT

# 日志(放在 DROP 前)
iptables -A INPUT -j LOG --log-prefix "IPTABLES-DROP: " --log-level 4
iptables -A INPUT -j DROP

NAT 实战(共享上网或端口映射):

# SNAT(内网访问外网)
iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -o eth0 -j MASQUERADE

# DNAT(端口转发)
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80

保存开机自启:

  • RHEL:iptables-save > /etc/sysconfig/iptables
  • Ubuntu:使用 iptables-persistent 包。

三、高级功能与性能优化

连接跟踪优化:

sysctl -w net.netfilter.nf_conntrack_max=524288
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=3600
echo"net.netfilter.nf_conntrack_max=524288" >> /etc/sysctl.conf

SYN 代理与洪泛防护:

iptables -A INPUT -p tcp --syn -m limit --limit 5/s -j ACCEPT
# 或启用 syncookies(内核层面)
sysctl -w net.ipv4.tcp_syncookies=1

字符串匹配防 Web 攻击:

iptables -A INPUT -p tcp --dport 80 -m string --string "SQL" --algo bm -j DROP

Rate Limiting: 保护 API:-m limit --limit 100/minute --limit-burst 200

MARK + 策略路由结合(第二篇扩展):

iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 10

多表操作:

  • mangle 标记 TOS 实现 QoS。
  • raw 表跳过 conntrack 提升性能(UDP 高吞吐)。

性能监控:

watch -n 1 "cat /proc/net/nf_conntrack | wc -l"
iptables -t filter -L -v -n   # 查看计数器

四、nftables 迁移与现代实践

iptables 语法复杂、规则多时性能下降,nftables 是推荐替代方案(原子更新、更高效)。

基本语法:

# 安装
apt install nftables   # 或 dnf

# 查看
nft list ruleset

# 示例规则集
nft add table inet filter
nft add chain inet filter input { type filter hook input priority 0 \; policy drop \; }
nft add rule inet filter input iif lo accept
nft add rule inet filter input ct state established,related accept
nft add rule inet filter input tcp dport 22 accept

批量加载(/etc/nftables.conf):

table inet filter {
    chain input {
        type filter hook input priority 0; policy drop;
        iif "lo" accept
        ct state established,related accept
        tcp dport {22, 80, 443} accept
        counter log prefix "DROP: " drop
    }
}

加载:nft -f /etc/nftables.conf 并设置开机自启 systemctl enable nftables。

iptables 到 nftables 转换:

iptables-save | iptables-restore-translate -o /etc/nftables.conf

优势:

  • 集合(set)匹配更快。
  • 动态更新不中断。
  • 更好调试:nft monitor

五、生产故障排查与案例分析

常见问题:

  1. 规则顺序错误:ACCEPT 在 DROP 后无效。始终用 --line-numbers 检查。
  2. conntrack 满:nf_conntrack: table full → 调大 max 或优化应用连接池。
  3. NAT 失效:忘记 POSTROUTING MASQUERADE,或接口不对。
  4. 日志过多:使用 ulogd 或 rsyslog 分离,防止磁盘打满。
  5. Docker/K8s 冲突:Docker 默认修改 iptables,推荐使用 iptables-legacy 或配置 CNI。

案例1:SSH 暴力破解: 解决:Fail2Ban + iptables 动态 DROP,或直接限速 + 密钥登录。

案例2:Web 服务被 CC 攻击:

# 限制单 IP 并发
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 30 -j DROP

案例3:端口转发后后端不可达: 排查:tcpdump -i any port 8080 确认 PREROUTING 是否命中,检查后端防火墙。

调试技巧:

  • tcpdump -i eth0 -nn "tcp port 22"
  • iptables -t raw -A PREROUTING -j TRACE(慎用,日志爆炸)
  • dmesg | grep -i netfilter

六、安全最佳实践与自动化

  • 最小权限:默认 DROP,只开放必要端口。

  • 分层防御:主机防火墙 + 云安全组 + WAF。

  • 定期审计:iptables-save | diff 或脚本巡检。

  • 零信任:基于身份而非 IP。

  • 自动化:Ansible role 管理规则,支持版本控制。 示例 Playbook 片段:

    -name:Deployfirewall
    template:
    src:iptables.j2
    dest:/etc/iptables.rules
    notify:restoreiptables
  • 监控:Prometheus exporter 监控丢弃包计数。

  • 备份与回滚:变更前快照,失败立即 restore。

SELinux/AppArmor 补充:防火墙之外的 MAC 控制。

最新文章

随机文章