iptables学习

iptables 是 Linux 系统下的一个用户空间工具,用于配置内核中的网络包过滤规则(Netfilter 框架)。它是 Linux 防火墙的核心工具,可实现数据包过滤、网络地址转换(NAT)、端口转发等功能。以下是 iptables 的详细解析及常见规则示例。


一、iptables 基础概念

1. 四表(Tables)

iptables 包含四张表,按优先级从高到低排列:

  • raw表:用于处理连接跟踪前的数据包(如禁用连接跟踪)。
  • mangle表:修改数据包的元数据(如 TTL、TOS 字段)。
  • nat表:用于网络地址转换(SNAT/DNAT)。
  • filter表:默认表,用于数据包过滤(允许/拒绝流量)。
2. 五链(Chains)

每个表包含多个链,用于处理不同阶段的数据包:

  • PREROUTING:路由前处理(如 DNAT)。
  • INPUT:处理目标是本机的数据包。
  • FORWARD:处理经过本机转发的数据包。
  • OUTPUT:处理本机生成的数据包。
  • POSTROUTING:路由后处理(如 SNAT)。

表和链的关系:不同表支持的链不同。例如,nat 表处理 PREROUTINGPOSTROUTING,而 filter 表处理 INPUTFORWARDOUTPUT


二、iptables 规则语法

基本命令格式
iptables [-t 表名] 命令选项 [链名] [规则匹配条件] [-j 动作]
  • 表名:默认是 filter,可省略;其他表需明确指定(如 -t nat)。
  • 命令选项:如 -A(追加规则)、-I(插入规则)、-D(删除规则)、-L(查看规则)。
  • 匹配条件:源/目标 IP、端口、协议等。
  • 动作(Target):如 ACCEPTDROPREJECTLOG 等。
常用选项
选项 说明
-A <链名> 在链末尾追加规则
-I <链名> [位置] 在链的指定位置插入规则(默认头部)
-D <链名> [规则号] 删除链中的某条规则
-L 列出规则
-F 清空所有规则
-p <协议> 匹配协议(如 tcp、udp、icmp)
-s <源地址> 匹配源 IP 或网段
-d <目标地址> 匹配目标 IP 或网段
--sport <源端口> 匹配源端口
--dport <目标端口> 匹配目标端口
-i <网络接口> 输入接口(如 eth0)
-o <网络接口> 输出接口(如 eth1)
-j <动作> 执行的动作(如 ACCEPT、DROP)

三、常见规则示例

1. 基本规则
# 允许来自 192.168.1.0/24 的 SSH 连接
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT

# 阻止所有 ICMP 请求(禁 ping)
iptables -A INPUT -p icmp -j DROP

# 允许本地回环接口(lo)的所有流量
iptables -A INPUT -i lo -j ACCEPT

# 拒绝所有其他入站流量
iptables -A INPUT -j DROP
2. 状态追踪(连接跟踪)
# 允许已建立或相关的连接(推荐用于 OUTPUT 链)
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 允许来自外部的 HTTP/HTTPS 访问
iptables -A INPUT -p tcp -m multiport --dports 80,443 -m state --state NEW,ESTABLISHED -j ACCEPT
3. 网络地址转换(NAT)
# 共享上网(SNAT):将内网 192.168.1.0/24 的流量通过 eth0 出口
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

# 端口转发(DNAT):将访问公网 IP:8080 的流量转发到内部服务器 192.168.1.100:80
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
4. 防止 DDoS 攻击
# 限制每分钟 25 个新连接,超过则丢弃
iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW -j DROP

四、高级功能

1. 自定义链
# 创建名为 CUSTOM-CHAIN 的自定义链
iptables -N CUSTOM-CHAIN

# 在 INPUT 链中跳转到自定义链
iptables -A INPUT -j CUSTOM-CHAIN

# 在自定义链中添加规则
iptables -A CUSTOM-CHAIN -s 10.0.0.0/8 -j DROP
2. 记录日志
# 记录被拒绝的 SSH 连接尝试
iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH Denied: "
iptables -A INPUT -p tcp --dport 22 -j DROP
3. 多端口匹配
# 允许多个端口(如 80,443,8080)
iptables -A INPUT -p tcp -m multiport --dports 80,443,8080 -j ACCEPT

五、维护与管理

1. 保存与恢复规则
# 保存规则到文件(不同系统路径可能不同)
iptables-save > /etc/iptables/rules.v4

# 恢复规则
iptables-restore < /etc/iptables/rules.v4

# Ubuntu/Debian 安装持久化工具
apt install iptables-persistent
2. 监控 iptables 日志
# 查看被拒绝的流量日志
tail -f /var/log/syslog | grep iptables

