免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 13834 | 回复: 38
打印 上一主题 下一主题

[网络管理] linux网桥做流量控制时使用iptables的MARK问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-27 17:42 |只看该作者 |倒序浏览
linux网桥做流量控制时使用iptables的MARK问题


环境:
     MagicLinux2.0 内核: 2.6.15.3
        iptables版本:iptables v1.3.7
        网桥:bridge-utils-1.2
        route -V : route 1.98
        给内核打了layer7补丁

eth1:外网  eth2:内网

配置网桥:

brctl addbr br0
brctl addif br0 eth1
brctl addif br0 eth2
ifconfig eth1 0.0.0.0
ifconfig eth2 0.0.0.0
ifconfig br0 0.0.0.0

去外网的队列:


tc qdisc add dev eth1 root handle 1: htb default 20

tc class add dev eth1 parent 1: classid 1:1 htb rate 100mbit burst 1k

tc class add dev eth1 parent 1:1 classid 1:10 htb rate 100kbit  burst 1k

tc class add dev eth1 parent 1:1 classid 1:20 htb rate 100mbit burst 1k

tc qdisc add dev eth1 parent 1:10 handle 10: sfq perturb 10
tc qdisc add dev eth1 parent 1:20 handle 20: sfq perturb 10
tc filter add dev eth1 protocol ip parent 1:0 prio 8 handle 11 fw flowid 1:10

进内网的队列:

tc qdisc add dev eth2 root handle 1: htb default 40

tc class add dev eth2 parent 1: classid 1:1 htb rate 100mbit burst 100m

tc class add dev eth2 parent 1:1 classid 1:30 htb rate 100kbit  burst 1k

tc class add dev eth2 parent 1:1 classid 1:40 htb rate 100mbit burst 1k

tc qdisc add dev eth2 parent 1:30 handle 30: sfq perturb 10
tc qdisc add dev eth2 parent 1:40 handle 40: sfq perturb 10
tc filter add dev eth2 protocol ip parent 1:0 prio 8 handle 22 fw flowid 1:30

iptables配置:

iptables -t mangle -F
iptables -t mangle -A PREROUTING -i eth2 -s 90.0.11.66/32 -j MARK --set-mark 11
iptables -t mangle -A PREROUTING -i eth2 -s 90.0.11.66/32 -j RETURN

iptables -t mangle -A PREROUTING -i eth1 -d 90.0.11.66/32 -j MARK --set-mark 22
iptables -t mangle -A PREROUTING -i eth1 -d 90.0.11.66/32 -j RETURN

(对90.0.11.66这个地址限速100kbit,在这里是测试效果的,本意是用layer7来做p2p流量控制的。)

经测试发现速度没有改变,为了查找问题,我用u32试了试效果:


tc qdisc add dev eth1 root handle 1: htb default 20

tc class add dev eth1 parent 1: classid 1:1 htb rate 100mbit burst 1k

tc class add dev eth1 parent 1:1 classid 1:10 htb rate 100kbit  burst 1k

tc class add dev eth1 parent 1:1 classid 1:20 htb rate 100mbit burst 1k

tc qdisc add dev eth1 parent 1:10 handle 10: sfq perturb 10
tc qdisc add dev eth1 parent 1:20 handle 20: sfq perturb 10
tc filter add dev eth1 protocol ip parent 1:0 prio 8 u32 match ip src 90.0.11.66/32 flowid 1:10



tc qdisc add dev eth2 root handle 1: htb default 40

tc class add dev eth2 parent 1: classid 1:1 htb rate 100mbit burst 100m

tc class add dev eth2 parent 1:1 classid 1:30 htb rate 100kbit  burst 1k

tc class add dev eth2 parent 1:1 classid 1:40 htb rate 100mbit burst 99m

tc qdisc add dev eth2 parent 1:30 handle 30: sfq perturb 10
tc qdisc add dev eth2 parent 1:40 handle 40: sfq perturb 10

