linux中级_iptables

TJCcc 发布于 2026-01-30 33 次阅读


先放出笔记

一、iptables 基础概念

1.1 iptables 简介

iptables 是 Linux 系统自带的防火墙工具,用于管理网络数据包的过滤、网络地址转换(NAT)和端口转发等功能。

1.2 四表五链结构

# 四张表(Tables):
1. filter表:默认表,用于数据包过滤(INPUT、FORWARD、OUTPUT)
2. nat表:网络地址转换(PREROUTING、POSTROUTING、OUTPUT)
3. mangle表:修改数据包(TOS、TTL、MARK等)
4. raw表:连接跟踪处理(PREROUTING、OUTPUT)

# 五条链(Chains):
1. INPUT:进入本机的数据包
2. OUTPUT:从本机发出的数据包
3. FORWARD:经过本机转发的数据包
4. PREROUTING:数据包进入路由之前
5. POSTROUTING:数据包离开路由之后

1.3 数据包流向

网络数据包 → PREROUTING → 路由决策 → FORWARD → POSTROUTING → 网络
                            ↓
                         INPUT → 本地进程 → OUTPUT → POSTROUTING → 网络

二、iptables 安装与配置

2.1 安装与启动

# 1. 停止并禁用 firewalld(CentOS 7+)
systemctl stop firewalld
systemctl disable firewalld

# 2. 安装 iptables-services
yum install -y iptables-services

# 3. 加载必要内核模块
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state

# 4. 设置模块开机自动加载
cat >> /etc/rc.local << EOF
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state
EOF
chmod +x /etc/rc.local

# 5. 启动 iptables
systemctl start iptables
systemctl enable iptables

2.2 查看当前规则

# 查看所有规则(默认查看filter表)
iptables -L -n -v

# 查看指定表规则
iptables -t filter -L -n -v      # filter表(默认)
iptables -t nat -L -n -v         # nat表
iptables -t mangle -L -n -v      # mangle表
iptables -t raw -L -n -v         # raw表

# 查看规则并显示行号(便于管理)
iptables -L -n --line-numbers

# 查看规则统计信息
iptables -L -n -v -x

# 查看连接跟踪状态
cat /proc/net/ip_conntrack
conntrack -L

三、⚙️ iptables 命令语法详解

3.1 基本命令结构

iptables [-t 表名] 命令选项 [链名] [规则匹配条件] [-j 目标动作]

# 常用命令选项:
-A, --append     在链末尾添加规则
-I, --insert     在指定位置插入规则(默认插入到第一行)
-D, --delete     删除指定规则
-R, --replace    替换指定规则
-L, --list       列出规则
-F, --flush      清空规则
-Z, --zero       计数器清零
-N, --new-chain  创建自定义链
-X, --delete-chain 删除自定义链
-P, --policy     设置链的默认策略

3.2 规则匹配条件

# 1. 通用匹配
-p, --protocol       协议(tcp, udp, icmp, all)
-s, --source         源IP地址/网段
-d, --destination    目标IP地址/网段
-i, --in-interface   数据包进入的网卡
-o, --out-interface  数据包出去的网卡

# 2. TCP/UDP匹配(-p tcp/udp 时可用)
--sport, --source-port        源端口
--dport, --destination-port   目标端口
--tcp-flags                   TCP标志位
--syn                         匹配SYN包(TCP三次握手)

# 3. ICMP匹配(-p icmp 时可用)
--icmp-type                   ICMP类型

# 4. 状态匹配(连接跟踪)
-m state --state             状态(NEW, ESTABLISHED, RELATED, INVALID)
-m conntrack --ctstate       连接跟踪状态

# 5. 多端口匹配
-m multiport --sports        多个源端口
-m multiport --dports        多个目标端口
-m multiport --ports         多个端口

# 6. IP范围匹配
-m iprange --src-range       IP源地址范围
-m iprange --dst-range       IP目标地址范围

