ngrok作为一款内网穿透工具,可以很方便的把内网设备映射到公网访问。不少路由器固件上都集成了这个工具。最近在两台路由器上设置ngrok时遇到了不能启动的问题。
设置token为可选参数
为了防止服务被滥用,大多数ngrok服务商的配置中都有token参数,不过我的ngrok服务端是自己搭的,没有设置token。而部分固件中token却是必填参数。因此缺少token会导致启动失败。比如我用的K2P官改固件中就存在这个问题:
解决方法:编辑 /etc/init.d/ngrokc 文件,找到类似下面的判断语句:
if [ -z "$shost" -o -z "$sport" -o -z "$token" ]; then
return 0
fi
改为:
if [ -z "$shost" -o -z "$sport" ]; then
return 0
fi
保存,重启ngrok服务即可。
解决“本地IP地址输入错误”的问题
在输入本地IP地址时,我一般用127.0.0.1作为路由器本机的IP,不过保存时却遇到提示:“本地IP地址输入错误”。原来是限制只能输入LAN网段的IP(192.168.0.X),不支持输入其他IP或者localhost等的地址。固件是在前端用JS判断的,简单修改即可。
解决方法:编辑 /usr/lib/lua/luci/view/pc/ngrok.htm 文件,注释下面位置的代码:
function saveto_ngrok(index){
var ival=document.getElementById("SubDomain").value.replace(/(^\s*)|(\s*$)/g, "");
var err;
if(document.getElementById("Protocol").value=="TCP")
{
err = checkNumNew(document.getElementById("RemotePort").value, 1, 65535);
if(E_NONE != err){
showAlert("TCP协议必须填写远程端口,端口有效值为1-65535");
return;
}
}
else
{
if(ival=="") {
showAlert("请输入子域名!HTTP及HTTPS协议必须输入子域名!");
return;
}
}
err = checkNumNew(document.getElementById("LocalPort").value, 1, 65535);
if(E_NONE != err){
showAlert("本地端口错误,端口有效值为1-65535");
return;
}
//把下面代码注释掉即可
// err = checkIp(document.getElementById("LocalIP").value);
// if(E_NONE != err){
//
// showAlert("本地IP地址输入错误");
// return;
//
// }
ngrokList[index].subdomain=document.getElementById("SubDomain").value;
ngrokList[index].ip=document.getElementById("LocalIP").value;
ngrokList[index].lport=document.getElementById("LocalPort").value;
ngrokList[index].rport=document.getElementById("RemotePort").value;
ngrokList[index].protocol=document.getElementById("Protocol").value;
ngrokList[index].domaintype=domainmode;
gen_mainTable();
document.getElementById("main_box").style.display = "block";
}
添加SSL支持
另一台路由器的ngrokc启动时报错:ssl_handshake returned -0x50,因为固件是我很早前编译的(还是Barrier Breaker版本),软件版本也很旧了,索性更新了一下ngrokc传上去,并且在路由器上添加SSL支持。
mkdir -p /etc/ssl/certs
export SSL_CERT_DIR=/etc/ssl/certs
opkg install ca-certificates
重启一下ngrokc服务,问题解决。
参考:
宝贝好棒棒哦,我回去折腾看看
→_→