WIFIHELL - 科技改变生活

 找回密码
 注册WIFIHELL

QQ登录

只需一步,快速开始

开启左侧

[其它] OPENWRT秒拨参考资料/修改pppd提高多拨成功率

[复制链接]
222ba 发表于 2014-4-5 23:24:19 | 显示全部楼层 |阅读模式

注册WIFIHELL,浏览更多技术贴!

您需要 登录 才可以下载或查看,没有账号?注册WIFIHELL

x
原文:http://www.openwrt.org.cn/bbs/fo ... thread&tid=7527


更新通告:后面我会把最新的改动提交到dreambox代码仓库,大家可以下载自行编译。


使用方法:
1. 用opkg安装ipk包,rg100a,db120请用brcm63xx,fw300R,mr3420请用ar71xx。请用如果提示md5sum出错,请加上 --force-reinstall 参数。如果提示不能降级,加上 --force-downgrade 参数。文件冲突加上 --force-overwrite。
  • opkg --force-reinstall --force-downgrade --force-overwrite install XXXXX.ipk

[color=rgb(51, 102, 153) !important]复制代码

2. 安装成功后用下文中脚本多拨。所提供拨号脚本仅为参考,请根据实际情况和脚本中的注释,修改开头处的相关变量(如网卡名称等)。
3. 注意:拨号时,由于syncpppinit忙等待,将占用较多CPU资源,系统负载也会较高,此为正常现象。如果拨号不成功(如果服务没响应等),syncpppinit不会退出。请手动杀掉进程: pkill -f syncpppinit

更新日志

2012.4.19

                  * 基于ppp-2.4.5
                  * 无须syncpppinit, 加 syncppp <多拨数> 参数运行pppd即可
                  * 改进同步方式,依赖libpthread,但同步时无忙等待
                  * 请加nopersist参数运行pppd
                  * 请先安装ppp-mod-pppoe_2.4.5包,否则2.4.5的pppd可能无法正常运行(见附件)

2012.4.08

                  * 加入PAP认证方式同步支持(以前只支持CHAP)
                  * 用syncppp关键字即可触发同步,无须区分认证方式

2012.2.11

                   * 改变同步实现方式,不使用信号量,不再依赖libpthread
                   * 能在backfire分支下正常使用(backfire下的libpthread实现不全)
2012.2.1
                   * 上传brcm-63xx和ar71xx的ipkg包,见附件
                   * 添加libpthread依赖
2012.1.31  
                   * 加入syncppp关键字,使用该关键字时才触发同步拨号。
                   * 写日志到系统日志中。可以用logread查看。如果成功则出现:
  • daemon.info pppd[1378]: syncppp sync succeeded

[color=rgb(51, 102, 153) !important]复制代码

失败也有相关日志。
                  * 同步失败不会导致pppd退出

原文链接: http://www.morfast.net/blog/linux/pppoe-multilink/,转载请注明出处,谢谢!

先上一张最终效果图吊吊大家胃口:


是的,这张是普通家用10M小区宽带*10拨后,下载速度实测图。下面正文开始。

大家伙用openwrt一般为了两件事:脱机下载;多拨带宽合并。今天讨论后者的前半部分:多拨。

多拨这个词太口语化了,书面一点的说法是:建立多条PPPOE连接。但由于ISP在PPPOE认证服务器上的限制(注意,完全是PPPOE认证服务器的限制,和地域啊,不同的ISP啊都没关系的,所以很多BBS上讨论XX地区XXISP能不能多拨是没多大意义的),多拨有时候很难成功。表现形式多为只能成功建立一条PPPOE连接,再尝试连接时虽然账号密码都正确,也无法认证成功。

后有网友发现,在有ISP限制的情况下,如果能做到同时多次拨号,有一定的概率能同时建立多条连接。这一般采用脚本同时启动多个pppd进程来实现。经过我的测试,这种方法的确可行,但在连接数多到一定程度时,成功率仍然较低。在我的网络环境下,一般只能成功建立两条连接。有没有办法进一步提高成功率呢?

刚才提到,成功的关键在于“同时”,我们就从这里入手。为什么同时就可以而不同时就不行呢?为什么即使同时也不是百分百成功呢?这里我们抓下认证过程的包,看看PPPOE服务端是如何做的限制:

PPPOE连接的认证过程主要分为两大步:发现阶段和认证阶段。在发现阶段,客户端以广播的方式找到认证服务器。在认证阶段,服务器向客户端询问用户名和密码(challenge),客户端响应用户名和密码(response),最后服务器回应认证成功。

观察抓包结果后我们不难发现,一但有一条连接成功建立(服务端回应Success),后续发送的response就只会得到Failure的回应。于是得到一个很重要的结论: 多个连接成功建立的关键,在于要在服务端回应第一个Success之前,发出所有的chap response。如果是使用脚本同时开始多个pppd进程,有一定的可能性满足这一条件。但由于开始多个pppd进程后,这些进程的调度完全由操作系统接管了,在shell脚本里不可能对其进行更精确的控制,只能通过pppd进程间的通信与同步来实现。我们要做的是,在pppd要发送response这个点上做同步,让所有pppd进程的response同时发出。

