如题,戳这里

本帖最后由 softtip 于 2016-2-3 11:42 编辑

前言

网络上关于多拨的的资料满天飞,我以前是用DUALWAN的,马马虎虎也就将就用着那个路由器自己改的脚本凑合用着,主路由是ASUSN16,另外有一条静态IP线路接入,做成了DUALWAN路由做多拨,N16做双WAN接入,用了2年,最近闲下来在折腾以前的电信猫RG100A-AA,刷了OPENWRT,觉得灵活度蛮高,就是一个五脏俱全的LINUX,就把N16折腾成OPENWRT了,多拨也折腾了下终于正常,只是最近觉得N16自从换了OPENWRT以后,性能实在是不堪入目,100M带宽都跑不满,研究了好几天,确定了WRT1900AC基本可以跑接近1000M带宽,正好论坛团购就入手一台。之前加了1900AC的QQ群,里面的人都说1900AC不支持并发多拨,又说不出个所以然来,我没当回事,纯软件的东西也不复杂,我在X86,N16,RG100A上都可以,1900AC没道理不可以嘛!直接把之前N16上弄好的多拨移到了1900AC上,谁知这就是问题的开始,后面慢慢道来。

由于本人水平有限,后面所写的观点,分析也许不一定正确,望各路高手批评指正。但是保证我的并发多拨方试绝对的可用性!

一、OpenWrt15.05 CC版本的PPPOE拨号机制分析

OpenWrt CC版本和以前的AA BB版本在拨号机制上有一定的差别,CC使用netifd套件来控制网络的连接、关闭等状态,并通过UBUS和核心控制程序通信。Netifd主要的代码位于/lib/netifd下,pppoe拨号涉及的主要几个系统脚本是ppp-up.sh ppp-down.shproto/ppp.sh这几个文件

当我们在OP的接口界面点击连接的时候,系统进行了以下的操作:

(1)    读取账号密码等设置信息 传递给ppp.sh

(2)    Ppp.sh进行初始化参数

(3)    关闭物理接口ubus.call.wan.down,然后启动接口ubus.call.wan.up 实际上就是ifup

(4)    Ppp.sh调用pppd进行PPPOE拨号连接

(5)    拨号成功后由ppp-up.sh进行DNS、路由表等设置

(6)    给UBUS系统传递已连接信号

(7)    触发MWAN3等程序监控连接

而断开连接的时候,系统进行了以下操作:

(1)       调用ppp-down.sh脚本

(2)       干掉pppd进程

(3)       关闭接口ifdown

二、并发多拨的实现思路

1、 pppd作为拨号程序,要实现并发多拨,也就是要同时和服务器响应指令,关键在于同时,参考前辈的解决方案,直接修改pppd源代码,通过进程通信同步的方式,实现同时响应服务器指令

2、 使用macvlan建立多块虚拟网卡,将虚拟网卡全部设置为pppoe模式,分别设置不同的跃点(mwan3负载均衡要用到),而物理网卡设置为不配置协议(后面解释为什么要设置为不配置协议)

3、 第1步处理好了拨号以后,还必须处理DNS、路由表、iptables,才能实现网络的畅通,这一步可以自己写脚本实现,不过我水平不高,写出来以后,什么都正常,通过mwan3也能叠加带宽,唯一的问题是过不了多久ubus就崩溃了,体现在能上网,但是管理页面打不开,提示ubus不能连接

4、 改变思路 我只处理pppd拨号阶段,其余的处理dns、路由表,与系统ubusd通信全部交给op自己的netifd完成,经测试完全正常

5、 那我们怎么接管ppp.sh里面的拨号过程呢,网上给出的方法是注释掉那几行代码,实际上这并不科学,因为注释掉以后,脚本运行到那里并不会停止,没有调用pppd,脚本结束,netifd机制认为拨号失败,就会再次进行关闭网卡,打开网卡,重新拨号,这样的过程,导致2个结果网卡不停开关,我们的脚本不能拨号,常常是在拨号的时候,网卡被NETIFD关闭了,另外,反复的进行开关网卡这个过程会导致路由器CPU占用过高,变卡变慢,不得不关闭这些网卡。解决思路:修改ppp.sh 检测我们的拨号脚本是否在进程中,如果不在,进行系统默认的拨号,如果在,那么跳过调用pppd拨号,暂停起来等待我们的拨号脚本拨号,等拨号成功后,再继续后续的处理操作

三、编译制作我们自己的并发多拨进程通信pppd

具体分析实现我就不再写了,这是前人的精髓,我就在这里直接把如何编译简单说一下

1、 根据前人成功的代码制作ppp的patch补丁(附件可下载)