# 7. 字符串匹配
-m string --algo bm/kmp --string "pattern"

# 8. 时间匹配
-m time --timestart --timestop --weekdays

# 9. 限制匹配
-m limit --limit             限制速率

3.3 目标动作(-j)

# 基本动作
ACCEPT     允许数据包通过
DROP       丢弃数据包(无回应)
REJECT     拒绝数据包(返回拒绝信息)
LOG        记录日志

# NAT相关
SNAT       源地址转换
DNAT       目标地址转换
MASQUERADE 动态源地址转换(用于拨号上网)
REDIRECT   端口重定向

# 其他
RETURN     返回上一级链
QUEUE      将数据包放入用户空间队列

四、规则管理实战

4.1 基础规则操作

# 1. 查看默认规则
iptables -L -n
# 默认规则通常为:
# INPUT链:允许ESTABLISHED,RELATED连接,允许icmp,允许22端口,其他拒绝

# 2. 清空所有规则
iptables -F          # 清空filter表规则
iptables -t nat -F   # 清空nat表规则
iptables -t mangle -F
iptables -t raw -F

# 清空计数器
iptables -Z

# 删除自定义链
iptables -X

# 3. 设置默认策略(注意:设置前确保不会把自己锁在外面)
iptables -P INPUT DROP      # 默认拒绝所有入站
iptables -P OUTPUT ACCEPT   # 默认允许所有出站
iptables -P FORWARD DROP    # 默认拒绝所有转发

# 4. 添加规则(尾部添加)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 5. 插入规则(指定位置)
iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT  # 插入到第1行
iptables -I INPUT 2 -s 192.168.1.0/24 -j ACCEPT  # 插入到第2行

# 6. 删除规则
iptables -D INPUT 2                  # 按行号删除
iptables -D INPUT -p tcp --dport 22 -j ACCEPT  # 按规则内容删除

# 7. 替换规则
iptables -R INPUT 1 -p tcp --dport 80 -j DROP

4.2 规则持久化

# 1. 保存当前规则到配置文件
iptables-save > /etc/sysconfig/iptables
# 或者使用服务命令
service iptables save        # CentOS 6
systemctl enable iptables    # CentOS 7+ 会自动保存

# 2. 恢复规则
iptables-restore < /etc/sysconfig/iptables

# 3. 备份与恢复
iptables-save > /backup/iptables-backup-$(date +%Y%m%d).rules
iptables-restore < /backup/iptables-backup-20230101.rules

# 4. 查看配置文件
cat /etc/sysconfig/iptables

五、安全防护实战案例

5.1 基础防护配置

#!/bin/bash
# iptables-basic-security.sh

# 清空所有规则
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X

# 设置默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# 1. 允许本地回环
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# 2. 允许已建立的连接和相关的数据包
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 3. 允许ping(可选)
iptables -A INPUT -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT

# 4. 开放必要的服务端口
# SSH (22)
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m limit --limit 3/minute --limit-burst 3 -j ACCEPT

# HTTP (80)
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT

# HTTPS (443)
iptables -A INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT

# 5. 限制恶意访问
# 防止SYN洪水攻击
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT

# 防止死亡ping
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

# 6. 记录拒绝的包(可选,用于调试)
iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

# 保存规则
service iptables save
echo "基本安全规则已配置完成"

5.2 高级安全配置

#!/bin/bash
# iptables-advanced-security.sh

# 防止端口扫描
iptables -N port-scan
iptables -A port-scan -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j RETURN
iptables -A port-scan -j DROP
iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j port-scan

# 防止DoS攻击
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT

# 防止SSH暴力破解
iptables -A INPUT -p tcp --dport 22 -m recent --name ssh --update --seconds 60 --hitcount 3 -j DROP
iptables -A INPUT -p tcp --dport 22 -m recent --name ssh --set -j ACCEPT

# 封禁恶意IP
# 方法1:直接DROP
iptables -A INPUT -s 192.168.1.100 -j DROP
iptables -A INPUT -s 10.0.0.0/24 -j DROP

