header image

Ngxin HTTPS代理Transmission Web UI

在上一篇文章中,我设置了用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时访问就好像服务不存在一样,彻底断绝检测到未备案网站的可能性。

赞赏

微信赞赏支付宝赞赏

no comment

reply

your email will keep secret. (* required).

you can use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> .