tc filter add dev eth2 protocol ip parent 1:0 prio 8 u32 match ip dst 90.0.11.66/32 flowid 1:30

(以上使用的是网桥,内外网用的全部是90.0.11.0网络地址,掩码255.255.255.0)

测试发现效果很好。后来我怀疑是网桥的问题,我把网桥去掉,做了nat,内部是192.168.1.0网络,外部是90.0.11.0网络。经测试还是老样子,用u32可以,用iptables 的mark 就是不行,百思不得其解。

后来改用cbq队列试了试,还是不行。

tc qdisc add dev eth1 root handle 1: cbq  bandwidth 100mbit avpkt 1000 cell 8

tc class add dev eth1 parent 1: classid 1:1 cbq bandwidth 100mbit rate 100mbit maxburst 20 allot 1514 avpkt 1000 cell 8 weight 1mbit

tc class add dev eth1 parent 1: classid 1:10 cbq bandwidth 100mbit rate 100kbit  maxburst 20 allot 1514 avpkt 1000 cell 8 weight 1mbit

tc class add dev eth1 parent 1: classid 1:20 cbq bandwidth 100mbit rate 100mbit  maxburst 20 allot 1514 avpkt 1000 cell 8 weight 1mbit


tc filter add dev eth1 protocol ip parent 1:0 prio 8 handle 11 fw flowid 1:10
tc filter add dev eth1 protocol ip parent 1:0 prio 4 handle 22 fw flowid 1:10

iptables -t mangle -F
iptables -t mangle -A PREROUTING -i eth2 -s 192.168.1.6/32 -j MARK --set-mark 11
iptables -t mangle -A PREROUTING -i eth2 -s 192.168.1.6/32 -j RETURN
iptables -t mangle -A PREROUTING -i eth2 -j MARK --set-mark 22


tc qdisc add dev eth2 root handle 1: cbq  bandwidth 100mbit avpkt 1000 cell 8

tc class add dev eth2 parent 1: classid 1:1 cbq bandwidth 100mbit rate 100mbit maxburst 20 allot 1514 avpkt 1000 cell 8 weight 1mbit

tc class add dev eth2 parent 1:1 classid 1:30 cbq bandwidth 100mbit rate 100kbit  maxburst 20 allot 1514 avpkt 1000 cell 8 weight 1mbit

tc class add dev eth2 parent 1:1 classid 1:40 cbq bandwidth 100mbit rate 100mbit  maxburst 20 allot 1514 avpkt 1000 cell 8 weight 1mbit


tc filter add dev eth2 protocol ip parent 1:0 prio 8 handle 33 fw flowid 1:30
tc filter add dev eth2 protocol ip parent 1:0 prio 4 handle 44 fw flowid 1:40

iptables -t mangle -A PREROUTING -i eth1 -d 192.168.1.6/32 -j MARK --set-mark 33
iptables -t mangle -A PREROUTING -i eth1 -d 192.168.1.6/32 -j RETURN
iptables -t mangle -A PREROUTING -i eth1 -j MARK --set-mark 44

如此看来,问题应该是出在mark上了。我加载的模块:lsmod|grep ip
ipt_layer7             10668  0
ipt_MARK                1536  4
ipt_MASQUERADE          2048  1
iptable_nat             5764  1
ipt_ipp2p               6784  0
ip_nat_ftp              2176  0
ip_nat                 12460  3 ipt_MASQUERADE,iptable_nat,ip_nat_ftp
ip_conntrack_ftp        5616  1 ip_nat_ftp
ip_conntrack           34508  5 ipt_MASQUERADE,iptable_nat,ip_nat_ftp,ip_nat,ip_conntrack_ftp
nfnetlink               3864  2 ip_nat,ip_conntrack
iptable_filter          1664  0
iptable_mangle          1792  1
ip_tables              16000  7 ipt_layer7,ipt_MARK,ipt_MASQUERADE,iptable_nat,ipt_ipp2p,iptable_filter,iptable_mangle