好在一切都是开源的。  翻翻ppp的源码,和chap认证有关的函数都在pppd文件夹的chap-new.c文件中。再找一下,发现chap_respond函数的注释写得很清楚:
  • /* chap_respond - Generate and send a response to a challenge. */

[color=rgb(51, 102, 153) !important]复制代码

这就是我们要找的地方了。在此函数的最后,调用output()函数把reponse发送出去。我们在output()函数之前做同步就行了。也就是说,所有的pppd进程会在这个地方停一下,直到所有的pppd程序都跑到这个地方了,再一起同时继续运行,把response发送出去。

附件中是代码。初学进程间通信,代码很乱。两个主要文件:syncpppinit.c编译后为独立程序,做的事是给一个文件lockfile加排它锁,并统计到达同步位置的pppd进程的数目,到达预定数目后解锁文件。syncppp.c文件中的syncppp()函数用于在chap_respond()中做进程同步。它会操作相关信号量以便syncpppinit能正确计数,以及尝试加锁lockfile。当syncpppinit解锁时,所有的pppd进程将加锁成功,同时继续运行并发送respond,从而达到我们的目的。当然这一定不是最好的同步方式。本人菜鸟一个,希望有大牛可以写一个更好的版本
修改了pppd后,拨号脚本代码段像这样:

  • # 多拨数
  • PPP_NUM=2
  • # 用户名
  • USERNAME='user'
  • # 密码
  • PASSWORD='123456'
  • # 多个wan接口的前缀,比如用macvlan生成了eth1, eth2,... 就设置成eth
  • WAN_IF_PREFIX='eth'
  • # 生成的pppoe接口名前缀,这个应该关系不大
  • PPP_IF_PREFIX='pppoe-'
  • pkill -f pppd && sleep 3
  • # start all pppd with a loop
  • for i in $(seq 1 $PPP_NUM)
  • do
  •     echo -n "executing pppd for connection ${i} ... "
  •     pppd plugin rp-pppoe.so syncppp $PPP_NUM mtu 1492 mru 1492 nic-${WAN_IF_PREFIX}${i} nopersist \
  •     usepeerdns user ${USERNAME} password ${PASSWORD} ipparam wan ifname ${PPP_IF_PREFIX}${i} nodetach &
  •     echo "done"
  • done

[color=rgb(51, 102, 153) !important]复制代码

抓个包看看,哈哈,成功了!用这种方式可以稳定拨到15拨以上。


最后是带宽叠加后的效果图:


本文只讨论建立PPPOE连接。而多拨中大家另一个经常问到的问题是负载不够均衡。我后面会再写一篇博文讨论这一问题。

原文链接: http://www.morfast.net/blog/linux/pppoe-multilink/,转载请注明出处,谢谢!

编译好的ipkg包(编译自dreambox-openwrt revision 423, 2012.4.19更新):
ppp_2.4.5-4_x86.ipk.tar.gz (105.78 KB, 下载次数: 568)
ppp_2.4.5-4_brcm63xx.ipk.tar.gz (108.6 KB, 下载次数: 903)
ppp_2.4.5-4_ar71xx.ipk.tar.gz (107.63 KB, 下载次数: 1932)

ppp-mod-pppoe_2.4.5-4_ar71xx.ipk.tar.gz (9.52 KB, 下载次数: 1340)
ppp-mod-pppoe_2.4.5-4_x86.ipk.tar.gz (9.58 KB, 下载次数: 381)
ppp-mod-pppoe_2.4.5-4_brcm63xx.ipk.tar.gz (9.49 KB, 下载次数: 604)


---------------zjhzzyf添加并发拨号脚本------------------------------------------
添加并发拨号脚本,自动读取wan数量和用户名密码,未进行测试
使用方法 解压缩后放到到路由任意位置
例如解压缩到usr/bin/pppoeup
chmod 755 usr/bin/pppoeup
执行 sh /usr/bin/pppoeup
也可以在 rc.local  添加,开机时候执行并发拨号
sh /usr/bin/pppoeup

pppoeup.tar.bz2 (1.24 KB, 下载次数: 2369)

-----------------------------------------以上------------------------------------------------


针对于WNDR3800、WZR-HP-AG300H等AR芯片的相关文件下载:

http://www.wifihell.com/dl/source/ppp_2.4.5-4_ar71xx.ipk.tar.gz
http://www.wifihell.com/dl/sourc ... 4_ar71xx.ipk.tar.gz
http://www.wifihell.com/dl/source/pppoeup.tar.bz2

相关帖子

WIFIHELL | 万丰乐活 2020开启新的征程,好货不断!
kingmax22 发表于 2014-10-24 22:47:19 | 显示全部楼层
整理得非常详细,谢谢楼主了!有点高升。。。
WIFIHELL | 万丰乐活 2020开启新的征程,好货不断!
关闭

站点推荐上一条 /1 下一条

万丰乐活

GMT+8, 2024-3-29 19:55

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表