iptables

title

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'

注意事项

  1. 规则顺序: iptables规则从上到下匹配,注意规则顺序
  2. 默认策略: 设置DROP策略前确保有SSH访问规则
  3. 备份规则: 修改前备份现有规则
  4. 测试环境: 在测试环境中验证规则
  5. 性能影响: 过多规则会影响网络性能

相关命令

  • firewalld - CentOS 7+的防火墙管理工具
  • ufw - Ubuntu的简化防火墙工具
  • nftables - 新一代的包过滤框架
  • tcpdump - 网络包捕获工具
  • netstat - 网络连接状态查看

iptables是Linux网络安全的重要工具,正确配置可以有效保护系统安全。

powered by Gitbook© 2025 编外计划 | 最后修改: 2025-07-28 12:42:41

results matching ""

    No results matching ""