iptables + tc htb + 策略路由

我的拓扑在附件里,自己做了个图.
这个只是我在虚拟机上用5个系统做的简单实验.很多东西都没有写进去。
希望对和我一样是初学者的朋友有所帮助.
也请各位高手多指点不足之处。多谢了。多谢了。

忘了画上,7.7.7.0和8.8.8.0是模拟公网上的地址。这两个地址是走策略的.

#!/bin/bash
IF_INTERNAL="eth0"
IF_CNTELCOM="eth1"
IF_CNNETCOM="eth2"
tc qdisc del dev $IF_INTERNAL root 2> /dev/null > /dev/null
tc qdisc del dev $IF_INTERNAL ingress 2> /dev/null > /dev/null
tc qdisc del dev $IF_CNTELCOM root 2> /dev/null > /dev/null
tc qdisc del dev $IF_CNTELCOM ingress 2> /dev/null > /dev/null
tc qdisc del dev $IF_CNNETCOM root 2> /dev/null > /dev/null
tc qdisc del dev $IF_CNNETCOM ingress 2> /dev/null > /dev/null
tc qdisc add dev $IF_INTERNAL root handle 1: htb default 14
tc class add dev $IF_INTERNAL parent 1: classid 1:1 htb rate 100mbit ceil 100mbit prio 0
tc class add dev $IF_INTERNAL parent 1:1 classid 1:11 htb rate 30mbit ceil 100mbit prio 1
tc class add dev $IF_INTERNAL parent 1:1 classid 1:12 htb rate 20mbit ceil 100mbit prio 2
tc class add dev $IF_INTERNAL parent 1:1 classid 1:13 htb rate 40mbit ceil 100mbit prio 3
tc class add dev $IF_INTERNAL parent 1:1 classid 1:14 htb rate 10mbit ceil 10mbit prio 4
tc filter add dev $IF_INTERNAL parent 1:0 protocol ip prio 1 handle 1 fw classid 1:11
tc filter add dev $IF_INTERNAL parent 1:0 protocol ip prio 2 handle 2 fw classid 1:12
tc filter add dev $IF_INTERNAL parent 1:0 protocol ip prio 3 handle 3 fw classid 1:13
tc filter add dev $IF_INTERNAL parent 1:0 protocol ip prio 5 handle 5 fw classid 1:14
tc qdisc add dev $IF_INTERNAL parent 1:11 handle 111: sfq perturb 5
tc qdisc add dev $IF_INTERNAL parent 1:12 handle 112: sfq perturb 10
tc qdisc add dev $IF_INTERNAL parent 1:13 handle 113: sfq perturb 10
tc qdisc add dev $IF_INTERNAL parent 1:14 handle 114: sfq perturb 15
tc qdisc add dev $IF_INTERNAL handle ffff: ingress
tc filter add dev $IF_INTERNAL parent ffff: protocol ip prio 10 u32 match ip src 0.0.0.0/0 police rate 90mbit burst 1mbit drop flowid :1
tc qdisc add dev $IF_CNTELCOM root handle 2: htb default 14
tc class add dev $IF_CNTELCOM parent 2: classid 2:1 htb rate 100mbit ceil 100mbit prio 0
tc class add dev $IF_CNTELCOM parent 2:1 classid 2:11 htb rate 30mbit ceil 100mbit prio 1
tc class add dev $IF_CNTELCOM parent 2:1 classid 2:12 htb rate 20mbit ceil 100mbit prio 2
tc class add dev $IF_CNTELCOM parent 2:1 classid 2:13 htb rate 40mbit ceil 100mbit prio 3
tc class add dev $IF_CNTELCOM parent 2:1 classid 2:14 htb rate 10mbit ceil 10mbit prio 4
tc filter add dev $IF_CNTELCOM parent 2:0 protocol ip prio 1 handle 1 fw classid 2:11
tc filter add dev $IF_CNTELCOM parent 2:0 protocol ip prio 2 handle 2 fw classid 2:12
tc filter add dev $IF_CNTELCOM parent 2:0 protocol ip prio 3 handle 3 fw classid 2:13
tc filter add dev $IF_CNTELCOM parent 2:0 protocol ip prio 5 handle 5 fw classid 2:14
tc qdisc add dev $IF_CNTELCOM parent 2:11 handle 211: sfq perturb 5
tc qdisc add dev $IF_CNTELCOM parent 2:12 handle 212: sfq perturb 10
tc qdisc add dev $IF_CNTELCOM parent 2:13 handle 213: sfq perturb 10
tc qdisc add dev $IF_CNTELCOM parent 2:14 handle 214: sfq perturb 15
tc qdisc add dev $IF_CNTELCOM handle ffff: ingress
tc filter add dev $IF_CNTELCOM parent ffff: protocol ip prio 10 u32 match ip src 0.0.0.0/0 police rate 90mbit burst 1mbit drop flowid :1
tc qdisc add dev $IF_CNNETCOM root handle 3: htb default 14
tc class add dev $IF_CNNETCOM parent 3: classid 3:1 htb rate 100mbit ceil 100mbit prio 0
tc class add dev $IF_CNNETCOM parent 3:1 classid 3:11 htb rate 30mbit ceil 100mbit prio 1
tc class add dev $IF_CNNETCOM parent 3:1 classid 3:12 htb rate 20mbit ceil 100mbit prio 2
tc class add dev $IF_CNNETCOM parent 3:1 classid 3:13 htb rate 40mbit ceil 100mbit prio 3
tc class add dev $IF_CNNETCOM parent 3:1 classid 3:14 htb rate 10mbit ceil 10mbit prio 4
tc filter add dev $IF_CNNETCOM parent 3:0 protocol ip prio 1 handle 1 fw classid 3:11
tc filter add dev $IF_CNNETCOM parent 3:0 protocol ip prio 2 handle 2 fw classid 3:12
tc filter add dev $IF_CNNETCOM parent 3:0 protocol ip prio 3 handle 3 fw classid 3:13
tc filter add dev $IF_CNNETCOM parent 3:0 protocol ip prio 5 handle 5 fw classid 3:14
tc qdisc add dev $IF_CNNETCOM parent 3:11 handle 311: sfq perturb 5
tc qdisc add dev $IF_CNNETCOM parent 3:12 handle 312: sfq perturb 10
tc qdisc add dev $IF_CNNETCOM parent 3:13 handle 313: sfq perturb 10
tc qdisc add dev $IF_CNNETCOM parent 3:14 handle 314: sfq perturb 15
tc qdisc add dev $IF_CNNETCOM handle ffff: ingress
tc filter add dev $IF_CNNETCOM parent ffff: protocol ip prio 10 u32 match ip src 0.0.0.0/0 police rate 90mbit burst 1mbit drop flowid :1
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -P INPUT DROP
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -m mac --mac-source 00:c0:9f:XX:XX:XX -p tcp --dport 22 -j ACCEPT
iptables -P FORWARD ACCEPT
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type 11 -j DROP
iptables -A FORWARD -p icmp -j ACCEPT
iptables -P OUTPUT ACCEPT
iptables -t nat -A POSTROUTING -o $IF_CNTELCOM -j MASQUERADE
iptables -t nat -A POSTROUTING -o $IF_CNNETCOM -j MASQUERADE
iptables -t mangle -A PREROUTING -m tos --tos Minimize-Delay -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -m tos --tos Minimize-Cost -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -m tos --tos Maximize-Throughput -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp -m tcp --tcp-flags SYN ACK,RST -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p tcp -m tcp --tcp-flags SYN ACK,RST -j RETURN
iptables -t mangle -A PREROUTING -m length --length :64 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -m length --length :64 -j RETURN
iptables -t mangle -A PREROUTING -p tcp --dport ftp -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p tcp --dport ftp -j RETURN
iptables -t mangle -A PREROUTING -p tcp --sport ftp -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p tcp --sport ftp -j RETURN
iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p tcp --dport 22 -j RETURN
iptables -t mangle -A PREROUTING -p tcp --sport 22 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p tcp --sport 22 -j RETURN
iptables -t mangle -A PREROUTING -p udp --dport 53 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p udp --dport 53 -j RETURN
iptables -t mangle -A PREROUTING -p udp --sport 53 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p udp --sport 53 -j RETURN
iptables -t mangle -A PREROUTING -p tcp --dport 25 -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -p tcp --dport 25 -j RETURN
iptables -t mangle -A PREROUTING -p tcp --sport 25 -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -p tcp --sport 25 -j RETURN
iptables -t mangle -A PREROUTING -p tcp --dport 110 -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -p tcp --dport 110 -j RETURN
iptables -t mangle -A PREROUTING -p tcp --sport 110 -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -p tcp --sport 110 -j RETURN
iptables -t mangle -A PREROUTING -p tcp --dport 443 -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp --dport 443 -j RETURN
iptables -t mangle -A PREROUTING -p tcp --sport 443 -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp --sport 443 -j RETURN
iptables -t mangle -A PREROUTING -p tcp --dport ftp-data -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp --dport ftp-data -j RETURN
iptables -t mangle -A PREROUTING -p tcp --sport ftp-data -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp --sport ftp-data -j RETURN
iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp --dport 80 -j RETURN
iptables -t mangle -A PREROUTING -p tcp --sport 80 -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp --sport 80 -j RETURN
iptables -t mangle -A PREROUTING -p tcp --dport 8080 -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp --dport 8080 -j RETURN
iptables -t mangle -A PREROUTING -p tcp --sport 8080 -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp --dport 8080 -j RETURN
iptables -t mangle -A PREROUTING -p tcp --dport 3389 -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp --dport 3389 -j RETURN
iptables -t mangle -A PREROUTING -p tcp --sport 3389 -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp --sport 3389 -j RETURN
iptables -t mangle -A PREROUTING -p tcp --dport 139 -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp --dport 139 -j RETURN
iptables -t mangle -A PREROUTING -p tcp --sport 139 -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp --sport 139 -j RETURN
iptables -t mangle -A PREROUTING -p udp --dport 4000:8000 -j MARK --set-mark 5
iptables -t mangle -A PREROUTING -p udp --dport 4000:8000 -j RETURN
iptables -t mangle -A PREROUTING -p udp --sport 4000:8000 -j MARK --set-mark 5
iptables -t mangle -A PREROUTING -p udp --sport 4000:8000 -j RETURN
iptables -t mangle -A PREROUTING -j MARK --set-mark 5
iptables -t mangle -A PREROUTING -j RETURN
modprobe ip_nat_ftp
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 255 > /proc/sys/net/ipv4/ip_default_ttl
ip route add default via 1.1.1.2
ip route add default via 2.2.2.2 table 100
ip rule add to 7.0.0.0/8 table 100
ip rule add to 8.0.0.0/8 table 100

