https://gist.github.com/akrasic/7242498
楼上这个是限制速度还是限制流量?
流量限制用 iptables 感觉挺方便,也准确。
速度限制我就不知道了, tc 没用过。
因为真正意义上,入站流量整形本来就不容易
数据已经到了,你难道还能打回去么?
如果丢弃,源服务器会重发,结果还更多
延迟的话流量大点就很难做到了
ip=4.1.2.3 填写的可是真实服务器 IP?
iptables 怎么限制流量?
扯淡吧,别把限制数据包当成限制带宽。
。。。第一次看到这么简单的实现,真这么简单为什么以前网上没见过这种实例。 tc 只能控制 out 方向, in 方向要用到 ingress 接口,后来出现了一个更高级的 ifb ,以前如果内部有高达 13 个 vlan 只能针对每个 vlan 做流控, ifb 出现以后可以将 13 个 vlan 映射到一个统一的 ifb 接口上。
限制数据包通常可以用 iptables limit 匹配每秒数据包通过的数量,一个大概是 mtu 大,大概 1.5kb 。问题是这个 limit 是个令牌桶概念,数据包在不同时间段数量是有差别的也就会造成流量的不确定,哪天要注意到流量快到慢,慢到快那就是被人实施发包限制了。
不去验证这个实例了,平时很少用到 tc u32 ,无法验证这种方向,在 nat 环境 iptables 都是在 mangle 表过滤的,所谓的路由前,路由后。如果简单的实现 out 可以看下面那帖验证过了。
$FILTER match ip dst 0.0.0.0/0 flowid 1:10
$FILTER match ip src 0.0.0.0/0 flowid 1:20
https://www.v2ex.com/t/248723
你好,请教一下,我使用下面的脚本来对 eth0 限速,本想对 eth0 的每个 ip 单独限速的,可是下面的代码对 eth0 的所有 ip 共同限速了 300k,有什么办法可以改一下么,比如 eth0 里有 10.0.0.1 跟 10.0.0.2、10.0.0.3 三个 ip 如何对这 3 个 ip 分别限速 300k,下面是我自己改的代码实现不了,望赐教
/>/sbin/tc qdisc del dev eth0 root
/sbin/tc qdisc add dev eth0 root handle 2:0 htb
/sbin/tc class add dev eth0 parent 2:1 classid 2:10 htb rate 300kbps
/sbin/tc class add dev eth0 parent 2:2 classid 2:11 htb rate 1024kbps
/sbin/tc qdisc add dev eth0 parent 2:10 handle 1: sfq perturb 1
/sbin/tc filter add dev eth0 protocol ip parent 2:0 u32 match ip dst 10.0.0.0/8 flowid 2:10
/>/sbin/tc qdisc add dev eth0 handle ffff: ingress
/sbin/tc filter add dev eth0 parent ffff: protocol ip u32 match ip dst 10.0.0.0/8 police rate 300kbps burst 100k drop flowid 2:11
好久不看这些了看起来头大。参看了我的 vps,QOS 只能控制上行接口的这个 eth0 是控制上行,eth0 ffff:ingress 才是控制下行。但这个 ffff:ingress 平时我很少用。我给个作用作用在 lan 端的 br0 接口,也是你想要的控制 lan ip 速度的。自己参考修改一下吧。
-t mangle -F POSTROUTING
tc qdisc del dev br0 root 2> /dev/null > /dev/null
tc qdisc add dev br0 root handle 1: htb default 119
tc class add dev br0 parent 1: classid 1:1 htb rate $((3072))kbps
tc class add dev br0 parent 1:1 classid 1:2 htb rate $((3072*6/10))kbps ceil $((3072*6/10))kbps
IP=101;while [ $IP -le 125 ];do
tc class add dev br0 parent 1:2 classid 1:$IP htb rate $((3072*1/10))kbps ceil $((3072*1/4))kbps prio 4
tc qdisc add dev br0 parent 1:$IP handle $IP: sfq perturb 10
tc filter add dev br0 parent 1: prio 20 protocol ip handle $IP fw flowid 1:$IP
iptables -t mangle -A POSTROUTING -d 192.168.8.$IP -j MARK --set-mark $IP
iptables -t mangle -A POSTROUTING -d 192.168.8.$IP -j RETURN;let "IP+=1";done
tc class add dev br0 parent 1:1 classid 1:3 htb rate $((3072*5/10))kbps ceil $((3072*10/10))kbps prio 0
tc qdisc add dev br0 parent 1:3 handle 3: sfq perturb 10
tc filter add dev br0 parent 1: prio 10 protocol ip handle 3 fw flowid 1:3
iptables -t mangle -I POSTROUTING -m iprange --dst-range 192.168.8.200-192.168.8.205 -j RETURN
iptables -t mangle -I POSTROUTING -m iprange --dst-range 192.168.8.200-192.168.8.205 -j MARK --set-mark 3
设定一个 1:2 只有 6/10 流量的限制分组,ip 范围为 101-125,里面再根据每个 ip 限制流量到最多 1/4 的总流量。
设定一个 1:3 10/10 流量的高优先级分组,prio 0,ip 范围 200-205 共享该 100%的流量
好的,非常感谢~~
iptables -t mangle -A POSTROUTING -d 10.24.26.2 -j MARK --set-mark 101
iptables -I FORWARD -s 10.24.26.2 -j MARK --set-mark 6
这 2 个 set-mark 对于这个限速,FORWARD 跟 POSTROUTING 应该使用哪个好呢,我试了下,两个都可以实现。
请忽略楼上-d -s
另外这个 tc 规则重启就失效了,我是不是要写个 shell 开机自动执行呢。
@datocp