六、注意事项

  1. 规则顺序:规则按顺序匹配,第一条匹配的规则生效。
  2. 避免锁定自己:如果通过 SSH 远程配置防火墙,务必先允许 SSH 端口。
  3. 测试规则:使用 iptables-apply 或临时规则测试,防止配置错误导致断连。
  4. IPv6 支持:如需处理 IPv6,需使用 ip6tables 命令。

通过灵活组合表和链,可以构建复杂的防火墙策略。如需更高级功能(例如流量整形、复杂匹配),可结合 ipset 或升级到 nftables(iptables 的下一代替代工具)。

iptables 详解及规则策略指南

iptables 是 Linux 系统中用于配置防火墙规则的核心工具,通过控制网络流量保障系统安全。以下从结构、规则、策略到实用示例,全面解析其用法。


一、iptables 核心结构

iptables 由 表(Tables)链(Chains) 组成,不同表处理特定类型的流量。

作用 内置链
filter 默认表,用于过滤数据包(允许/拒绝) INPUTOUTPUTFORWARD
nat 网络地址转换(NAT) PREROUTINGPOSTROUTINGOUTPUT
mangle 修改数据包内容(如 TTL、QoS) 所有链(包括自定义链)
raw 绕过连接跟踪(用于豁免某些流量) PREROUTINGOUTPUT

链的流向

  1. 入站流量PREROUTING(nat) → INPUT(filter)
  2. 出站流量OUTPUT(filter) → POSTROUTING(nat)
  3. 转发流量PREROUTING(nat) → FORWARD(filter) → POSTROUTING(nat)

二、规则组成与动作

