Linux防火墙配置iptables实战


文档摘要

Linux防火墙配置iptables实战指南 概述 iptables是Linux系统内核级别的防火墙工具,通过规则链控制网络数据包的转发、NAT(网络地址转换)和流量过滤。正确配置iptables可以有效保护服务器安全,防止未授权访问和网络攻击。 iptables基础概念 表(Tables) filter表:默认表,用于包过滤(INPUT、OUTPUT、FORWARD链) nat表:用于网络地址转换(PREROUTING、POSTROUTING、OUTPUT链) mangle表:用于包修改(PREROUTING、OUTPUT、FORWARD、INPUT、POSTROUTING链) raw表:用于连接跟踪(PREROUTING、OUTPUT链) 链(Chains)

Linux防火墙配置iptables实战指南

概述

iptables是Linux系统内核级别的防火墙工具,通过规则链控制网络数据包的转发、NAT(网络地址转换)和流量过滤。正确配置iptables可以有效保护服务器安全,防止未授权访问和网络攻击。

iptables基础概念

表(Tables)

  • filter表:默认表,用于包过滤(INPUT、OUTPUT、FORWARD链)
  • nat表:用于网络地址转换(PREROUTING、POSTROUTING、OUTPUT链)
  • mangle表:用于包修改(PREROUTING、OUTPUT、FORWARD、INPUT、POSTROUTING链)
  • raw表:用于连接跟踪(PREROUTING、OUTPUT链)

链(Chains)

  • INPUT:处理进入本机的数据包
  • OUTPUT:处理从本机发出的数据包
  • FORWARD:处理转发数据包
  • PREROUTING:路由前处理(DNAT)
  • POSTROUTING:路由后处理(SNAT)

规则匹配顺序

数据包按顺序遍历规则链中的规则,匹配到即停止处理。

基础命令操作

查看规则

# 查看所有规则(带行号) iptables -L -n -v --line-numbers # 查看特定表规则 iptables -t nat -L -n -v # 查看INPUT链规则 iptables -L INPUT -n -v

清空规则

# 清空所有规则(慎用) iptables -F # 清空特定链 iptables -F INPUT # 删除用户自定义链 iptables -X # 清空计数器 iptables -Z

保存和恢复规则

# 保存规则(RedHat/CentOS) service iptables save # 或使用iptables-save iptables-save > /etc/iptables.rules # 恢复规则 iptables-restore < /etc/iptables.rules # 开机自动恢复(Debian/Ubuntu) iptables-save > /etc/iptables/rules.v4

常用配置场景

基础安全策略

# 1. 设置默认策略(拒绝所有,逐个开放) iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT # 2. 允许本地回环 iptables -A INPUT -i lo -j ACCEPT # 3. 允许已建立的连接 iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT # 4. 允许SSH(根据实际情况修改端口) iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 5. 允许HTTP/HTTPS iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT # 6. 允许Ping(可选) iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT # 7. 拒绝并记录其他连接 iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7 iptables -A INPUT -j DROP

防止DDoS攻击

# 限制每秒最多15个新连接 iptables -A INPUT -p tcp --dport 80 -m limit --limit 15/second --limit-burst 30 -j ACCEPT # 限制单个IP的并发连接数 iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 32 -j DROP # 防止SYN洪水攻击 iptables -N syn_flood iptables -A INPUT -p tcp --syn -j syn_flood iptables -A syn_flood -m limit --limit 1/s --limit-burst 3 -j RETURN iptables -A syn_flood -j DROP # 限制ICMP请求频率 iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 2 -j ACCEPT iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

端口转发(NAT)

# 启用IP转发 echo 1 > /proc/sys/net/ipv4/ip_forward # DNAT(目的地址转换):将外部80端口转发到内部8080端口 iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:8080 # SNAT(源地址转换):内部访问外部时使用公网IP iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 203.0.113.10 # MASQUERADE(动态IP) iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

IP黑白名单

