Skip to main content

1.iptables简介

Netfilter 和 iptables的关系

Netfilter

Netfilter 是 Linux 内核中的一个框架,用于实现数据包的过滤、修改和路由等功能。它在 Linux 内核中的位置是网络协议栈中的一个重要组件,负责在数据包通过网络协议栈时进行处理。Netfilter 提供了一系列的钩子(Hooks),允许用户空间程序注册回调函数来处理特定的网络事件,从而实现对数据包的处理和控制。

iptables

iptables 是 Linux 中的一个命令行工具,用于配置和管理 Netfilter 的规则集。它允许用户在 Linux 系统上设置防火墙规则、网络地址转换(NAT)、端口转发等功能。通过 iptables,用户可以定义各种规则来控制数据包的流动,包括允许或拒绝特定的数据包、修改数据包的头部信息、进行数据包的转发等。

总的来说,Netfilter 提供了底层的数据包处理框架,而 iptables 则提供了用户友好的接口,使用户可以方便地配置和管理网络规则。使用 iptables 可以实现诸如防火墙、NAT、端口转发等功能,通过配置不同的规则,可以对网络流量进行精确地控制和管理,保障系统的安全性和稳定性。

iptables工作流程

iptables 的工作流程可以简单描述为:数据包到达 -> 规则集匹配 -> 执行动作 -> 数据包处理。

  1. 数据包匹配 : 当网络数据包到达 Linux 系统时,它首先会经过 Netfilter 框架。在 Netfilter 中,每个数据包都会按照预定义的顺序(称为钩子,Hooks)经过一系列的处理步骤,其中包括 PREROUTING、INPUT、FORWARD、OUTPUT 和 POSTROUTING。
  2. 规则集匹配 : 在经过每个钩子时,iptables 将会检查数据包是否与已定义的规则集匹配。规则集包含一系列的规则(Rules),每个规则都定义了对应的匹配条件和动作。iptables 会按照规则集中的顺序逐个检查规则,直到找到与数据包匹配的规则或者到达规则集的末尾。
  3. 动作执行 : 如果找到了与数据包匹配的规则,iptables 将执行规则中定义的动作。这些动作可以是允许(ACCEPT)、拒绝(DROP)、重定向(REDIRECT)、修改数据包头部信息等。如果数据包未匹配任何规则,则根据系统的默认策略(policy)执行对应的动作。
  4. 数据包处理 : 根据执行的动作,iptables 将决定如何处理数据包。如果动作是允许或者拒绝,iptables 将根据规则执行相应的操作;如果动作是重定向或修改数据包头部信息,则 iptables 将按照规则进行数据包的转发或修改操作。
  5. 继续处理 : 如果数据包需要继续被处理(例如,经过 FORWARD 钩子的数据包需要继续转发),则数据包将继续经过后续的处理步骤,直到完成全部处理流程。

itables四表五链

在 iptables 中,有四个表(Table)和五条链(Chain),它们组成了 iptables 的基本框架,用于控制网络数据包的流向和处理。

四个表(Table)

filter 表

  • 作用:用于过滤数据包,决定是否允许数据包通过防火墙。
  • 默认链:INPUT、OUTPUT、FORWARD
  • 典型用途:设置防火墙规则,控制数据包的进出。

nat 表

  • 作用:用于实现网络地址转换(NAT)功能,修改数据包的源或目的地址。
  • 默认链:PREROUTING、POSTROUTING、OUTPUT
  • 典型用途:配置端口转发、网络地址转换等功能。

mangle 表

  • 作用:用于修改数据包的报头信息,如修改 TTL(Time to Live)、标记数据包等。
  • 默认链:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
  • 典型用途:实现特定的网络流量处理,如设置 QoS(Quality of Service)、路由策略等。

raw 表

  • 作用:用于配置规则,控制数据包是否跳过连接追踪。
  • 默认链:PREROUTING、OUTPUT
  • 典型用途:配置特定规则,让数据包绕过连接追踪模块处理。

五条链(Chain)

INPUT

  • 位置:在数据包到达目标主机后处理。
  • 作用:用于处理数据包发送至本地的情况,即数据包的目标地址是本机。

