继上次将路由刷到dd-wrt后,一直琢磨着如何绕过网管对路由的限制。开始以为是对非windows主机拨号都有限制,后来用wireshark抓包发现只是接入设备对echo请求没有响应,导致超时后自动断开。在windows下默认不发送请求,只回应来自对方的echo请求,大约6秒一次。找到问题的根源后,在ubuntu下修改了ppp配置选项,文件位于/etc/ppp/options,找到如下两行:
lcp-echo-interval 30
lcp-echo-failure 4
这两个参数表示在一个lcp链路协议中,pppd会每隔30秒发出一个echo请求包到对方。一般来说对方在收到echo请求后需要回应一个echo应答。如果发送4次请求后都没有收到有效的回应,pppd便会中断这次连接,也就是在两分钟左右就会断网,与之前遇到的现象一致。既然用不到这两个参数,就可以在前面加#号注释掉,保存后重新拨号一切正常了。
既然在ubuntu下成功了,那基于linux系统的TEW-652BRP路由器应该也是可以这样搞定,在web管理界面将路由器的广域网设置为PPPoE拨号上网,输入正确的账号密码,保存后再通过ssh登录,查看进程发现pppd已经运行了,后面的参数可以看到调用的配置文件路径。
root@Dorole Network:~# ps | grep ppp
1074 root 1324 S pppd file /tmp/ppp/options.pppoe
打开/tmp/ppp/options.pppoe
root@Dorole Network:~# cat /tmp/ppp/options.pppoe
plugin /usr/lib/rp-pppoe.so
nic-eth1
noccp
nomppc
noipdefault
noauth
defaultroute
noaccomp
nobsdcomp
nodeflate
nopcomp
nomppe
usepeerdns
user ‘…’
password ‘…’
default-asyncmap
mtu 1492
mru 1492
persist
lcp-echo-interval 5
lcp-echo-failure 10
最后面的两行就是要修改的地方了,不过这里要修改比较麻烦。/tmp目录下的东西是在开机后自动生成的,每次重启都要修改那也太麻烦了,/etc/config目录下也有个配置文件存在,且无法修改,后来想把固件在电脑上解开修改完再刷进去,但是现有的工具只支持linksys的固件,拿源代码编译更麻烦。最后想到dd-wrt是支持脚本的,于是弄了一段shell让它每次开机都自动运行。
cat /tmp/ppp/options.pppoe | sed -e "s/lcp/#lcp/g" > /tmp/ppp/options.pppoe.new if [ -f "/tmp/ppp/options.pppoe.new" ]; then killall redial killall pppd sleep 10 /usr/sbin/pppd file /tmp/ppp/options.pppoe.new > /dev/null fi
将options.pppoe文件中的lcp替换成#lcp也就是注释了那两个参数,重启pppd加载新的配置文件,经过这样处理后上网正常了。