搭建访问内地网络的OpenVPN云服务

最近开始,不少网站对于境外流量直接拒绝访问,所以搭建一个可以正常访问的VPN的任务提上了日程,但因为不是强需求,所以没有着急。

最近买了一台3D打印机,购买时没有发现厂家在详情页说明不能在大陆以外使用,后来专门到深圳提货时发现包装箱上有这么一行字,还以为只是像手机、相机一类只是不用使用国内版本的APP和失去保修,没想到直接所有的联网功能都不能使用了,只能用SD卡传输打印文件。一下子把5000多的准工业级降级成了1000多的入门级。

无法接受这样的结果,所以就尝试搭建可以将网络环境虚拟成国内网络的VPN。

配置

  • 路由器
    • ASUS RT-92U
  • 云主机
    • CentOS Linux release 7.9.2009 (Core)
    • Ubuntu 20.04.06
  • OpenVPN
    • 服务端:2.4.12
    • 客户端:Asus Router VPN Fusion

步骤 1: 选择云服务器

在某云购买了Ubuntu和Centos两种服务器,第一次用Ubuntu时没成功,用Centos配置成功了,后续会验证Ubuntu是否也可以完成。配置好服务器和密钥,用SSH访问服务器,完成后续配置。

需要注意的是下载的 pem 文件注意要修改文件权限后才能直接用于 SSH,例如:

chmod 400 mykey.pem
ssh -i mykey.pem user@mydomain.example

步骤 2: 更新服务器并安装 OpenVPN

1、更新系统

Ubuntu:

apt-get update && apt-get upgrade -y

CentOS:

yum update -y

2、安装 OpenVPN 和 Easy-RSA

Ubuntu:

apt-get install openvpn easy-rsa -y

CentOS:

yum install epel-release -y
yum install openvpn easy-rsa -y

步骤 3: 配置 OpenVPN 服务器

1、复制示例配置文件

OpenVPN 的示例配置文件在项目文档目录里,粗体部分在其它环境中可能不同,将这个目录下的 server.conf 和 client.conf 都复制到 /etc/openvpn 目录,client.conf 用于客户端配置。

Ubuntu:

cd /usr/share/doc/openvpn/examples/sample-config-files
cp server.conf /etc/openvpn
cp client.conf /etc/openvpn

CentOS:

/usr/share/doc/openvpn-2.4.12/sample/sample-config-files
gunzip server.conf.gz
cp server.conf /etc/openvpn
cp client.conf /etc/openvpn

2、编辑 server.conf

根据需要对示例文件中的相关项目进行修改,2.4.12的默认配置说明点击这里

用于转发流量,必须要将以下两行设为有效:

push "redirect-gateway def1 bypass-dhcp"# 路由转发
push "dhcp-option DNS 114.114.114.114"  # 国内运营商通用 DNS
push "dhcp-option DNS 114.114.115.115"  # 国内运营商通用 DNS

如果没有特别的需要,其它配置建议不用修改。

3、服务器启用 IP 转发

编辑 /etc/sysctl.conf,确认以下配置生效

net.ipv4.ip_forward = 1

执行以下命令使其生效,输出看到上述配置表示成功

sysctl -p

步骤4、配置 iptables

1、配置 iptables 以允许 VPN 客户端通过服务器转发访问国内网络

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 10.8.0.0/24 -j ACCEPT

2、持久化配置

Ubuntu

apt-get install iptables-persistent
netfilter-persistent save

CentOS

service iptables save

步骤5:生成密钥和证书

1、使用 Easy-RSA 创建一套 PKI 配置,

先在 OpenVPN 目下复制 easy-rsa 文件(注意黑体部分可能和你的环境不同)

Ubuntu

make-cadir /etc/openvpn/easy-rsa

CentOS

