iptables
iptables
是Linux系统中的防火墙工具,用于配置内核的netfilter框架,实现网络包过滤、NAT、端口转发等功能。
基本概念
表(Tables)
- filter表 - 默认表,用于包过滤
- nat表 - 用于网络地址转换
- mangle表 - 用于包的修改
- raw表 - 用于配置连接跟踪
- security表 - 用于强制访问控制
链(Chains)
- INPUT - 处理进入本机的数据包
- OUTPUT - 处理从本机发出的数据包
- FORWARD - 处理转发的数据包
- PREROUTING - 数据包进入路由表之前
- POSTROUTING - 数据包离开路由表之后
动作(Targets)
- ACCEPT - 接受数据包
- DROP - 丢弃数据包(不回应)
- REJECT - 拒绝数据包(发送拒绝消息)
- LOG - 记录日志
- RETURN - 返回调用链
基本语法
iptables [-t table] command [chain] [rule-specification] [target]
常用命令
查看规则
# 查看所有规则
iptables -L
# 查看指定表的规则
iptables -t nat -L
# 显示行号和详细信息
iptables -L -n --line-numbers
# 查看规则统计
iptables -L -v
# 查看具体规则配置
iptables -S
基本规则操作
# 添加规则到链末尾
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 插入规则到指定位置
iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT
# 删除指定规则
iptables -D INPUT -p tcp --dport 22 -j ACCEPT
# 删除指定行号的规则
iptables -D INPUT 3
# 清空所有规则
iptables -F
# 清空指定链的规则
iptables -F INPUT
链的默认策略
# 设置默认策略为拒绝
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 设置默认策略为接受
iptables -P INPUT ACCEPT
实际配置示例
基础防火墙配置
#!/bin/bash
# basic_firewall.sh
# 清空现有规则
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
# 允许SSH连接
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 允许HTTP和HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 允许ping
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
# 保存规则
service iptables save
Web服务器防火墙
#!/bin/bash
# web_server_firewall.sh
# 清空规则
iptables -F
iptables -X
# 默认策略
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
# SSH访问(限制IP)
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
# Web服务
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 数据库访问(仅允许Web服务器)
iptables -A INPUT -s 192.168.1.100 -p tcp --dport 3306 -j ACCEPT
# FTP服务(如果需要)
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
# 邮件服务
iptables -A INPUT -p tcp --dport 25 -j ACCEPT # SMTP
iptables -A INPUT -p tcp --dport 110 -j ACCEPT # POP3
iptables -A INPUT -p tcp --dport 143 -j ACCEPT # IMAP
# DNS查询
iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p tcp --dport 53 -j ACCEPT
# 防止DDoS攻击
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
# 记录被拒绝的连接
iptables -A INPUT -j LOG --log-prefix "IPTABLES-DROPPED: "
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 MASQUERADE
# DNAT(目标地址转换)
iptables -t nat -A PREROUTING -d 203.0.113.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:80
# 端口转发
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 80
高级安全配置
#!/bin/bash
# advanced_security.sh
# 防止IP欺骗
iptables -A INPUT -s 10.0.0.0/8 -i eth0 -j DROP
iptables -A INPUT -s 172.16.0.0/12 -i eth0 -j DROP
iptables -A INPUT -s 192.168.0.0/16 -i eth0 -j DROP
# 防止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
# 限制并发连接数
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 10 -j REJECT
# 防止端口扫描
iptables -A INPUT -m recent --name portscan --rcheck --seconds 86400 -j DROP
iptables -A INPUT -m recent --name portscan --set -j LOG --log-prefix "PORTSCAN: "
iptables -A INPUT -m recent --name portscan --set -j DROP
# 防止暴力破解
iptables -A INPUT -p tcp --dport 22 -m recent --name ssh --set
iptables -A INPUT -p tcp --dport 22 -m recent --name ssh --rcheck --seconds 60 --hitcount 4 -j DROP
# 防止ping洪水
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
常用规则模板
允许特定IP访问
# 允许特定IP访问SSH
iptables -A INPUT -s 192.168.1.100 -p tcp --dport 22 -j ACCEPT
# 允许IP段访问
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
# 允许多个IP
iptables -A INPUT -s 192.168.1.100,192.168.1.101 -p tcp --dport 22 -j ACCEPT
时间限制规则
# 仅在工作时间允许访问
iptables -A INPUT -p tcp --dport 80 -m time --timestart 09:00 --timestop 18:00 -j ACCEPT
# 仅在工作日允许
iptables -A INPUT -p tcp --dport 22 -m time --weekdays Mon,Tue,Wed,Thu,Fri -j ACCEPT
流量限制
# 限制下载速度
iptables -A FORWARD -p tcp --sport 80 -m limit --limit 50/s -j ACCEPT
# 限制连接速率
iptables -A INPUT -p tcp --dport 80 -m recent --set --name WEB
iptables -A INPUT -p tcp --dport 80 -m recent --update --seconds 10 --hitcount 10 --name WEB -j DROP
日志和监控
配置日志
# 记录所有被拒绝的包
iptables -A INPUT -j LOG --log-prefix "IPTABLES-INPUT-DROPPED: " --log-level 6
# 记录特定端口的访问
iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH-ACCESS: "
# 查看日志
tail -f /var/log/messages | grep IPTABLES
监控脚本
#!/bin/bash
# iptables_monitor.sh
echo "iptables规则监控"
echo "================="
# 显示规则统计
echo "当前规则统计:"
iptables -L -v -n | grep -E "(Chain|packets bytes)"
echo
echo "连接跟踪统计:"
cat /proc/net/nf_conntrack | wc -l
echo "最大连接数: $(cat /proc/sys/net/nf_conntrack_max)"
echo
echo "最近被阻止的连接:"
dmesg | grep "IPTABLES" | tail -5
规则管理
保存和恢复规则
# CentOS/RHEL 保存规则
service iptables save
# Ubuntu/Debian 保存规则
iptables-save > /etc/iptables/rules.v4
# 手动保存规则
iptables-save > /etc/iptables.rules
# 恢复规则
iptables-restore < /etc/iptables.rules
# 开机自动加载
echo "iptables-restore < /etc/iptables.rules" >> /etc/rc.local
规则备份脚本
#!/bin/bash
# iptables_backup.sh
BACKUP_DIR="/backup/iptables"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR
# 备份当前规则
iptables-save > $BACKUP_DIR/iptables_$DATE.rules
echo "iptables规则已备份到: $BACKUP_DIR/iptables_$DATE.rules"
# 保留最近30天的备份
find $BACKUP_DIR -name "iptables_*.rules" -mtime +30 -delete
故障排查
常见问题诊断
# 检查规则是否生效
iptables -L -v -n | grep -E "(DROP|REJECT)"
# 查看连接状态
netstat -an | grep ":80"
ss -tuln
# 测试连接
telnet target_ip port
# 临时禁用iptables
service iptables stop
# 或
iptables -F && iptables -P INPUT ACCEPT
调试模式
# 启用详细日志
echo 1 > /proc/sys/net/netfilter/nf_log_all_netns
# 跟踪数据包
iptables -t raw -A PREROUTING -p tcp --dport 80 -j TRACE
iptables -t raw -A OUTPUT -p tcp --sport 80 -j TRACE
# 查看跟踪日志
dmesg | grep TRACE
性能优化
规则优化
# 将常用规则放在前面
iptables -I INPUT 1 -m state --state ESTABLISHED,RELATED -j ACCEPT
# 使用conntrack模块
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# 避免过多的规则
# 使用ipset管理大量IP
ipset create blacklist hash:ip
ipset add blacklist 192.168.1.100
iptables -A INPUT -m set --match-set blacklist src -j DROP
性能监控
# 查看规则匹配统计
iptables -L -v -n --line-numbers
# 重置计数器
iptables -Z
# 监控连接跟踪表
watch -n 1 'cat /proc/net/nf_conntrack | wc -l'
注意事项
- 规则顺序: iptables规则从上到下匹配,注意规则顺序
- 默认策略: 设置DROP策略前确保有SSH访问规则
- 备份规则: 修改前备份现有规则
- 测试环境: 在测试环境中验证规则
- 性能影响: 过多规则会影响网络性能
相关命令
firewalld
- CentOS 7+的防火墙管理工具ufw
- Ubuntu的简化防火墙工具nftables
- 新一代的包过滤框架tcpdump
- 网络包捕获工具netstat
- 网络连接状态查看
iptables是Linux网络安全的重要工具,正确配置可以有效保护系统安全。