V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jdjingdian
V2EX  ›  宽带症候群

魔改 OpenVPN3 支持 SRV,配合打洞连回家

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

    前段时间我的公网 IP 掉了,也引起了大伙的讨论。我懒得跟运营商继续扯皮,所以想自己折腾折腾,用打洞的方式连回家。

    首先要感谢 @mikewang @heiher @gdy666 几位大佬提供的 TCP 打洞的程序,不然我可能就只能选择 frp 之类中转的方案了,个人还是比较倾向于直连。

    家里 HTTP 的服务通过 302 跳转访问,基本没什么痛点。SSH 连接借鉴的的是 natmap 项目中提出的方案——使用 NATMap 在 NAT-1 私网 IP 宽带上部署 SSH 服务,但是我选择将端口信息保存到 TXT 记录中,个人觉得更方便一点。

    唯一比较难受的是,以前有公网 IP 的时候,可以直接用 VPN 连回家里,这样干活(摸鱼)能方便点,但是公网 IP 掉了以后,我就没办法连回家里内网了。

    一开始我是想找有没有类似实现的 VPN ,但似乎没找到,因为我原来用的就是 OpenVPN ,服务端是 Mikrotik 自带的,索性就尝试魔改了一下 OpenVPN 客户端,调研后我选择魔改 OpenVPN 3 这个库,看起来挺多 UI 客户端都依赖这个库。

    我修改的方法大概是这样的,需要 ovpn 配置文件中添加一行记录

    remote-srv _openvpn._tcp.yourdomain.com
    

    OpenVPN 3 启动时需要读取 ovpn 配置,如果发现有remote-srv字段的配置,就会尝试解析 SRV 记录,获取到对应的端口号后,自动覆盖掉端口号的配置。

    由于要解析 SRV 记录,所以引入了 ldns 库,现在想想,可能利用 IP4P 格式的记录做解析可能更方便,还不用引入其他库,不过我都写完了才想起来,就懒得改了

    本身这是一个核心库,但是它本身带了一个 cli 程序,编译完后用 cli 命令连接即可,我偷懒就没弄 GUI 了(我是废物

    这个图是我在公司网络用 cli 连回 Mikrotik 管理页面的截图

    仓库地址在这,欢迎大佬尝试使用,如果 readme 写的不清晰或者有问题,也欢迎提 issue: https://github.com/jdjingdian/openvpn3_srv

    第 1 条附言  ·  96 天前
    再分享一个打洞+SRV 记录的用法

    你可以在内网部署一个 KMS 激活服务器

    正常情况 KMS 激活需要访问 1688 端口,但是微软支持使用 SRV 记录,你可以在 DNS 后台创建两个域名

    A 记录的 direct.example.com 和 SRV 记录的 _vlmcs._tcp.direct.example.com

    SRV 记录填写为 5 0 端口号 direct.example.com ,打洞成功后,将 IP 同步到 direct 域名,将端口号更新到 SRV 域名

    在要激活的设备上,以管理员权限运行

    slmgr /skms-domain direct.example.com ,配置了这行后,kms 会自动搜寻这个域名带_vlmcs._tcp.zh 前缀的记录,如果能找到,就根据这个 srv 记录指向的端口和 hostname 进程激活流程
    10 条回复    2024-09-14 22:50:08 +08:00
    asilin
        3
    asilin  
       96 天前
    很赞,无论是 remote-srv 还是 remote-ip4p 都是很好的创意!

    但是有一个小建议:OpenVPN 3 在服务器上面用的比较少,大部分发行版的源都是 OpenVPN 2.x 版本,如果能支持 2.x 版本就更好了!
    jdjingdian
        4
    jdjingdian  
    OP
       96 天前
    @asilin 在 openvpn3 仓库有一段介绍

    ```
    OpenVPN 3 is a C++ class library that implements the functionality of an OpenVPN client, and is protocol-compatible with the OpenVPN 2.x branch.
    ```

    所以理论上来说,我魔改的这个库只是针对客户端的,而且这个东西也兼容 2.x 的版本,服务端是 2.x 的话也可以用我这个,因为我这个改动只是连接前更新了一下端口信息,没有改其他 openvpn 的逻辑
    godmiracle
        5
    godmiracle  
       96 天前
    学习下,最近电信换了移动公网 ip 也无了
    MFWT
        6
    MFWT  
       96 天前
    我也在考虑 SRV 相关的东西,不过我的侧重点是 WireGuard ,毕竟 OpenVPN 对我来说好像还是有点太重了

    顺带一提另一个的话,AnyConnect 可以做到动态跳转(访问地址可以 302 到真实地址),不过直接访问端口的话会有 HTTP 内容出现,我怕运营商会因此找借口,所以不太敢用
    Jhma
        7
    Jhma  
       96 天前
    有 V6 就很简单,V6 DDNS openvpn 连回家,我现在连回家后串流局域网的 PS5 很顺畅
    jdjingdian
        8
    jdjingdian  
    OP
       96 天前 via iPhone
    @Jhma v6 我家有,但是问题是公司的网络没有,我又不想用自己的手机流量连回家,所以只能想办法 v4 打洞啦🥵
    funnypc
        9
    funnypc  
       89 天前
    TXT 记录的更新是怎么做的呢?需要自己去写个脚本?

    希望还是能改个 IP4P 版本的,这样可以直接使用 natmap
    Xemember
        10
    Xemember  
       69 天前 via iPhone
    我努力看了半天…确实没看懂…缺少相关知识…
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2755 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 09:38 · PVG 17:38 · LAX 01:38 · JFK 04:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.