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