2023-12-11T09:28:12.png

iptables与netfilter的关系

iptables和netfilter是Linux内核在处理和管理网络流程中两个重要组件,他们之间的关系可以理解成工具(iptables)和底层框架(netfilter)的关系:

  • netfilter:
    (1) 底层框架:Netfilter是Linux内核的一部分,负责处理和过滤网络流量。
    (2) 处理点:Netfilter在内核网络栈中的多个点处理进出的数据包,这些点包括数据包进入网络栈、路由决策之前和之后、以及离开网络栈等。
    (3) 功能:它提供了一系列的钩子(hooks),这些钩子允许内核模块在网络栈的不同点执行待定的功能,如包过滤、地址转换(NAT)、数据包修改等。
  • iptables:
    (1)用户空间工具:iptables是一个用户空间工具,用于配置Linux内核防火墙功能。
    (2)接口:iptables提供了一个命令行接口,允许管理员定义规则,这些规则决定如何处理和转发网络流量。
    (3)作用于Netfilter:iptables的规则实际上是被传递给并由Netfilter框架处理的。它利用Netfilter提供的钩子来实施规则和策略。
  • 关系概述
    (1)iptables依赖于Netfilter:iptables依赖于netfilter的功能来实施其规则。没有netfilter,iptables就无法工作。
    (2)netfilter是基础,iptables是接口:可以将netfilter看作是车辆的引擎(核心功能),而iptables则是驾驶室(用户与引擎交互的接口)。
  • 其他工具和进化:
    近年来,为了提供更先进的功能和更好的性能,Linux 引入了 nftables,作为 iptables 的继任者。nftables 同样利用了 netfilter 框架,但提供了一个更简洁和统一的方式来处理网络流量规则。

Filter表

用来对数据包进行过滤,具体的规则要求决定如何处理一个数据包

iptablesfilter 表是用于定义网络数据包过滤规则的主要表。这个表包含了一组规则,用于控制进出网络接口的数据包。以下是使用 iptablesfilter 表进行增加、删除、修改和查询操作的一些常见例子,以表格形式展示:

操作命令示例说明
增加规则iptables -A INPUT -p tcp --dport 22 -j ACCEPTINPUT 链中增加一条规则,允许所有进入的 TCP 数据包,目的端口为 22(SSH)。
删除规则iptables -D INPUT -p tcp --dport 22 -j ACCEPTINPUT 链中删除上述规则。另一种方法是通过规则编号删除,例如 iptables -D INPUT 1(删除 INPUT 链的第一条规则)。
修改规则由于 iptables 没有直接的修改命令,通常是通过先删除后增加来实现。例如,先删除某条规则,然后增加一个新规则。例如,先删除一条规则(iptables -D INPUT -p tcp --dport 22 -j ACCEPT),然后增加一个修改后的新规则(iptables -A INPUT -p tcp --dport 22 -j DROP)。
查询规则iptables -Liptables -L INPUT显示所有规则或特定链(如 INPUT)的规则。-L 表示 “list”(列表)。-v (详细模式)可以提供更多信息。

注意:在应用这些命令时,请确保你有足够的权限(通常需要 root 权限),并且清楚每个规则的含义,以避免不必要的网络访问问题。特别是在配置防火墙规则时,错误的规则可能导致你无法远程访问服务器。在生产环境中,建议先在测试环境中验证规则的效果。

NAT表

network address translation 网络地址转换,主要用来修改数据包的 IP 地址、端口号信息

iptablesnat 表是用于网络地址转换(NAT)的配置。这个表主要用于修改源或目的地址的网络数据包。以下是使用 iptablesnat 表进行增加、删除、修改和查询操作的一些常见例子,以表格形式展示:

操作命令示例说明
增加规则iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADEnat 表的 POSTROUTING 链中增加一条规则,对从 eth0 接口发出的所有数据包进行源地址伪装(MASQUERADE)。这常用于简单的网络地址转换场景。
删除规则iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADEnat 表的 POSTROUTING 链中删除上述规则。和 filter 表一样,也可以通过规则编号来删除,例如 iptables -t nat -D POSTROUTING 1(删除 POSTROUTING 链的第一条规则)。
修改规则由于 iptables 没有直接的修改命令,通常是通过先删除后增加来实现。例如,先删除某条规则,然后增加一个新规则。例如,先删除一条规则(iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE),然后增加一个修改后的新规则(例如更换接口或更改动作)。
查询规则iptables -t nat -Liptables -t nat -L POSTROUTING显示 nat 表的所有规则或特定链(如 POSTROUTING)的规则。-L 表示 “list”(列表)。-v (详细模式)可以提供更多信息。

注意:配置 NAT 规则时需要特别小心,因为错误的配置可能导致网络连接问题。在生产环境中操作前,建议充分测试每一条规则,并确保对 NAT 的原理和影响有充分的理解。此外,配置 NAT 规则通常需要 root 权限。