2、 将补丁放进/package/network/services/ppp/patches/

3、 修改/package/network/services/ppp/Makefile的第38行为DEPENDS:=+kmod-ppp+libpthread

4、 编译ppp包,然后到/build_dir/target-arm_cortex-a9+vfpv3_uClibc-0.9.33.2_eabi/ppp-default/ppp-2.4.7/pppd/里面把pppd复制出来即可,不需要ipk安装包的

5、 将提取出来编译好的pppd替换路由器/usr/sbin/pppd

四、修改/lib/netifd/proto/ppp.sh实现拨号步骤的接管和暂停

修改/lib/netifd/proto/ppp.sh

将     proto_run_command"$config" /usr/sbin/pppd \

nodetach ipparam"$config" \

ifname "$pppname" \

${localip:+$localip:} \

${lcp_failure:+lcp-echo-interval$lcp_interval lcp-echo-failure $lcp_failure $lcp_adaptive} \

${ipv6:++ipv6} \

${autoipv6:+set AUTOIPV6=1} \

nodefaultroute \

usepeerdns \

$demand maxfail 1 \

${username:+user"$username" password "$password"} \

${connect:+connect"$connect"} \

${disconnect:+disconnect"$disconnect"} \

ip-up-script /lib/netifd/ppp-up \

ipv6-up-script /lib/netifd/ppp-up\

ip-down-script/lib/netifd/ppp-down \

ipv6-down-script/lib/netifd/ppp-down \

${mtu:+mtu $mtu mru $mtu} \

"$@" $pppd_options

修改为

state=`ps|grep -c mypppoe`

if [ "$state" -ge "2" ];then

/root/pppsleep.sh

else

proto_run_command "$config"/usr/sbin/pppd \

nodetach ipparam"$config" \

ifname "$pppname" \

${localip:+$localip:} \

${lcp_failure:+lcp-echo-interval$lcp_interval lcp-echo-failure $lcp_failure $lcp_adaptive} \

${ipv6:++ipv6} \

${autoipv6:+set AUTOIPV6=1} \

nodefaultroute \

usepeerdns \

$demand maxfail 1 \

${username:+user"$username" password "$password"} \

${connect:+connect"$connect"} \

${disconnect:+disconnect"$disconnect"} \

ip-up-script /lib/netifd/ppp-up \

ipv6-up-script /lib/netifd/ppp-up\

ip-down-script/lib/netifd/ppp-down \

ipv6-down-script/lib/netifd/ppp-down \

${mtu:+mtu $mtu mru $mtu} \

"$@" $pppd_options

fi

红色为修改部分,代码很简单,如果检测到我们的拨号脚本mypppoe在运行,那么就执行/root/pppsleep.sh暂停下来,如果没有检测到那么就进行pppd拨号

Pppsleep.sh内容如下

#!/bin/sh

while [1 -eq 1 ]

do

sleep10

done

没啥功能,就是不断的sleep暂停

暂停以后,等待我们的额拨号脚本完成拨号,拨号完成后我们的脚本kill掉pppslepp.sh进程,ppp.sh就会继续运行完成后续的DNS、路由表等工作

五、  拨号脚本

因为我们的脚本会通过ifup ifdown来不断控制网卡的打开和关闭,如果物理网卡eth1每次都被关闭再打开,那么虚拟网卡又要重新建立,会浪费一定的时间,所以在之前我提到的设置里面,WAN口的物理网卡eth1设置为“不配置协议”,名字设置为wan0,其余的设置为wan1,wan2,wan3…

配置wan1,wan2,wan3…前先运行脚本mypppoe.sh initvth创建虚拟网卡,创建以后才可以在接口中设置wan1,wan,wan3…

本脚本实现的是在指定的时间内(比如凌晨4-6点进行多拨,必须达到要求的多拨数量),在其余的时间进行多拨,但是拨通次数大于1即停止拨号,以免影响正常上网。

脚本如下:

#!/bin/sh

help()

{

cat <

Syntax:mypppoe [command]

Availablecommands:

start           Init vth and start PPPOE

start force      Init vth and start PPPOE without timelimit

stop            Stop and remove iptables

restart         Stop and START

initvth         Init vth with macvlan

EOF

}

#判断当前是否有另一个脚本存在

state=`ps|grep-c mypppoe`

["$state" -ge "4" ] && echo another mypppoe is running

["$state" -ge "4" ] && exit

本脚本

#number是重拔次数

#number2是重拔次数(设定的多拨时间)

#n是几拔

#ok是拔上几次后退出拔号(正常时间)

