backgroundbackground

iptables详解

iptables / netfilter / network / linux

教程

2024-12-29 07:24

一、iptables 是什么?

iptablesLinux 系统中一个强大的防火墙工具,它实际上是一个命令行实用程序,用于配置 Linux 内核防火墙 netfilter。而 netfilter 是内核中的一个框架,负责网络数据包的过滤、修改和转发。如果把 netfilter 看作是防火墙的“骨架”,而 iptables 则是用来控制这个骨架的“工具”。

简单来说,iptables 允许你定义规则,决定如何处理进出你计算机或网络的网络流量。这些规则可以基于各种标准,例如源 IP 地址、目标 IP 地址、端口号和协议。

二、概念解析

1、iptables 的表和链

iptables 使用表 tables 和链 chains 来组织规则,主要有五个表,每个表都有其特定的用途:

  • filter 表: 这是最常用的表,用于过滤数据包。它决定哪些数据包允许通过,哪些数据包被拒绝或丢弃。 filter 表包含三个内置链:
    • INPUT 链: 处理进入系统的数据包。
    • OUTPUT 链: 处理从系统发出的数据包。
    • FORWARD 链: 处理从一个接口转发到另一个接口的数据包。
  • nat 表: 用于网络地址转换 (Network Address Translation, NAT)。它修改数据包的源或目的 IP 地址和端口号,实现地址掩蔽、端口映射等功能。 nat 表包含三个内置链:
    • PREROUTING 链: 在路由决策之前处理数据包,用于目的 NAT (DNAT)。
    • POSTROUTING 链: 在路由决策之后处理数据包,用于源 NAT (SNAT)。
    • OUTPUT 链: 处理从系统发出的数据包,用于本地出站 NAT。
  • mangle 表: 用于修改数据包的头部信息,例如修改 TTL (Time To Live) 值、TOS (Type of Service) 值等。 这通常用于 QoS (Quality of Service) 控制或其他网络管理任务。 mangle 表包含五个内置链:
    • PREROUTING 链: 在路由决策之前处理数据包。
    • INPUT 链: 处理进入系统的数据包。
    • FORWARD 链: 处理从一个接口转发到另一个接口的数据包。
    • OUTPUT 链: 处理从系统发出的数据包。
    • POSTROUTING 链: 在路由决策之后处理数据包。
  • raw 表: 用于在连接跟踪之前处理数据包。 它主要用于控制哪些数据包需要进行连接跟踪,哪些数据包不需要。 raw 表包含两个内置链:
    • PREROUTING 链: 在路由决策之前处理数据包。
    • OUTPUT 链: 处理从系统发出的数据包。
  • security 表: 这个表与 SELinux 安全模块集成,用于强制执行基于 SELinux 的安全策略。它包含三个内置链,与 filter 表的链名称相同:
    • INPUT 链: 处理进入系统的数据包。
    • OUTPUT 链: 处理从系统发出的数据包。
    • FORWARD 链: 处理从一个接口转发到另一个接口的数据包。 这个表只有在 SELinux 启用时才可用。

2、iptables 的规则

规则是 iptables 的核心。每个规则指定一个匹配条件和一个目标 (target)。

  • 匹配条件:定义规则应用于哪些数据包。例如,你可以指定源 IP 地址、目标端口或协议。
  • 目标 (target):指定匹配规则的数据包应采取的操作。常用的目标有:
  • ACCEPT:允许数据包通过。
  • DROP:丢弃数据包。
  • REJECT:拒绝数据包,并向发送方发送一个错误消息。

3、数据包在 iptables 中的流向

一个网络数据包在进入或离开你的 Linux 系统时,会按照特定的顺序经过不同的表和链。这个顺序非常重要,因为它决定了规则的应用顺序,也决定了不同表之间的规则如何“相互作用”。

以下是数据包在 iptables 中的典型流向:

  • 进入本机 (目标地址为本地主机):
    1. raw 表: 数据包首先进入 raw 表的 PREROUTING 链。 此链主要用于设置连接跟踪标记,决定是否对该数据包进行连接跟踪。 如果设置了 NOTRACK 标记,则跳过连接跟踪。
    2. mangle 表: 接下来,数据包进入 mangle 表的 PREROUTING 链。 此链用于修改数据包的头部信息,例如 QoS (Quality of Service) 标记、TTL (Time To Live) 值等。
    3. nat 表: 然后,数据包进入 nat 表的 PREROUTING 链。 此链用于进行源 NAT (SNAT) 或目的 NAT (DNAT)。 SNAT 用于修改数据包的源 IP 地址,通常用于隐藏内部网络的 IP 地址;DNAT 用于修改数据包的目的 IP 地址,通常用于将外部请求转发到内部服务器。
    4. filter 表: 数据包进入 filter 表的 INPUT 链。 此链用于根据各种条件过滤入站数据包,决定是否允许数据包进入系统。
    5. security 表 (如果启用): 如果启用了 SELinux,数据包将进入 security 表。 此表用于基于 SELinux 安全策略进行访问控制。
  • 从本机发出 (源地址为本地主机):
    1. raw 表: 数据包进入 raw 表的 OUTPUT 链。 与入站数据包类似,此链用于设置连接跟踪标记。
    2. mangle 表: 数据包进入 mangle 表的 OUTPUT 链,用于修改数据包头部信息。
    3. nat 表: 数据包进入 nat 表的 POSTROUTING 链。 此链用于进行源 NAT (SNAT),将内部 IP 地址转换为外部 IP 地址。
    4. filter 表: 数据包进入 filter 表的 OUTPUT 链,用于过滤出站数据包。
    5. security 表 (如果启用): 如果启用了 SELinux,数据包将进入 security 表。
  • 通过本机转发 (FORWARD 链):
    1. raw 表: 数据包进入 raw 表的 FORWARD 链。
    2. mangle 表: 数据包进入 mangle 表的 FORWARD 链。
    3. nat 表: 数据包进入 nat 表的 PREROUTING 链 (用于目的 NAT) 和 POSTROUTING 链 (用于源 NAT)。
    4. filter 表: 数据包进入 filter 表的 FORWARD 链。
    5. security 表 (如果启用): 如果启用了 SELinux,数据包将进入 security 表。