PREROUTING

  • 位置:在数据包进入路由前处理。
  • 作用:适用于对数据包进行修改、跳转到 NAT 表等预处理操作。

FORWARD

  • 位置:在数据包在路由时进行处理。
  • 作用:适用于数据包经过防火墙进行转发的情况。

OUTPUT

  • 位置:在数据包从本地发出前处理。
  • 作用:用于处理从本地发出的数据包。

POSTROUTING

  • 位置:在数据包离开系统时进行处理。
  • 作用:适用于对数据包进行修改、跳转到 NAT 表等后处理操作。

filter 表

filter 表是 iptables 中最常用的表之一,用于过滤数据包,决定是否允许数据包通过防火墙。

默认链:

  • INPUT :处理进入本地计算机的数据包。
  • OUTPUT :处理从本地计算机发出的数据包。
  • FORWARD :处理经过本地计算机进行转发的数据包。

功能:

  • 允许数据包通过 :可以定义规则允许特定类型的数据包通过防火墙。
  • 拒绝数据包通过 :可以定义规则拒绝特定类型的数据包通过防火墙。
  • 日志记录 :可以定义规则记录特定类型的数据包,以便后续分析。

典型用途:

  • 防火墙规则 :通过设置规则,允许或者拒绝特定源、目的、端口等条件的数据包通过防火墙,实现网络安全防护。
  • 网络访问控制 :通过过滤规则,控制本地计算机的网络访问权限,例如限制特定应用程序的网络访问。
  • 端口转发 :在 FORWARD 链中,可以配置端口转发规则,将经过本地计算机的数据包转发至其他目的地。

示例

允许来自特定 IP 地址的 SSH 连接

iptables -A INPUT -s <IP_Address> -p tcp --dport 22 -j ACCEPT

允许访问特定端口的数据包通过

iptables -A INPUT -p tcp --dport 80 -j ACCEPT

拒绝来自特定 IP 地址的数据包通过

iptables -A INPUT -s <IP_Address> -j DROP

扩展

默认链

默认链是指在特定的 iptables 表中预先定义的链,用于处理相应表中没有匹配规则的数据包。对于 filter 表、nat 表、mangle 表和raw 表,它们各自都有默认链。

  • 在 filter 表中,有三个默认链:INPUT、OUTPUT 和 FORWARD。
  • 在 nat 表中,有三个默认链:PREROUTING、POSTROUTING 和 OUTPUT。
  • 在 mangle 表中,有五个默认链:PREROUTING、INPUT、FORWARD、OUTPUT 和POSTROUTING。
  • 在 raw 表中,有两个默认链:PREROUTING 和 OUTPUT。

这些默认链定义了数据包在特定阶段的处理顺序,如果数据包在某个表中的特定链上没有匹配到规则,那么默认链就会根据预设的策略来处理这些数据包。通常情况下,默认链的行为由表的默认策略(policy)来决定,可以通过 iptables -P 命令来设置默认策略。

例如,在 filter 表的 INPUT 链上,如果没有匹配到任何规则,那么根据默认策略(通常是 ACCEPT 或者 DROP),数据包将会被相应地处理。默认链的设置对于 iptables 规则的生效非常重要,因为它影响了没有匹配到特定规则的数据包的处理方式。

nat 表

nat 表是 iptables 中的一个重要表,用于实现网络地址转换(Network Address Translation,NAT)功能,主要用于修改数据包的源或目的地址。

默认链:

  • PREROUTING :在数据包进入路由之前处理。
  • POSTROUTING :在数据包离开路由之后处理。
  • OUTPUT :在数据包从本地发出之前处理。

功能:

  • 源地址转换(SNAT) :修改数据包的源地址,通常用于隐藏内部网络的真实 IP 地址。
  • 目的地址转换(DNAT) :修改数据包的目的地址,通常用于实现端口转发、反向代理等功能。
  • 端口转发 :将进入本地计算机的数据包转发至其他目标主机的指定端口。
  • 负载均衡 :将进入本地计算机的数据包根据负载均衡算法转发至多个后端服务器。