# 方法2:使用ipset(更高效)
yum install -y ipset
ipset create blacklist hash:ip timeout 86400  # 24小时自动解封
ipset add blacklist 192.168.1.100
ipset add blacklist 10.0.0.0/24
iptables -A INPUT -m set --match-set blacklist src -j DROP

# 保护敏感端口
# 禁止外部访问MySQL端口
iptables -A INPUT -p tcp --dport 3306 -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 3306 -j DROP

# 禁止外部访问Redis端口
iptables -A INPUT -p tcp --dport 6379 -s 127.0.0.1 -j ACCEPT
iptables -A INPUT -p tcp --dport 6379 -j DROP

# 限制ICMP(防止ICMP洪水)
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

5.3 网络服务配置

# 1. Web服务器配置
iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT

# 2. 数据库服务器
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 3306 -j ACCEPT
iptables -A INPUT -s 10.0.0.0/24 -p tcp --dport 3306 -j ACCEPT

# 3. 邮件服务器
iptables -A INPUT -p tcp -m multiport --dports 25,110,143,465,587,993,995 -j ACCEPT

# 4. DNS服务器
iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p tcp --dport 53 -j ACCEPT

# 5. FTP服务器(主动模式)
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 20 -j ACCEPT

# 6. FTP服务器(被动模式)
# 需要加载ip_conntrack_ftp模块
modprobe ip_conntrack_ftp
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 开放被动模式端口范围
iptables -A INPUT -p tcp --dport 30000:31000 -j ACCEPT

六、NAT 网络地址转换

6.1 SNAT(源地址转换)

# 场景:局域网共享上网
# 局域网:172.16.1.0/24
# 网关:10.0.0.61(公网IP)

# 1. 开启内核转发
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p

# 2. 配置SNAT(固定IP)
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j SNAT --to-source 10.0.0.61

# 3. 配置SNAT(动态IP,如ADSL拨号)
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o ppp0 -j MASQUERADE

# 客户端配置网关
# /etc/sysconfig/network-scripts/ifcfg-eth0
# GATEWAY=172.16.1.61
# DNS1=223.5.5.5

6.2 DNAT(目标地址转换)

# 场景:端口映射/端口转发
# 将公网IP的9000端口转发到内网172.16.1.7的22端口

iptables -t nat -A PREROUTING -d 10.0.0.61 -p tcp --dport 9000 -j DNAT --to-destination 172.16.1.7:22

# 还需要允许转发(如果FORWARD链默认是DROP)
iptables -A FORWARD -d 172.16.1.7 -p tcp --dport 22 -j ACCEPT
iptables -A FORWARD -s 172.16.1.7 -j ACCEPT

# 多个端口映射
iptables -t nat -A PREROUTING -d 10.0.0.61 -p tcp -m multiport --dports 80,443 -j DNAT --to-destination 172.16.1.8

6.3 完整的NAT配置示例

#!/bin/bash
# iptables-nat-router.sh

# 网关服务器配置:10.0.0.61(公网),172.16.1.61(内网)

# 1. 清空所有规则
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X

# 2. 设置默认策略
iptables -P INPUT ACCEPT
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# 3. 开启内核转发
echo 1 > /proc/sys/net/ipv4/ip_forward
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p

# 4. SNAT:内网共享上网
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j MASQUERADE

# 5. DNAT:端口映射
# Web服务器映射
iptables -t nat -A PREROUTING -d 10.0.0.61 -p tcp --dport 80 -j DNAT --to-destination 172.16.1.8:80
iptables -t nat -A PREROUTING -d 10.0.0.61 -p tcp --dport 443 -j DNAT --to-destination 172.16.1.8:443

# SSH端口映射
iptables -t nat -A PREROUTING -d 10.0.0.61 -p tcp --dport 2222 -j DNAT --to-destination 172.16.1.7:22

