Iptables mangle表和raw表应用场景介绍
1、mangle 表是 iptables 中用于修改数据包的标记的表,它可以在数据包经过路由表之前,根据规则修改数据包的 IP 头部的一些字段,如 TTL 值、TOS 值等。这样可以影响数据包在网络中的转发方式和处理方式。mangle 表包含五个链:PREROUTING、POSTROUTING、INPUT、OUTPUT 和 FORWARD。mangle 表的优先级仅次于 raw 表,它会在 nat 表和 filter 表之前执行。
mangle 表的一个常见应用场景是实现策略路由,即根据不同的数据包选择不同的路由表进行转发。例如,如果我们想要让不同端口的数据包走不同的网关出去,我们可以使用 mangle 表来给数据包打上标记,然后根据标记来指定路由表。具体的步骤如下:
- 首先,我们需要定义两个路由表,比如 10 和 20,并且分别添加默认路由到不同的网关。假设我们有两个网卡 eth1 和 eth2,分别连接到网关 202.106.x.x 和 211.108.x.x,我们可以使用 ip 命令来添加路由表:
ip route add default via 202.106.x.x dev eth1 table 10
ip route add default via 211.108.x.x dev eth2 table 20
- 然后,我们需要使用 mangle 表来给不同端口的数据包打上标记,比如我们想要让 80 和 443 端口的数据包走 eth1 网卡,而 20 和 21 端口的数据包走 eth2 网卡,我们可以使用 iptables 命令来设置 mangle 表:
iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 80:443 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 20:21 -j MARK --set-mark 2
- 最后,我们需要使用 ip 命令来添加规则,让打上标记的数据包按照对应的路由表进行转发:
ip rule add from all fwmark 1 table 10
ip rule add from all fwmark 2 table 20
2、raw 表是 iptables 中用于处理特殊类型的数据包的表,它可以决定是否对数据包进行连接跟踪(connection tracking),即是否记录数据包的状态信息。连接跟踪是一种消耗资源的操作,如果我们想要提高性能或者避免某些问题,我们可以使用 raw 表来让某些数据包跳过连接跟踪。raw 表只包含两个链:PREROUTING 和 OUTPUT。raw 表是 iptables 中优先级最高的表,它会在其他任何表之前执行。
raw 表的一个常见应用场景是处理 ICMP 数据包,即互联网控制消息协议数据包。ICMP 数据包是一种用于网络诊断和管理的数据包,比如 ping 命令就是发送 ICMP echo 请求并接收 ICMP echo 应答来测试网络连通性。如果我们想要禁止某些主机 ping 我们或者被我们 ping,我们可以使用 raw 表来设置规则。具体的步骤如下:
- 首先,我们需要确定要禁止 ping 的主机的 IP 地址,比如 192.168.1.100。
- 然后,我们需要使用 raw 表来设置规则,让该主机发出或者发往的 ICMP 数据包跳过连接跟踪,并且直接丢弃。我们可以使用 iptables 命令来设置 raw 表:
iptables -t raw -A PREROUTING -s 192.168.1.100 -p icmp -j DROP
iptables -t raw -A OUTPUT -d 192.168.1.100 -p icmp -j DROP
下面解释为什么使用 raw 表来禁止 ping 比使用 filter 表更好。
ping 命令是一种用于测试网络连通性的工具,它发送 ICMP 数据包到目标主机,并等待回应。如果目标主机能够正常响应,那么就说明网络是通的。如果目标主机无法响应,那么就说明网络有问题或者被阻止了。
如果我们想要禁止某些主机 ping 我们或者被我们 ping,我们可以使用 iptables 的防火墙功能来设置规则,让 ICMP 数据包被丢弃或者拒绝。iptables 有四个表来管理不同类型的规则,分别是 filter、nat、mangle 和 raw。其中 filter 表是默认的表,用于过滤数据包;nat 表是用于实现网络地址转换;mangle 表是用于修改数据包的标记;raw 表是用于处理特殊类型的数据包。
一般来说,我们可以使用 filter 表来禁止 ping,只需要在 INPUT 链和 OUTPUT 链上添加规则,让 ICMP 数据包被 DROP 或者 REJECT 即可。例如,如果我们想要禁止 192.168.1.100 这个主机 ping 我们或者被我们 ping,我们可以使用以下命令:
iptables -A INPUT -s 192.168.1.100 -p icmp -j DROP
iptables -A OUTPUT -d 192.168.1.100 -p icmp -j DROP
这样做的效果是一样的,但是有一个缺点,就是 filter 表会对数据包进行连接跟踪(connection tracking),即记录数据包的状态信息。连接跟踪是一种消耗资源的操作,它会占用内存和 CPU 的资源,并且可能导致一些问题,如连接表溢出、连接超时等。如果我们不需要对 ICMP 数据包进行连接跟踪,那么使用 filter 表就是一种浪费。
为了避免这种浪费,我们可以使用 raw 表来禁止 ping,只需要在 PREROUTING 链和 OUTPUT 链上添加规则,让 ICMP 数据包跳过连接跟踪,并且直接丢弃即可。例如,如果我们想要禁止 192.168.1.100 这个主机 ping 我们或者被我们 ping,我们可以使用以下命令:
iptables -t raw -A PREROUTING -s 192.168.1.100 -p icmp -j DROP
iptables -t raw -A OUTPUT -d 192.168.1.100 -p icmp -j DROP
这样做的好处是可以节省资源和提高性能,因为 raw 表是 iptables 中优先级最高的表,它会在其他任何表之前执行,并且不会对数据包进行连接跟踪。这样就可以减少不必要的开销和风险。
因此,使用 raw 表来禁止 ping 比使用 filter 表更好,除非我们有特殊的需求需要对 ICMP 数据包进行连接跟踪。