如何使用iptables来识别下载stream量

如何识别下载stream量并设置一个标记,以便我可以通过另一个链接使用fwmark路由这些数据包?

iptables 模块的 connbytes,connlimit和length可以用来识别下载。 这里的设置是使用:

#Mark downloads $IPT -t mangle -N BULKCONN #Small packet is probably interactive or flow control $IPT -t mangle -A BULKCONN -m length --length 0:500 -j RETURN #Small packet connections: multi purpose (don't harm since not maxed out) $IPT -t mangle -A BULKCONN -m connbytes --connbytes 0:250 --connbytes-dir both --connbytes-mode avgpkt -j RETURN #After one megabyte a connection is considered a download $IPT -t mangle -A BULKCONN -m connbytes --connbytes 1048576: --connbytes-dir both --connbytes-mode bytes -j MARK --set-mark 6 $IPT -t mangle -A BULKCONN -j RETURN $IPT -t mangle -A PREROUTING -i eth1 -j BULKCONN 

我使用排队规则优先下载和其他stream量。

关于通过另一个链接发送:我还没有准备好回答这个问题,但是可以用iproute2来完成(假设你的意思是另一个IP链接)。 但是它只能在下游工作,因为你无法控制上游stream量到达你的位置。

我受到了@Ganwell的解决scheme的启发,并且设法解决这个问题,并在tc类stream量整形中join。 我在我的个人wiki中对此解决scheme进行了博客: https : //giki.wiki/@nubela/Software-Engineering/Per-Connection-Throttling

这是我用一个实际的shell脚本解决这个问题的方法:

 #!/bin/sh dev=eth0 ip_port=3002 rate_limit=512kbit rate_ceil=1024kbit htb_class=10 max_byte=10485760 if [ "$(id -u)" != "0" ]; then echo "This script must be run as root" 1>&2 exit 1 fi if [ "$1" = "enable" ]; then echo "enabling rate limits" tc qdisc del dev $dev root > /dev/null 2>&1 tc qdisc add dev $dev root handle 1: htb tc class add dev $dev parent 1: classid 1:$htb_class htb rate $rate_limit ceil $rate_ceil tc filter add dev $dev parent 1: prio 0 protocol ip handle $htb_class fw flowid 1:$htb_class #iptables -t mangle -A OUTPUT -p tcp --sport $ip_port -j MARK --set-mark $htb_class # small packet is probably interactive or flow control iptables -t mangle -A OUTPUT -p tcp --sport $ip_port -m length --length 0:500 -j RETURN # small packet connections: multi purpose (don't harm since not maxed out) iptables -t mangle -A OUTPUT -p tcp --sport $ip_port -m connbytes --connbytes 0:250 --connbytes-dir both --connbytes-mode avgpkt -j RETURN #after 10 megabyte a connection is considered a download iptables -t mangle -A OUTPUT -p tcp --sport $ip_port -m connbytes --connbytes $max_byte: --connbytes-dir both --connbytes-mode bytes -j MARK --set-mark $htb_class iptables -t mangle -A OUTPUT -j RETURN elif [ "$1" = "disable" ]; then echo "disabling rate limits" tc qdisc del dev $dev root > /dev/null 2>&1 iptables -t mangle -F iptables -t mangle -X elif [ "$1" = "show" ]; then tc qdisc show dev $dev tc class show dev $dev tc filter show dev $dev iptables -t mangle -vnL INPUT iptables -t mangle -vnL OUTPUT else echo "invalid arg $1" fi