# 6. 转发规则
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -s 172.16.1.0/24 -j ACCEPT

# 7. 安全规则
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT  # SSH管理
iptables -P INPUT DROP

# 保存配置
service iptables save
echo "NAT路由器配置完成"

七、高级功能与技巧

7.1 连接跟踪(Connection Tracking)

# 查看连接跟踪表
cat /proc/net/nf_conntrack
conntrack -L

# 调整连接跟踪表大小
echo 262144 > /proc/sys/net/nf_conntrack_max
echo "net.nf_conntrack_max = 262144" >> /etc/sysctl.conf

# 查看连接跟踪超时时间
sysctl -a | grep conntrack_timeout

# 手动删除连接跟踪条目
conntrack -D -s 192.168.1.100

7.2 限速与流量控制

# 1. 限制单个IP的连接数
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 32 -j DROP

# 2. 限制单个IP的并发连接数
iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j DROP

# 3. 限制访问速率
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT

# 4. 限制ICMP速率
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

7.3 日志记录与监控

# 1. 记录被拒绝的连接
iptables -A INPUT -j LOG --log-prefix "IPTABLES-IN-DROP: " --log-level 4
iptables -A FORWARD -j LOG --log-prefix "IPTABLES-FWD-DROP: " --log-level 4

# 2. 记录特定端口的访问
iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH-ACCESS: " --log-level 6

# 3. 限制日志频率防止日志爆炸
iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

# 4. 查看日志
tail -f /var/log/messages | grep iptables
dmesg | grep iptables

7.4 时间控制规则

# 1. 在工作时间开放某些服务
iptables -A INPUT -p tcp --dport 22 -m time --timestart 09:00 --timestop 18:00 --weekdays Mon,Tue,Wed,Thu,Fri -j ACCEPT

# 2. 在非工作时间拒绝某些服务
iptables -A INPUT -p tcp --dport 22 -m time --timestart 18:00 --timestop 09:00 -j DROP
iptables -A INPUT -p tcp --dport 22 -m time --weekdays Sat,Sun -j DROP

# 3. 限制特定时间段的访问
iptables -A INPUT -s 192.168.1.0/24 -m time --timestart 13:00 --timestop 14:00 --weekdays Mon,Tue,Wed,Thu,Fri -j DROP

八、自定义链管理

8.1 创建和使用自定义链

# 1. 创建自定义链
iptables -N CUSTOM_CHAIN

# 2. 向自定义链添加规则
iptables -A CUSTOM_CHAIN -s 192.168.1.100 -j DROP
iptables -A CUSTOM_CHAIN -s 10.0.0.0/24 -j ACCEPT

# 3. 在主链中引用自定义链
iptables -A INPUT -j CUSTOM_CHAIN

# 4. 删除自定义链(必须先清空规则并从主链移除引用)
iptables -D INPUT -j CUSTOM_CHAIN
iptables -F CUSTOM_CHAIN
iptables -X CUSTOM_CHAIN

# 5. 重命名自定义链
iptables -E CUSTOM_CHAIN NEW_CHAIN_NAME

8.2 实际应用:HTTP洪水防护

#!/bin/bash
# iptables-http-flood-protection.sh

# 创建自定义链
iptables -N HTTP_FLOOD

# 设置规则:每秒最多5个新连接,突发10个
iptables -A HTTP_FLOOD -p tcp --syn --dport 80 -m limit --limit 5/s --limit-burst 10 -j RETURN

# 超过限制的连接记录日志并丢弃
iptables -A HTTP_FLOOD -j LOG --log-prefix "HTTP-FLOOD: "
iptables -A HTTP_FLOOD -j DROP

# 将HTTP流量跳转到自定义链
iptables -A INPUT -p tcp --dport 80 -j HTTP_FLOOD

# 显示自定义链规则
iptables -L HTTP_FLOOD -n -v

九、故障排查与调试

9.1 常用调试命令

