Linux iptables防火墙完全指南:从入门到实战

1. iptables概述
iptables是Linux内核集成的IP 信息包过滤系统,是netfilter项目的一部分。它通过规则表、链和规则三个层次来管理网络数据包。

核心概念
四个表(Tables):

filter表:默认表,用于包过滤
nat表:用于网络地址转换
mangle表:用于修改数据包
raw表:用于配置数据包免除连接跟踪
五个链(Chains):

INPUT:处理进入本机的数据包
OUTPUT:处理本机发出的数据包
FORWARD:处理转发的数据包
PREROUTING:数据包进入路由之前
POSTROUTING:数据包离开路由之后
2. 基本语法结构
iptables [-t 表名] 命令选项 [链名] [规则匹配条件] [-j 目标动作]

常用命令选项
命令 说明
-A, --append 在链尾添加规则
-I, --insert 在指定位置插入规则
-D, --delete 删除规则
-L, --list 列出规则
-F, --flush 清空规则
-P, --policy 设置链的默认策略
-N, --new-chain 创建自定义链
-X, --delete-chain 删除自定义链
3. 防火墙策略配置实战
3.1 基础安全配置
#!/bin/bash
# 基础防火墙配置脚本

# 清空所有规则
iptables -F
iptables -X
iptables -Z

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

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

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

# 允许ICMP (ping)
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT

# 保存配置
iptables-save > /etc/sysconfig/iptables

3.2 Web服务器配置
#!/bin/bash
# Web服务器防火墙配置

# 清空规则
iptables -F

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

# 基本规则
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 开放服务端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # SSH
iptables -A INPUT -p tcp --dport 80 -j ACCEPT # HTTP
iptables -A INPUT -p tcp --dport 443 -j ACCEPT # HTTPS
iptables -A INPUT -p tcp --dport 21 -j ACCEPT # FTP
iptables -A INPUT -p tcp --dport 20 -j ACCEPT # FTP数据

# 允许ICMP
iptables -A INPUT -p icmp -j ACCEPT

# 记录被拒绝的连接(可选)
iptables -A INPUT -j LOG --log-prefix "IPTABLES-DROPPED: "

3.3 数据库 服务器配置
#!/bin/bash
# 数据库服务器防火墙配置

iptables -F
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# 基础规则
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 管理端口
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT # SSH来自内网
iptables -A INPUT -s 10.0.0.0/8 -p tcp --dport 22 -j ACCEPT # SSH来自管理网络

# 数据库端口
iptables -A INPUT -s 192.168.1.0/24 -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 192.168.1.100 -p tcp --dport 9100 -j ACCEPT # Node Exporter

4. 高级功能配置
4.1 NAT网络地址转换
# 开启IP转发
echo 1 > /proc/sys/net/ipv4/ip_forward

# SNAT:内网访问外网
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 公网IP

# MASQUERADE:动态IP环境
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE

# DNAT:端口映射
iptables -t nat -A PREROUTING -d 公网IP -p tcp --dport 80 -j DNAT --to-dest 192.168.1.100:80
iptables -t nat -A PREROUTING -d 公网IP -p tcp --dport 2222 -j DNAT --to-dest 192.168.1.200:22

4.2 流量控制与限速
# 限制SSH连接频率
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP

# 限制HTTP连接数
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j REJECT

# 限制ICMP频率(防ping洪水)
iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 1/s --limit-burst 10 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 8 -j DROP

# 端口扫描防护
iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

4.3 字符串匹配和内容过滤
# 阻止特定字符串
iptables -A FORWARD -p tcp -m string --string "malware.com" --algo kmp -j DROP
iptables -A FORWARD -p tcp -m string --string "cmd.exe" --algo kmp -j DROP

# 阻止P2P流量(示例)
iptables -A FORWARD -p tcp -m string --string "BitTorrent" --algo kmp -j DROP
iptables -A FORWARD -p udp -m string --string "BitTorrent" --algo kmp -j DROP

5. 安全防护配置
5.1 DDoS防护
#!/bin/bash
# DDoS防护配置

# SYN洪水攻击防护
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP

# 限制同一IP的连接数
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 20 -j REJECT

# 防止端口扫描
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

