Localtunnel 踩坑记

什么是localtunnel

Localtunnel是一个npm的包,是一个挺方便的内网穿透工具,就是将内网的网页端口映射到公网中。如果是在国内,类似的有花生壳工具,但是花生壳现在由于某些原因已经禁止从港澳登录/穿透IP指向港澳。如果是国外,有商用的ngrok。

内网穿透之后可以让jupyter-lab或者本地web-based development的工具在校外都可以使用,并在低带宽条件下实现方便的远程控制(大家使用的ssh在可视化和可编辑化上比较糟糕,而jupyter-lab融合了terminal,文件管理以及jupyter notebook,在开发上有一定优势)。

Localtunnel则是一个开源的包,相比于ngrok来说可控性更强。但是默认的localtunnel工具需要连接到由他们运营的海外的localtunnel服务器,在一定程度上安全性还不够令人放心。

但是我们可以通过自己搭建localtunnel server的方式,使用自己的server,使得整个流程对我们自己完全透明。


localtunnel 涉及三台机子:

Ubuntu 网页端系统搭建

首先需要完成的是搭建一个本地的网络服务/jupyter lab.

本地需要安装nodejs, npm,以及网页搭建本身的材料(这里举apache以及jupyter lab为例).

Ubuntu Node Js的安装 参考这个链接

sudo apt install curl -y
sudo curl -sL https://deb.nodesource.com/setup_16.x | bash -
sudo apt-get install -y nodejs npm

Jupyter lab的安装 (默认 pip3与python3已经正确安装)

pip3 install --user jupyterlab jupyterlab-git xeus-python
jupyter labextension install jupyterlab-python-file

之后需要允许jupyter 可以被外网访问并设置密码:

jupyter notebook --generate-config
## .jupyter/jupyter_notebook_config.py
## allow_remote_access=True
## ip = '*'
## Run The following command to set password
python3 -c "from notebook.auth import passwd; passwd()"

之后在tmux或者后台运行 jupyter lab形成网站

jupyter lab --port $LOCAL_PORTNUM --no-browser >> dev/null 2>&1 &

此后在本地浏览器就能打开jupyter lab;若这个机子本身就可以被其他机子通过网络访问(如局域网),则其他机子也可用浏览器打开这个页面。


下一步需要设置localtunnel

npm install -g localtunnel
# localtunnel, 使
lt --port $LOCAL_PORTNUM

Screenshot from 2021-07-27 13-07-26.png

下面给出的url是一个随机名字,直接登这个网站就能从公网连接到这个端口的网页上。


自己搭建一个localtunnel转接服务器

鉴于loca.lt的速度以及不透明性,我们很可能需要寻求一个自己的localtunnel服务器.

这个中转服务器需要以下的条件之一:


在安装nodejs的基础上,安装localtunnel server 并运行:

git clone https://github.com/localtunnel/server.git
cd server
npm install
npm install -g esm
# tmux
node -r esm bin/server --port $SERVER_PORT # SERVER_PORT is usually 80

从现在开始这个公开的服务器就成为了一个好用的中介桥接


后面的设置参考1, 以及参考2.

如果公开服务器有公开域名

在承载网页的服务器上,运行

lt --port $LOCAL_PORT --host http://helloworld.com:$SERVER_PORT --subdomain mysubdomain
#your url is : http://mysubdomain.helloworld.com:$SERVER_PORT

在公网自己的最终客户端上,输入以上的网址应当就能访问

如果公开服务器没有公开域名

这个时候我们需要手动更改客户端以及网页端的HOSTS文件。要求服务器开放的端口是80

Ubuntu Hosts

sudo nano /etc/hosts
## SERVER_IP example.com mysubdomain.example.com

Windows Hosts

位置

C:\Windows\System32\drivers\etc\hosts
SERVER_IP example.com mysubdomain.example.com

网页端在更改Hosts之后运行

lt --port $LOCAL_PORT --host http://example.com --subdomain mysubdomain

客户端更改hosts之后在浏览器输入 mysubdomain.example.com也可以访问.