#ok2是拔上几次后退出拔号(设定的多拨时间)

#wait是等待重拨时间(秒)

#wan0name是物理wan口的名字

#time1是设定的多拨起始时间

#time2是设定的多拨结束时间

number=100

number2=200

n=6

ok=1

ok2=4

wait=5

time1=4

time2=6

time_now=`date+%H`

if [$time_now -ge $time1 ];then

if [ $time_now -lt $time2 ];then

ok=$ok2

number=$number2

fi

fi

wan0name='wan0'

ifwan=$(uci-p /var/state get network.$wan0name.device)

start(){

if ["$1"x = "force"x ] ;

then

ok=$ok2

number=$number2

fi

#判断当前是否已经多播成功

j=$(ifconfig| grep pppoe-wan | wc -l)

if ["$j" -ge "$ok" ] ;

then

echo equal or more than the set [$ok]dial, and will exit.....

exit 0

fi

stop

echo [syncppp]change mac ...........

#开始更换随机mac地址

#执行initvth函数 初始化虚拟网卡和物理网卡

initvth

for q in $( seq 1 $number )

do

echo

echo___________________________________________________

echo [syncppp]start the $q dial...........

echo "[syncppp]ifupwan1~wan$n"

for k in $( seq 1 $n )

do

ifup wan$k

done

echo "[syncppp]ifup sleep 5"

sleep 5

#取得wan1口的账号和密码,用来多拨

user=$(uciget network.wan1.username)

pass=$(uci get network.wan1.password)

#开始并发拨号

echo [syncppp]sync dialing.............

for i in $( seq 1 $n)

do

interface=wan$i

ifname=vth$i

/usr/sbin/pppd plugin rp-pppoe.sosyncppp $n mtu 1492 mru 1492 nic-$ifname nopersist usepeerdns nodefaultrouteuser $user password $pass ipparam $interface ifname pppoe-$interface nodetachmaxfail 1 ip-up-script /lib/netifd/ppp-up ipv6-up-script /lib/netifd/ppp-upip-down-script /lib/netifd/ppp-down ipv6-down-script /lib/netifd/ppp-down &

done

echo [syncppp]sync dialcomplete.............

echo [syncppp]waiting 10s .............

sleep 10

j=`ifconfig|grep -c inet.*P-t-P`

echo [syncppp] [$n] dialed and [$j]dial succeed .....

! [ "$j" -ge "$ok"] && echo [syncppp] [$j] dial succeed, less than the the set [$ok]dial, and will retry...

[ "$j" -ge "$ok" ]&& echo [syncppp]succeed [$j] dial, equal or more than the set [$ok]dial, and will exit...

[ "$j" -ge "$ok" ]&& set_route_for_wman3

[ "$j" -ge "$ok" ]&& exit

echo [syncppp]kill process pppd ..........

stop

#如果拨号成功数为0 说明线路有问题 sleep 10分钟

if ["$j" -eq "0" ];

then

echo [syncppp]kill process pppd..........

echo "[syncppp]kill -SIGINT `pidofpppd`"

kill -SIGINT `pidof pppd`

stop

echo "[syncppp]ifdown $wan0name"

ifdown $wan0name

echo "[syncppp]sleep 600"

sleep600

initvth

fi

#等待重拨时间,可以自己调整

echo "[syncppp]sleep $wait"

sleep $wait

done

}

initvth(){

echo"[syncppp]ifup $wan0name"

ifup$wan0name

echo "[syncppp]ifconfig $ifwan promisc"

ifconfig $ifwan promisc

for i in $( seq 1 $n)

do

ifname=wan$i

ifvth=vth$i

if [ $(ip link | grep "${ifvth}@$ifwan:" | wc -l) == "0" ] ;

then

macfac=$(ifconfig | grep $ifwan| tr -s " " | cut -d " " -f5 | cut -b 1-8)

mac="$macfac:"$(md5sum /proc/sys/kernel/random/uuid | sed's/\(..\)/&:/g' | cut -b 1-8)

ip link add link $ifwan $ifvthtype macvlan

ifconfig $ifvth hw ether $mac

echo Add interface: $ifvth -$mac

fi

ifconfig $ifvth up

done

}

stop(){

echo"[syncppp][stop]"

echo"kill -SIGINT `pidof pppd`"

kill-SIGINT `pidof pppd`

echo"[syncppp]ifdown wan1~wan$n"

for q in$( seq 1 $n )

do

ifdownwan$q

done

echo"[syncppp]killall -9 pppsleep.sh"

killall-9 pppsleep.sh

}

