linux流量控制(三)

其它可能性
William Stearns已经利用高级隧道来达到捆绑多重Internet连接的效果.可以在他的隧道网页找到.
本HOWTO将来可能更多地描述这个问题.
/etc/iproute2/rt_tables
# ip rule add fwmark 1 table mail.out
# ip rule ls
0:from all lookup local
32764:
from all fwmark 1 lookup mail.out
32766:
from all lookup main
32767:
from all lookup default
现在我们建立一个通往那条便宜链路的路由,从而生成mail.out路由表:
# /sbin/ip route add default via 195.96.98.253 dev ppp0 table mail.out
这 就做完了.我们可能需要一些例外,有很多方法都能达到目的.我们可以修改netfilter命令来排除一些主机,也可以插入一些优先权值更低的规则把需要 排除的主机的数据包发往main路由表.我们还可以通过识别数据包的TOS位,来给不同服务类型的数据包打上不同的标记,再为它们分别建立规则.你甚至可 以利用这种方法让诸如ISDN线路支持交互业务.
不用说,这当然也可以用于正在进行NAT("伪装")的机器上.重要提醒:我们收到报告说MASQ和SNAT功能与数据包标记有冲突.RustyRussell在这个帖子中作了解释.关闭反方向的过滤就可以正常工作.注意:想给数据包打标记的话,你的内和需要一些配置:
IP: advanced router (CONFIG_IP_ADVANCED_ROUTER) [Y/n/ ]
IP: policy routing (CONFIG_IP_MULTIPLE_TABLES) [Y/n/ ]
IP: use netfilter MARK value as routing key (CONFIG_IP_ROUTE_FWMARK) [Y/n/ ]
参考方便菜谱一章中的15.5.

第12章 对包进行分类的高级过滤器
就象在分类的队列规定一段中解释的,过滤器用与把数据包分类并放入相应的子队列.这些过滤器在分类的队列规定内部被调用.下面就是我们可用的分类器(部分):
fw
根据防火墙如何对这个数据包做标记进行判断.如果你不想学习tc的过
滤器语法,这倒是一个捷径.细节请参见队列那一章.
u32
根据数据包中的各个字段进行判断,如源IP地址等等.
route
根据数据包将被哪条路由进行路由来判断.
rsvp, rsvp6
根据数据包的RSVP情况进行判断.只能用于你自己的网络,互联网并不
遵守RSVP.
tcindex
用于DSMARK队列规定,参见相关章节.
通常来说,总有很多途径可实现对数据包分类,最终取决于你喜欢使用哪种系统.
分类器一般都能接受几个参数,为了方便我们列出来:
protocol
这个分类器所接受的协议.一般来说你只会接受IP数据.必要参数.
parent
这个分类器附带在哪个句柄上.句柄必须是一个已经存在的类.必要参数.
prio
这个分类器的优先权值.优先权值低的优先.
handle
对于不同过滤器,它的意义不同.
后面所有的节都假定你试图对去往HostA的流量进行整形.并且假定根类配置为
1:,并且你希望把选中的数据包送给1:1类.
64

12.1. u32分类器
U32分类器是当前实现中最先进的过滤器.全部基于哈希表实现,所以当有很多
过 滤器的时候仍然能够保持健壮.U32过滤器最简单的形式就是一系列记录,每条记录包含两个部分:一个选择器和一个动作.下面要讲的选择器用来与IP包相匹 配,一旦成功匹配就执行其指定的动作.最简单的动作就是把数据包发送到特定的类队列.用来配置过滤器的tc命令行由三部分组成:过滤器说明,选择器和动 作.一个过滤器可以如下定义:
tc filter add dev IF [ protocol PROTO ]
[ (preference|priority) PRIO ]
[ parent CBQ ]
上 面行中,protocol字段描述了过滤器要匹配的协议.我们将只讨论IP协议的情况.preference字段(也可以用priority代替)设置该 过滤器的优先权.这非常重要,因为你可能有几条拥有不同优先权的过滤器.每个过滤器列表都按照输入的顺序被扫描一遍,然后优先权值低(更高的偏好值)的列 表优先被处理."parent"字段定义了过滤器所属的CBQ的顶部(如1:0).上面描述的选项适用于所有过滤器,而不仅仅适用于U32.

