防火墙配置 - iptables
iptables是Linux系统最重要的防火墙工具,掌握其配置和管理对系统安全至关重要。
iptables是Linux系统中功能强大的防火墙工具,通过配置规则来控制网络流量,保护系统安全。
iptables基础概念
表(Tables)和链(Chains)
# 四个基本表:
# filter: 默认表,用于过滤数据包
# nat: 网络地址转换
# mangle: 修改数据包
# raw: 配置免跟踪
# 五个基本链:
# INPUT: 输入链,进入本机的数据包
# OUTPUT: 输出链,从本机发出的数据包
# FORWARD: 转发链,经过本机转发的数据包
# PREROUTING: 路由前处理
# POSTROUTING: 路由后处理
查看当前规则
# 查看filter表规则
iptables -L
iptables -L -n # 显示数字地址
iptables -L -v # 显示详细信息
iptables -L --line-numbers # 显示行号
# 查看nat表规则
iptables -t nat -L
# 查看所有表的规则
iptables-save
基本规则操作
添加规则
# 允许SSH连接(端口22)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 允许HTTP连接(端口80)
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 允许HTTPS连接(端口443)
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 允许本地回环
iptables -A INPUT -i lo -j ACCEPT
# 允许已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
删除规则
# 按行号删除规则
iptables -D INPUT 3
# 按规则内容删除
iptables -D INPUT -p tcp --dport 80 -j ACCEPT
# 清空所有规则
iptables -F # 清空filter表
iptables -t nat -F # 清空nat表
iptables -X # 删除自定义链
插入规则
# 在指定位置插入规则
iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT
# 替换规则
iptables -R INPUT 1 -p tcp --dport 22 -j DROP
常用规则配置
基本安全规则
#!/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 INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许SSH (修改为实际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
端口访问控制
# 允许特定IP访问SSH
iptables -A INPUT -p tcp -s 192.168.1.100 --dport 22 -j ACCEPT
# 允许特定网段访问数据库
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 3306 -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 8000:8999 -j ACCEPT
连接频率限制
# 限制SSH连接频率(每分钟最多3次)
iptables -A INPUT -p tcp --dport 22 -m limit --limit 3/min -j ACCEPT
# 限制HTTP连接频率
iptables -A INPUT -p tcp --dport 80 -m limit --limit 100/sec -j ACCEPT
# 防止SYN flood攻击
iptables -A INPUT -p tcp --syn -m limit --limit 1/sec -j ACCEPT
# 限制并发连接数
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j REJECT
高级规则配置
NAT配置
# SNAT (源地址转换)
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 10.0.0.1
# MASQUERADE (动态SNAT)
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
# DNAT (目标地址转换)
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:8080
# 端口转发
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 80
日志记录
# 记录拒绝的连接
iptables -A INPUT -j LOG --log-prefix "IPTABLES-DROPPED: " --log-level 4
iptables -A INPUT -j DROP
# 记录特定端口访问
iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH-ACCESS: "
# 限制日志频率
iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "IPTABLES: "
自定义链
# 创建自定义链
iptables -N WEB_RULES
iptables -N SSH_RULES
# 添加规则到自定义链
iptables -A WEB_RULES -p tcp --dport 80 -j ACCEPT
iptables -A WEB_RULES -p tcp --dport 443 -j ACCEPT
# 调用自定义链
iptables -A INPUT -j WEB_RULES
iptables -A INPUT -j SSH_RULES
防火墙管理脚本
启动脚本
#!/bin/bash
# firewall_start.sh
# 加载模块
modprobe ip_tables
modprobe ip_conntrack
modprobe ip_conntrack_ftp
# 启用IP转发(如需要)
echo 1 > /proc/sys/net/ipv4/ip_forward
# 清空现有规则
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -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
# 服务规则
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 保存规则
service iptables save # CentOS/RHEL
# 或
iptables-save > /etc/iptables/rules.v4 # Ubuntu/Debian
echo "防火墙规则已加载"
停止脚本
#!/bin/bash
# firewall_stop.sh
# 设置允许所有策略
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
# 清空所有规则
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
echo "防火墙已停止"
状态检查脚本
#!/bin/bash
# firewall_status.sh
echo "=== 当前规则数量 ==="
echo "Filter表: $(iptables -L | grep -c 'Chain\|target')"
echo "NAT表: $(iptables -t nat -L | grep -c 'Chain\|target')"
echo -e "\n=== 默认策略 ==="
iptables -L | grep "Chain" | grep "policy"
echo -e "\n=== 连接状态统计 ==="
cat /proc/net/nf_conntrack | wc -l
echo -e "\n=== 最近的防火墙日志 ==="
tail -n 5 /var/log/messages | grep "IPTABLES"
故障排查
常见问题诊断
# 检查规则冲突
iptables -L -n -v --line-numbers
# 测试端口连通性
telnet target_ip port
nc -v target_ip port
# 查看连接跟踪
cat /proc/net/nf_conntrack
netstat -an | grep ESTABLISHED
# 检查模块加载
lsmod | grep ip_tables
lsmod | grep nf_conntrack
调试技巧
# 临时添加允许规则
iptables -I INPUT 1 -j ACCEPT
# 查看规则匹配计数
iptables -L -v
# 重置计数器
iptables -Z
# 临时禁用防火墙
systemctl stop iptables
systemctl stop firewalld
最佳实践
安全建议
默认拒绝策略
iptables -P INPUT DROP iptables -P FORWARD DROP
最小化开放端口
- 只开放必要的服务端口
- 使用非标准端口号
- 限制访问来源IP
规则顺序优化
- 将最常匹配的规则放在前面
- 拒绝规则放在最后
定期备份规则
iptables-save > /backup/iptables-$(date +%Y%m%d).rules
性能优化
# 优化连接跟踪
echo 'net.netfilter.nf_conntrack_max = 65536' >> /etc/sysctl.conf
echo 'net.netfilter.nf_conntrack_tcp_timeout_established = 1200' >> /etc/sysctl.conf
# 启用快速回收
echo 'net.ipv4.tcp_tw_recycle = 1' >> /etc/sysctl.conf
echo 'net.ipv4.tcp_tw_reuse = 1' >> /etc/sysctl.conf
sysctl -p
监控和维护
# 定期检查规则
crontab -e
# 添加: 0 0 * * * /usr/local/bin/firewall_status.sh
# 监控连接数
watch -n 1 'cat /proc/net/nf_conntrack | wc -l'
# 分析日志
grep "IPTABLES" /var/log/messages | tail -100