[[i] 本帖最后由 Suniverse 于 2007-6-7 19:55 编辑 [/i]]
platinum
文中用到了 0、1、2、3、4 共 5 个不同的 class 优先级,以及很多 filter 优先级,可否讲一下同优先级和不同优先级下他们的不同点在哪里?

Suniverse
根据我的理解,我认为PRIO的级别在不同时,当两种级别的流量同时到达某一接口时,优先级搞的流量优先被处理和转发。
(忘了写,即使优先级不同,也不会让某一流量永久占用带宽而让其他流量饿死,因为有SFQ在)


当PRIO相同时
则同时到达之后,采用先来先处理的原则(我不知道这算不算FIFO)。
而根据SFQ队列的公平算法,每个流量都不会一直占用出口,而是根据每个单位时间PERTURB从新进行散列算法的计算,来重新分配.

小弟初学,不知道对不对,请指点.

谢谢了,谢谢了

[[i] 本帖最后由 Suniverse 于 2007-6-8 08:19 编辑 [/i]]

gdqynic
写得很好,受益非浅!
另外,根据我最近的测试发现,MARK部分可以使用multiport减少规则的条数,我觉得可以提高服务器的处理速度,我把我的代码列一下,欢迎大家指正!
[code]$IPTABLES -t mangle -F

