从 Client VPN endpoint 迁移到 EC2 上的 OpenVPN

缘起

原本有一个 Client VPN endpoint 在 AWS 新加坡。有几个原因导致要迁移:

  • 没几天就不能用了,具体原因不足为外人道也,懂的都懂。
  • Client VPN endpoint 太贵了。

现有环境

  • 免费的 EC2 一台,跑的是 Amazon Linux 2023

具体步骤

安装 OpenVPN

由于 Amazon Linux 2023 里没有 OpenVPN 的包,也考察过 Fedora 36 的包,但思来想去,还是源代码编译安装吧,所以 OpenVPN 最后还是源代码编译安装的。

登录 EC2 后,开始操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
wget https://swupdate.openvpn.org/community/releases/openvpn-2.6.6.tar.gz
tar xzvf openvpn-2.6.6.tar.gz
cd openvpn-2.6.6
./configure --prefix=/usr/local/openvpn
make
# configure 和 make 的时候会出一些错误
# 多半是缺少什么包导致的,见招拆招吧,
# 缺什么直接用 sudo dnf install xxx 装上即可
sudo make install
sudo mkdir /usr/local/openvpn/etc
sudo cp ca.crt /usr/local/openvpn/etc/
sudo cp server.crt /usr/local/openvpn/etc/
sudo cp server.key /usr/local/openvpn/etc/
# 因为是迁移,所以这里把原来有的 ca.crt、server.crt 和
# server.key 拷贝到 /usr/local/openvpn/etc/ 目录下
cd /usr/local/openvpn/etc
sudo wget https://github.com/OpenVPN/openvpn/raw/master/sample/sample-config-files/server.conf
# 上面是从 OpenVPN 官方代码库里把服务器配置例子扒下来

配置 OpenVPN 服务器

还是在 EC2 上,/usr/local/openvpn/etc 目录下

1
2
sudo vim /usr/local/openvpn/etc/server.conf
# 以官方例子为模版修改服务器配置文件

有几个地方需要改:

  • cipher 这一行改成 cipher AES-256-GCM
  • dh 这一行改成 dh none
  • user 这一行改成 user nobody
  • group 这一行改成 group nobody
  • port 这一行是端口号,自己看着改,缺省 1194 也可以
  • proto 这一行建议改成 proto tcp
  • explicit-exit-notify 这一行如果 proto 设成 tcp 的话要改成 explicit-exit-notify 0
  • cert 这一行改成 cert /usr/local/openvpn/etc/server.crt
  • key 这一行改成 key /usr/local/openvpn/etc/server.key
  • ca 这一行改成 ca /usr/local/openvpn/etc/ca.crt
  • push “route 这一行需要按需写上要推送的路由(每行写一段),比如 push "route 172.16.0.0 255.240.0.0"

Linux 上打开包转发

EC2 上

1
2
echo "net.ipv4.ip_forward = 1" > /etc/sysctl.d/10-OpenVPN.conf
sudo sysctl -p /etc/sysctl.d/10-OpenVPN.conf

启动服务

EC2 上

1
2
3
sudo /usr/local/openvpn/sbin/openvpn \
--config /usr/local/openvpn/etc/server.conf \
--daemon

AWS 上修改 EC2 的设置

所有做包转发的 EC2,都需要强制关掉 AWS 官方的 source/destination check。方法是:

Actions->Networking->change source/destination check,然后点“stop”

至此,VPN 从 AWS 的 Client VPN endpoint 已经迁移到我们自己的 EC2 上了,以前的客户端,只需要改下 remote 那一行的服务器地址为 EC2 的公网地址,以及将 proto 改成 tcp(Client VPN endpoint 缺省是 udp,而且不能改)即可继续使用,连新的 VPN 服务器。