典型用途:

  • 端口转发 :将来自公网的请求转发至内部服务器。
  • 负载均衡 :将来自公网的请求分发至多个服务器。
  • 隐藏内部网络 :将内部网络的真实 IP 地址转换为公网 IP 地址,增强安全性。

使用注意:

  • NAT 表的规则对经过路由的数据包进行处理,因此需要在 FORWARD 链中配置规则。
  • 确保内核启用了相关的网络转发功能,以确保 NAT 功能正常工作。
  • 注意 NAT 表规则的顺序,规则的匹配顺序可能会影响转发和转换的行为。

示例

实现端口转发

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination <Internal_IP>:<Internal_Port>

实现源地址转换

iptables -t nat -A POSTROUTING -s <Internal_Network> -o eth0 -j SNAT --to-source <Public_IP>
  • 用于修改数据包的源地址,将内部网络中的数据包的源地址修改为指定的公网 IP 地址 <Public_IP>

实现负载均衡

iptables -t nat -A PREROUTING -p tcp --dport 80 -m statistic --mode random --probability 0.5 -j DNAT --to-destination <Server1_IP>:80
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination <Server2_IP>:80
  • 第一条规则使用了 statistic 模块,采用了随机模式(--mode random)并设置了概率为 0.5(--probability 0.5)。这意味着对于进入端口为 80 的 TCP 数据包,有 50% 的概率会被转发至 <Server1_IP> 的端口 80。
  • 第二条规则是一个默认规则,用于将剩余的 50% 的 TCP 数据包转发至 <Server2_IP> 的端口 80。

mangle 表

mangle 表是 iptables 中的一个表,用于修改数据包的报头信息,例如修改 TTL(Time to Live)、标记数据包等。

默认链:

mangle 表包含五个默认链:

  • PREROUTING :在数据包进入路由之前处理。
  • INPUT :在数据包到达本地计算机后处理。
  • FORWARD :在数据包经过本地计算机进行转发时处理。
  • OUTPUT :在数据包从本地计算机发出之前处理。
  • POSTROUTING :在数据包离开路由之后处理。

功能:

mangle 表主要用于修改数据包的报头信息,其功能包括但不限于:

  • 修改 TTL(Time to Live):修改数据包的 TTL 值,影响数据包的生存时间。
  • 标记数据包:在数据包中添加特定的标记信息,以便后续处理。

典型用途:

mangle 表通常用于实现特定的网络流量处理,例如:

  • 实现 QoS(Quality of Service):通过修改数据包的 TOS 字段来实现不同优先级的服务质量。
  • 实现特定路由策略:根据数据包的源地址、目标地址等信息修改数据包的标记,从而影响路由决策。
  • 实现数据包标记:在数据包中添加特定标记,以便后续的策略路由、流量分析等操作。

使用注意:

  • mangle 表中的规则对数据包的处理顺序非常重要,需要根据具体的需求进行合理的排序。
  • 修改数据包的报头信息可能会影响网络流量的传输和处理,请谨慎配置规则。
  • 通过理解 mangle 表的功能和用法,可以实现对网络流量的高级处理和控制,从而满足不同网络场景下的需求。

示例

修改数据包的 TTL

iptables -t mangle -A PREROUTING -i eth0 -j TTL --ttl-set 64

标记数据包

iptables -t mangle -A PREROUTING -s <source_IP> -j MARK --set-mark 1
  • 添加标记的目的在于标识特定的数据包,以便后续根据标记值进行特定的处理。这种标记通常用于实现更复杂的网络策略,如:流量控制,路由策略,防火墙策略。
    • 流量控制 :根据标记值对不同类型的流量进行不同的限制,如限速、限制连接数等。
    • 路由策略 :根据标记值将数据包路由到不同的路径,实现策略路由。
    • 防火墙策略 :根据标记值定义特定的防火墙规则,实现更精细的流量控制和访问控制。

raw 表

raw 表是 iptables 中的一个表,它用于配置规则以控制数据包是否跳过连接追踪机制。连接追踪是 Linux 内核中的一个功能,用于跟踪网络连接的状态,并在网络数据包经过网络协议栈时对其进行标记。raw 表可以影响数据包的连接追踪行为。