set_route_for_wman3(){

echo"[syncppp][set_route_for_wman3]"

for i in$( seq 1 $n )

do

pp_wan=wan$i

ifname=vth$i

pp_name=pppoe-wan$i

if [ -n"$(ip route list dev $pp_name default | head -1)" ]; then

echo"[syncppp]$pp_name is ok!"

else

ifdownwan$i

fi

done

killall-9 pppsleep.sh

}

restart(){

stop

echo"restart sleep 10"

sleep 10

start

}

case"$1" in

start|stop|restart|initvth)

$*

;;

*)

help

;;

esac

exit 0

脚本说明:

1、mypppoe.sh initvth

初始化网卡,建立虚拟网卡vth1,vth2,vth3…

2、mypppoe.sh start

进行拨号,脚本根据设置的时间自动选择是必须多拨到几拨还是只要拨通就行

3、mypppoe.sh start force

强制多拨,忽略时间设置

4、mypppoe.sh stop

断开连接,关闭网卡

5、mypppoe.sh restart

关闭现在的连接并重拨

使用方法:

1、第一次使用时运行mypppoe.sh initvth初始化虚拟网卡,在op设置界面接口里面设置好wan口

2、建立一个startpppoe.sh文件,内容是mypppoe.sh start

3、将这个startpppoe.sh加入开机启动脚本中,开机脚本前加个SLEEP 20

例如sleep 20

/root/startpppoe.sh

4、计划任务中设置每10分钟执行一次脚本监测多拨状态,如果断线或者到达指定多拨时间则进行相应拨号处理

*/10 * * * * /root/startpppoe.sh

5、另外想手工强制多拨的也可以mypppoe.sh stop以后 隔上10秒钟运行mypppoe.sh start force

六、WRT1900AC WRT1200AC系列多拨BUG的解决

之前的脚本在WRT1900AC系列上有问题,问题在于macvlan虚拟出来的vth网卡完全不可用,dhcp也好,静态ip也好,pppoe也好,都不能用,有发送有接收就是不能通信,折腾了好几个销售,后来装上tcpdump准备看看是怎么回事,发现tcpdump一启动,虚拟网卡vth好了!就好了!。。。无语,看了下tcpdump的源码,感觉是有一行代码导致一切正常,那就是设置网卡为混杂模式!测试了一下,将物理网卡设置为混杂模式果然一切OK了,迎刃而解,修改了下脚本,一切OK,万事大吉!修改的部分为脚本红色的地方!

由于word复制到论坛,有些空格不见了,建议直接使用的话,脚本使用附件下载里面的,帖子里面的看看就好。

多拨以后请设置好mwan3,否则不能上网。

附件下载:

700-syncppp.rar (2.28 KB, 下载次数: 81)   pppd.rar (90.25 KB, 下载次数: 38)  mypppoe.rar (2.25 KB, 下载次数: 87)

结束语

这篇文章也没太多新奇之处,也许很多人会不屑一顾,但是对于很多伸手党来说,只会讨论某某固件可以多拨,只会问新版本有没有大神做个并发啊等等,写这篇文章的目的是让大家可以自己动手,不求人,靠自己,从编译到脚本自己搞定,换固件了,系统升级了,都不怕,不需等待,不需求人!本文的思路,脚本,与硬件无关,只要是15.05 cc均可以使用!只是编译的pppd是wrt1900ac/wrt1200ac使用的,其他路由的小伙伴们自己编译一下就好了!

全文无图,打字太累了,其实愿意花点心思认真看一下的人,有没有图完全不重要的!

