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

使用策略路由

对应的场景, 都是有多个网口, 常见的使用步骤

1. 创建路由表 Create new routing table

编辑 /etc/iproute2/rt_tables

, 添加

[ID of your Table] [Name of your table]

使用ip rule 对指定的路由表table [Table Name or Table ID]添加路由规则.

使用下面的命令检查

ip route show table [Table Name or Table ID]

为路由表指定默认的路由设备

ip route add default dev "${TUNDEV}" src "${INTERNAL_IP4_ADDRESS}" table "${TABLENAME}"
# 在路由表100上添加一个默认路由(对所有地址), 使用本地网关192.168.1.1, 这是一个可以从eth0到达的地址
ip route add default via 192.168.1.1 dev eth0 table 100
# 对10.1.1.0/30这个目的地址范围添加路由规则, 并添加MPLS标签
ip route add 10.1.1.0/30 encap mpls 200/300 via 10.1.1.1 dev eth0

确定数据包走哪个路由表

默认每个数据报文走的路由表都是main, 你可以给满足一定规则的数据报文指定不同的路由表, 而未满足的还继续使用默认的路由表.

路由规则(ip rule)

这里有所有可能用到的参数列表, 如果还不够, 你可以使用fwmark. 给数据报文打fwmark标签可以通过iptables来处理, 然后通过ip rule来处理. 例如

# 来源于167.99.208.1的用指定table
ip rule add from 167.99.208.1 table [table-name]
# 所有来源都用table ztable1
ip rule add from all table ztable1
# 所有来源中带标签2的都用table 20
ip rule add from all fwmark 2 table 20

2. 使用iptables打标签

使用的格式为 -j MARK --set-mark <Your marknumber in decimal form>. MARK这个target只在mangle中有效.

对于流入的数据报文可以使用-t mangle -A PREROUTING, 对于流出的数据报文可以使用-t mangle -A OUTPUT. 注意: 当数据报文被进程(例如apache)处理过之后, 标签就丢失了. 所以如果打过标签的报文在返回时不正确, 只给流入的报文打标签是不够的, 你必须给产生的流出报文也打上标签.

3. 遇到的问题

报文丢失

很可能是因为被认为"martian"而被丢弃了. 在kernel中被丢弃可能不会留下日志, 可以通过下面的方式开启日志

# 编辑 /etc/sysctl.conf
net.ipv4.conf.default.log_martians = 1
net.ipv4.conf.all.log_martians = 1

如果确认是被作为martian丢弃, 可以进行下面的修改

# 编辑 /etc/sysctl.conf
# Enables source route verification
net.ipv4.conf.default.rp_filter=0
# Enable reverse path
net.ipv4.conf.all.rp_filter=0

关于 fwmark

https://docs.huihoo.com/hpc-cluster/linux-virtual-server/HOWTO/LVS-HOWTO.fwmark.html

Karl Kopper (Apr 2004) said that he thinks the correct term for this is "netfilter mark". A google search finds references to "netfilter mark" back to 2001, and with "fwmark" current at least to 2003. Both terms seem to be in use. The various netfilter HOWTOs don't say anything about new terminology. Horms (who wrote the fwmark code) doesn't know anything about a change in terminology, but thinks it's possible that fwmark is the implementation of netfilter marks.

I asked Harald Welte about this at OLS_2004 and the explanation was as clear as day, except that I didn't write it down and now I've forgotten it (geez, sorry about this). It was a matter of nomenclature rather than logic: it was something like - the entity in the command line is called a mark while the method of marking packets is called fwmark. Whatever it is, you can use either term and people will know what you're talking about.

fwmark实际上就是netfilter mark, 一种打标签的方式或者实现, 没有特殊的含义.

例一

内网的客户机通过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链后,将要进入路由选择模块,为了对其进行策略路由,执行以下两条命令,添加相应的规则

编辑 /etc/iproute2/rt_tables, 添加对应的路由表

`echo -e "${TABLEID}\t${TABLENAME}" >> /etc/iproute2/rt_tables`

添加路由

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

例四

使用dnsmasq, 将一个域名列表中匹配的域名解析得到的IP都放到一个名称为outside的ipset中, 让这个ipset的数据包都走指定的虚拟网卡

添加路由表

echo "200 outside" >> /etc/iproute2/rt_tables

添加ipset

# vi /etc/rc.local
ipset create outside hash:ip

添加iptables规则, 打标签

将匹配 ipset outside的包全部标上 mark 8, 在 /etc/firewall.user 中添加:

# vi /etc/firewall.user
iptables -t mangle -A fwmark -m set --match-set outside dst -j MARK --set-mark 8

指定使用的路由表

# 让 8.8.8.8 走 VPN,防止 DNS 污染
ip route add 8.8.8.8 dev $TUNDEV
ip route add default dev $TUNDEV table outside
ip rule add fwmark 8 table outside

将$TUNDEV替换为 VPN 设备名,比如ppp0, tun0等

配置dnsmasq, 使其解析时动态添加ipset

修改 /etc/dnsmasq.conf,在其中加入需要翻越的域名。 格式如下:

server=/域名/8.8.8.8
ipset=/域名/outside

其他

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

参考

