iptables/nftables 规则设计
High Contrast
Dark Mode
Light Mode
Sepia
Forest
1 min read239 words

iptables/nftables 规则设计

iptables 是 Linux 标配防火墙工具,nftables 是它的现代继任者。掌握这两个工具,能保护服务器、构建 NAT 网关、实现流量过滤——是 DevOps 和网络工程师的必备技能。


iptables 四表五链

四张表(Table):按功能分类
filter   — 最常用:决定放行/拒绝(INPUT/OUTPUT/FORWARD)
nat      — 地址转换:SNAT/DNAT/MASQUERADE
mangle   — 修改包头字段(TTL/TOS/标记)
raw      — 跳过连接跟踪(性能优化)
五条链(Chain):按流量方向分类
INPUT    — 到达本机的流量
OUTPUT   — 从本机发出的流量
FORWARD  — 穿越本机的流量(路由转发)
PREROUTING  — 路由决策前(nat表用于DNAT)
POSTROUTING — 路由决策后(nat表用于SNAT/MASQUERADE)
流量路径:
入站:PREROUTING → INPUT → 本地进程
出站:本地进程 → OUTPUT → POSTROUTING
转发:PREROUTING → FORWARD → POSTROUTING

iptables 常用命令

# === 查看规则 ===
iptables -L -n -v --line-numbers          # filter 表
iptables -t nat -L -n -v                  # nat 表
# === 基础规则操作 ===
# 允许 SSH(端口 22)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 允许已建立的连接(必须放在前面,提升性能)
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -I OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许本机回环
iptables -I INPUT -i lo -j ACCEPT
iptables -I OUTPUT -o lo -j ACCEPT
# 允许特定 IP 访问
iptables -A INPUT -s 10.0.1.100 -p tcp --dport 3306 -j ACCEPT
# 允许特定网段访问
iptables -A INPUT -s 10.0.0.0/8 -p tcp --dport 80 -j ACCEPT
# 拒绝其余所有入站(设置默认策略)
iptables -P INPUT DROP
iptables -P FORWARD DROP
# 删除规则
iptables -D INPUT 3                       # 删除第 3 条
iptables -D INPUT -p tcp --dport 8080 -j ACCEPT  # 按规则内容删除
# 清空所有规则(危险!会断开 SSH)
iptables -F && iptables -X && iptables -Z

服务器安全基线配置

#!/bin/bash
# server-firewall.sh — 标准服务器防火墙规则
# 清空现有规则
iptables -F
iptables -X
# 默认策略
iptables -P INPUT DROP          # 默认拒绝入站
iptables -P FORWARD DROP        # 默认拒绝转发
iptables -P OUTPUT ACCEPT       # 默认允许出站
# 1. 本机回环(必须)
iptables -A INPUT -i lo -j ACCEPT
# 2. 已建立的连接(必须放在最前面)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 3. SSH(限制来源 IP,防止暴力破解)
iptables -A INPUT -s 10.0.0.0/8 -p tcp --dport 22 -j ACCEPT
# 如果 SSH 改了端口:
# iptables -A INPUT -s 10.0.0.0/8 -p tcp --dport 2222 -j ACCEPT
# 4. Web 服务(对所有人开放)
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 5. 内网服务(只对内网开放)
iptables -A INPUT -s 10.0.0.0/8 -p tcp --dport 3306 -j ACCEPT   # MySQL
iptables -A INPUT -s 10.0.0.0/8 -p tcp --dport 5432 -j ACCEPT   # PostgreSQL
iptables -A INPUT -s 10.0.0.0/8 -p tcp --dport 6379 -j ACCEPT   # Redis
# 6. 允许 ping(可选,内网调试用)
iptables -A INPUT -s 10.0.0.0/8 -p icmp --icmp-type echo-request -j ACCEPT
# 7. 限速:防 ping 泛洪
iptables -A INPUT -p icmp --icmp-type echo-request \
-m limit --limit 5/s --limit-burst 10 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
# 8. SSH 暴力破解防护(1分钟内超过3次连接请求则封锁)
iptables -A INPUT -p tcp --dport 22 -m state --state NEW \
-m recent --set --name SSH
iptables -A INPUT -p tcp --dport 22 -m state --state NEW \
-m recent --update --seconds 60 --hitcount 4 --name SSH -j DROP
# 保存规则(Ubuntu/Debian)
iptables-save > /etc/iptables/rules.v4
# 使用 iptables-persistent 开机自动加载:
# apt install iptables-persistent

NAT 配置(Linux 路由器)

# 场景:Linux 服务器作为出口 NAT 网关
# 内网接口:eth1(10.0.0.0/8)
# 公网接口:eth0(203.0.113.5/30)
# 开启 IP 转发
echo 1 > /proc/sys/net/ipv4/ip_forward
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
# MASQUERADE(动态 SNAT,公网 IP 变化时自动适应)
iptables -t nat -A POSTROUTING -s 10.0.0.0/8 -o eth0 -j MASQUERADE
# SNAT(静态 SNAT,公网 IP 固定时更高效)
iptables -t nat -A POSTROUTING -s 10.0.0.0/8 -o eth0 \
-j SNAT --to-source 203.0.113.5
# DNAT(端口转发:把公网 80 转发到内网 Web 服务器)
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 \
-j DNAT --to-destination 10.0.50.10:80
# 放行转发流量
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 \
-m state --state ESTABLISHED,RELATED -j ACCEPT

nftables:现代替代方案

# nftables 是 Linux 5.x 推荐的防火墙工具(iptables 已进入维护模式)
# 语法更统一,性能更好
# 完整的 nftables 服务器配置(/etc/nftables.conf)
flush ruleset
table inet filter {
chain input {
type filter hook input priority filter; policy drop;
# 本机回环
iif "lo" accept
# 已建立连接
ct state established,related accept
# SSH(内网)
ip saddr 10.0.0.0/8 tcp dport 22 accept
# Web
tcp dport { 80, 443 } accept
# 内网服务
ip saddr 10.0.0.0/8 tcp dport { 3306, 5432, 6379 } accept
# ping(内网)
ip saddr 10.0.0.0/8 icmp type echo-request accept
}
chain forward {
type filter hook forward priority filter; policy drop;
}
chain output {
type filter hook output priority filter; policy accept;
}
}
table ip nat {
chain prerouting {
type nat hook prerouting priority dstnat;
iif "eth0" tcp dport 80 dnat to 10.0.50.10
}
chain postrouting {
type nat hook postrouting priority srcnat;
ip saddr 10.0.0.0/8 oif "eth0" masquerade
}
}
# 加载配置
nft -f /etc/nftables.conf
# 查看规则
nft list ruleset
# 启动并开机自动加载
systemctl enable --now nftables

CCNA 对应考点

考纲位置:Domain 5.4 — Configure and verify access control lists

CCNA 主要考 Cisco ACL(概念与 iptables 相通): - 标准 ACL(Standard ACL):只匹配源 IP,用于路由器的 permit/deny - 扩展 ACL(Extended ACL):匹配源/目标 IP + 协议 + 端口 - 规则从上到下匹配,末尾有隐式 deny any


下一节云安全组与本地防火墙对比——在 AWS/阿里云上配安全组,和在 Linux 上写 iptables 规则有什么相通之处?