免费注册 查看新帖 |

Chinaunix

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

[网络管理] iptables匹配ip成功,但是tc没有成功限速 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-30 19:13 |只看该作者 |倒序浏览
20可用积分
在一台nat网关上,内网口是eth2,外网口是eth3,用iptables来匹配流过的网络包,当内网的ip为10.0.1.7的用户从219.239.26.6下载时,用如下的脚本来限制下载速度到100kbps
#!/bin/sh
echo control
IDEV=eth2
ODEV=eth3
ulimit -HSn 65536
echo 1024 40000 > /proc/sys/net/ipv4/ip_local_port_range
echo 1 >/proc/sys/net/ipv4/ip_forward
echo 1 >/proc/sys/net/ipv4/tcp_syncookies
echo 1 >/proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
modprobe ip_nat_ftp
modprobe xt_iprange
iptables -F -t nat
iptables -F -t filter
iptables -F -t mangle
iptables -F
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
DOWNLINK=10000
UPLINK=10000
modprobe xt_iprange
tc qdisc del dev eth2 root    2>/dev/null
tc qdisc del dev eth2 ingress 2>/dev/null
tc qdisc del dev eth3 root    2>/dev/null
tc qdisc add dev $IDEV root handle 1: htb default 9 r2q 1
tc class add dev $IDEV parent 1:  classid 1:1  htb rate ${DOWNLINK}kbps ceil ${DOWNLINK}kbps
tc qdisc add dev $ODEV root handle 2: htb default 9 r2q 1
tc class add dev $ODEV parent 2:  classid 2:1  htb rate ${UPLINK}kbps ceil ${UPLINK}kbps
tc class add dev $IDEV parent 1:1 classid 1:251 htb rate 100kbps ceil 100kbps prio 0

tc qdisc add dev $IDEV parent 1:251 handle 251: sfq
tc filter add dev $IDEV protocol ip parent 1:0 prio 0 handle 251 fw classid 1:251
tc class add dev $ODEV parent 2:1 classid 2:251 htb rate 100kbps ceil 100kbps prio 1
iptables -A PREROUTING -t mangle  -p tcp -s 202.105.13.166/32 -j MARK --set-mark 251
iptables -A OUTPUT -t mangle -p tcp -s 202.105.13.166/32 -j MARK --set-mark 251
tc qdisc add dev $ODEV parent 2:251 handle 251: sfq
tc filter add dev $ODEV protocol ip parent 2:0 prio 1 handle 251 fw classid 2:251
iptables -t nat -A PREROUTING -i $IDEV  -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080
echo over

执行后,用iptables -L -t mangle -n -v可以看到有符合的包匹配成功了,如下:
Chain PREROUTING (policy ACCEPT 23M packets, 6992M bytes)
pkts bytes target     prot opt in     out     source               destination         
15402   23M MARK       tcp  --  *      *       202.105.13.166       0.0.0.0/0           MARK set 0xfb

Chain INPUT (policy ACCEPT 23M packets, 6975M bytes)
pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 70239 packets, 17M bytes)
pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 20M packets, 6774M bytes)
pkts bytes target     prot opt in     out     source               destination         
    0     0 MARK       tcp  --  *      *       202.105.13.166       0.0.0.0/0           MARK set 0xfb

Chain POSTROUTING (policy ACCEPT 20M packets, 6790M bytes)
pkts bytes target     prot opt in     out     source               destination

但是tc -s -d class show dev eth2没有发现有包通过队列
[root@localhost ~]# tc -s -d class show dev eth2
class htb 1:1 root rate 80000Kbit ceil 80000Kbit burst 1590b/8 mpu 0b overhead 0b cburst 1590b/8 mpu 0b overhead 0b level 7
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
lended: 0 borrowed: 0 giants: 0
tokens: 156 ctokens: 156

class htb 1:251 parent 1:1 leaf 251: prio 0 quantum 100000 rate 800000bit ceil 800000bit burst 1599b/8 mpu 0b overhead 0b cburst 1599b/8 mpu 0b overhead 0b level 0
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
lended: 0 borrowed: 0 giants: 0
tokens: 15624 ctokens: 15624


请问这是因为什么造成的?非常感谢!

[ 本帖最后由 setsuna 于 2009-12-30 20:42 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-12-30 21:56 |只看该作者
配置有点多了,不好找问题。
对于要做下载的限制,只需要做eth2的qdisc就行了。

output做限速那是限制上行100k。

建议你先不要配置output接口的配置。

论坛徽章:
0
3 [报告]
发表于 2009-12-30 22:23 |只看该作者
我知道了,错在你的iptables打的标是251,打到包上是0xfb
而filter的handle你写是251,这个filter可能默认认为写的是16进制。你应该写handle 0xfb。

如果没有把握,建议先用10以内的id做实验。
当初我就是被10禁止和16进制搞迷糊了。

论坛徽章:
0
4 [报告]
发表于 2009-12-30 22:39 |只看该作者
原帖由 emmoblin 于 2009-12-30 22:23 发表
我知道了,错在你的iptables打的标是251,打到包上是0xfb
而filter的handle你写是251,这个filter可能默认认为写的是16进制。你应该写handle 0xfb。

如果没有把握,建议先用10以内的id做实验。
当初我就是被 ...



很有可能就是因为这个,我明天试试

论坛徽章:
0
5 [报告]
发表于 2010-01-04 11:20 |只看该作者
原帖由 emmoblin 于 2009-12-30 22:23 发表
我知道了,错在你的iptables打的标是251,打到包上是0xfb
而filter的handle你写是251,这个filter可能默认认为写的是16进制。你应该写handle 0xfb。

如果没有把握,建议先用10以内的id做实验。
当初我就是被 ...

正解

论坛徽章:
0
6 [报告]
发表于 2010-01-05 09:48 |只看该作者

论坛徽章:
0
7 [报告]
发表于 2010-04-07 16:32 |只看该作者
我也遇到了这个问题,恐怕不是进制转换的问题,因为我的mark值是6,也是可以iptables mark,但是tc fw没有任何流量。

我的系统是debian 5.0,iptables版本是1.4.2

我觉得可能是内核问题,但是内核看了一下,qos里面,fw(mark)被选成M了,不知道为什么还是不可以。


如果楼主解决了,一定要教教大家啊,呵呵,谢谢!

各位大侠,小弟膜拜,请帮忙看看!

论坛徽章:
0
8 [报告]
发表于 2010-04-07 16:43 |只看该作者
楼主,我搞定了,我没有搞清楚流向问题,呵呵,在本机向外发包的时候,要在OUTPUT链上做mark,我错了!希望你不是流向问题上搞错。

论坛徽章:
0
9 [报告]
发表于 2014-10-24 14:43 |只看该作者
不知楼主有没有解决 filter 匹配不到的问题,我现在也遇到类似问题,用u32过滤器匹配和iptables+fw过滤器都无法匹配。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP