Loading... ![2023-12-11T09:28:12.png][1] # 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表 用来对数据包进行过滤,具体的规则要求决定如何处理一个数据包 `iptables` 的 `filter` 表是用于定义网络数据包过滤规则的主要表。这个表包含了一组规则,用于控制进出网络接口的数据包。以下是使用 `iptables` 对 `filter` 表进行增加、删除、修改和查询操作的一些常见例子,以表格形式展示: | 操作 | 命令示例 | 说明 | |------|----------|------| | **增加规则** | `iptables -A INPUT -p tcp --dport 22 -j ACCEPT` | 在 `INPUT` 链中增加一条规则,允许所有进入的 TCP 数据包,目的端口为 22(SSH)。 | | **删除规则** | `iptables -D INPUT -p tcp --dport 22 -j ACCEPT` | 从 `INPUT` 链中删除上述规则。另一种方法是通过规则编号删除,例如 `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 -L` 或 `iptables -L INPUT` | 显示所有规则或特定链(如 `INPUT`)的规则。`-L` 表示 “list”(列表)。`-v` (详细模式)可以提供更多信息。 | **注意**:在应用这些命令时,请确保你有足够的权限(通常需要 root 权限),并且清楚每个规则的含义,以避免不必要的网络访问问题。特别是在配置防火墙规则时,错误的规则可能导致你无法远程访问服务器。在生产环境中,建议先在测试环境中验证规则的效果。 # NAT表 network address translation 网络地址转换,主要用来修改数据包的 IP 地址、端口号信息 `iptables` 的 `nat` 表是用于网络地址转换(NAT)的配置。这个表主要用于修改源或目的地址的网络数据包。以下是使用 `iptables` 对 `nat` 表进行增加、删除、修改和查询操作的一些常见例子,以表格形式展示: | 操作 | 命令示例 | 说明 | |------|----------|------| | **增加规则** | `iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE` | 在 `nat` 表的 `POSTROUTING` 链中增加一条规则,对从 `eth0` 接口发出的所有数据包进行源地址伪装(MASQUERADE)。这常用于简单的网络地址转换场景。 | | **删除规则** | `iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE` | 从 `nat` 表的 `POSTROUTING` 链中删除上述规则。和 `filter` 表一样,也可以通过规则编号来删除,例如 `iptables -t nat -D POSTROUTING 1`(删除 `POSTROUTING` 链的第一条规则)。 | | **修改规则** | 由于 `iptables` 没有直接的修改命令,通常是通过先删除后增加来实现。例如,先删除某条规则,然后增加一个新规则。 | 例如,先删除一条规则(`iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE`),然后增加一个修改后的新规则(例如更换接口或更改动作)。 | | **查询规则** | `iptables -t nat -L` 或 `iptables -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:80` | 在 `nat` 表的 `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:80` | 从 `nat` 表的 `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表 主要用来修改数据包的服务类型,生存周期,为数据包设置标记,实现流量整形、策略路由等 当然,让我们深入探讨 `iptables` 的 `mangle` 表功能,并结合流量控制(`tc`)以及策略路由的实际应用场景。这次的例子将更加详细和复杂,涵盖了如何使用 `mangle` 表进行高级网络管理。 ### Iptables Mangle 表功能 | 功能 | 命令示例 | 说明 | |------|----------|------| | **修改数据包ToS** | `iptables -t mangle -A PREROUTING -p tcp --dport 443 -j TOS --set-tos 0x10` | 将目标端口为 443 (HTTPS) 的 TCP 数据包的 ToS 字段设置为 0x10(通常表示最小延迟)。 | | **修改数据包TTL** | `iptables -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 内核提供的一个用于控制网络流量传输的工具。结合 `iptables` 的 `mangle` 表,可以实现更精细的流量控制。以下是一个 `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 网络、`iptables`、`tc` 和 `iproute2` 工具有深入的理解,这是成功配置和维护复杂网络策略的关键。 ## 策略路由 场景描述:假设您有两个网络接口: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 中执行的主要工作,以表格形式呈现: | 功能 | 说明 | |------|------| | **状态识别** | 跟踪每个数据包属于的连接状态(如 `NEW`、`ESTABLISHED`、`RELATED`、`INVALID`),基于源/目的地址、端口和协议。 | | **连接管理** | 为每个新建的网络连接创建条目,记录连接的详细信息和状态,并在连接状态发生变化时更新这些信息。 | | **处理网络会话** | 理解和管理复杂的网络会话(如 FTP、SIP),允许多个相关连接或数据流被识别和正确处理。 | | **NAT 支持** | 对实施网络地址转换(NAT)至关重要,通过跟踪连接,实现源和目的地址/端口的动态映射。 | | **防火墙决策支持** | 为 `iptables` 提供连接状态上下文,允许基于连接状态做出智能的包过滤和路由决策。 | | **超时和垃圾收集** | 监控每个连接的活动,如果连接在预定的超时时间内无活动,则将其标记为过期并从跟踪表中清除。 | 通过连接跟踪,Netfilter 能够提供高效和灵活的网络流量监控与管理,这是实现复杂网络策略和安全规则的基础。 [1]: https://www.sddts.cn/usr/uploads/2023/12/2445906671.png 最后修改:2024 年 05 月 11 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