x86 单线并发多拨_【转帖】适用所有CC版的 openwrt 单线并发多拨教程!!!相关推荐

  1. 不同用户同时并发测压_简单聊聊吞吐量(TPS)、QPS、并发数、响应时间(RT)概念...

    1. 响应时间(RT) 响应时间是指系统对请求作出响应的时间.直观上看,这个指标与人对软件性能的主观感受是非常一致的,因为它完整地记录了整个计算机系统处理请求的时间.由于一个系统通常会提供许多功能,而 ...

  2. Java并发编程实战_不愧是领军人物!这种等级的“Java并发编程宝典”谁能撰写?...

    前言 大家都知道并发编程技术就是在同一个处理器上同时的去处理多个任务,充分的利用到处理器的每个核心,最大化的发挥处理器的峰值性能,这样就可以避免我们因为性能而产生的一些问题. 大厂的核心负载肯定是非常 ...

  3. 不同用户同时并发测压_教你 7 招,迅速提高服务器并发能力!

    作者:潇洒一剑 链接:www.cnblogs.com/zengjin93 什么是服务器并发处理能力? 一台服务器在单位时间里能处理的请求越多,服务器的能力越高,也就是服务器并发处理能力越强. 服务器的 ...

  4. 500并发 一台服务器的性能_面试官绝杀:系统是如何支撑高并发的?

    作者 | 中华石杉 责编 | 伍杏玲 本文经授权转载石杉的架构笔记(ID:shishan100) 很多人面试的时候被问到一个让人特别手足无措的问题:你的系统如何支撑高并发? 大多数同学被问到这个问题压 ...

  5. qps多少才算高并发_要大到什么程度?才算高并发?

    文章目录 前言 在这里插入图片描述 一.什么是高并发? 定义: 关键指标: 关键指标的维度: 并发 引申指标: 二.多大算高并发 场景1: 场景2: 三.高并发的本质 对比包括: 前提包括: 总结 前 ...

  6. java 并发和并行_并发和并行性有什么区别?

    并发和并行性有什么区别? 示例被赞赏. #1楼 并发性:具有共享资源潜力的多个执行流 例如:两个线程争用一个I / O端口. 平行主义:将问题分成多个相似的块. 例如:通过在文件的每半部分上运行两个进 ...

  7. 深入理解计算机系统 -资料整理 高清中文版_在所不辞的博客-CSDN博客_深入理解计算机系统第四版pdf

    深入理解计算机系统 -资料整理 高清中文版_在所不辞的博客-CSDN博客_深入理解计算机系统第四版pdf

  8. 【可救砖】CM211-1/201-1等S905L3(B)_安卓9-通刷极致精简免拆语音-线刷固件及教程202208

    [语音版]CM211-1/201-1等S905L3(B)_安卓9-通刷极致精简免拆语音-线刷固件及教程!本固件为安卓9.0版本的线刷刷机包,可救砖!理论上可通刷680LC,M304A,M302A,IP ...

  9. 修改pppd,提高openwrt中pppoe多拨成功率

    原文链接: http://www.morfast.net/blog/linux/pppoe-multilink/,转载请注明出处,谢谢! 先上一张最终效果图吊吊大家胃口: 是的,这张是普通家用10M小 ...

  10. 计算机英语在线学习,英语单词记忆法超强记忆_免费背单词软件电脑版

    英语单词记忆法超强记忆_免费背单词软件电脑版 下载地址: 内容预览 如何背英语单词personify.mp4 如何背英语单词dote.mp4 如何背英语单词coddle.mp4 如何背英语单词drow ...

最新文章

  1. LinkedIn领英发布《2016中国人才趋势报告》
  2. errno_t open_s()打开文件出现的错误分析
  3. mysql .pdb是什么文件_计算广告算法到底要做什么?
  4. 深度 | 带领国产数据库走向世界,POLARDB底层逻辑是什么?
  5. Vue 实现 Open Graph 分享预览
  6. java中no1_【Java】-- 网络编程のNo.1
  7. 【原创】MySQL Connector/C 库的版本选择
  8. JavaScript机器学习之KNN算法
  9. 阿里问题定位神器 Arthas 操作实践,定位线上BUG,超给力
  10. PHP微信模版消息有时收不到_PHP微信开发之模板消息回复
  11. rgba与16进制互相转换
  12. 迷你迅雷,IE下载加速补丁(转)
  13. KP26--输入成本中心的标准作业量(活动类型价格)
  14. CAN学习笔记---负载率计算
  15. Spring Boot企业微信点餐系统
  16. Stimulsoft.Report的代码实现功能自学整理(一)
  17. mtk keypad
  18. 算法简介及计算机算法基础——算法学习(四)
  19. Oracle 数据库利用回收站恢复删除的表实例演示
  20. Allegro 16.6 给动态铜皮指定网络的时候***Net VCC was selected. Resuming current application。

热门文章

  1. 无卷积结构(那就纯ransformer)的参考图像分割:ReSTR: Convolution-free Referring Image Segmentation Using Transformers
  2. TYUT太原理工大学2022数据库考试题型大纲
  3. django-haystack 对 多对多字段( ManyToManyField )进行索引
  4. JAVA 开发基础【JSON相关】
  5. HDU 4826Labyrinth(dp)
  6. 罗格斯的计算机科学博士奖学金,移动性视角下智能城市的物理信息系统
  7. 按键1按下数码管显示1,按键2按下数码管显示2,按键3按下8个LED灯实现流水灯效果;
  8. steam显示没网络连接网络连接网络连接服务器,steam无法连接网络,steam显示无法连接网络...
  9. 硬件蓝牙测试软件,【原创】聊聊蓝牙测试专用硬件工具-Ubertooth
  10. java实现录屏_java录屏详细代码