# UDP洪水防护
iptables -A INPUT -p udp -m limit --limit 5/s --limit-burst 10 -j ACCEPT
iptables -A INPUT -p udp -j DROP

5.2 Web应用防护
#!/bin/bash
# Web应用防火墙规则

# 防止SQL注入
iptables -A INPUT -p tcp --dport 80 -m string --string "union" --algo bm -j DROP
iptables -A INPUT -p tcp --dport 80 -m string --string "select" --algo bm -j DROP
iptables -A INPUT -p tcp --dport 80 -m string --string "drop" --algo bm -j DROP

# 防止XSS攻击
iptables -A INPUT -p tcp --dport 80 -m string --string "<script>" --algo bm -j DROP

# 限制POST请求大小
iptables -A INPUT -p tcp --dport 80 -m length --length 10000: -j DROP

# 阻止特定User-Agent
iptables -A INPUT -p tcp --dport 80 -m string --string "badbot" --algo bm -j DROP

6. 管理和维护
6.1 规则查看和管理
# 查看所有规则
iptables -L -n -v

# 查看带行号的规则
iptables -L -n --line-numbers

# 查看指定表的规则
iptables -t nat -L -n

# 删除指定规则
iptables -D INPUT 3 # 删除INPUT链的第3条规则

# 清空计数器
iptables -Z

# 保存规则
iptables-save > /etc/sysconfig/iptables

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

6.2 监控和日志
# 启用详细日志
iptables -A INPUT -j LOG --log-prefix "IPTABLES: " --log-level 4

# 查看iptables日志
tail -f /var/log/messages | grep IPTABLES

# 实时监控连接
watch -n 1 'iptables -L -n -v'

# 统计规则命中次数
iptables -L -n -v -x

7. 实用脚本示例
7.1 完整的服务器 防火墙脚本
#!/bin/bash
# 完整的服务器防火墙配置

# 定义变量
SSH_PORT=22
HTTP_PORT=80
HTTPS_PORT=443
DB_PORT=3306
INTERNAL_NET="192.168.1.0/24"
ADMIN_IP="192.168.1.100"

# 清理规则
iptables -F
iptables -X
iptables -Z

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

# 本地回环
iptables -A INPUT -i lo -j ACCEPT

# 已建立连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 管理服务
iptables -A INPUT -s $ADMIN_IP -p tcp --dport $SSH_PORT -j ACCEPT
iptables -A INPUT -s $INTERNAL_NET -p tcp --dport $SSH_PORT -j ACCEPT

# Web服务
iptables -A INPUT -p tcp --dport $HTTP_PORT -j ACCEPT
iptables -A INPUT -p tcp --dport $HTTPS_PORT -j ACCEPT

# 数据库(仅内网)
iptables -A INPUT -s $INTERNAL_NET -p tcp --dport $DB_PORT -j ACCEPT

# ICMP
iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 1/s -j ACCEPT

# 安全防护
iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP

# 日志记录
iptables -A INPUT -j LOG --log-prefix "IPTABLES-DROP: " --log-level 4

echo "防火墙配置完成"

7.2 网关路由器配置
#!/bin/bash
# 网关路由器防火墙配置

# 启用转发
echo 1 > /proc/sys/net/ipv4/ip_forward

# 清理规则
iptables -F
iptables -t nat -F
iptables -X

# NAT配置
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# 转发规则
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT

# DMZ配置
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.1.10:80
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j DNAT --to 192.168.1.10:443

echo "网关配置完成"

8. 故障排除
8.1 常见问题解决
# 检查规则是否生效
iptables -L -n

# 查看连接跟踪
cat /proc/net/ip_conntrack

# 检查内核参数
sysctl -a | grep net.ipv4.ip_forward

# 调试规则
iptables -t raw -A PREROUTING -p tcp --dport 80 -j TRACE

8.2 规则调试技巧
# 临时允许所有流量进行测试
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT

# 逐步添加规则测试
iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH: "

# 使用tcpdump配合调试
tcpdump -i eth0 port 80

————————————————
版权声明:本文为CSDN博主「Seal^_^」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41840843/article/details/155036982

上一篇 关于TCP的三次握手,四次挥手
下一篇 RG-N18000-XH系列交换机 硬件安装手册 M18018XH-FE-D II