# 1. 查看规则是否生效
iptables -L -n -v | grep -E "DROP|REJECT"

# 2. 跟踪数据包处理
iptables -t raw -A PREROUTING -p tcp --dport 80 -j TRACE
# 查看日志:dmesg | grep TRACE

# 3. 测试规则
# 模拟数据包(需要iptables-devel包)
iptables -t filter -A INPUT -p tcp --dport 80 -j LOG --log-prefix "TEST-RULE: "

# 4. 查看计数器
iptables -L -n -v -x
iptables -L -n -v | grep -E "^Chain|packets"

# 5. 查看连接跟踪
conntrack -L
conntrack -L -d 192.168.1.100

9.2 常见问题解决

# 1. 无法连接SSH(把自己锁在外面)
# 解决方法:通过VNC或物理控制台登录,执行:
iptables -P INPUT ACCEPT
iptables -F

# 2. NAT不工作
# 检查:
# a) 是否开启内核转发
cat /proc/sys/net/ipv4/ip_forward  # 应该为1
# b) 规则是否正确
iptables -t nat -L -n -v
# c) 路由是否正确
route -n

# 3. 规则不生效
# 检查:
# a) 规则顺序是否正确(iptables按顺序匹配)
# b) 是否有其他规则覆盖
# c) 保存规则后是否重启了服务

# 4. 性能问题
# 优化建议:
# a) 使用ipset处理大量IP
# b) 将常用规则放在前面
# c) 减少日志规则
# d) 调整连接跟踪表大小

9.3 性能优化配置

# 1. 优化连接跟踪
echo 65536 > /proc/sys/net/netfilter/nf_conntrack_max
echo 120 > /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established

# 2. 使用ipset处理大量IP
yum install -y ipset
ipset create blacklist hash:net
ipset add blacklist 10.0.0.0/24
iptables -I INPUT -m set --match-set blacklist src -j DROP

# 3. 规则排序优化(常用规则放前面)
# 例如:将ESTABLISHED,RELATED规则放最前面
iptables -I INPUT 1 -m state --state ESTABLISHED,RELATED -j ACCEPT

十、iptables 管理脚本示例

10.1 完整的防火墙脚本

#!/bin/bash
# firewall.sh - 完整的iptables防火墙配置脚本

# 定义颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
NC='\033[0m' # No Color

echo -e "${GREEN}正在配置iptables防火墙...${NC}"

# 定义变量
EXTERNAL_IF="eth0"          # 外网接口
INTERNAL_IF="eth1"          # 内网接口
INTERNAL_NET="172.16.1.0/24" # 内网网段
ALLOWED_SSH_IPS="192.168.1.0/24 10.0.0.0/24"

# 函数:打印状态
print_status() {
    echo -e "${GREEN}[+] $1${NC}"
}

print_error() {
    echo -e "${RED}[-] $1${NC}"
}

# 1. 清理现有规则
print_status "清理现有规则..."
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
iptables -t nat -X
iptables -t mangle -X
iptables -Z

# 2. 设置默认策略
print_status "设置默认策略..."
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# 3. 允许本地回环
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# 4. 允许已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 5. 允许ICMP(ping)
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

# 6. 允许SSH(限制来源IP)
for ip in $ALLOWED_SSH_IPS; do
    iptables -A INPUT -s $ip -p tcp --dport 22 -m state --state NEW -j ACCEPT
done

# 7. 允许Web服务
iptables -A INPUT -p tcp -m multiport --dports 80,443 -m state --state NEW -j ACCEPT

# 8. 配置NAT(如果是网关服务器)
if [ "$1" == "gateway" ]; then
    print_status "配置NAT网关..."
    echo 1 > /proc/sys/net/ipv4/ip_forward
    iptables -t nat -A POSTROUTING -s $INTERNAL_NET -o $EXTERNAL_IF -j MASQUERADE
    iptables -A FORWARD -i $INTERNAL_IF -o $EXTERNAL_IF -j ACCEPT
    iptables -A FORWARD -i $EXTERNAL_IF -o $INTERNAL_IF -m state --state ESTABLISHED,RELATED -j ACCEPT