默认链:

raw 表包含两个默认链:

  • PREROUTING :在数据包进入路由之前处理。
  • OUTPUT :在数据包从本地计算机发出之前处理。

功能:

raw 表主要用于控制数据包是否跳过连接追踪机制,其功能包括:

  • 跳过连接追踪 :可以定义规则,使特定类型的数据包不被连接追踪机制所处理。
  • 影响数据包的连接追踪状态 :可以在数据包经过网络协议栈时设置或清除数据包的连接追踪状态。

典型用途:

raw 表的典型用途包括但不限于:

  • 防火墙规则 :可以定义规则,使某些特定类型的数据包不受防火墙的连接追踪和过滤规则的影响。
  • 特殊网络场景 :在某些特殊的网络场景下,可能需要控制数据包的连接追踪行为,raw 表可以提供这样的控制能力。

使用注意:

  • raw 表的规则通常用于特殊的网络场景,一般情况下并不常用。
  • raw 表的规则需要谨慎配置,以免影响网络连接的正常通信。

示例

跳过连接追踪

iptables -t raw -A PREROUTING -p tcp --dport 80 -j NOTRACK
  • 将 TCP 目标端口为 80 的数据包设置为不进行连接追踪(NOTRACK)。

    有些特定的网络流量可能不需要进行连接追踪,例如某些特定的应用层协议或者数据包已经经过了其他方式的连接追踪,这时候就可以使用 NOTRACK 标记来告诉内核不对这些数据包进行连接追踪。

    • 提高性能 :跳过连接追踪可以减少内核对数据包的处理时间,提高系统性能。特别是对于高负载的网络服务器,减少不必要的连接追踪可以显著降低系统的 CPU 使用率,提高网络吞吐量。
    • 防止连接追踪表溢出 :连接追踪表是有限的资源,如果系统面临大量连接的情况,可能会导致连接追踪表溢出。通过设置某些特定的数据包不进行连接追踪,可以减少连接追踪表的负担,降低连接追踪表溢出的风险,提高系统的稳定性。
    • 特定应用场景 :某些特定的网络应用或协议可能不需要连接追踪,例如一些 P2P 应用或者实时音视频应用。通过设置 NOTRACK 规则,可以避免不必要的连接追踪对这些应用的影响,保证其正常运行。
    • 安全性 :有些网络攻击可能会利用连接追踪机制来进行攻击,通过设置 NOTRACK 规则可以避免这些攻击。例如,一些 DoS(拒绝服务)攻击可能会利用连接追踪表的耗尽来达到攻击的目的,通过跳过连接追踪,可以降低这种攻击的影响。

设置数据包的连接追踪状态

iptables -t raw -A OUTPUT -p tcp --dport 22 -j CT --notrack
  • 将 TCP 目标端口为 22 的数据包设置为不进行连接追踪(NOTRACK)。

INPUT链

在iptables中,INPUT链属于filter表。INPUT链用于处理进入本地计算机的数据包。具体来说,INPUT链中的规则会在数据包到达本地计算机后被调用,而且在数据包被路由或者进入任何其他链之前执行。这意味着INPUT链中的规则可以影响数据包是否被本地计算机接受,以及如何处理这些被接受的数据包。

典型用途

  • 接受或拒绝数据包 :在INPUT链中可以添加规则,根据数据包的源地址、目标地址、协议类型、端口号等条件,决定是否接受或拒绝这些数据包。
  • 防火墙规则 :INPUT链常用于配置防火墙规则,用于保护本地计算机免受未经授权的访问或攻击。
  • 端口转发 :在INPUT链中可以配置端口转发规则,将某个端口上收到的数据包转发到另一个地址或端口。
  • 流量监控 :可以在INPUT链中配置规则,用于监控进入本地计算机的流量情况,例如统计特定类型的数据包的数量、流量分布等信息。
  • 网络服务访问控制 :可以根据特定的网络服务或应用程序,配置INPUT链规则以允许或禁止相应的数据包进入本地计算机。