$IPTABLES -t mangle -A POSTROUTING -m tos --tos Minimize-Delay -j MARK --set-mark 1
$IPTABLES -t mangle -A POSTROUTING -m tos --tos Minimize-Delay -j RETURN

$IPTABLES -t mangle -A POSTROUTING -p tcp --tcp-flags SYN,RST,ACK SYN -j MARK --set-mark 1
$IPTABLES -t mangle -A POSTROUTING -p tcp --tcp-flags SYN,RST,ACK SYN -j RETURN

$IPTABLES -t mangle -A POSTROUTING -p tcp -m length --length :64 -j MARK --set-mark 1
$IPTABLES -t mangle -A POSTROUTING -p tcp -m length --length :64 -j RETURN

$IPTABLES -t mangle -A POSTROUTING -p icmp -j MARK --set-mark 1
$IPTABLES -t mangle -A POSTROUTING -p icmp -j RETURN

$IPTABLES -t mangle -A POSTROUTING -p udp -m multiport --port 53 -j MARK --set-mark 1
$IPTABLES -t mangle -A POSTROUTING -p udp -m multiport --port 53 -j RETURN

$IPTABLES -t mangle -A POSTROUTING -p tcp -m multiport --port 20,22,23,1433,3389 -j MARK --set-mark 1
$IPTABLES -t mangle -A POSTROUTING -p tcp -m multiport --port 20,22,23,1433,3389 -j RETURN

