在上一篇文章中,我设置了用ngrok转发端口来实现对内网NAS的访问,但是如果转发用的是国内的VPS,会由于域名没有备案而被关停。解决方法一个是搞个备案过的域名。现在阿里云等云服务都有便宜的域名,所以这不是大问题。还有个方法就是绕开HTTP访问,比如我这里用的HTTPS。
方法简述
就是在NAS上建立一个Nginx服务,然后启用HTTPS(这部分就不详细介绍了,网上文章很多,我配置的是8443
端口以免常用端口被检测),然后通过代理将访问路径/transmission/
的请求转发到NAS的9091端口上。
初步方案
一开始就直接做了个转发,在Nginx的网站配置如下:
location /transmission {
proxy_pass: http://127.0.0.1:9091;
}
但是这样却出现了问题,由于缺少Transmission的一个特有的请求头会造成409错误,而且不知为啥有静态文件无法获取。
改进方案
有这种需求的肯定不止我一个,所以马上就放狗搜了一下,还真找到了一篇文章,把上面的配置改成如下:
location ^~ /transmission {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_pass_header X-Transmission-Session-Id;
add_header Front-End-Https on;
location /transmission/rpc {
proxy_pass http://127.0.0.1:9091;
}
location /transmission/web/ {
proxy_pass http://127.0.0.1:9091;
}
location /transmission/upload {
proxy_pass http://127.0.0.1:9091;
}
location /transmission/web/style/ {
alias /usr/share/transmission/web/style/;
}
location /transmission/web/javascript/ {
alias /usr/share/transmission/web/javascript/;
}
location /transmission/web/images/ {
alias /usr/share/transmission/web/images/;
}
location /transmission/ {
return 301 https://$server_name/transmission/web;
}
}
这样就行了,今后只要访问VPS的/transmission/
(如http://example.com:8443/transmission
)就和直接访问Transmission的9091端口一样了。
更进一步
但是这样还是能直接访问8443端口,能不能让这个端口不能直接访问呢,答案是可以。
我们需要用到cookie,cookie是什么就不多解释了。我们只要在Nginx的网站配置中最初的location
块之前添加如下内容就可以了。
if ($http_cookie !~ "key=abcdef") {
reutrn 444;
}
上面配置的意思是,访问网站时的请求要包含一个名称是key
、值是abcdef
的cookie(这两个参数可以自己设定),否则就抛弃请求。444
是一个特殊的错误码,Nginx遇到这个错误码会直接抛弃请求(就好像没有服务似的),而不会真正地返回错误。
这样,我们只要用一些特殊手段(Firefox或者Chrome的开发者工具或者一些附加组件/扩展程序)给网站添加一个名称是key
、值是abcdef
的cookie,就能访问了,而没有这个cookie时访问就好像服务不存在一样,彻底断绝检测到未备案网站的可能性。
微信支付宝
感谢,学习了! 贴上我的配置段:
server {
listen 443;
listen [::]:443;
server_name pt.tzc003.club;
ssl on;
ssl_certificate /etc/nginx/pt.tzc003.club.crt;
ssl_certificate_key /etc/nginx/pt.tzc003.club.key;
auth_basic “Restricted”;
auth_basic_user_file /etc/nginx/password;
location / {
proxy_pass http://127.0.0.1:9091;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_http_version 1.1;
proxy_set_header Connection “”;
proxy_pass_header X-Transmission-Session-Id;
add_header Front-End-Https on;
}}
不错,你这个简洁明了。
谢谢,成功了