12.1.1. U32选择器
u32选择器包含了能够对当前通过的数据包进行匹配的特征定义.它其实只是定义了IP包头中某些位的匹配而已,但这种看似简单的方法却非常有效.让我们看看这个从实际应用的系统中抄来的例子:
# tc filter add dev eth0 protocol ip parent 1:0 pref 10 u32 /
match u32 00100000 00ff0000 at 0 flowid 1:10
现 在,命令的第一行已经不用解释了,前面都说过了.我们把精力集中在用"match"选项描述选择器的第二行.这个选择器将匹配那些IP头部的第二个字节是 0x10的数据包.你应该猜到了,00ff就是匹配掩码,确切地告诉过滤器应该匹配哪些位.在这个例子中是0xff,所以会精确地匹配这个字节是否等于 0x10.
"at"关键字的意思是指出从数据包的第几个字节开始匹配——本例中是从数据包的开头开始.完全地翻译成人类语言就是:"匹配那些TOS字段带有'最小延迟'属性的数据包".让我们看看另一个例子:
# tc filter add dev eth0 protocol ip parent 1:0 pref 10 u32 /
match u32 00000016 0000ffff at nexthdr+0 flowid 1:10
"nexthdr" 选项意味着封装在IP包中的下一个PDU的头部,也就是说它的上层协议的头.匹配操作就是从这个协议的头部开始的,应该发生在头部开始的第16位处.在 TCP和UDP协议的头部,这个部分存放的是这个报文的目标端口.数字是按照先高厚低的格式存储的,所以0x0016就是十进制的22(如果是TCP
的话就是ssh服务).其实,这个匹配在没有上下文的情况下含义很模糊,我们放在后面讨论.理解了上面的例子之后,下面这条选择器就很好懂了:  match c0a80100 ffffff00 at 16
表示了:匹配从IP头开始数的第17个字节到第19个字节.这个选择器将匹配所有去往192.168.1.0/24的数据包.成功分析完上面这个例子后,我们就已经掌握u32选择器了.

12.1.2. 普通选择器
普通选择器定义了要对数据包进行匹配的特征,掩码和偏移量.使用普通选择器,你实际上可以匹配IP(或者上层协议)头部的任意一个bit,虽然这样的选择器比特殊选择器难读和难写.一般选择器的语法是:
match [ u32 | u16 | u8 ] PATTERN MASK [ at OFFSET | nexthdr+OFFSET]利用u32,u16或u8三个关键字中的一个来指明特征的bit数.然后PATTERN和MASK应该按照它定义的长度紧 挨着写.OFFSET参数是开始进行比较的偏移量(以字节计).如果给出了"nexthdr+"关键字,偏移量就移到上层协议头部开始的位置.一些例子:
# tc filter add dev ppp14 parent 1:0 prio 10 u32 /
match u8 64 0xff at 8 /
flowid 1:4
如果一个数据包的TTL值等于64,就将匹配这个选择器.TTL就位于IP包头的第9个字节.匹配带有ACK位的TCP数据包:
# tc filter add dev ppp14 parent 1:0 prio 10 u32 /
match ip protocol 6 0xff /
match u8 0x10 0xff at nexthdr+13 /
flowid 1:3
用这个匹配小于64字节的ACK包:
## match acks the hard way,
## IP protocol 6,
## IP header length 0x5(32 bit words),
## IP Total length 0x34 (ACK + 12 bytes of TCP options)
## TCP ack set (bit 5, offset 33)
# tc filter add dev ppp14 parent 1:0 protocol ip prio 10 u32 /
match ip protocol 6 0xff /
match
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值