V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
charce
V2EX  ›  NAS

Frp 内网穿透后,怎么通过同一域名+SSL+不同端口来访问?

  •  
  •   charce · 223 天前 · 2910 次点击
    这是一个创建于 223 天前的主题,其中的信息可能已经有所发展或是发生改变。

    因为群晖没有公网 IP ,所以使用 Frp 进行内网穿透。

    目前 Frp 已经能够实现IP+端口进行访问,但是 Frp 要进行 http 访问只能是“不同的域名+相同的端口”进行访问。

    我希望能保持“相同的域名+不同的端口”来进行访问,同时加上SSL 证书

    有尝试过在服务器再加上反代的方式来访问,但是都不能实现我想要的效果。

    请教各位大神这个要怎么弄?

    流程图示意如下:

    流程图示意

    第 1 条附言  ·  223 天前

    感谢各位的热心解答!

    因为我是初学者,很多东西都只能是一直尝试。

    原来其实走了很多弯路,一直在公网服务器尝试不同的反代设置。

    但其实最后发现只要在群晖设置好反代,frp把端口映射到公网就可以了,服务端只需要配置好Frps就可以!

    大概流程也说明一下:

    1. 在群晖和服务器先分别装好Frpc和Frps;
    2. 在群晖的反代服务器中,把原来http的端口反代设置到https的端口;
    3. Frpc中的端口使用群晖已经配置过的https的端口;
    4. 把域名解析到Frps对应的服务器IP就可以了!

    具体流程可以参考下面这个流程图,不对的地方请指正! piP8obq.jpg

    37 条回复    2023-10-18 15:30:30 +08:00
    JamesR
        1
    JamesR  
       223 天前   ❤️ 1
    1.公网服务器上面配个 Apache 。
    2.Apache 配置多个虚拟主机(域名相同,基于端口不同的)。
    3.每个虚拟主机配置反向代理,代理本地 Frp 穿透好的端口。

    需要学习下 Apache 的安装,虚拟主机和 SSL 的配置。
    PXW139
        2
    PXW139  
       223 天前   ❤️ 1
    这不 nginx 反代一下就可以,每个服务一个配置文件就行
    flashBee233
        3
    flashBee233  
       223 天前   ❤️ 1
    可以参考一下我的这个配置,我这也是自己摸索的,如有不对请指点
    PXW139
        5
    PXW139  
       223 天前   ❤️ 1
    哦,应该还有更简单的,直接一个配置文件搞定
    同时监听所有提供服务的端口,判断入口端口,对应到目标端口完事
    if ( $server_port = 5679 ){ set $my_port 5678;}
    反代里面
    proxy_pass http://127.0.0.1:$my_port;
    opengps
        6
    opengps  
       223 天前
    反代为什么达不到你要的效果?哪一点卡住的?
    ysc3839
        7
    ysc3839  
       223 天前 via Android   ❤️ 1
    在 NAS 上设置 https ,监听不同端口,frp 只进行端口转发即可。
    skyzwb
        8
    skyzwb  
       223 天前   ❤️ 1
    很简单在你公有云服务器上安装一个 nginx Proxy Manager ,然后配置就行了,很简单证书也能一件申请
    oneisall8955
        9
    oneisall8955  
       223 天前 via Android   ❤️ 1
    7 楼和我的想法一致
    hyperbin
        10
    hyperbin  
       223 天前 via Android   ❤️ 1
    弄个*.domain.com 的证书,然后 ngnix 到子域名,访问时 a.domain.comb.domain.com 就是不同的服务了
    superchijinpeng
        11
    superchijinpeng  
       223 天前   ❤️ 1
    caddy 直接配
    guanzhangzhang
        12
    guanzhangzhang  
       223 天前   ❤️ 1
    你搞组网后,直接三层就通了就没这么多事情了
    y1y1
        13
    y1y1  
       223 天前   ❤️ 1
    反代
    ryc111
        14
    ryc111  
       223 天前   ❤️ 1
    讲一个我自己目前搞的方式:
    - frp -> 一堆端口 ( serv1:10001 ,serv2:10002 ,serv3: 10003 ,serv4: 10004....) FYI,我目前转用了 rathole ,可以映射到 vps 的 127.0.0.1,而不是暴露在外。
    - 证书申请的时候设置泛域名: 使用 *.your.domain
    - 使用 nginx/caddy/etc 对于各个服务进行反代:
    serv1.your.domain -> 10001 ... 以此类推

    更简单的方法就是用 frpc 的 vhostHTTPSPort 。但是这样的话就需要自己管理证书,也可以自签名。
    devliu1
        15
    devliu1  
       223 天前   ❤️ 1
    1. https 可以在反代配置

    2. frp 多配置几个端口就好,一个端口也行,反代通过 host 判断

    3. 如果反代部署在本地,端口通过 FRP 暴露在远程,是获取不到用户 IP 真实的(因为是通过 frpc 连接的反代),可以配置 proxy protocol
    linuxgo
        16
    linuxgo  
       223 天前   ❤️ 1
    我用过 nps 是同一域名指定不同端口访问
    charce
        17
    charce  
    OP
       223 天前
    @flashBee233 我看了你的配置文件,是通过多个子域名来访问的,跟我想要的不太一样。
    因为我同时有用 ipv6 在访问,所以才会想要保持同一个域名,这样证书管理也简单一点。
    charce
        18
    charce  
    OP
       223 天前
    @ryc111 @flashBee233 我看了你的配置文件,是通过多个子域名来访问的,跟我想要的不太一样。
    因为我同时有用 ipv6 在访问,所以才会想要保持同一个域名,这样证书管理也简单一点。
    charce
        19
    charce  
    OP
       223 天前
    @ysc3839
    @oneisall8955 如果在 NAS 上面设置 https ,访问的依然是 frps 的公网 IP 啊,不太明白要怎么操作,请赐教
    charce
        20
    charce  
    OP
       223 天前
    @hyperbin 因为我同时也用 ipv6 访问,为了保持统一不想搞太多子域名,所以才会想要保持同一个域名+多个不同端口的方式。
    DigitalG
        21
    DigitalG  
       223 天前   ❤️ 1
    我记得群晖的 docker 应用 可以配合 web station 制作门户访问的方式来着?
    类似 https://xxxx.com:a_fixed_port/path 指向服务。域名和端口是固定的,一个 path 指向一个服务。
    ysc3839
        22
    ysc3839  
       223 天前 via Android   ❤️ 1
    @charce “访问的依然是 frps 的公网 IP 啊”是什么意思?
    charce
        23
    charce  
    OP
       223 天前
    @DigitalG 因为群晖实际上是在内网环境里面的,所以实际上现在访问的都是 frp 暴露出来的端口。再在群晖里面配置是不是就没有效果?
    flashBee233
        24
    flashBee233  
       223 天前   ❤️ 1
    @charce 可以申请个免费的泛域名证书
    BaseException
        25
    BaseException  
       223 天前   ❤️ 1
    nginx 写多个配置文件就行。listen 不同的端口。

    我有几个服务就是

    - https://emby.940304.xyz:23399
    - https://emby.940304.xyz:16790

    楼主想要实现的是我这种吗
    BaseException
        26
    BaseException  
       223 天前   ❤️ 1
    https://emby.940304.xyz:16790/start-page.html

    我还部署了更多服务,均是使用的高位端口(因为 80 443 被运营商封锁 你懂的)。
    PXW139
        27
    PXW139  
       223 天前   ❤️ 1
    最简单的示范
    其他配置往里面加就行
    ```
    server
    {
    listen 9080;
    listen 9081;
    listen 9082;
    server_name www.abc.xyz;
    index index.php index.html index.htm default.php default.htm default.html;

    if ( $server_port = 9080 ){ set $my_port 8080;}#端口自行修改为映射端口
    if ( $server_port = 9081 ){ set $my_port 8081;}
    if ( $server_port = 9082 ){ set $my_port 8082;}

    location / {
    proxy_pass http://127.0.0.1:$my_port;
    }
    }
    ```
    @PXW139
    charce
        28
    charce  
    OP
       223 天前
    @BaseException #25 是这个效果,要怎么弄呢?
    jccaipc
        29
    jccaipc  
       223 天前
    Mark 关注下,跟 LZ 一样有此需求,前期 nginx 反向代理也是搞过,不过失败了
    charce
        30
    charce  
    OP
       223 天前
    @ysc3839 #22 感谢!还是用你这个思路设置成功了!
    charce
        31
    charce  
    OP
       223 天前
    @jccaipc #29 我设置好了,你可以参考一下主题下面的附言。
    charce
        32
    charce  
    OP
       223 天前
    @linuxgo #16 之前也用过 NPS ,但是 NPS 好久没有更新了,也爆出过漏洞,所以就没用了。
    BaseException
        33
    BaseException  
       223 天前
    @charce #28 既然 “目前 Frp 已经能够实现 IP+端口进行访问” 那么 nginx +ssl 就能解决了,监听不同端口,不同端口 proxy_pass 到 frps 服务端本地不同的端口就行了
    charce
        34
    charce  
    OP
       223 天前
    @BaseException #33 我只懂得在宝塔面板里面创建网站,然后用面板自带的 GUI 来配置反代,有尝试着去配置一下,都没有成功,如果可以您可以分享一下经验,谢谢。
    ryc111
        35
    ryc111  
       223 天前
    @charce

    ipv6 和这个没关系呀,ipv6 只是一个地址而已。

    我获取的证书是泛域名的证书。 *.domain ,放在 vps 上自动更新。
    为了方便,域名解析那也可以直接设置泛域名 *.domain 都指向 vps ,这样,你想要什么子域名,都直接用。


    看到你用宝塔,所以更推荐你使用我这种配置,每个服务都用一个子域名,其实和端口后置也差不多对吧,实在不行你的域名写成:
    端口.域名 : 5000.domain.com 这样嘛。
    因为这样子,你只要在宝塔里面: 1,添加站点,2,配置 ssl ,3 添加反向代理。
    不需要自己手动配置任何 nginx 配置文件,都是点点点就能完成的。
    charce
        36
    charce  
    OP
       222 天前
    @ryc111 #35 这个确实也是一种思路,操作起来也不复杂。

    但是有个问题是,IPv6 的 80/443 端口是被封的,所以如果用子域名,IPv6 就会访问不了。

    所以要保证 IPv4 和 IPv6 两种情况都能访问的话,就只能用高位端口。

    我现在保留 IPv6 是考虑到在有 IPv6 环境下,直连的速度是比较快的,所以就需要用高位端口来进行访问。

    大概技术路径是这样的:

    [![piPcFBV.jpg]( https://z1.ax1x.com/2023/10/18/piPcFBV.jpg)]( https://imgse.com/i/piPcFBV)
    hyperbin
        37
    hyperbin  
       222 天前 via Android
    @charce 完全不冲突
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   994 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 21:49 · PVG 05:49 · LAX 14:49 · JFK 17:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.