fi

# 9. 记录被拒绝的包(每分钟最多5条)
iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables-denied: " --log-level 4

# 10. 保存配置
print_status "保存配置..."
service iptables save

# 显示配置结果
print_status "防火墙配置完成!"
echo "当前规则:"
iptables -L -n -v | head -30

10.2 日常管理脚本

#!/bin/bash
# iptables-manager.sh

case "$1" in
    start)
        echo "启动防火墙..."
        systemctl start iptables
        ;;
    stop)
        echo "停止防火墙..."
        systemctl stop iptables
        iptables -F
        iptables -P INPUT ACCEPT
        ;;
    restart)
        echo "重启防火墙..."
        systemctl restart iptables
        ;;
    status)
        echo "防火墙状态:"
        systemctl status iptables
        echo -e "\n当前规则:"
        iptables -L -n -v
        ;;
    save)
        echo "保存规则..."
        iptables-save > /etc/sysconfig/iptables
        ;;
    restore)
        echo "恢复规则..."
        iptables-restore < /etc/sysconfig/iptables
        ;;
    block)
        if [ -z "$2" ]; then
            echo "用法: $0 block <IP地址>"
            exit 1
        fi
        echo "封禁IP: $2"
        iptables -I INPUT -s $2 -j DROP
        ;;
    unblock)
        if [ -z "$2" ]; then
            echo "用法: $0 unblock <IP地址>"
            exit 1
        fi
        echo "解封IP: $2"
        iptables -D INPUT -s $2 -j DROP 2>/dev/null
        ;;
    list-blocked)
        echo "已封禁的IP:"
        iptables -L INPUT -n | grep DROP
        ;;
    *)
        echo "用法: $0 {start|stop|restart|status|save|restore|block|unblock|list-blocked}"
        exit 1
        ;;
esac

十一、从 iptables 迁移到 nftables

11.1 nftables 简介

nftables 是 iptables 的继任者,具有更简洁的语法和更好的性能。

11.2 迁移工具

# 1. 安装 nftables
yum install -y nftables

# 2. 将 iptables 规则转换为 nftables
iptables-save > iptables-backup.rules
iptables-restore-translate -f iptables-backup.rules > nftables-backup.nft

# 3. 查看转换后的规则
cat nftables-backup.nft

# 4. 加载 nftables 规则
nft -f nftables-backup.nft

# 5. 保存 nftables 规则
nft list ruleset > /etc/sysconfig/nftables.conf

# 6. 启用 nftables 服务
systemctl enable nftables
systemctl start nftables

11.3 nftables 基础命令

# 查看规则
nft list ruleset

# 添加规则
nft add rule inet filter input tcp dport 22 accept

# 删除规则(需要句柄号)
nft list ruleset -a
nft delete rule inet filter input handle 3

# 清空规则
nft flush ruleset

总结与最佳实践

1. 安全配置原则

  • 默认拒绝所有,按需开放
  • 规则尽量具体,避免过于宽泛
  • 将常用规则放在前面提高性能
  • 定期审查和更新规则

2. 性能优化建议

  • 使用连接跟踪状态匹配减少规则数量
  • 对大量IP使用ipset
  • 避免过多的日志规则
  • 合理设置连接跟踪表大小

3. 维护建议

  • 备份配置文件
  • 测试环境验证后再上生产
  • 使用脚本化管理
  • 监控防火墙日志

4. 学习资源

# 官方文档
man iptables
man iptables-extensions

# 在线资源
# 1. Netfilter官方文档:https://netfilter.org/
# 2. RHEL iptables指南:https://access.redhat.com/documentation/
# 3. Arch Linux Wiki:https://wiki.archlinux.org/title/iptables

唯有极致沉淀,才能造就辉煌。
最后更新于 2026-01-30