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

[技术贴]微服务中的网关部署在云服务器,自己在公司内网启动服务,怎么让网关能调通自己本地的服务?

  •  
  •   Aliberter · 2023-02-15 09:35:15 +08:00 · 3937 次点击
    这是一个创建于 652 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,目前遇到这么个问题,一开始想的是内网穿透,但是被 pass 了说是对内网不安全,经过一番调研,阿里云有自己的端云互联工具,但是又不想用阿里云,太贵了。我们的某个竞品,他们部署在云端的后台就能直接发现自己内网的服务并成功调用,这个是怎么做到的呢?希望老哥们给指点一下迷津,感谢

    51 条回复    2023-02-16 10:38:10 +08:00
    MinJin
        1
    MinJin  
       2023-02-15 09:36:46 +08:00
    zerotier
    luomao
        2
    luomao  
       2023-02-15 09:37:53 +08:00   ❤️ 1
    我们这边是和阿里云拉了一条专线,可以直接互访内网
    Aliberter
        3
    Aliberter  
    OP
       2023-02-15 09:40:06 +08:00
    @MinJin 就是如果不用额外的第三方穿透工具,有别的实现方式吗
    Aliberter
        4
    Aliberter  
    OP
       2023-02-15 09:40:28 +08:00
    @luomao 哦哦,大佬,……我们还做不到
    Aliberter
        5
    Aliberter  
    OP
       2023-02-15 09:43:27 +08:00
    我们用的 springcloud 那一套,有能跟服务的项目做集成做绑定,不用额外的网络配置和三方工具,只要本地项目跑起来,就能被云端发现调用,这种技术实现吗?
    cheng6563
        6
    cheng6563  
       2023-02-15 09:47:40 +08:00
    ssh 算第三方工具吗?用 ssh 也能穿透
    tramm
        7
    tramm  
       2023-02-15 09:48:06 +08:00
    你们公司不能开放端口吗?

    不开放端口,也没专线的话,云服务器起个 TCP 服务,公司的这边写个 TCP 中转服务通过长连接连上去,让云服务器那边所有请求下发到公司的这个中转服务器上...不过感觉这个有点麻烦啊
    Seulgi
        8
    Seulgi  
       2023-02-15 09:50:41 +08:00
    阿里的端云互联实际也和内网穿透差不多。
    Lentin
        9
    Lentin  
       2023-02-15 09:52:23 +08:00
    防火墙上做 nat 转发 设置好源 IP 和目的地 IP 端口就行了
    Diego01
        10
    Diego01  
       2023-02-15 09:54:43 +08:00
    公网访问、VPN 、智能接入网关、共享专线
    Aliberter
        11
    Aliberter  
    OP
       2023-02-15 09:56:16 +08:00
    @cheng6563 就是希望 ssh 能融入进微服务代码架构里最好,每一个服务启动后都连一下 ssh ?这样可能也能被他们接受
    Aliberter
        12
    Aliberter  
    OP
       2023-02-15 09:57:34 +08:00
    @tramm 能开放端口,就是不要有明显的穿透工具就行,你说的这个是不是就是 frp 的原理啊...手写 tcp 服务再中转啥的...可能确实有点麻烦
    Aliberter
        13
    Aliberter  
    OP
       2023-02-15 09:59:20 +08:00
    @Seulgi 对 我看也是 就是有个中转 但是他们不同意我们自己用 frp 之类的 还需要各种配置 还要改项目配置的 ip 麻烦 就想无脑启动
    Aliberter
        14
    Aliberter  
    OP
       2023-02-15 10:01:06 +08:00
    @Lentin 这个需要运维参与,我们可能不会让运维去搞这个,就是想着在不动网络的前提下
    Aliberter
        15
    Aliberter  
    OP
       2023-02-15 10:02:25 +08:00
    @Diego01 合理合法的方案,但都没被接受,说实话,我觉得除了这些,真就有点异想天开了
    lower
        16
    lower  
       2023-02-15 10:04:41 +08:00
    @tramm 搭个消息队列 搞一套发布、订阅 感觉也基本能在楼主描述的网络场景里实现想要的功能……
    Eytoyes
        17
    Eytoyes  
       2023-02-15 10:05:51 +08:00
    这不是网工的事吗?提个申请开个口子映射到你的内网服务器,把源地址和目的地址都限制一下就行了
    lower
        18
    lower  
       2023-02-15 10:06:19 +08:00
    楼主项目里有集成消息队列么,感觉应该适合你的场景,改造改造
    ragnaroks
        19
    ragnaroks  
       2023-02-15 10:07:16 +08:00
    zerotier 本身有库,集成到你的项目中即可,我用很久以前就实现了 MC 一键 P2P 联机
    luomao
        20
    luomao  
       2023-02-15 10:07:50 +08:00
    和 spring cloud 那套融合起来,还有个比较蛋疼的方法。两边都接入一个消息队列,譬如 rabbitMq ,网关收到消息后将消息发送到队列中并保持连接,内网服务器消费这个”请求”,“请求”的结果消费完以后再将”响应”发送到队列中,网关消费掉这个”响应”后释放连接并返回
    killva4624
        21
    killva4624  
       2023-02-15 10:08:39 +08:00
    合理合法、又不动网络和运维参与,说实话不太可能...
    koloonps
        22
    koloonps  
       2023-02-15 10:08:49 +08:00
    SSH -L 将服务器的端口映射到本地,SSH -R 将本地端口映射到服务器上.修改本机路由,将服务器地址转发到 localhost.这样应该就可以了
    lucifer69
        23
    lucifer69  
       2023-02-15 10:09:36 +08:00
    部署一个服务注册中心?比如 nacos
    xuanbg
        24
    xuanbg  
       2023-02-15 10:10:23 +08:00
    VPN 。我在家里,要使用公司的测试环境的话,就拨公司的 VPN 。
    koloonps
        25
    koloonps  
       2023-02-15 10:11:26 +08:00
    最简单的方式是开一个 openvpn,不用对外开放端口.用 SSH 将 openvpn 端口映射到本地,然后你在 openvpn 客户端中将服务器设置为本地就可以了
    Aliberter
        26
    Aliberter  
    OP
       2023-02-15 10:11:27 +08:00
    @lower 消息队列怎么实现啊 说实话好像了解到竞品的代码里有 jmx 的东西 跟这个有关系吗大佬
    xuanbg
        27
    xuanbg  
       2023-02-15 10:15:02 +08:00   ❤️ 1
    如果服务器上有 doker 的话,稍微改一下下面的 docker 命令里的一些参数,就能通过 vpn 来打通云端的环境了。

    docker run -d \
    --name=wireguard \
    --cap-add=NET_ADMIN \
    --cap-add=SYS_MODULE \
    -e PUID=1000 \
    -e PGID=1000 \
    -e TZ=Europe/London \
    -e SERVERURL=wireguard.domain.com \
    -e SERVERPORT=51820 \
    -e PEERS=1 \
    -e PEERDNS=auto \
    -e INTERNAL_SUBNET=10.13.13.0 \
    -e ALLOWEDIPS=0.0.0.0/0 \
    -e LOG_CONFS=true \
    -p 51820:51820/udp \
    -v /opt/wireguard/config:/config \
    -v /lib/modules:/lib/modules \
    --sysctl="net.ipv4.conf.all.src_valid_mark=1" \
    --restart unless-stopped \
    lscr.io/linuxserver/wireguard:latest
    Aliberter
        28
    Aliberter  
    OP
       2023-02-15 10:16:41 +08:00
    @Eytoyes 确实...但是...
    @ragnaroks 这样啊 我感觉我可以去了解一下 谢谢大佬
    @luomao 说的比较详细了 但我确实没这个搞过 我学习下试试
    @killva4624 确实,比较奇葩
    @koloonps 不让动路由..
    @lucifer69 跟注册中心没关系 注册中心也在云上
    @xuanbg @koloonps 不想额外搭建什么 openvpn 之类的了
    happyn
        29
    happyn  
       2023-02-15 10:17:33 +08:00
    首先公司内网,有公网 ip ,可以对外映射服务吗?

    如果没有公网 ip ;那肯定得需要端口映射出去;

    不用第三方工具,就得自己集成这个服务,本质上跟第三方工具做的事情是一样的;

    如果服务不动,ip 也不想改;最简单的方法就是楼上建议的,用 zerotier 、tailscale ,或者 openvpn 一样的工具,把云服务器和公司内网服务器联网到同一个虚拟网络里,然后用 ssh 或者 socat 端口转发,把公司内网的服务映射到云服务器上;这样对于服务端是无感知的;

    如果不用三方工具,就得自己做上面的工作了;
    koloonps
        30
    koloonps  
       2023-02-15 10:19:20 +08:00
    修改本机路由,不是修改公司的路由.在本机路由表中添加一条就行.
    2han9wen71an
        31
    2han9wen71an  
       2023-02-15 10:20:36 +08:00
    我们是 zerotier
    Aliberter
        32
    Aliberter  
    OP
       2023-02-15 10:28:41 +08:00
    @xuanbg 我去,这个吊,可以用 docker 部,我看看
    @happyn 就是可以动服务的代码,刚我看上边有个老哥说能集成 zerotier 到服务里的,我准备看看
    @koloonps 本机路由?不是,现在只有公司网络和云端网络两个概念,让云端能访问到公司内网就行,本机路由是啥
    john2022
        33
    john2022  
       2023-02-15 10:31:56 +08:00
    vpn 接入云端一台服务器,两个子网打通就可以了
    john2022
        34
    john2022  
       2023-02-15 10:32:37 +08:00
    @john2022 要求云端的访问内网的服务器都要添加一条路由
    koloonps
        35
    koloonps  
       2023-02-15 10:36:14 +08:00
    你从 nacos 获取的其他服务的地址是服务器的局域网地址,你需要在你的机器路由表上添加一条路由将服务器的地址重定向到本机上.你可以看下 SSH 的内网穿透功能.https://zhuanlan.zhihu.com/p/57630633 参考下这个
    amrice
        36
    amrice  
       2023-02-15 10:43:04 +08:00
    要么组网,要么直接把设备暴露到公网里呗
    wccc
        37
    wccc  
       2023-02-15 10:46:31 +08:00
    wireguard 组网
    ilovey482i
        38
    ilovey482i  
       2023-02-15 10:51:57 +08:00
    如果不组网打通环境的话,只能在云端部署测试服务器,将代码部署到测试服务器上去
    GopherDaily
        39
    GopherDaily  
       2023-02-15 10:56:49 +08:00
    测试还是开发?测试考虑下 telepresence
    nicholasxuu
        40
    nicholasxuu  
       2023-02-15 11:12:32 +08:00
    如果公司有固定 ip 的网络的话,搭一下 ipsec vpn ,阿里云那儿大概一个月 200 的费用吧。
    ChengHaha
        41
    ChengHaha  
       2023-02-15 11:12:53 +08:00
    我是在本地启动一个网关,前端指向本地的网关就好了
    nicebird
        42
    nicebird  
       2023-02-15 12:15:30 +08:00
    不难吧,自己开发个代理都可以
    Bottle
        43
    Bottle  
       2023-02-15 14:30:45 +08:00   ❤️ 1
    说一下我们公司的情况:
    1 、有两台物理服务器放在公司内网,部署一些服务
    2 、办公室没有固定公网 IP
    3 、有几台阿里云 ECS ,有公网 IP ,几台 ECS 之间内网互通

    需求是:ECS 上的所有服务,都能访问办公室内网两台机器上的服务

    我们采用的解决方案是:SSH 远程端口转发
    1 、办公室内网服务端口转发到 ECS 指定端口上
    2 、ECS 上的服务,通过转发的端口,访问公司内网服务

    希望能够帮到你。


    参考资料:
    https://www.ronpad.com/docs/ssh/port-forwarding-4.html
    https://www.cnblogs.com/XiiX/p/15095135.html
    BQsummer
        44
    BQsummer  
       2023-02-15 17:07:26 +08:00
    我们公司也有类似场景, ios 打包需要 mac 机器, 云服务没有, 就把 mac mini 放在办公地点的机房, 走的 vpn
    lyc8503
        45
    lyc8503  
       2023-02-15 19:27:25 +08:00
    如果不用过墙的话 wireguard 或者 openvpn 就可以? 两者都是完全开源的工具.
    k8ser
        46
    k8ser  
       2023-02-15 21:17:31 +08:00
    wireguard over udp ,国内运营商的环境还是要测试下。
    salmon5
        47
    salmon5  
       2023-02-15 21:21:40 +08:00
    专线
    Dreamacro
        48
    Dreamacro  
       2023-02-15 22:16:47 +08:00 via iPad
    目前发现比较好的形式是 fly.io 的方案,本地 ctl 通过 wg 映射端口到本地,既可以鉴权又很方便。
    piku
        49
    piku  
       2023-02-16 08:36:25 +08:00 via Android
    tram 的方法是正确的,只要有网络连接,无所谓是从内网连到云端还是从云端连到内网。不知道你们中间究竟需要什么样的数据交互,总体上从内网起一个 tcp 连到云服务器上,然后数据走这个长连接就是了。约等于手机接收推送(比如 jipush )消息的原理。
    内网穿透一般是指建立一个其他连接可以用的隧道,上面的方法只供一个连接通道用,算是内网穿透的简化吧
    SoulSleep
        50
    SoulSleep  
       2023-02-16 08:52:52 +08:00
    @luomao #2 +1 我们也是拉了专线,相当于私有云的指定服务器和阿里云在一个内网
    sunnysab
        51
    sunnysab  
       2023-02-16 10:38:09 +08:00 via Android
    干过类似事情,不过协议是私有的,代码自己写的,比较好改 😂
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1168 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 22:52 · PVG 06:52 · LAX 14:52 · JFK 17:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.