用PPPOE加TC 流控 来搭建 社区网络
作者:storysky
场景描述:
有这样一个小区,建设的时候小区都已经铺设好了局域网,每家每户都可以用通过小区宽带上网,开始时候物业申请了10M的光纤,小区居民都通过这一条线共享上网并每月交纳费用。开始的时候用的人不多,几个办宽带的居民上着那是相当的爽啊!几乎是独享10M带宽,后来上的人越来越多了,一到高峰时期就慢了不少,不过还是可以忍受的,再后来有人开始用bt、迅雷24小时不停的DOWNLOAD,还做下载服务器。有些用户受不了了,个别几个搞电脑的开始自行做起网管来了,并用“P2P终结者”一类的工具进行限速,一时间网内ARP欺骗开始泛滥,搞得大多用户都无法上网,对网络管理怨声载道。物业的网管开始想办法了,怎么办?把所有的MAC地址都绑定?几千户啊,这不得累死,再说你绑定了他们还可以改,不好!怎么办,最后决定用 pppoe建立点对点拨号网络,对每户发放上网账号并进行带宽限制,彻底解决网内ARP欺骗问题。
实验环境 RHEL5U3
实验目的 建立PPPoe拨号服务器并对每个帐号作流量控制
实验工具 rp-pppoe-3.5-32.1 与iproute-2.6.18-9.el5
实验过程:
1、建立PPPOE拨号服务器
在我的机器里上面的包都已经装好,装包步骤 略
我们主要是用到下面的几个文件来建立PPPOE服务器
/etc/ppp/chap-secrets #帐号信息文件 如用户名、IP、密码等等
/etc/ppp/pppoe-server-options #pppoe 服务器的配置文件包含验证类型、帐号类型等等
/sbin/pppoe-server # 可执行文件用来建立pppoe服务器
先来修改/etc/ppp/chap-secrets
"xman" * "321" 172.16.2.1 #xman是分给用户的帐号,就像咱们adsl那个帐号一样,321 是密码 后面的ip地址是为这个帐号专门分配一个地址(方便管理),也可以用“*”让服务器去分配
"ufo" * "123" 172.16.3.1
修改 /etc/ppp/pppoe-server-options
auth #连接必须验证
require-chap # 选择验证方式,分为PAP和CHAP 我建议用CHAP,因为PAP不太安全,容易被人把密码抓走
login #据说加了这个就能后再使用PAP 方式就能允许使用本地帐号登录了,不过我一直没成功
lcp-echo-interval 10 #每十秒检测一次链路状态,查看是否正常
lcp-echo-failure 2 #如果10秒后状态依然不正常 再等两秒后 确认断开连接
ms-dns 202.106.0.20 #给客户端的DNS
编辑完成
pppoe-server -l eth0 -N 200 -L 172.16.1.1 -R 172.16.1.254
上面这条命令是开启pppoe服务,-l 是指定监听的网卡 -N为提供多少个客户端(不过这个参数似乎不太准) -L 和 -R 是指定一个地址池 用来和拨号客户端进行点对点连接
连接是好了,那么关闭呢?我现在还没找到相应的关闭参数 ,暂时只能用下面的了 呵呵,如果您知道怎么关闭请 给我邮件,十分感谢
killall pppoe-server
客户端测试:
这里我用Linux来测试
[root@jda ~]#adsl-setup
中间步骤省略,记住 别忘了设置 帐号和密码就行了,下面是结果
aype '/sbin/ifup ppp0' to bring up your xDSL link and '/sbin/ifdown ppp0'
to bring it down.
aype '/sbin/adsl-status /etc/sysconfig/network-scripts/ifcfg-ppp0'
to see the link status.
[root@jda ~]# ifup ppp0
[root@jda ~]# ifconfig
ppp0 Link encap:Point-to-Point Protocol
inet addr:172.16.2.1 P-t-P:172.16.1.1 Mask:255.255.255.255
Windows客户端的连接方法就更简单了,直接建立一个拨号连接就行了,其他的好工具也不少
好了 PPPOE服务器就已经建立成
在这里我遇到个问题,就是关于PPPoe的速度,我在客户端用adsl-start 连接到服务器后 用ssh连接上服务器后,scp一个大文件时候发现 传输速度只有1M/s 也就是10mbit每秒,这只有我局域网速度的十分之一,一直找不到原因,后来经过了解可能是 pppoe同步与异步 造成的,想在这里问下大家谁能帮忙解决传输速度的问题!!!万分感谢
下面就开始使用TC来划分流量了
我用的调度算法为 HTB(分层令牌桶),有朋友用CBQ 但是因为我用的是Linux作服务器 (linux的软件时钟对CBQ的效果不理想)所以,在这里用HTB效果更好一些
tc qdisc #查看当前的 队列 信息
tc qdisc add dev ppp0 root handle 1:0 htb default 13
#这里的root可不是 root用户,而是 “根”的意思,详细的意思我在这里就不多说了,如果你想深入了解下流控的概念可以看看这个 《Traffic Control using tcng and HTB HOWTO》和《Linux的高级路由和流量控制HOWTO
中文版》 估计你看完了这两本书会对 QOS于Linux的路由有更深入的了解;
#上面的命令 是建立了一条默认的队列,意思是如果没有特殊定义的规则默认包会走 1:13这个通道
tc class add dev ppp0 parent 1:0 classid 1:1 htb rate 10mbit burst 50k #在根队列 1:0的上面 建立一条总的class 1:1 采用HTB算法 速度为 10mbit 迸发值设为50k字节,(这个迸发值根据实际情况自定,我这里随便设的)
tc class add dev ppp0 parent 1:1 classid 1:11 htb rate 3mbit burst 30k ceil 6mbit #在上面class 1:1 的下面继续分类 1:11 ,这里的ceil是指在其他通道都空闲的时候这条通道可以占用的带宽,如果其他通道忙碌则会回到3mbit
tc class add dev ppp0 parent 1:1 classid 1:12 htb rate 6mbit burst 10k
tc class add dev ppp0 parent 1:1 classid 1:13 htb rate 1mbit burst 100k ceil 3mbit
tc qdisc add dev ppp0 parent 1:11 handle 10:0 sfq perturb 20 #设定每个子类的具体调度算法为SFQ(随机公平队列) perturb 20是指每20秒从新计算sfq的随机值
tc qdisc add dev ppp0 parent 1:12 handle 20:0 sfq perturb 20
tc qdisc add dev ppp0 parent 1:13 handle 30:0 sfq perturb 20
下面我们要在根上面加一个过滤器,用来规定什么样的包应该去哪条通道
tc filter add dev ppp0 parent 1:0 protocol ip prio 800 u32 match ip dst 172.16.1.19/32 flowid 1:13 #这里可以规定某个ip地址应该去哪个通道,比如这个IP是老板的,可以让他独享一个通道
tc filter add dev ppp0 parent 1:0 protocol ip prio 800 u32 match ip sport 22 0xffff flowid 1:11
tc filter add dev ppp0 parent 1:0 protocol ip prio 800 u32 match ip sport 80 0xffff flowid 1:12
tc filter add dev ppp0 parent 1:0 protocol ip prio 800 u32 match ip sport 20 0xffff flowid 1:12
拨号自动限速脚本,这样在有客户端连上来的时候会自动对其限速
在 /etc/ppp/目录下建立 auth-up这个文件,在里面加入下面这些语句
#!/bin/bash
export PATH=/bin:/usr/bin:/sbin:/usr/sbin
tc qdisc add dev $IFNAME root handle 1:0 htb default 13
tc class add dev $IFNAME parent 1:0 classid 1:1 htb rate 10mbit burst 50k
tc class add dev $IFNAME parent 1:1 classid 1:11 htb rate 3mbit burst 30k ceil 6mbit
tc class add dev $IFNAME parent 1:1 classid 1:12 htb rate 6mbit burst 10k
tc class add dev $IFNAME parent 1:1 classid 1:13 htb rate 1mbit burst 100k ceil 3mbit
tc qdisc add dev $IFNAME parent 1:11 handle 10:0 sfq perturb 20
tc qdisc add dev $IFNAME parent 1:12 handle 20:0 sfq perturb 20
tc qdisc add dev $IFNAME parent 1:13 handle 30:0 sfq perturb 20
tc filter add dev $IFNAME parent 1:0 protocol ip prio 1000 u32 match ip dst 172.16.1.19/32 flowid 1:13
tc filter add dev $IFNAME parent 1:0 protocol ip prio 1000 u32 match ip sport 22 0xffff flowid 1:11
tc filter add dev $IFNAME parent 1:0 protocol ip prio 1000 u32 match ip sport 80 0xffff flowid 1:12
tc filter add dev $IFNAME parent 1:0 protocol ip prio 1000 u32 match ip sport 20 0xffff flowid 1:13
再加上记账软件就齐全了,不过那个我在这里就不阐述了,感兴趣的朋友可以尝试一下
好了就写到这里吧,希望这篇文章对你有所帮助。如果有错误的地方欢迎指正,大家共同进步。
参考资料《Traffic Control using tcng and HTB HOWTO》和《Linux的高级路由和流量控制HOWTO中文版》