$IPTABLES -t mangle -A POSTROUTING -p tcp -m multiport --port 21,25,80,110,443 -j MARK --set-mark 2
$IPTABLES -t mangle -A POSTROUTING -p tcp -m multiport --port 21,25,80,110,443 -j RETURN

$IPTABLES -t mangle -A POSTROUTING -p udp -m multiport --port 8000 -j MARK --set-mark 2
$IPTABLES -t mangle -A POSTROUTING -p udp -m multiport --port 8000 -j RETURN

$IPTABLES -t mangle -A POSTROUTING -p tcp -m multiport --port 1038,3724,5050,5858,6299,7000,7050,7100,7200 -j MARK --set-mark 3
$IPTABLES -t mangle -A POSTROUTING -p tcp -m multiport --port 1038,3724,5050,5858,6299,7000,7050,7100,7200 -j RETURN

$IPTABLES -t mangle -A POSTROUTING -p tcp -m multiport --port 7202,7205,8888,28008,38101,39311,40041,55088 -j MARK --set-mark 3
$IPTABLES -t mangle -A POSTROUTING -p tcp -m multiport --port 7202,7205,8888,28008,38101,39311,40041,55088 -j RETURN

$IPTABLES -t mangle -A POSTROUTING -p tcp -m multiport --port 3000:3050 -j MARK --set-mark 3
$IPTABLES -t mangle -A POSTROUTING -p tcp -m multiport --port 3000:3050 -j RETURN

$IPTABLES -t mangle -A POSTROUTING -p tcp -m multiport --port 8000:8050 -j MARK --set-mark 3
$IPTABLES -t mangle -A POSTROUTING -p tcp -m multiport --port 8000:8050 -j RETURN

$IPTABLES -t mangle -A POSTROUTING -j MARK --set-mark 4[/code]

platinum
[quote]原帖由 [i]Suniverse[/i] 于 2007-6-8 08:18 发表于 3楼  
根据我的理解,我认为PRIO的级别在不同时,当两种级别的流量同时到达某一接口时,优先级搞的流量优先被处理和转发。
(忘了写,即使优先级不同,也不会让某一流量永久占用带宽而让其他流量饿死,因为有SFQ在)
... [/quote]
当带宽没有达到设置峰值最大值的时候,这种优先级和带宽保障会生效吗?据我所知,SFQ 在带宽挤占的时候才开始生效
换句话讲,若你设置峰值 2Mbps,带宽也是 2Mbps 的,而由于 ISP 的原因实际带宽只能达到 1.8Mbps,在这种情况下,Linux 的队列可能不会排满,那么这种优先级和随机队列公平竞争机制会生效吗?

你可能感兴趣的:(职场,休闲)