三、使用方法

可以用 -t 选项指定表名,如果不指定默认为 filter

1、基本操作命令

  • iptables -L -v --line-number:列出 filter 表的规则,-v 参数显示更详细的信息,例如数据包计数器和字节计数器, --line-number 显示行号,方便其他命令指定规则。
  • iptables -F:清空指定表的所有规则。例如,iptables -F filter 清空 filter 表的所有规则。不指定表名则清空所有表的规则。
  • iptables -X:删除用户自定义的链。
  • iptables -Z:将所有链的计数器清零。
  • iptables -P <链名> <策略>:设置指定链的默认策略。策略可以是 ACCEPT(接受)、DROP(丢弃)或 REJECT(拒绝并发送错误信息)。例如,iptables -P INPUT DROP 将 INPUT 链的默认策略设置为丢弃所有进入的数据包。
  • iptables -E <旧链名> <新链名>:重命名用户自定义的链。

2、规则管理命令

  • iptables -A <链名> <规则>:在指定链的末尾添加一条规则。
  • iptables -I <链名> [规则编号] <规则>:在指定链的开头或指定编号处插入一条规则。例如,iptables -I INPUT 2 <规则> 将规则插入到 INPUT 链的第二条。
  • iptables -D <链名> <规则编号>iptables -D <链名> <规则>:删除指定链中的一条规则。可以通过规则编号或完整规则来删除。
  • iptables -R <链名> <规则编号> <新规则>:替换指定链中指定编号的规则。

3、规则匹配选项

以下是一些常用的规则匹配选项:

  • -p <协议>:指定协议,例如 tcpudpicmp
  • -s <源地址>:指定源 IP 地址或网络地址。例如,192.168.1.100192.168.1.0/24。可以使用 ! 取反,例如 ! 192.168.1.0/24 表示除了 192.168.1.0/24 网络之外的所有地址。
  • -d <目标地址>:指定目标 IP 地址或网络地址,用法同 -s
  • --sport <源端口>:指定源端口号或端口范围。例如,221024:65535
  • --dport <目标端口>:指定目标端口号或端口范围,用法同 --sport
  • -i <网络接口>:指定数据包进入的网络接口。例如,eth0
  • -o <网络接口>:指定数据包发出的网络接口。例如,eth0
  • -m <模块名>:加载额外的匹配模块,例如 stateconntrackmultiport 等。

4、目标(Target)选项

以下是一些常用的目标选项:

  • -j ACCEPT:接受数据包。
  • -j DROP:丢弃数据包。
  • -j REJECT:拒绝数据包,并向发送方发送一个错误信息。可以使用 --reject-with <类型> 指定拒绝类型,例如 icmp-port-unreachable
  • -j LOG:记录数据包信息到日志。可以使用 --log-prefix <前缀> 指定日志前缀。
  • -j MASQUERADE:用于 NAT,将私有网络地址伪装成公网 IP 地址。
  • -j SNAT --to-source <IP地址>:源地址转换。
  • -j DNAT --to-destination <IP地址>:目标地址转换。

5、常用组合示例

  • 允许 SSH 流量: iptables -A INPUT -p tcp --dport 22 -j ACCEPT
  • 阻止来自特定 IP 的流量: iptables -A INPUT -s 192.168.1.100 -j DROP
  • 允许来自本地网络的流量: iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
  • 允许 ping: iptables -A INPUT -p icmp -j ACCEPT
  • 记录被丢弃的数据包: iptables -A INPUT -j LOG --log-prefix "Dropped packets: "
  • 将80端口转发到目标地址的8080 iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:8080
  • 将80端口重定向到本地的8080(端口映射) iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

6、保存和恢复规则

  • iptables-save:保存当前规则到文件。通常保存到 /etc/sysconfig/iptables(CentOS/RHEL)或 /etc/iptables/rules.v4(Debian/Ubuntu)。
  • iptables-restore <文件名>:从文件恢复规则。

7、重要提示:

  • 规则的顺序非常重要,iptables 会按顺序检查规则。
  • 在修改 iptables 规则之前,最好先备份当前的规则。
  • 测试新的规则时要小心,以免意外阻止了重要的网络连接。
  • iptables 命令是即时生效的,但重启后会失效。需要使用 iptables-saveiptables-restore 命令来持久化规则。

五、外部链接