mkdir -p /etc/openvpn/easy-rsa
cp -R /usr/share/easy-rsa/3/* /etc/openvpn/easy-rsa/

2、生成私钥和签名证书

生成根证书 ca.crt (位于/etc/openvpn/easy-rsa/pki)和私钥 ca.key 。过程中需要设置一个密码,如果是自用就不用太复杂,但需要记下来。后续签名服务端和客户端证书时会用到。其它设置按默认即可。

cd /etc/openvpn/easy-rsa
./easyras clean-all
./easyrsa build-ca

生成服务端私钥 server.key (位于/etc/openvpn/easy-rsa/pki/private)

./easyrsa gen-req server nopass

生成服务端签名证书 server.crt (位于/etc/openvpn/easy-rsa/pki/issued),过程中需要键入「yes」和输入之前生成 ca.key 时设置的密码

./easyrsa sign-req server server 

生成 Diffie-Hellman 参数 dh.pem (位于 /etc/openvpn/easy-rsa/pki ),按不同的系统配置,这一步可能需要的时间长短不一,请耐心等待

./easyrsa gen-dh

生成 HMAC 密钥 ta.key (位于 /etc/openvpn/easy-rsa/ )

openvpn --genkey --secret ta.key

为了便于后续处理,建议将以上五个文件都复制到 OpenVPN 主目录 /etc/openvpn

cp ta.key /etc/openvpn
cp pki/dh.pem /etc/openvpn
cp pki/ca.crt /etc/openvpn
cp pki/issued/server.crt /etc/openvpn
cp pki/priavte/server.key /etc/openvpn

完善 server.conf。确认 server.conf 中的相关文件名配置和生成的这五个一致,如果一直用默认名称,在这个版本中, 只有 dh 的设置需要修改一下

ca ca.crt
cert server.crt
key server.key
tls-auth ta.key 0
#dh dh2048.pem 需要修改
dh dh.pem

2、生成客户端私钥和签名证书

这里暂时用不到这两个文件,但是为了后续处理方便,可以一并生成好,为了便于区分,这里使用 client1 作为文件名,生成的文件有 client1.key 和 client1.crt。生成 client1.crt 签名文件时,需要键入「yes」及之前生成 ca.key 时设置的密码。生成之后,也将它们复制到 /etc/openvpn 目录下待用。

cd /etc/openvpn/easy-rsa
./easyrsa gen-req client1 nopass
./easyrsa sign-req client client1
cp pki/private/client1.key /etc/openvpn
cp pki/issued/client1.crt /etc/openvpn

步骤6:启动 OpenVPN 服务

systemctl start openvpn@server

查看 OpenVPN 服务启动状态,如果没有出错提示,就是服务正常了

systemctl status openvpn@server

如果需要查看详细的连接日志,可以在 server.conf 中打开这个配置
日志的默认位置

  • CentOS系统中位于 /etc/openvpn/openvpn.log
  • Ubuntu 系统中位于 /var/log/openvpn/openvpn.log 
log-append  openvpn.log

步骤7:修改 OpenVPN 客户端配置文件

将以下文件从服务器 /etc/openvpn 下载到本地

client.conf
client1.key
client1.crt
dh.pem
ta.key

详细的客户端配置脚本 client.conf 参考可以点击这里查看。

首先需要修改服务器地址,将 my-server-1 替换为你的服务器地址

remote my-server-1 1194

最重要的修改是密钥和签名文件的引用。这里需要用到之前在 /etc/openvpn 目录下准备好的文件:

  • ca.crt (生成目录 etc/openvpn/easy-rsa/pki/
  • client1.key (生成目录 etc/openvpn/easy-rsa/
  • client1.crt (生成目录 etc/openvpn/easy-rsa/
  • ta.key (生成目录 etc/openvpn/easy-rsa/

客户端脚本有两种组织结构

  • 在配置文件中引用当前目录下的对应文件名
  • 将文件内容以嵌入的方式直接写在配置文件里

如果第一种方案,配置内容应该如下,注意黑体部分和范例里有少许不同

ca ca.crt
cert client1.crt
key client1.key
tls-auth ta.key 1

在此建议第二种方案,这样就不用考虑多文件上传的问题,做法如下

#ca ca.crt
# 注释上一行后,复制  ca.crt 内容到下面 XXX... 位置
<ca>
-----BEGIN CERTIFICATE-----
XXX...
-----END CERTIFICATE-----
</ca>

#cert client.crt
# 注释上一行后,复制 client1.crt 内容到下面 XXX... 位置
# 注意,只需要复制 BEGIN - END 范围内的内容即可,其它内容不用
<cert>
-----BEGIN CERTIFICATE-----
XXX...
-----END CERTIFICATE-----
</cert>

#key client.key
# 注释上一行后,复制 client1.key 内容到下面 XXX... 位置
<key>
-----BEGIN PRIVATE KEY-----
XXX...
-----END PRIVATE KEY-----
</key>

#tls-auth ta.key 1
# 注释上一行后,复制 ta.key 内容到下面 XXX... 位置
<tls-auth>
-----BEGIN OpenVPN Static key V1-----
XXX...
-----END OpenVPN Static key V1-----
</tls-auth>

在调试过程中,有一个地方需要注意,如果使用了 tls-auth 加密方式,在客户端脚本中需要加入

key-direction 1

修改完后,将 client1.conf 文件名改为 client1.ovpn,便于客户端系统识别。

步骤8:启动客户端

利用 Asus Router 的 Setting – VPN – VPN Fusion 功能,新建一个 VPN 客户端实例,将client1.ovpn 上传,启动连接。

如果连接不成功,可以通过 OpenVPN 的手机客户端验证,查看客户端脚本在本地的执行日志。

排除本地问题后,再通过服务端 /etc/openvpn/openvpn.log 排除服务端的问题

其它可能问题:云服务安全组规则

  • 如果云服务有安全规则,需要在安全规则中开放对 1194端口的许可

探索更多來自 从前有个程序员 的內容

訂閱即可透過電子郵件收到最新文章。

發表留言

你的電子郵件位址不會公開。 必要欄位標記為 *