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 涉及三台机子:
- 不在公网上,但是承载了网页/jupyter lab等任务的网页端,就像我们实验室的电脑或者车子。
- IP暴露在公网上的转接服务端,localtunnel提供一个在海外的转接服务器; 我们的ram-lab.com服务器或者各类云服务器.
- 想要访问/使用网页端服务的客户端。
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
下面给出的url是一个随机名字,直接登这个网站就能从公网连接到这个端口的网页上。
自己搭建一个localtunnel转接服务器
鉴于loca.lt的速度以及不透明性,我们很可能需要寻求一个自己的localtunnel服务器.
这个中转服务器需要以下的条件之一:
- 其需要有一个对应的域名,如ram-lab.com. google.com. 这种情况下我们可以允许在不同的端口开启localtunnel server.
- 没有自己的域名,只有一个可以公开访问的IP,这种情况下我们可以通过改hosts让这个网页可以被正常访问.但是服务器必须使用端口80
在安装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
从现在开始这个公开的服务器就成为了一个好用的中介桥接
如果公开服务器有公开域名
在承载网页的服务器上,运行
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也可以访问.