先放出笔记
一、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
Comments NOTHING