早期Ngrok是免费的,最近几年就花钱了。其实道理都一样,nginx接请求,转发给ssh的隧道tunnel,下面来实现:
本例子是所有的命令都在一个机器上运行,实现目的是访问这个服务器上的80端口,80端口转给本地的3333端口(sshd监听),然后3333端口转给本地的8888端口(sshd隧道),本地的8888服务是个python的HTTPsimpleserver。总结就是访问80端口,实际访问的是8888端口。
1、nginx配置:
server {
server_name tunnel.moneyslow.com;
access_log /var/log/nginx/$host;
location / {
proxy_pass http://localhost:3333/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_redirect off;
}
error_page 502 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
有了此配置,假设我访问了 tunnel.moneyslow.com, Nginx 将接收连接,并看到它应该对其进行反向代理。 它会有效地将连接传递给正在侦听端口 的任何应用程序3333。 目前,没有任何程序正在侦听此端口,因此我们将从 Nginx 获得502 Bad Gatewayor404 Not Found错误。
2、建立隧道:
ssh -R 3333:localhost:8888 tunnel.moneyslow.com
这个例子是ssh隧道和web服务在一个机器上,如果8888服务在内网其他机器上,就可以改为ip地址:
ssh -R 3333:xx.xx.xx.xx:8888 tunnel.moneyslow.com
3、起个服务:
python -m http.server 8888
4、https加密,在第一步的nginx配置里加证书配置:
server {
server_name tunnel.moneyslow.com;
access_log /var/log/nginx/$host;
# These three lines are new.
listen 443 ssl;
ssl_certificate /path/to/tls/cert/fullchain.pem;
ssl_certificate_key /path/to/tls/cert/privkey.pem;
location / {
proxy_pass http://localhost:3333/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_redirect off;
}
error_page 502 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}