依托云服务的NAS配置2


背景

上家云服务因为宁波区大手收紧,FRP的对等流量业务被发现了,因此服务器就4了。由于没有办法完整迁移服务器到阿里云的新服务器上,因此选择了重开。

结构改变

总体结构和实现思路完全没有变化,区别在于这次三个子域名的访问全部接入1Panel,然后创建三个独立的站点(静态页面),然后通过编写不同的配置文件实现不同的跳转功能。

结构拓扑图

至于这次为什么这么设计……因为我换了一个AI()

这么做的好处是彻底隔离了三个子域名的访问,并且全部同时支持了http和https协议,并且对于FRP的端口有了更严格的阻断,全部经过配置文件的转发流入FRPS的虚拟隧道,阻断不许可的端口和协议。非http/https协议的FRP依旧是直接暴露在公网。

这个做法和之前拥有同样的缺点,一个端口不能同时被两个nginx进程监听,因此使用i和o子域名访问nas的同一个端口时必须在外部使用不同的端口。

神秘小bug

由于webdav和管理页面全部走的是http协议,如果frpc直接连接frps,在直接指定外网域名的情况下,进入内部虚拟隧道的转发流量会被全部裁切掉端口号信息,转发出来之后的流量自动匹配的端口号优先匹配了管理页面的http,因此即使外部访问了webdav的端口仍会跳转出管理页面。

解决办法是在frp的连接中定义虚拟的域名作为区分。

frpc

[[proxies]]
name = "admin"
type = "http"
localIP = "127.0.0.1"
localPort = 1145
customDomains = ["admin.fnos"]

[[proxies]]
name = "webdav"
type = "http"
localIP = "127.0.0.1"
localPort = 1919
customDomains = ["webdav.fnos"]

nginx

location / {
        # 默认阻断
        set $frp_host "block";
        
        # 1. 如果是控制台端口进来的流量,把 Host 改写为 admin.fnos
        if ($server_port ~* "^(1145)$") {
            set $frp_host "admin.fnos";
        }
        
        # 2. 如果是 WebDAV 端口进来的流量,把 Host 改写为 webdav.fnos
        if ($server_port ~* "^(1919)$") {
            set $frp_host "webdav.fnos";
        }

        # 安全防空机制:如果有人敲 80/443,直接挂断
        if ($frp_host = "block") {
            return 444;
        }

        proxy_pass http://127.0.0.1:8080; # 虚拟隧道

        proxy_set_header Host $frp_host;
        
        proxy_ssl_verify off; # 防止网站ssl证书和fnos管理页自签证书不匹配被阻断连接
    }

文章作者: tukwhy
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 tukwhy !
  目录