mangle表的主要功能是根据规则修改数据包的一些标志位,以便其他规则或程序可以利用这种标志对数据包进行过滤或策略路由。

使用

=======================

对应的场景, 都是有多个网口, 常见的使用方式就是三步:


  1. 使用ip route add 在对应的网口上创建 table, 这一步同时会设置好默认网关
  2. 使用ip rule 将对应的fwmark绑定到上一步创建的table
  3. 使用iptables -t mangle -A PREROUTING 将满足规则的包, 打上标签

例一

=======================

内网的客户机通过Linux主机连入Internet,而Linux主机有两个网口与Internet连接, 分别有两条线路,它们的网关分别为10.10.1.1和10.10.2.1. 现要求对内网进行策略路由,所有通过TCP协议访问80端口的数据包都从10.10.1.1 线路出去,而所有访问UDP协议53号端口的数据包都从10.10.2.1线路出去。
这是一个策略路由的问题,为了达到目的,在对数据包进行路由前,要先根据数据包的协议和目的端口给数据包做上一种标志,然后再指定相应规则,根据数据包的标志进行策略路由。为了给特定的数据包做上标志,需要使用mangle表,mangle表共有5条链,由于需要在路由选择前做标志,因此应该使用PREROUTING链,下面是具体的命令。

iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 80 -j MARK --set-mark 1  
iptables -t mangle -A PREROUTING -i eth0 -p udp --dprot 53 -j MARK --set-mark 2 

以上命令在mangle表的PREROUTING链中添加规则,为来自eth0接口的数据包做标志,其匹配规则分别是TCP协议、目的端口号是80和UDP协议、目的端口号是53,标志的值分别是1和2。数据包经过PREROUTING链后,将要进入路由选择模块,为了对其进行策略路由,执行以下两条命令,添加相应的规则

ip rule add from all fwmark 1 table 10  
ip rule add from all fwmark 2 table 20 

以上两条命令表示所有标志是1的数据包使用路由表10进行路由,而所有标志是2的数据包使用路由表20进行路由。路由表10和20分别使用了10.10.1.1和10.10.2.1作为默认网关

ip route add default via 10.10.1.1 dev eth1 table 10  
ip route add default via 10.10.2.1 dev eth2 table 20

以上两条命令在路由表10和20上分别指定了10.10.1.1和10.10.2.1作为默认网关, 于是使用路由表10的数据包将通过10.10.1.1线路出去,而使用路由表20的数据包将通过10.10.2.1线路出去

例二

=======================

网关服务器三块网卡

  • eth0 网通ip:10.0.0.1
  • eth1 电信ip:20.0.0.1
  • eth2 网关ip:192.168.10.1

内网要求192.168.10.1---100以内的ip使用10.0.0.1 网关上网, 其他IP使用 20.0.0.1上网

ip route add default gw 20.0.0.1
#eth0 是 10.0.0.1 所在的网卡, 10是路由表的编号
ip route add table 10 via 10.0.0.1 dev eth0
#fwmark 10 是标记, table 10 是路由表10, 标记了10的数据使用table 10路由表
ip rule add fwmark 10 table 10
#使用iptables给相应的数据打上标记, 对于这种IP范围需要用到iprange模块
iptables -A PREROUTING -t mangle -i eth2 -m iprange --src-range 192.168.10.1-192.168.10.100 -j MARK --set-mark 10

例三

=======================

网关服务器三块网卡

  • eth0 网通ip:10.0.0.1
  • eth1 电信ip:20.0.0.1
  • eth2 网关ip:192.168.10.1

内网要求员工访问外面的网站使用 10.0.0.1 网关上网, 其他IP使用 20.0.0.1 上网

iptables -t mangle -A PREROUTING -i eth2 -p tcp --dport 80 -j MARK --set-mark 20
ip route add default gw 20.0.0.1
ip route add table 20 via 10.0.0.1 dev eth0
ip rule add fwmark 20 table 20 

其他

iptables: No chain/target/match by that name

# iptables -t mangle -A PREROUTING -s 192.168.2.0/24 -j
MARK --set-mark 1
iptables: No chain/target/match by that name

==================================================================================================================================================================================================================================================================================

如果出现这个错误, 用下面的方式解决

[root@mpc8315erdb /root]# modprobe xt_MARK

标签: ip, iptables, 数据包, mangle, table

相关文章推荐

添加新评论,含*的栏目为必填