V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要把任何和邀请码有关的内容发到 NAS 节点。

邀请码相关的内容请使用 /go/in 节点。

如果没有发送到 /go/in,那么会被移动到 /go/pointless 同时账号会被降权。如果持续触发这样的移动,会导致账号被禁用。
mikewang
V2EX  ›  NAS

有没有什么开源自建的 WebVPN?

  •  
  •   mikewang · 2023-10-05 13:55:29 +08:00 · 7395 次点击
    这是一个创建于 433 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这个词或许是国内常用,在 Google 搜到的都是中文网页,并且都是公司学校的入口。不知道正式的名字叫什么。
    很早的时候有 Glype ,缺点是没有登录认证,现在也停止维护了。

    总之,不想直接将 NAS 的服务暴露在公网,想要加一层保护,并且临时使用的时候不需要客户端。

    第 1 条附言  ·  2023-10-05 19:23:46 +08:00
    感谢 #21 补充,学校用的确实是这种方案:
    https://www.wrdtech.com/content/content.php?p=2_30_203

    国内也有其他类似的,不止这一家。

    本质确实是反向代理,但是优势在于首页输入内网 URL 就能直接访问,不需要像 Nginx 那样每新增一个站点都要手动写规则; WebVPN 程序可以自动改写网页里的 URL 。
    50 条回复    2024-08-01 20:33:19 +08:00
    Lightbright
        1
    Lightbright  
       2023-10-05 13:59:12 +08:00 via Android
    这个其实就是反代,nginx 就能配置
    flyqie
        2
    flyqie  
       2023-10-05 14:06:30 +08:00 via Android
    挺好奇现有 webvpn 方案对 spa 支持怎么样。。

    感觉 spa 解决起来不容易啊。
    ysc3839
        3
    ysc3839  
       2023-10-05 14:15:19 +08:00 via Android
    OpenCore
    ysc3839
        4
    ysc3839  
       2023-10-05 14:15:36 +08:00 via Android
    @ysc3839 抱歉,打错了,是 OpenConnect
    ysc3839
        5
    ysc3839  
       2023-10-05 14:17:15 +08:00 via Android
    正式名字应该叫 SSL VPN 或者 TLS VPN ,因为跟 Web 毫无关系,不基于浏览器,也不基于 http 。再者国内哪会用“Web”这个词,都叫“H5”的。
    ysc3839
        6
    ysc3839  
       2023-10-05 14:18:33 +08:00 via Android
    如果要求不需要客户端,只使用浏览器的话实现不了 VPN 功能,最多只能反向代理
    bao3
        7
    bao3  
       2023-10-05 14:24:45 +08:00
    你说得是 ssl vpn ,juniper 、cisco 都支持。 用楼上的 open connect 可以模拟 Cisco 的。
    Puteulanus
        8
    Puteulanus  
       2023-10-05 14:36:19 +08:00
    你跑个带密码、novnc 的 Chrome docker 镜像暴露出来,访问内网其他服务的时候通过里面的浏览器访问
    serafin
        9
    serafin  
       2023-10-05 14:53:27 +08:00
    L2TP/IPsec ,群晖自带 VPN 服务端。iPhone 安卓自带 VPN 客户端就行。
    adoal
        10
    adoal  
       2023-10-05 14:58:14 +08:00
    @ysc3839 不,这几年在大学流行起来的 WebVPN 并不是你说的这种从 Web 上安装 VPN 插件的 SSL VPN ,而是改写规则做得很细致的反代
    hefish
        11
    hefish  
       2023-10-05 14:58:27 +08:00
    以前有个基于 openvpn + java web application 的,
    用 web 登录进去,然后 web 上调用 Java 在本地起一个端口映射器。 好像是叫 openvpn-as 吧。
    mikewang
        12
    mikewang  
    OP
       2023-10-05 15:10:37 +08:00   ❤️ 1
    @adoal 是的,非常好奇那些大学的反代是怎么做的。我大学 WebVPN 的 URL 可以随便输,甚至可以上 B 站看视频和直播(可以表现为视频流、WebSocket 都是支持的)。除了网速有点卡以外没有遇到其他问题。感觉非常神奇。
    ysc3839
        13
    ysc3839  
       2023-10-05 15:23:13 +08:00 via Android
    @adoal 否的,我之前上的学校就是直接用深信服的 EasyConnect 。
    再者现在主流浏览器都不支持第三方插件了,不存在“Web 上安装 VPN 插件”。
    datocp
        14
    datocp  
       2023-10-05 15:29:23 +08:00
    用的全能型 softether ,
    OpenConnect?几年前 android 不断的升级不知道是不是 android8/9 就不能运行了。

    softether ,提供了 l2tp/openvpn/softether 自己的客户端,也可以实现直接通过 vpn 链路通过 vps 来转发端口服务。它可以安装在 openwrt 路由里,如果有多条线路更是可以通过 cron 调用命令不断的切换不同线路来达到条条大路通过罗马。
    bao3
        15
    bao3  
       2023-10-05 15:36:11 +08:00
    不是这几年流行,你要的只是 web auth 的 vpn ,用 java 实现,这个 juniper 的就是这样的。vpn 本身就支持这个设定。但上面 open Connect 不知道能不能用 java 来做。
    yaoyao1128
        16
    yaoyao1128  
       2023-10-05 15:39:02 +08:00 via iPhone
    你說的實際就是反向代理()
    大學圖書館常用就是 ezproxy 但是這個比較重並且主要用的就是圖書館()
    自己用的話自己 web 服務器反向代理加認證就好了
    mali2002
        17
    mali2002  
       2023-10-05 15:45:47 +08:00   ❤️ 1
    飞塔的 sslvpn 有一个网页的 portal 可以实现,但是似乎对 ws 这类新协议兼容性不是很好,这个帖子里也有很多类似的,但似乎都没有集成认证,不知道实际体验怎么样。
    https://v2ex.com/t/932851
    andyben
        18
    andyben  
       2023-10-05 16:05:48 +08:00
    同求
    andyben
        19
    andyben  
       2023-10-05 16:07:57 +08:00
    同求,我知道目前商业产品做的比较好的是 sxf ,虽然知道原理就是反代。但是不知道有没开源的 webvpn ,可以比较好实现 用户权限管理和站点配置等这些
    adoal
        20
    adoal  
       2023-10-05 17:07:48 +08:00   ❤️ 4
    @ysc3839 不,我就是在大学里工作的,知道你说的 EasyConnect 是啥玩意,深信服的 SSL VPN 嘛,但我说的是 [
    这几年] 大学里普遍新上的另一个系统,纯 web 的,登录进去之后有一个清单是校内资源/对校园网出口 IP 授权的学术资源,也可以自己输入 URL ,这个系统只是为了让麻瓜用户好理解而取名“WebVPN”,其实并不是任何技术意义上的 VPN ,实际是对取来的页面里 URL 做了精致改写的反代。OP 说的应该就是这玩意。

    另,“Web 上安装 VPN 插件”是我表述不严谨,你明白是啥就行。另另,虽然现在主流浏览器都不支持第三方插件了,但是类似 EasyConnect 这种 SSL VPN ,登录进去之后是会让你下载客户端安装的……好吧我按你的严谨说法不叫它插件,但要用 EasyConnect 必须要安装,而且安装好的会在浏览器里搞一个 extension 进去,下次你在网站登录后,这个 extension 会运行起来触发 EasyConnect 的客户端运行以接入内网并接管 DNS 等某些配置。不管我叫它“Web 上安装 VPN 插件”还是你叫它“不存在“Web 上安装 VPN 插件””,反正是从 Web 提示你的,安装是一定要安装的,插是必须要插的,贱也是无奈一定要犯的。所以,这个玩意的称呼,你有啥一目了然的好建议?
    kdwnil
        21
    kdwnil  
       2023-10-05 17:16:59 +08:00   ❤️ 1
    补充楼上说的”近几年大学里普遍新上的另一个系统”,应该是这个: https://www.wrdtech.com/content/content.php?p=2_30_203 ,前两年它的官网还提供过镜像下载,不过激活需要去申请 key ,所以有镜像也用不了
    butanediol2d
        22
    butanediol2d  
       2023-10-05 17:50:01 +08:00 via iPhone
    我有类似的需求,现在用的是 jsproxy ,但是有时候也出问题,比如登陆之类的。
    leo97
        23
    leo97  
       2023-10-05 17:54:05 +08:00 via Android
    类似零信任,Okta 这种提供 Oauth 服务接入的吧,不是传统 VPN 了
    leo97
        24
    leo97  
       2023-10-05 17:54:26 +08:00 via Android
    本质就是搞个 OAuth 网关
    mikewang
        25
    mikewang  
    OP
       2023-10-05 19:02:02 +08:00
    @kdwnil #21 对对,就是这家,挺厉害的
    docx
        26
    docx  
       2023-10-05 19:26:38 +08:00 via iPhone
    用过深信服的 webvpn
    docx
        27
    docx  
       2023-10-05 19:29:15 +08:00 via iPhone
    看起来就是个反代,地址栏改改就能访问自己想要的其他地址了……
    sduoduo233
        28
    sduoduo233  
       2023-10-05 20:06:19 +08:00 via Android
    https://hideip.network/
    op 是不是要这种效果?
    ncepuzs
        29
    ncepuzs  
       2023-10-05 21:44:29 +08:00
    mikewang
        30
    mikewang  
    OP
       2023-10-05 21:58:48 +08:00
    @sduoduo233 #28 是的。除此之外带登录认证。
    @ncepuzs #29 这个我正在用,每新增一个站点都需要配置,没有 WebVPN 那种简便的优势。
    flynaj
        31
    flynaj  
       2023-10-05 23:28:33 +08:00 via Android
    楼主的需求 Firefox + HTTP2 代理就行。Glype 这种已经不能满足现在的互联网了。
    busier
        32
    busier  
       2023-10-05 23:30:33 +08:00 via Android
    思想放开阔点!
    Nginx 的 proxy_pass 后面可以跟变量的,给这个变量传不同值就可以灵活反代。
    最简单的方法就是用自定义 http head 传这个值!
    sldaniel
        33
    sldaniel  
       2023-10-06 00:13:30 +08:00
    关注,
    之前一直想有一个方案可以不用客户端就能连回家里的网,实现车机访问家里的 plex 。
    当时第一反应也是大学里用过的基于 web 的 vpn
    Fader10
        34
    Fader10  
       2023-10-06 00:36:53 +08:00
    不太清楚你说的具体是哪种
    如果是 SSL VPN 带个 web 管理界面的话可以看一下 OpenVPN Access Server
    如果说的是类似于 cloudflare zero trust 加的一个认证界面的那种的话可以看一下开源的 goteleport
    dusu
        35
    dusu  
       2023-10-06 01:04:49 +08:00 via iPhone   ❤️ 2
    看看 m1k1o/neko 项目看满足需求么
    mikewang
        36
    mikewang  
    OP
       2023-10-06 03:36:52 +08:00
    @dusu 有点意思,不过不知道这个有没有移动端适配和剪贴板问题
    01802
        37
    01802  
       2023-10-06 07:45:37 +08:00 via Android
    还不如直接 wireguard 后爱怎么连怎么连
    andyben
        38
    andyben  
       2023-10-06 10:13:53 +08:00
    @01802 需要纯 web
    uncat
        39
    uncat  
       2023-10-06 10:30:14 +08:00
    WireGuard 全平台兼容( Windows/iOS/Android/Linux/MacOS ),直接 systemd netdev 配置一个 WireGuard 虚拟设备就好了,现在基本所有的最新发行版的 systemd 都是内置支持 WireGuard 的了

    我想在用的方案就是:WireGuard + FRP
    uncat
        40
    uncat  
       2023-10-06 10:49:07 +08:00
    1. WireGuard 构建一个 VPN 网关,允许接入 VPN 的设备访问局域网网段中的任何设备(比如:192.168.188.0/24 )
    2. VPN 网关运行在局域网内( 192.168.188.33 ),基于 FRP 暴露公网( 1.1.1.1 )
    3. 签发设备 WireGuard VPN 证书并分发证书到各个设备,证书对应的 VPN 网关服务器地址配置为 FRP 暴露后的公网地址( 1.1.1.1 )
    4. 各个设备安装 WireGuard ,载入证书,连接 VPN 网关后,即可访问局域网中所有设备

    可以用来组件自己的虚拟办公网络,实现远程办公。局域网内配合虚拟化和网桥(让虚拟机具备跟物理机类似的局域网 IP )可以释放巨大的生产力(比如:自建大量的基础服务,gitLab/miniflux/xray/jira/vscode remote-ssh/transmission/vaultwarden/loki/grafana/prometheus/k8s/pg/mysql/rsshub/jellyfin/mitmproxy/keycloak ,每台虚拟机一个服务)
    vvhy
        41
    vvhy  
       2023-10-06 16:27:49 +08:00   ❤️ 1
    这个可以参考一下 https://github.com/EtherDream/jsproxy ,不过也不完美
    patrickyoung
        42
    patrickyoung  
       2023-10-07 00:23:01 +08:00
    @ysc3839 @adoal #19
    我大概知道你们在说什么了。访问准入+Web 云应用。

    基础架构都需要打一个插件到用户的浏览器,实现的方式不同,本地有客户端,这个客户端一般是 openvpn 二开的 ssl vpn ,如果没有客户端的纯 web 应用,就是 ws 代理,然后里面的操作终端是 guacamole 二开的。

    核心的原理就是这个,具体实现的各家有差异。
    friparia
        43
    friparia  
       2023-10-07 09:36:00 +08:00
    方案原理大概是前端劫持了浏览器 js 的相关 api ,在涉及到所有和 URL 相关的地方做自动化替换

    实际上和 https://github.com/EtherDream/jsproxy 差不多,但是是服务器端的
    Kinnice
        44
    Kinnice  
       2023-10-07 10:32:04 +08:00
    要不换个思路,敲门模式,野路子 webvpn ,无需反代
    0. 随便糊个后端,部署在你需要被 webvpn 访问的机器上,使用 iptables/ufw ,除了管理端口,其他端口的包全部 drop
    1. 糊一个公开的 web 段提供 auth ,auth 成功后把当前/24 的 ip 段加到你的 [需要被访问的 iptables accept 列表中]
    2. 如果 n 分钟没有新连接、手动断开,就删除这个 accept 规则


    more: 切换 ip 后,web 如果还在通过 websocket/轮询,更新新的 ip
    d460686680
        45
    d460686680  
       2023-10-07 14:55:02 +08:00
    发现一个你说的这玩意 https://github.com/Hideipnetwork/hideipnetwork-web/tree/dev
    试了下 除了套 cf 盾的其他都好使
    yg503
        46
    yg503  
       2023-10-10 14:42:24 +08:00
    https://github.com/NginxProxyManager/nginx-proxy-manager
    https://github.com/k8scat/lua-resty-feishu-auth

    我们的需求是把公司内的一些 web 服务暴露到公网,想通过钉钉控制只有企业内的人访问,基于这个开源的 lua 适配了钉钉 API ,搭配 https://github.com/liftoff/GateOne 也能实现 shell 功能。
    DIO
        47
    DIO  
       133 天前 via Android
    请问 op 现在在用什么好的方案吗
    mikewang
        48
    mikewang  
    OP
       133 天前
    @DIO 我没有在使用类似方案了,目前仍是 wg 组网
    MFWT
        49
    MFWT  
       132 天前 via Android
    我也在考虑类似的玩意,最大的痛点其实是前端链接的改写,因为浏览器不知道你这个是代理,所以光做后端反代(包括楼上说到传递变量给 nginx 的 proxy_pass )没有用,对于页面中的外链(不同域名)和带主机的链接,浏览器在前端就发走了,根本不会发往你的代理服务器

    在后端收到内容之后提前嗅探并改写数据流中的链接是个方法,但是覆盖面不够(比如前端动态生成资源地址的完全没辙),性能消耗也大。比较通用的方法是前端尽可能用 js 改写掉所有有可能发起请求的函数(比如 XMLHTTPRequest ,fetch ,扫描并嗅探所有 html 标签的 src/href 属性值),但是我不确定浏览器允不允许这么干,或者说有些请求会不会覆盖到?
    MFWT
        50
    MFWT  
       132 天前 via Android
    另外就是,学校或者企业用 webVPN 比较多的原因是,这种位于内网的网站很多都是自己部署且仅面对内网的(比如内部 OA ,学校在线图书馆),很少存在外站链接,所以实现起来比较简单,也是最早应用起来的

    此外就是,这种部门信息化比较早,『适配 IE6.0 』这个笑话大概也就是起源于此。IE 浏览器最大的杀手锏其实是 ActiveX 控件,这玩意近似理解就是前端可以很方便执行原生二进制文件,可玩空间就高很多,说是说 clientless ,但实际上只是自动下载部署了个很小体积的客户端(在华为那边这个就是 Web Link 模式的 SSL VPN )。可惜现在 IE 已经作古,ActiveX 也被放弃,现代浏览器呢,又越来越强调沙盒化,这种玩法也就没落了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4147 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 04:02 · PVG 12:02 · LAX 20:02 · JFK 23:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.