前言
内网穿透说白了就是要有公网IP,网上的文章推荐的花生壳软件,他肯定也是挑了个公网IP分给你。
不过我不喜欢装软件,能不装就不装
所以就用自己的云服务器和公网IP搞一下
背景
我搞这个是想在公网能访问我自己电脑部署的stable-diffusion服务
SSH反向隧道
ssh -fNR LOCAL_PORT:localhost:REMOTE_PORT root@REMOTE_IP
这个的作用,是把远端主机所有发送到REMOTE_PORT端口的包转发到本地主机上
是双向通信
nginx反向代理
nginx默认会使用/etc/nginx/nginx.conf这个文件,这里指定include了/etc/nginx/conf.d中的*.conf
所以在/etc/nginx/conf.d下新建个default.conf然后写入配置就行
server {
listen 9876;
server_name your_domain_or_server_ip;
location / {
proxy_pass http://127.0.0.1:7860;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# WebSocket代理配置
location /ws {
proxy_pass http://127.0.0.1:7860;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Origin "";
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400;
}
}
**注意:**上述写法只能代理访问路径是url/ws的websocket请求,如果websocket代理报错什么websocket请求404 not found,很可能是因为协议没升级,普通地作为http请求转发过去了,检查配置路径是否正确
或者,将websocket代理合并到主路径:
server {
listen 9876;
server_name your_domain_or_server_ip;
location / {
proxy_pass http://127.0.0.1:7860;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Origin "";
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400;
}
}
反向代理的作用,是监听云服务器上的另一个端口,然后转发给ssh隧道所建立的端口
因为端口只能被一个进程绑定,所以需要一个服务器来转发请求
运行
通过ssh反向隧道将本地的7860端口与云服务器的7860端口建立连接
再通过nginx反向代理,将云上9090端口收到的包反向代理给7860端口
访问云服务器的9090端口,即可实现到本地主机7860端口的内网穿透