# 白名单:允许特定IP访问 iptables -A INPUT -s 192.168.1.100 -j ACCEPT iptables -A INPUT -s 10.0.0.0/8 -j ACCEPT # 黑名单:拒绝特定IP访问 iptables -A INPUT -s 203.0.113.50 -j DROP iptables -A INPUT -s 203.0.113.0/24 -j DROP # 封禁IP后记录日志 iptables -A INPUT -s 203.0.113.50 -j LOG --log-prefix "IP Blocked: " iptables -A INPUT -s 203.0.113.50 -j DROP

高级规则示例

限制特定应用访问

# 仅允许特定IP访问MySQL iptables -A INPUT -p tcp --dport 3306 -s 192.168.1.0/24 -j ACCEPT iptables -A INPUT -p tcp --dport 3306 -j DROP # 允许特定IP访问Redis iptables -A INPUT -p tcp --dport 6379 -s 127.0.0.1 -j ACCEPT iptables -A INPUT -p tcp --dport 6379 -j DROP

时间控制

# 工作时间(9:00-18:00)允许访问 iptables -A INPUT -m time --timestart 09:00 --timestop 18:00 --days Mon,Tue,Wed,Thu,Fri -j ACCEPT iptables -A INPUT -j DROP

记录规则

# 记录丢弃的包 iptables -A INPUT -j LOG --log-prefix "INPUT Dropped: " --log-level 4 # 记录转发数据包 iptables -A FORWARD -j LOG --log-prefix "FORWARD: " --log-level 4 # 记录NAT连接 iptables -t nat -A PREROUTING -j LOG --log-prefix "NAT PREROUTING: "

管理规则

删除规则

# 根据行号删除 iptables -D INPUT 3 # 根据规则内容删除 iptables -D INPUT -s 192.168.1.100 -j ACCEPT

插入规则

# 在第2行插入规则 iptables -I INPUT 2 -p tcp --dport 3306 -j ACCEPT

替换规则

# 替换第3行规则 iptables -R INPUT 3 -p tcp --dport 22 -j ACCEPT

性能优化

使用ipset批量管理IP

# 创建ipset集合 ipset create blacklist hash:ip # 添加IP到集合 ipset add blacklist 203.0.113.50 ipset add blacklist 203.0.113.51 # 在iptables中使用 iptables -A INPUT -m set --match-set blacklist src -j DROP # 保存ipset ipset save > /etc/ipset.conf ipset restore < /etc/ipset.conf

规则优化原则

  1. 高频规则置顶:将匹配频率高的规则放在前面
  2. 拒绝规则置底:DROP/REJECT规则放在最后
  3. 白名单优先:ACCEPT规则优先于DROP规则
  4. 使用具体规则:避免使用过于宽泛的规则

监控和调试

实时监控

# 实时查看iptables日志 tail -f /var/log/messages | grep "iptables" # 使用watch监控规则匹配情况 watch -n 1 'iptables -L -n -v'

统计信息

# 查看每个规则的匹配次数和字节数 iptables -L -n -v # 重置计数器 iptables -Z INPUT

最佳实践

  1. 设置默认拒绝策略:安全性最高
  2. 最小权限原则:只开放必要的端口和服务
  3. 规则持久化:确保重启后规则生效
  4. 定期审查规则:删除过时和冗余规则
  5. 备份规则:修改前备份当前规则
  6. 测试环境验证:在生产环境应用前先在测试环境验证

故障排查

无法连接服务

# 1. 检查规则是否正确 iptables -L -n -v # 2. 检查默认策略 iptables -L | grep policy # 3. 查看日志 grep iptables /var/log/messages # 4. 临时清空规则测试 iptables -F

性能问题

# 查看规则数量 iptables -L | wc -l # 优化规则顺序 # 使用ipset替代大量IP规则

过渡到nftables

nftables是iptables的下一代替代品:

# nftables基础命令 nft list ruleset nft add rule ip filter INPUT tcp dport 22 accept

总结

iptables是Linux系统安全的重要组成部分,通过合理配置可以显著提升系统安全性。建议结合具体业务场景制定安全策略,并定期维护和更新规则,确保系统安全防护的有效性。


发布者: 作者: 转发
评论区 (0)
U