当然,这里有一个更高级的例子,展示了如何使用 iptables 进行 NAT(网络地址转换)的增加、删除、修改和查询操作,包括一些更复杂的命令和概念。

操作命令示例说明
增加规则iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80nat 表的 PREROUTING 链中增加一条规则,将所有目标端口为 80(HTTP)的 TCP 数据包的目的地址转换为内网地址 192.168.1.10 上的 80 端口。这常用于将外网流量重定向到内网服务器。
删除规则iptables -t nat -D PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80nat 表的 PREROUTING 链中删除上述规则。可以通过规则编号删除,例如 iptables -t nat -D PREROUTING 1(删除 PREROUTING 链的第一条规则)。
修改规则由于 iptables 没有直接的修改命令,通常是通过先删除后增加来实现。例如,先删除某条规则,然后增加一个新规则。例如,先删除一条规则(iptables -t nat -D PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80),然后增加一个修改后的新规则,比如更改目的地址或端口。
查询规则iptables -t nat -L PREROUTING -v -n显示 nat 表的 PREROUTING 铑的规则,-v(详细模式)提供更多信息,-n 避免进行 DNS 查找,加快命令执行速度。

高级注意事项

  • 端口转发DNAT 规则常用于端口转发,特别是在将外部请求重定向到内部网络的特定服务器时。
  • 地址伪装MASQUERADE 规则常用于动态 IP 地址,如拨号上网或移动网络。
  • 规则顺序iptables 规则按照添加的顺序执行,因此规则的顺序非常重要。
  • 安全性:改变网络流量的路径可能带来安全风险。确保理解每条规则的安全影响,并在必要时更新防火墙策略。

在处理更复杂的 iptables 配置时,了解网络基础和 TCP/IP 协议是非常重要的。此外,始终在生产环境之外测试规则,以确保它们按预期工作,且不会导致意外的网络问题。

Mangle表

主要用来修改数据包的服务类型,生存周期,为数据包设置标记,实现流量整形、策略路由等

当然,让我们深入探讨 iptablesmangle 表功能,并结合流量控制(tc)以及策略路由的实际应用场景。这次的例子将更加详细和复杂,涵盖了如何使用 mangle 表进行高级网络管理。

Iptables Mangle 表功能

功能命令示例说明
修改数据包ToSiptables -t mangle -A PREROUTING -p tcp --dport 443 -j TOS --set-tos 0x10将目标端口为 443 (HTTPS) 的 TCP 数据包的 ToS 字段设置为 0x10(通常表示最小延迟)。
修改数据包TTLiptables -t mangle -A OUTPUT -o eth0 -j TTL --ttl-set 65将从 eth0 接口发送的所有出站数据包的 TTL 值设置为 65。
标记数据包iptables -t mangle -A FORWARD -p tcp -j MARK --set-mark 0x1为经过 FORWARD 链的 TCP 数据包设置标记 0x1。
流量整形(配合tc)iptables -t mangle -A POSTROUTING -o eth0 -p tcp --sport 22 -j CLASSIFY --set-class 1:11为从端口 22 (SSH) 发出的 TCP 数据包设置流量类别 1:11,这个类别可以被 tc 用来进行特定的流量整形。
策略路由iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 80 -j MARK --set-mark 0x2为从 eth0 接口进入且目的端口为 80 (HTTP) 的 TCP 数据包设置标记 0x2,用于策略路由。