INPUT链提供了对进入本地计算机的数据包进行处理的机会,可以实现诸如接受或拒绝数据包、配置防火墙规则、端口转发、流量监控、网络服务访问控制等功能。

PREROUTING链

PREROUTING 链属于 raw 表和 nat 表。PREROUTING 链用于在数据包进入路由之前进行处理。

具体来说,PREROUTING 链中的规则会在数据包经过网络协议栈的入口处被调用,而且在数据包进行路由之前执行。这意味着 PREROUTING 链中的规则可以影响数据包进入系统的行为,但它们不会影响数据包是否被路由,也不会影响数据包的目的地。

典型用途

  • 目标地址转换(DNAT) :可以在 PREROUTING 链中添加 DNAT 规则,将数据包的目标地址修改为其他地址,从而实现端口转发、反向代理等功能。
  • 源地址转换(SNAT) :同样地,在 PREROUTING 链中可以添加 SNAT 规则,将数据包的源地址修改为其他地址,通常用于隐藏内部网络的真实 IP 地址。
  • 特定类型的数据包处理 :可以根据数据包的特定属性,如协议类型、端口号等,在 PREROUTING 链中对数据包进行特定的处理,例如标记数据包、跳过连接追踪等。
  • 数据包过滤 :在 PREROUTING 链中可以添加过滤规则,根据特定条件过滤掉不需要的数据包,从而提高网络安全性。
  • 网络流量监测 :可以在 PREROUTING 链中配置规则,用于监测网络流量的情况,例如统计特定类型的数据包的数量、流量分布等信息。

PREROUTING 链提供了在数据包进入路由之前进行处理的机会,可以实现诸如目标地址转换、源地址转换、数据包过滤、网络流量监测等功能。

FORWARD链

FORWARD 链属于 filter 表。FORWARD 链用于处理经过本地计算机进行转发的数据包,具体来说,它处理的是本地计算机作为路由器时转发给其他目的地的数据包。

典型用途

  • 转发规则 :通过在 FORWARD 链中添加规则,可以根据数据包的源地址、目标地址、协议类型、端口号等条件,决定是否转发这些数据包到其他目的地。
  • 防火墙规则 :FORWARD 链常用于配置防火墙规则,用于保护本地计算机免受未经授权的访问或攻击,同时也可以保护其他计算机免受来自本地计算机的攻击。
  • 流量控制 :可以在 FORWARD 链中配置规则,用于控制经过本地计算机转发的流量,例如限制特定类型的流量的带宽或连接数。
  • VPN 配置 :当本地计算机作为 VPN 服务器时,FORWARD 链可以用于配置 VPN 的转发规则,将来自 VPN 客户端的数据包转发到目标服务器。
  • 流量监控 :可以在 FORWARD 链中配置规则,用于监控经过本地计算机转发的流量情况,例如统计特定类型的数据包的数量、流量分布等信息。

FORWARD 链提供了对经过本地计算机进行转发的数据包进行处理的机会,可以实现诸如转发规则、防火墙规则、流量控制、VPN 配置、流量监控等功能。

OUTPUT链

OUTPUT 链属于 filter 表。OUTPUT 链用于处理从本地计算机发出的数据包,具体来说,它处理的是本地计算机产生的数据包,而不是通过本地计算机转发的数据包。

典型用途:

  • 允许或拒绝出站流量 :可以在 OUTPUT 链中添加规则,根据数据包的目的地址、协议类型、端口号等条件,决定是否允许本地计算机发出这些数据包。
  • 防火墙规则 :OUTPUT 链常用于配置防火墙规则,用于保护本地计算机免受未经授权的访问或攻击,以及保护其他计算机免受来自本地计算机的攻击。
  • 应用层代理 :可以在 OUTPUT 链中配置规则,将某个端口上产生的数据包重定向到本地计算机上运行的代理程序,实现应用层代理功能。
  • 网络服务访问控制 :可以根据特定的网络服务或应用程序,配置 OUTPUT 链规则以允许或禁止相应的数据包离开本地计算机。
  • 流量监控 :可以在 OUTPUT 链中配置规则,用于监控从本地计算机发出的流量情况,例如统计特定类型的数据包的数量、流量分布等信息。

