防火墙配置 - iptables

title

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

最佳实践

安全建议

  1. 默认拒绝策略

    iptables -P INPUT DROP
    iptables -P FORWARD DROP
    
  2. 最小化开放端口

    • 只开放必要的服务端口
    • 使用非标准端口号
    • 限制访问来源IP
  3. 规则顺序优化

    • 将最常匹配的规则放在前面
    • 拒绝规则放在最后
  4. 定期备份规则

    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
powered by Gitbook© 2025 编外计划 | 最后修改: 2025-07-28 12:47:16

results matching ""

    No results matching ""