iptables的mangle表的更多相关文章

  1. iptables的四表五链

    iptables只是Linux防火墙的管理工具而已,位于/sbin/iptables.真正实现防火墙功能的是netfilter,它是Linux内核中实现包过滤的内部结构. iptables包含4个表, ...

  2. 四十七.iptables防火墙 filter表控制 扩展匹配 nat表典型应用

    1.iptables基本管理 关闭firewalld,开启iptables服务 查看防火墙规则 追加.插入防火墙规则 删除.清空防火墙规则   1.1 关闭firewalld,启动iptables服务 ...

  3. IPtables 之“四表五链”

    目录 架构图 IP tables 简介 包过滤防火墙 Iptables如何过滤 "四表" "五链" Iptables流程 架构图 公司架构模式(酒店迎宾比喻) ...

  4. iptables四个表五条链

    iptables四个表五条链     其实关于iptables的使用网上的资料和教程也比较多,主要是要理解其中的路由前和路由后每个表和链所处的位置和作用,明白了也就简单了,以下是我转载的觉得写的比较详 ...

  5. iptables的conntrack表满了导致访问网站很慢

    iptables的conntrack表满了导致访问网站很慢 转载自:https://my.oschina.net/jean/blog/189935 检查系统conntrack表是否满 现象:突然发现访 ...

  6. iptables里filter表前面几个数字的意思

    一般的linux系统iptables配置文件filter表前面都带下面三行,但是具体是什么意思呢! *filter:INPUT ACCEPT [0:0]:FORWARD ACCEPT [0:0]:OU ...

  7. Linux对外提供服务 网络操作 端口操作 1.开启服务监听端口 2.设置防火墙,放行访问端口的包 iptables&netfilter 四表五链和通堵策略

    主题: Linux服务器上软件提供服务 1.网络操作 2.端口操作 1.网络操作 本机必须能够ping通目标主机(本地虚拟机或者远程主机) 2.端口操作 1.开启服务监听端口 2.设置防火墙,放行访问 ...

  8. iptables学习02-nat表应用

    nat表应用实验 第一步 准备工作 A机器两块网卡ens33(192.168.2.106).再添加一块自定义网卡ens37(192.168.100.1),添加到LAN内网区段(自定义名字,写什么无所谓 ...

  9. iptables四个表与五个链间的处理关系

    转载自:http://www.linuxidc.com/Linux/2012-08/67505.htm netfilter/iptables IP 信息包过滤系统是一种功能强大的工具,可用于添加.编辑 ...

  10. iptables的4表5链(未完)

    iptables中共4张表:filter,nat,raw,mangle,其中默认表为filter如:iptables -A -p tcp -j ACCEPT 等价于 iptables -t filte ...

随机推荐

  1. makefile文件详解

    1. make 编译:将源代码文件翻译成处理器可执行的二进制文件的过程,这个过程的时间区间称为编译时 构建:指定多个编译过程的先后顺序 make命令是常用的构建工具,诞生于1977年,主要用于C/C+ ...

  2. [转帖]nginx优化配置及方法论

    https://www.jianshu.com/p/87f8c03e91bd 1.优化方法论 从软件层面提升硬件使用效率 增大CPU的利用率 增大内存的利用率 增大磁盘IO的利用率 增大网络带宽的利用 ...

  3. [转帖]oracle 审计日志清理

    https://www.cnblogs.com/bangchen/p/7268086.html   --进入审计日志目录: cd $ORACLE_BASE/admin/$ORACLE_SID/adum ...

  4. 【转帖】【ethtool】ethtool 网卡诊断、调整工具、网卡性能优化| 解决丢包严重

    目录 即看即用 详细信息 软件简介 安装 ethtool的使用 输出详解 其他指令 将 ethtool 设置永久保存 如何使用 ethtool 优化 Linux 虚拟机网卡性能 ethtool 解决网 ...

  5. [转帖]Python基础之数据类型(一)

    https://www.jianshu.com/p/5c43f6056f77 Python基本数据类型 python系列文档都是基于python3 数字 字符串 列表 元组 字典 集合 一.数字 特性 ...

  6. [转帖]“炫技”还是“真硬核”,OpenPPL 实测阿里「倚天 710」芯片

    http://www.voycn.com/article/xuanjihaishizhenyingheopenppl-shicealiyitian-710-xinpian   本文将以深度学习模型推理 ...

  7. vim配置的学习与总结

    摘要 有时候在linux里面操作需要使用粘贴以及其他处理. 很多发行版, 遇到 # 会自动退格, 很难受. 想着能够处理一下vim的默认设置可以好很多. 所以这里简单总结一下. 配置文件 vim的配置 ...

  8. 如何优雅的写 css 代码

    CSS(全称 Cascading Style Sheets,层叠样式表)为开发人员提供声明式的样式语言,是前端必备的技能之一,基于互联网上全面的资料和简单易懂的语法,CSS 非常易于学习,但其知识点广 ...

  9. 【JS 逆向百例】Fiddler 插件 Hook 实战,某创帮登录逆向

    关注微信公众号:K哥爬虫,QQ交流群:808574309,持续分享爬虫进阶.JS/安卓逆向等技术干货! 声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途 ...

  10. Dubbo3应用开发—Dubbo注册中心引言

    Dubbo注册中心引言 什么是Dubbo注册中心 Dubbo的注册中心,是Dubbo服务治理的⼀个重要的概念,他主要用于 RPC服务集群实例的管理. 注册中心的运行流程 使用注册中心的好处 可以有效的 ...