OUTPUT 链提供了对从本地计算机发出的数据包进行处理的机会,可以实现诸如允许或拒绝出站流量、配置防火墙规则、应用层代理、网络服务访问控制、流量监控等功能。

POSTROUTING链

POSTROUTING 链属于 nat 表。POSTROUTING 链用于处理从本地计算机发送出去的数据包,具体来说,它处理的是已经被本地计算机发出,并且已经经过路由决策的数据包。

典型用途

  • 源地址转换(SNAT) :最常见的用途之一是配置 SNAT 规则,将数据包的源地址修改为其他地址,通常用于隐藏内部网络的真实 IP 地址,实现多台主机共享公网 IP 地址等。
  • 目标地址转换(DNAT) :在某些情况下,也可以在 POSTROUTING 链中配置 DNAT 规则,将数据包的目标地址修改为其他地址,实现端口转发、反向代理等功能。
  • 源 NAT 和目标 NAT 结合 :有时候,可以在 POSTROUTING 链中结合使用 SNAT 和 DNAT 规则,同时修改数据包的源地址和目标地址,以实现更复杂的网络转换和转发需求。
  • 负载均衡 :通过在 POSTROUTING 链中配置负载均衡规则,可以将数据包从一个接口转发到多个目标地址,实现负载均衡的功能。
  • VPN 配置 :在使用 VPN 时,POSTROUTING 链常用于配置 VPN 的 SNAT 规则,将来自 VPN 客户端的数据包源地址修改为 VPN 服务器的地址,以实现 VPN 流量的转发和隐私保护。

总之,POSTROUTING 链提供了对从本地计算机发送出去的数据包进行处理的机会,可以实现诸如源地址转换、目标地址转换、负载均衡、VPN 配置等功能。

iptables语法

其语法相对灵活,但也比较复杂,此处只做简介。

语法:iptables [选项] 命令 [链] 规则

  • 选项 :用于指定额外的参数,控制命令的行为。
  • 命令 :指定要执行的操作,如添加规则、删除规则、显示规则等。
  • :指定要操作的链,如 INPUT、OUTPUT、FORWARD 等,默认为 filter 表。
  • 规则 :指定要应用的防火墙规则,包括匹配条件和动作。

常用选项

  • -A, --append :添加规则到链的末尾。
  • -D, --delete :删除链中的规则。
  • -I, --insert :插入规则到链的指定位置。
  • -L, --list :列出链中的规则。
  • -F, --flush :清除链中的所有规则。
  • -P, --policy :设置链的默认策略。

常用命令

  • -A, --append :添加规则。
  • -D, --delete :删除规则。
  • -I, --insert :插入规则。
  • -R, --replace :替换规则。
  • -L, --list :列出规则。
  • -F, --flush :清除规则。
  • -Z, --zero :清除规则的计数器。
  • -N, --new-chain :创建新的自定义链。
  • -X, --delete-chain :删除自定义链。

规则格式

规则由匹配条件和动作组成,其基本格式为:

[匹配条件] -j [动作]
  • 匹配条件 :用于匹配数据包的特征,可以是源 IP、目标端口、协议类型等。
  • 动作 :对匹配的数据包执行的操作,如 ACCEPT、DROP、REJECT 等。

示例

添加一条允许来自特定 IP 地址的 SSH 连接的规则

iptables -A INPUT -s <IP_Address> -p tcp --dport 22 -j ACCEPT

删除一条特定的规则

iptables -D INPUT -s <IP_Address> -p tcp --dport 22 -j ACCEPT

列出所有规则

iptables -L

#iptables详解

https://blog.csdn.net/shujuliu818/article/details/125649998

#防火墙知识总结及linux下iptables使用详解

https://www.zengzhiqi.top/archives/fang-huo-qiang-zhi-shi-zong-jie-ji-linux-xia-iptables-shi-yong-xiang-jie

#iptables防火墙详解

https://www.xjx100.cn/news/634828.html?action=onClick