每条规则包含 匹配条件动作(Target)

  • 常见匹配条件
    • -p tcp/udp/icmp:协议类型
    • --dport 80:目标端口
    • -s 192.168.1.0/24:源IP
    • -m state --state RELATED,ESTABLISHED:连接状态
  • 关键动作
    • ACCEPT:允许通过
    • DROP:静默丢弃
    • REJECT:拒绝并返回错误(如 --reject-with icmp-port-unreachable
    • LOG:记录日志(--log-prefix "Blocked: "
    • SNAT/DNAT:地址转换
    • RETURN:返回上一级链

三、常用命令与示例
# 查看当前规则(filter表)
iptables -L -n -v

# 允许SSH(22端口)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 拒绝IP 10.0.0.5
iptables -A INPUT -s 10.0.0.5 -j DROP

# 允许已建立的连接
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# NAT示例:将内网192.168.1.0/24通过公网IP出站
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to 公网IP

拒绝的流量
 -j LOG --log-prefix "iptables Denied: "

四、安全策略配置
  1. 默认策略:建议 INPUT 链默认拒绝,仅放行必要流量。

    iptables -P FORWARD DROP
    iptables -P OUTPUT ACCEPT  # 可根据需求调整
    
  2. 白名单模式

    # 放行本地回环
    iptables -A INPUT -i lo -j ACCEPT
    # 放行HTTP/HTTPS
    iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
    
  3. 防御暴力破解

    # 限制SSH每分钟3次新连接
    iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
    iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 3 -j DROP
    

五、规则持久化

临时规则重启后会失效,需保存:

  • Debian/Ubuntu
    apt install iptables-persistent
    netfilter-persistent save
    
  • RHEL/CentOS
    service iptables save  # 或使用 /etc/sysconfig/iptables
    

六、注意事项
  1. 规则顺序:iptables 从上到下匹配,首条匹配的规则生效。
  2. 远程操作保护:配置防火墙前,先放行SSH,避免被锁定。
  3. 日志管理:高频日志可能影响性能,可用 -m limit --limit 3/min 限制速率。
  4. 测试规则:使用 iptables-apply--wait 防止配置错误导致断连。

通过合理配置 iptables,可有效提升系统安全性。建议结合工具如 ufwfirewalld(基于iptables)简化管理,同时定期审查规则避免冗余。

在 iptables 中,规则的顺序至关重要,因为防火墙会按照从上到下的顺序匹配规则,一旦匹配到某条规则,后续规则将不再处理。若需要调整规则顺序,可通过以下步骤操作:


一、调整规则的核心方法

iptables 没有直接移动规则的命令,但可以通过 删除旧规则 + 插入新位置 实现顺序调整。

1. 查看规则列表(显示行号)
iptables -L [链名] --line-numbers -n
# 示例:查看 INPUT 链的所有规则及其编号
iptables -L INPUT --line-numbers -n

输出示例:

Chain INPUT (policy DROP)
num  target     prot opt source               destination
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
2    DROP       tcp  --  10.0.0.5             0.0.0.0/0            tcp dpt:22
2. 删除旧规则

使用 -D 参数指定链名和规则编号:

iptables -D [链名] [规则编号]
# 示例:删除 INPUT 链的第 2 条规则
iptables -D INPUT 2
3. 插入新规则到指定位置

使用 -I 参数指定链名和插入位置(行号):

iptables -I [链名] [位置] [规则条件] -j [动作]
# 示例:在 INPUT 链的第 1 位插入一条允许 80 端口的规则
iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT

二、完整操作示例

目标:将原本在末尾的「允许 22 端口」规则移动到首行,避免被前面的 DROP 规则拦截。

  1. 查看当前规则

     ptables -L INPUT --line-numbers -n
    # 假设输出如下:
    Chain INPUT (policy DROP)
    num  target     prot opt source     destination
    1    DROP       all  --  10.0.0.5   0.0.0.0/0
    2    ACCEPT     tcp  --  0.0.0.0/0  0.0.0.0/0   tcp dpt:22
    
  2. 删除原规则(第 2 条):

    iptables -D INPUT 2
    
  3. 插入到首行

    iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT
    

三、其他方法:通过规则文件编辑

若规则较多,可导出配置、编辑文件后重新加载(谨慎操作,避免语法错误导致防火墙失效):

# 1. 保存当前规则到文件
iptables-save > /tmp/iptables.bak

# 2. (手动调整规则顺序)
vim /tmp/iptables.bak

# 3. 清除现有规则并重新加载
iptables -F
iptables-restore < /tmp/iptables.bak

四、注意事项

  1. 规则依赖:确保移动后的规则不会意外阻断关键流量(如 SSH 连接)。
  2. 临时生效:重启后规则会丢失,调整后需执行持久化操作。
    • Debian/Ubuntu:iptables-persistent save
    • RHEL/CentOS:service iptables save
  3. 备份规则:操作前备份当前规则,以便快速回滚:
    iptables-save > ~/iptables_backup.txt
    

通过以上方法,可灵活控制 iptables 规则顺序,确保防火墙策略按预期生效。

在 iptables 中,规则的顺序至关重要,因为防火墙会按照从上到下的顺序匹配规则,一旦匹配到某条规则,后续规则将不再处理。若需要调整规则顺序,可通过以下步骤操作:


一、调整规则的核心方法

iptables 没有直接移动规则的命令,但可以通过 删除旧规则 + 插入新位置 实现顺序调整。

1. 查看规则列表(显示行号)
iptables -L [链名] --line-numbers -n
# 示例:查看 INPUT 链的所有规则及其编号
iptables -L INPUT --line-numbers -n

输出示例:

Chain INPUT (policy DROP)
num  target     prot opt source               destination
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
2    DROP       tcp  --  10.0.0.5             0.0.0.0/0            tcp dpt:22
2. 删除旧规则

使用 -D 参数指定链名和规则编号:

iptables -D [链名] [规则编号]
# 示例:删除 INPUT 链的第 2 条规则
iptables -D INPUT 2
3. 插入新规则到指定位置

使用 -I 参数指定链名和插入位置(行号):

iptables -I [链名] [位置] [规则条件] -j [动作]
# 示例:在 INPUT 链的第 1 位插入一条允许 80 端口的规则
iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT

二、完整操作示例

目标:将原本在末尾的「允许 22 端口」规则移动到首行,避免被前面的 DROP 规则拦截。

  1. 查看当前规则

    ptables -L INPUT --line-numbers -n
    # 假设输出如下:
    Chain INPUT (policy DROP)
    num  target     prot opt source     destination
    1    DROP       all  --  10.0.0.5   0.0.0.0/0
    2    ACCEPT     tcp  --  0.0.0.0/0  0.0.0.0/0   tcp dpt:22
    
  2. 删除原规则(第 2 条):

    iptables -D INPUT 2
    
  3. 插入到首行

     iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT
    

三、其他方法:通过规则文件编辑

若规则较多,可导出配置、编辑文件后重新加载(谨慎操作,避免语法错误导致防火墙失效):

# 1. 保存当前规则到文件
iptables-save > /tmp/iptables.bak

# 2. (手动调整规则顺序)
vim /tmp/iptables.bak

# 3. 清除现有规则并重新加载
iptables -F
iptables-restore < /tmp/iptables.bak

四、注意事项

  1. 规则依赖:确保移动后的规则不会意外阻断关键流量(如 SSH 连接)。
  2. 临时生效:重启后规则会丢失,调整后需执行持久化操作。
    • Debian/Ubuntu:iptables-persistent save
    • RHEL/CentOS:service iptables save
  3. 备份规则:操作前备份当前规则,以便快速回滚:
    iptables-save > ~/iptables_backup.txt
    

通过以上方法,可灵活控制 iptables 规则顺序,确保防火墙策略按预期生效。

你可能感兴趣的:(学习,网络,linux,运维,ubuntu)