此页面需要javascript支持,请在浏览器中启用javascript

本地环境安全访问公有云资源的一种方式

ipsec
vpc
vpn
docker
共1378个字,阅读时间 7 分钟
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://icebreaker.top/articles/2023/7/20-host-vpc

Image

本地环境安全访问公有云资源的一种方式

场景预演

不知道你有没有遇到这样的场景?

你在某个公有云平台上,有好几台服务器,它们在一个私有网络 (vpc) 里相互串联通信,一起构建整套系统。

然而由于它们对外默认只提供 22/80/443 等端口的访问,你无法直接访问里面的 redis/db 等等的资源。

那么把 redis/db 等等的资源的监听端口全部放开不就好啦?

显然不行,直接把 redis,db 等等资源暴露在公网上是非常不安全的,即使你设置了复杂的密码。

那么给 db 套一层外壳去访问就安全吗?

比如我有一个 postgres 实例只在 docker 网络中暴露访问端口,然后在部署一个 dpage/pgadmin4 在那个网络里,再配置复杂的密码,放开额外的端口暴露在公网上,显然这就比上面直接暴露数据库要安全一点,因为这种方式相当于加了一层保护壳。

但是这样就足够安全吗?显然不是,服务只要暴露在公网上就不够安全。

因为静态的密码即使再长再复杂,没有锁定和重试机制都有破解的可能。 相对而言,2FA 和 cert 登录就安全很多,尤其是 2FA 现在已经广泛的运用到各个领域了。

事实上,我们完全可以在某台服务器上部署一个 vpn-server 把它作为我们本地环境和云上环境的桥梁,让我们本地可以快速安全的访问到云上的资源,同时云上的资源也不需要暴露在公网上。

技术选型

经过了一些调研,最终选定了 hwdsl2/ipsec-vpn-server

为什么不是 OpenVPN / WireGuard ?

OpenVPN

相关地址:

商业化了,使用起来有些限制。老版本可以使用,但是为什么要去部署一个已经停止维护的版本呢?

WireGuard

相关地址:

很棒但是需要下载对应的client,某些系统版本的client在某些国家和地区是无法使用的,看到这句话你应该知道哪个地方了吧。

原生支持

而且我们想使用那种,所有系统原生自带的vpn功能去链接我们的服务器。

那么这个范围就缩小很多了,我们需要部署一个支持 L2TP/IPsec 协议的 vpn server,同时我们需要容器化部署。

所以 hwdsl2/ipsec-vpn-server 就成为了优秀的解决方案。

部署

使用 docker 部署非常方便,准备一份 docker-compose.yml

version: "3"

volumes:
  ikev2-vpn-data:

services:
  vpn:
    image: hwdsl2/ipsec-vpn-server
    restart: always
    env_file:
      - ./vpn.env
    ports:
      - "500:500/udp"
      - "4500:4500/udp"
    privileged: true
    hostname: ipsec-vpn-server
    container_name: ipsec-vpn-server
    volumes:
      - ikev2-vpn-data:/etc/ipsec.d
      - /lib/modules:/lib/modules:ro

和一份配置文件:

# vpn.env
# 预共享秘钥
VPN_IPSEC_PSK=
# 用户名
VPN_USER=
# 密码
VPN_PASSWORD=

配置好值之后,直接 docker compose up -d 就启动部署完成了。当然我目前是独立部署的,你也可以把它加入你自己的 docker network 中去,从而暴露更多服务。

同时因为 ipsec 协议的需求,我们需要在部署的那台服务器的 vpc安全组 里,开放 500/4500udp 协议。

Image

这样配置好了之后就可以直接用本机自带的 vpn 功能进行链接了,非常的简单方便快速。

windows 系统的机器,需要修改注册表后重新启动才能连上,不然会报错,详见 https://github.com/hwdsl2/setup-ipsec-vpn/blob/master/docs/clients-zh.md

链接成功客户端配置示例

Windows 11

Image

MacOS 13

Image

访问 vpc 内的资源

在我们购买服务器的时候,服务商都会给我们 2ip

一个是公网的 ip,一个是 vpc 内网里的 ip,

接下来让我们进入服务器,查看 ifconfig:

Image

我们直接使用 内网 ip + 端口,就可以访问对应的资源了,这些资源,你甚至可以直接监听 0.0.0.0,因为它们在安全组那会被屏蔽,所以不会直接暴露在公网。

这样,我们本地连上 vpn 就可以直接连接线上的数据库,访问线上的缓存,队列等等系统了。比如我们访问 pgadmin4:

Image

实在是非常的方便,推荐大家试一试。

当然有更好的方式也欢迎提出。小伙伴们你们学会了吗?


Show time

最后给自己的个人小程序打个小广告:

想要你的 Github 项目在微信内分享吗?快来试试 程序员名片 吧。

进入方式:微信内,搜索 程序员名片,快速注册后添加名片,导入 Github 项目即可。

在使用过程中,如果遇到问题,或者你有好的意见和建议,欢迎与我讨论。

Demo short link: 微信内访问 #小程序://程序员名片/c9lmHLg29GtN2PH 查看我的名片。