最近开始,不少网站对于境外流量直接拒绝访问,所以搭建一个可以正常访问的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端口的许可

發表留言