描述
外网客户端与内网数据服务器均加入一个虚拟局域网,并使用该虚拟网赋予的 IP 地址,解决服务器可见性问题
- IP隧道技术
- 保留IP地址:10.8.0.0/24
还有通信安全问题,专用网
- SSL/TLS、IPSec等等
使用OpenVPN来构建VPN
- OpenVPN 使用 IP 隧道技术构建 VLAN
- OpenVPN 使用数字证书与 SSL/TLS 技术实现通信安全(基于数字证书的双向认证)
- 必须构建一个 PKI 系统
环境和相关命令
- Vultr 服务器 和 Ubuntu 18.04 x64 的操作系统,需要设置 UDP 1194端口 的防火墙规则为accept
- 使用 PuTTY 进行远程连接
- 使用 WinSCP 传输文件
- 源文件全部放在 /usr/local/src 下,配置文件等全部放在 /usr/local/data 下
PuTTY容易断开连接,所以在登录时在Connection处设置keepalive 10s,并勾选下面两个勾
- wget [url] 命令用来在Linux环境下载文件
- tar -zxvf [文件名] 解压 .tgz文件和 .tar.gz 文件
- gzip -d [文件名] 用来解压 .gz 文件
- ps -ef 用来查看进程(ps -ef | grep openvpn 过滤出openvpn相关进程)
- kill -s 9 [pid] 用来杀死某个pid的进程
- cat 查看文件内容
- nano 查看并修改文件内容
配置流程
- 使用EasyRSA构建一个PKI系统
- 为openvpn服务器和客户端生成证书
- 下载openvpn
- 修改server.conf文件作为服务器端配置文件
- 修改client.conf文件作为客户端配置文件
- 运行并测试
构建PKI系统
下载 EasyRSA 3
选择安装目录,可以是任何目录,本文选定的是/usr/local/src,下载完成后文件夹更名为easyrsa(更名步骤可无视)
cd /usr/local/src |
构建一个 PKI 和 CA
cd easyrsa/ |
然后按提示设置一个CA密码,这个密码在后面为数字证书签名的时候要用到
然后会看到设置CA的Common Name就完成了,可以看到以下提示
Common Name (eg: your user, host, or server name) [Easy-RSA CA]: |
准备公钥和密钥
OpenVPN系统需要准备以下文件(以下服务器指openvpn服务器,客户端指意图通过openvpn通信的机器)
文件名 | 使用者 | 说明 | 保密 |
---|---|---|---|
ca.crt | 所有人 | 根证书 | 否 |
ca.key | 签发私钥的机器 | 根私钥 | 是 |
dh{n}.pem | 服务器 | Diffie Hellman parameters | 否 |
server.crt | 服务器 | 服务器证书 | 否 |
server.key | 服务器 | 服务器私钥 | 是 |
client(s).crt | 服务器 | 客户端证书 | 否 |
client(s).key | 服务器 | 客户端私钥 | 是 |
需要注意的点:
- 最佳实践是在需要这些文件的机器上生成req文件和key文件,然后将req文件传送到CA,由CA进行签证后将crt证书发回。(考虑到传送通道安全性,生成key和crt后再传送这两个文件这种方式的安全性无法保证)
- 可以多个客户端共同使用一个证书和私钥,但最好的不同的客户端使用不同的。
- 为了传输方便,直接在服务器端使用命令 ./easyrsa gen-dh 生成dh.pem文件
如果是在不同的机器(或文件夹)生成证书和私钥,EntityName可以自定义,本例子使用server代表openvpn服务器,forwin 代表一个使用 Windows 10 系统的客户端
中间根据提示设置密码和 Common Name
./easyrsa init-pki |
然后将 .req 文件发送到CA所在机器,然后导入到CA系统(如果是直接在CA系统处生成证书,省略此步骤)
./easyrsa import-req /tmp/path/to/import.req EntityName |
然后为 server 签订服务器证书为 forwin 签订客户端证书
中间根据提示输入“yes”和 CA 的密码
./easyrsa sign-req server server |
成功后可以看到以下提示
The Subject's Distinguished Name is as follows |
然后将 .crt 文件发给对应机器待用就好了
配置OpenVPN
安装
上官网对应操作系统下载和安装
Ubuntu直接使用以下命令安装和查看版本,Windows系统下载exe文件然后安装
apt install openvpn |
在/usr/local/data夹下创建一个openvpn文件夹存放相关证书和配置文件,将证书文件传送过来,将示例server.conf和client.conf文件复制过来。(或者在这里下载)
cd /usr/local/data |
此时已经在服务器开启了openvpn服务
使用 WinSCP 之类软件在客户端凑齐以下文件
- ca.crt
- forwin.crt
- forwin.key
- ta.key
- client.conf
然后修改 client.conf 并将其更名为 client.ovpn,修改部分参数,内容如下(仅作参考,路径自行设置,记得做双反斜杠和双引号处理),0.0.0.0 处改为你的服务器公网IP
remote 0.0.0.0 1194 |
打开 OpenVPN GUI 右键导入配置文件client.opvn
ping 一下试试看
问题
我遇到了客户端成功“Initialization Sequence Completed”的信息但是ping不通,然后在服务器加了下面这个命令,同时本机电脑也应注意防火墙问题
iptables -A INPUT -p udp --dport 1194 -j ACCEPT |