不知道是缺少补丁还是iptables的问题。MagicLinux2.0自带的iptables版本是1.3.6,我自己编译的1.3.7。

简易拓扑如下:

使用网桥时:内部(90.0.11.66)------------------(eth2)网桥(br0)(eth1)---------------------外部(90.0.11.0/24)
使用网关NAT:内部(192.168.1.6)---------(eth2:192.168.1.3)网关(nat)(eth1:90.0.11.77)----------------外部(90.0.11.0/24)

192.168.1.6和90.0.11.66是同一台pc,想对这台pc限速。
兄弟姐妹们,你们有何高见??

[ 本帖最后由 dreamever 于 2007-6-28 09:16 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-06-27 20:21 |只看该作者
总感觉楼主的mark打的很别扭。
你去外网打的标:
iptables -t mangle -F
iptables -t mangle -A PREROUTING -i eth2 -s 90.0.11.66/32 -j MARK --set-mark 11
iptables -t mangle -A PREROUTING -i eth2 -s 90.0.11.66/32 -j RETURN

这里你是在PREROUTING打的标,但你匹配的源地址是90.0.11.66,从eth2进。
mangle表的PREROUTING是包经过的第一条链,而你在NAT表POSTROUTING做SNAT出去,这是包经过的最后一条链。
既然你SNAT都还没进行呢,就打上标了,源地址哪来的90.0.11.66可以匹配呢?

以上是个人看法,如果不对,还请各位纠正。

论坛徽章:
0
3 [报告]
发表于 2007-06-27 21:03 |只看该作者
根据 Kernel Packet Traveling Diagram 所显示的流程来看,无论在 PREROUTING 链还是 POSTROUTING 链打标,都不会影响 tc 根据 MARK 作处理
数据包无论经过 PREROUTING 还是经过 POSTROUTING,都有自己的源地址与目的地址,只不过一个在路由前,一个在路由后
因此,楼主的打标动作并没有什么问题

论坛徽章:
0
4 [报告]
发表于 2007-06-27 21:16 |只看该作者
是这样的呀?倒!
有源地址目的地址没错,但没做SNAT之前,这个包的源地址应该是个内网IP才对啊,楼主匹配的是外网口的公网地址。
老大的意思是tc判断做MARK的包不是按正常流程走的?

论坛徽章:
0
5 [报告]
发表于 2007-06-27 21:44 |只看该作者
没做 SNAT 或者 MASQUERADE 与是否匹配目的地址为公网地址没有任何关系
在没做 NAT 之前,PREROUTING 匹配到的数据包只不过没有经过路由而已,它仍然可以被 MARK 的
这个 PREROUTING 用法可以引申为
iptables -t nat -A PREROUTING -d www.chinaunix.net -j DNAT --to www.163.com
就是目的地址转向,把去往 CU 的包打到 163 去,前面匹配是一样的,只不过后面的 MARK 动作改为了转向而已

>> 老大的意思是tc判断做MARK的包不是按正常流程走的?
这句话我没有理解,能否再详细说一下你的意思?

论坛徽章:
0
6 [报告]
发表于 2007-06-27 22:18 |只看该作者
对不起,我不是那个意思,说错话了,请原谅

论坛徽章:
0
7 [报告]
发表于 2007-06-27 22:29 |只看该作者
刚才我做了个实验
环境和楼主一样
内网eth2   192.168.1.1
外网eth1    192.168.0.3

tc的语句和mark语句都是复制楼主的。
做了SNAT并执行这些语句后,我在内网浏览了些网页
然后

  1. tc -s qdisc ls dev eth1
复制代码

得到的结果是

  1. [root@localhost ~]# tc -s qdisc ls dev eth1
  2. qdisc htb 1: r2q 10 default 20 direct_packets_stat 0
  3. Sent 100121 bytes 694 pkts (dropped 0, overlimits 4)

  4. qdisc sfq 10: parent 1:10 quantum 1514b perturb 10sec
  5. Sent 0 bytes 0 pkts (dropped 0, overlimits 0)

  6. qdisc sfq 20: parent 1:20 quantum 1514b perturb 10sec
  7. Sent 100121 bytes 694 pkts (dropped 0, overlimits 0)
复制代码

流量都是在默认子类20上。楼主打标的子类10果然没有任何流量。
然后我把楼主的mark语句改了下,去掉了源地址的项,修改为:

  1. iptables -t mangle -F
  2. iptables -t mangle -A PREROUTING -i eth2 -j MARK --set-mark 11
  3. iptables -t mangle -A PREROUTING -i eth2 -j RETURN
复制代码

清空原来的流量后,再浏览网页,执行tc -s qdisc ls dev eth1
结果为:

  1. [root@localhost ~]# tc -s qdisc ls dev eth1
  2. qdisc htb 1: r2q 10 default 20 direct_packets_stat 0
  3. Sent 10407 bytes 98 pkts (dropped 0, overlimits 0)

  4. qdisc sfq 10: parent 1:10 quantum 1514b perturb 10sec
  5. Sent 10407 bytes 98 pkts (dropped 0, overlimits 0)

  6. qdisc sfq 20: parent 1:20 quantum 1514b perturb 10sec
  7. Sent 0 bytes 0 pkts (dropped 0, overlimits 0)
复制代码

这时流量都是走的打标的子类10,子类20里没有流量。

论坛徽章:
0
8 [报告]
发表于 2007-06-27 22:33 |只看该作者
tc的语句和mark语句都是复制楼主的。
做了SNAT并执行这些语句后,我在内网浏览了些网页
然后

[Copy to clipboard]
CODE:
tc -s qdisc ls dev eth1

得到的结果是

[Copy to clipboard]
CODE:
[root@localhost ~]# tc -s qdisc ls dev eth1
qdisc htb 1: r2q 10 default 20 direct_packets_stat 0
Sent 100121 bytes 694 pkts (dropped 0, overlimits 4)

qdisc sfq 10: parent 1:10 quantum 1514b perturb 10sec
Sent 0 bytes 0 pkts (dropped 0, overlimits 0)

qdisc sfq 20: parent 1:20 quantum 1514b perturb 10sec
Sent 100121 bytes 694 pkts (dropped 0, overlimits 0)

流量都是在默认子类20上。楼主打标的子类10果然没有任何流量。

可否在得到这个结果的时候运行一下 iptables-save -ct mangle 并贴出结果?

论坛徽章:
0
9 [报告]
发表于 2007-06-27 22:45 |只看该作者

  1. # Generated by iptables-save v1.2.11 on Sat Jun 23 01:12:20 2007
  2. *mangle
  3. :PREROUTING ACCEPT [4457:862854]
  4. :INPUT ACCEPT [1296:101484]
  5. :FORWARD ACCEPT [3156:761170]
  6. :OUTPUT ACCEPT [1246:133593]
  7. :POSTROUTING ACCEPT [4402:894763]
  8. [1339:134061] -A PREROUTING -i eth2 -j MARK --set-mark 0xb
  9. [1339:134061] -A PREROUTING -i eth2 -j RETURN
  10. [740:211659] -A PREROUTING -d 192.168.0.3 -i eth1 -j MARK --set-mark 0x16
  11. [740:211659] -A PREROUTING -d 192.168.0.3 -i eth1 -j RETURN
  12. COMMIT
  13. # Completed on Sat Jun 23 01:12:20 2007

复制代码

论坛徽章:
0
10 [报告]
发表于 2007-06-27 22:47 |只看该作者
这并非你做测试失败时候的那个 iptables 啊,既然你说第一个测试失败了,那么就要排错,排错的时候当然要用测试失败的时候的内容去排啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP