2016 年 10 月 8 日,校园网认证客户端换成了 drcom,版本为 5.2.1(p)。使用 Linux 的我不得不再折腾 :(

可行性测试

首先,参考 p 版简略使用和配置说明 抓包,生成 config.txt,重命名为 drcom.conf。可是在 “PC 上测试” 那一步卡住,拨号失败了。

参考 关于 P 版的 PPPoE 拨号问题,发现用户名(账号)前多了 \r\n,利用 wiki 中的方法让 PC/OpenWrt 成功拨号,连接上了,能够上网。

OpenWrt 下需要对 /lib/netifd/proto/ppp.sh 打补丁,运行以下命令即可。

#!/bin/sh
cp /lib/netifd/proto/ppp.sh /lib/netifd/proto/ppp.sh_bak
sed -i '/proto_run_command/i username=`echo -e "$username"`' /lib/netifd/proto/ppp.sh

然而,这并不完美,PPPoE 每 1-2 分钟断开一次,所以需要继续折腾。可是,继续原来的教程,运行当时仓库的 python 脚本 latest-pppoe.py,一堆错误,认证失败了,该断的时候还是断了。翻了一下 drcoms/drcom-generic 的 closed Issues,发现很多和 5.2.1(p) 相关的 Issue,测试大大们提供的脚本,结果表明 Issue #116 在我所在环境有效。值得注意的是所有的文件的换行字元都必须为 LF(Unix 的换行字元),不能是 CRLF(Windows 的换行字元),可用 Visual Studio CodeAtom 等现代编辑器修改文件的换行字元。

有些路由器可能一直不能成功拨号,我猜测是因为改过硬件,没有有效的 MAC

解决方法:

ssh root@192.168.1.1
uci set network.wan.macaddr='xx:xx:xx:xx:xx:xx'
uci commit network
/etc/init.d/network reload

xx:xx:xx:xx:xx:xx 为 MAC 地址,可以用电脑的。这里有 查看电脑 MAC 地址的方法

在 OpenWrt 上安装 Python 2

ssh root@192.168.1.1
opkg update
# OpenWrt 15.05+
opkg install python-light python-logging python-openssl python-codecs
# OpenWrt 14.07
opkg install python-mini
exit

如果无法安装,则需要检查一下软件源。15.05 以上软件源信息在 /etc/opkg/distfeeds.conf,老版本的在 /etc/opkg.conf,根据以下格式修改之。

# 15.05.1/ar71xx/generic 的软件源,ar71xx/generic 为硬件类型
src/gz chaos_calmer_base http://openwrt.proxy.ustclug.org/chaos_calmer/15.05.1/ar71xx/generic/packages/base
src/gz chaos_calmer_luci http://openwrt.proxy.ustclug.org/chaos_calmer/15.05.1/ar71xx/generic/packages/luci
src/gz chaos_calmer_management http://openwrt.proxy.ustclug.org/chaos_calmer/15.05.1/ar71xx/generic/packages/management
src/gz chaos_calmer_packages http://openwrt.proxy.ustclug.org/chaos_calmer/15.05.1/ar71xx/generic/packages/packages
src/gz chaos_calmer_routing http://openwrt.proxy.ustclug.org/chaos_calmer/15.05.1/ar71xx/generic/packages/routing
src/gz chaos_calmer_telephony http://openwrt.proxy.ustclug.org/chaos_calmer/15.05.1/ar71xx/generic/packages/telephony

也可以自己编译带 Python 的固件,当然能够 编译自带 Drcom 的 OpenWrt 固件 就更好了。

文件的准备与部署

以下文件需要放在相应的文件夹中,以方便部署。

etc/drcom.conf:

server = '10.0.3.2'
PPPoE_flag = '\x6b'
keep_alive2_flag = '\xdc'

Issue #150 · drcoms/drcom-generic 提醒 drcom.conf 的 PPPoE_flag 更新了,奇怪的是通过上文提到的步骤抓出来的 PPPoE_flag 还是 \x6a。我没有验证过,因为我目前在用 C 写的 chenhaowen01/gdut-drcom-for-openwrt

usr/bin/drcom: 可用的 python 脚本,如 Issue #116 (将 IS_TEST 的值改为 False)。注:现在直接用仓库的最新的 latest-pppoe.py 就可以。

最后,需要让 python 脚本在 PPPoE 拨通后自动执行。需要额外的脚本,见下面的 99-drcom。其实,wiki 上就有,只是改了 wan 口的名称而已。

etc/hotplug.d/iface/99-drcom:

#!/bin/sh
[ "$ACTION" = ifup ] || exit 0
[ "$INTERFACE" = wan ] || exit 0
sleep 10
/usr/bin/drcom

赋予脚本可执行的权限,也可以在部署、ssh 登录后再做

chmod +x usr/bin/drcom

将所有文件上传到 OpenWrt

scp -r usr etc root@192.168.1.1:/