tunnelbroker

代替内网穿透工具Ngrok的方案:nginx+ssh隧道

早期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;
    }
}