不知道你有没有遇到这样的场景?
你在某个公有云平台上,有好几台服务器,它们在一个私有网络 (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
相关地址:
很棒但是需要下载对应的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/4500
的 udp
协议。
这样配置好了之后就可以直接用本机自带的 vpn
功能进行链接了,非常的简单方便快速。
windows 系统的机器,需要修改注册表后重新启动才能连上,不然会报错,详见 https://github.com/hwdsl2/setup-ipsec-vpn/blob/master/docs/clients-zh.md
在我们购买服务器的时候,服务商都会给我们 2
个 ip
一个是公网的 ip,一个是 vpc 内网里的 ip,
接下来让我们进入服务器,查看 ifconfig
:
我们直接使用 内网 ip + 端口
,就可以访问对应的资源了,这些资源,你甚至可以直接监听 0.0.0.0
,因为它们在安全组那会被屏蔽,所以不会直接暴露在公网。
这样,我们本地连上 vpn
就可以直接连接线上的数据库,访问线上的缓存,队列等等系统了。比如我们访问 pgadmin4
:
实在是非常的方便,推荐大家试一试。
当然有更好的方式也欢迎提出。小伙伴们你们学会了吗?
最后给自己的个人小程序打个小广告:
想要你的 Github 项目在微信内分享吗?快来试试 程序员名片
吧。
进入方式:微信内,搜索 程序员名片
,快速注册后添加名片,导入 Github
项目即可。
在使用过程中,如果遇到问题,或者你有好的意见和建议,欢迎与我讨论。
Demo short link
: 微信内访问 #小程序://程序员名片/c9lmHLg29GtN2PH
查看我的名片。