流量整形(使用 tc

tc(Traffic Control)是 Linux 内核提供的一个用于控制网络流量传输的工具。结合 iptablesmangle 表,可以实现更精细的流量控制。以下是一个 tc 流量整形的例子:

功能命令示例说明
创建流量控制队列(qdisc)tc qdisc add dev eth0 root handle 1: htb这创建了一个层级令牌桶(HTB)队列,用于 eth0 接口。
添加类别tc class add dev eth0 parent 1: classid 1:11 htb rate 1mbit ceil 2mbit这为之前通过 iptables 设置的类别 1:11 定义了带宽限制。
应用过滤规则tc filter add dev eth0 parent 1: protocol ip prio 1 handle 11 fw flowid 1:11这使得所有被 iptables 标记为类别 1:11 的数据包都遵循这一带宽限制。

策略路由

策略路由允许基于不同的标准(如源地址、目的地址、特定的标记)决定数据包的路由路径。以下是结合 iptables 标记和 iproute2 的策略路由配置示例:

功能命令示例说明
添加路由表echo "201 custom-route" >> /etc/iproute2/rt_tables这在 rt_tables 文件中添加了一个自定义路由表 custom-route
配置路由规则ip rule add fwmark 0x2 table custom-route ip route add default via 192.168.1.1 dev eth1 table custom-route这配置了一个规则,将所有被 iptables 标记为 0x2 的数据包重定向到 custom-route 表,该表指定了一个不同的默认网关(在这个例子中是 192.168.1.1 通过 eth1 接口)。

综合注意事项

  • 这些示例都具有一定的复杂性,并且可能需要根据你的特定网络环境进行调整。
  • 在生产环境中部署之前,务必在测试环境中充分测试这些配置。
  • 确保你对 Linux 网络、iptablestciproute2 工具有深入的理解,这是成功配置和维护复杂网络策略的关键。

策略路由

场景描述:假设您有两个网络接口:eth0(默认接口,IP为192.168.1.10)和eth1(IP为192.168.2.10)。您想要所有目标为特定IP(比如 8.8.8.8)的流量通过eth1接口发送,而不是默认的eth0接口。

  1. 创建自定义路由表:首先,您需要在 /etc/iproute2/rt_tables 中定义一个新的路由表。例如,您可以添加一行100 custom_table。

    echo "100 custom_table" >> /etc/iproute2/rt_tables
  2. 配置iptables规则来标记数据包:接着,使用iptables在mangle表上设置规则,为目的地为8.8.8.8的数据包设置标记。

    iptables -t mangle -A OUTPUT -d 8.8.8.8 -j MARK --set-mark 1

    这条规则会将所有目标地址为8.8.8.8的出站数据包标记为1。

  3. 添加路由规则:现在,您需要为这些标记的数据包添加特殊的路由规则。首先,为新表添加默认路由,通过eth1接口。

    ip route add default via [eth1-gateway-ip] dev eth1 table custom_table
  4. 添加策略路由规则
    最后,根据标记的值,将数据包导向新的路由表。

    ip rule add fwmark 1 lookup custom_table

    这条命令将所有标记为1的数据包重定向到custom_table路由表。

  5. 验证
    为了验证您的配置是否生效,您可以使用 ip rule show 和 ip route show table custom_table 查看规则和路由表。

Raw表

主要用于决定数据包是否应该被状态跟踪机制处理。这个表在 iptables 的处理链中非常靠前,允许你对特定的数据包设置 NOTRACK 状态,这意味着这些数据包将不会被连接跟踪系统处理。这通常用于提高性能或实现更细粒度的控制。

功能命令示例说明
禁用连接跟踪iptables -t raw -A PREROUTING -p tcp --dport 80 -j NOTRACK对所有目标端口为 80 的 TCP 数据包禁用连接跟踪。这可以用于高流量的 Web 服务器,以减少资源消耗。
启用连接跟踪iptables -t raw -A OUTPUT -p tcp --dport 25 -j CT --notrack对所有从本机发出的目标端口为 25(SMTP)的 TCP 数据包启用特定的连接跟踪设置。
禁用特定来源的连接跟踪iptables -t raw -A PREROUTING -s 192.168.1.100 -j NOTRACK对所有从 IP 地址 192.168.1.100 发来的数据包禁用连接跟踪。
设置针对特定协议的跟踪iptables -t raw -A OUTPUT -p icmp -j CT --helper icmp对所有 ICMP 数据包应用特定的连接跟踪设置。

注意事项

  • 使用 raw 表时要小心,因为禁用连接跟踪可能会影响防火墙的其他部分,特别是那些依赖于连接状态的规则。
  • 在大多数情况下,只有当你需要优化性能或处理特殊的网络流量时,才应该使用 raw 表。
  • 在生产环境中应用这些规则之前,建议在一个受控的环境中进行充分的测试。
  • 确保对 iptables 和其在 Linux 网络栈中的作用有深入理解。在不正确使用时,raw 表的规则可能导致安全问题或网络连接问题。

连接跟踪

连接跟踪(Connection Tracking)是 Netfilter 框架的一个核心功能,用于跟踪和维护网络数据包在系统中的状态和历史。这个功能在 Linux 防火墙的处理和决策中起着至关重要的作用。具体来说,连接跟踪主要执行以下几项工作:

当然,下面是连接跟踪(Connection Tracking)在 Netfilter 中执行的主要工作,以表格形式呈现:

功能说明
状态识别跟踪每个数据包属于的连接状态(如 NEWESTABLISHEDRELATEDINVALID),基于源/目的地址、端口和协议。
连接管理为每个新建的网络连接创建条目,记录连接的详细信息和状态,并在连接状态发生变化时更新这些信息。
处理网络会话理解和管理复杂的网络会话(如 FTP、SIP),允许多个相关连接或数据流被识别和正确处理。
NAT 支持对实施网络地址转换(NAT)至关重要,通过跟踪连接,实现源和目的地址/端口的动态映射。
防火墙决策支持iptables 提供连接状态上下文,允许基于连接状态做出智能的包过滤和路由决策。
超时和垃圾收集监控每个连接的活动,如果连接在预定的超时时间内无活动,则将其标记为过期并从跟踪表中清除。

通过连接跟踪,Netfilter 能够提供高效和灵活的网络流量监控与管理,这是实现复杂网络策略和安全规则的基础。

最后修改:2024 年 05 月 11 日
如果觉得我的文章对你有用,请随意赞赏