Ubuntu搭建OpenVPN服务器

今天在 Ubuntu 的云服务器上搭建了一个 OpenVPN 服务器,并且使用 Windows 和 Linux 客户端加入到了这个 VPN 网络中,记录一下搭建的过程,以备以后查询

生成证书和密钥

Open VPN 服务器需要生成证书和密钥,这些可以使用 easy-rsa 来生成
首先在服务端下载并解压 easy-rsa

1
2
3
wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.2.1/EasyRSA-3.2.1.tgz
tar -xzf EasyRSA-3.2.1.tgz
cd EasyRSA-3.2.1

生成 CA 证书和服务端的私钥和证书

1
2
3
4
5
./easyrsa init-pki #初始化
./easyrsa build-ca #注意设置CA证书的密码
./easyrsa gen-req server nopass #创建服务端证书的请求
./easyrsa sign-req server server #签名服务端证书,第一个server是命令的参数,第二个server是证书的名字,可以自定义
./easyrsa gen-dh #生成 Diffie-Hellman文件,在 Open Vpn 连接时使用 Diffie-Hellman 密钥交换算法

生成客户端证书和密钥,在客户端上下载并解压 EasyRSA,并执行以下命令

1
2
./easyrsa init-pki #初始化
./easyrsa gen-req client nopass #生成客户端证书的请求,client为证书名,可以自定义,nopass表示不需要设置密码

将客户端的请求文件 pki/reqs/client.req 发送给服务端,服务段对请求文件进行签名

1
2
./easyrsa import-req /path/to/client.req client #导入客户端请求文件,client为导入的请求名
./easyrsa sign-req client client #签名客户端证书,第一个client为参数,表示签发为客户端,第二个为上一条命令导入的请求名

签发完成后,将服务端的 pki/ca.crtpki/issued/client.crt 文件发送到客户端
至此,证书和密钥已经生成完毕,下面开始配置 openvpn 服务器

配置 Open VPN 服务器

安装 openvpn,Ubuntu 安装

1
sudo apt install openvpn

修改配置文件 /etc/openvpn/server.conf,如果没有,可以将 /usr/share/doc/openvpn/examples/sample-config-files/server.conf 复制到 /etc/openvpn 目录下

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

修改配置文件的以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
port 1194 #端口
proto udp #使用 UDP 协议
dev tun #使用 TUN 模式
ca /path/to/easy-rsa/pki/ca.crt #CA 证书
cert /path/to/easy-rsa/pki/issued/server.crt #服务端证书
key /path/to/easy-rsa/pki/private/server.key #服务端私钥
dh /path/to/easy-rsa/pki/dh.pem #Diffie-Hellman 文件
server 10.8.0.0 255.255.255.0 #服务器网段,第一个为网段,第二个为子网掩码
ifconfig-pool-persist /var/log/openvpn/ipp.txt #保存客户端 IP 地址池
client-config-dir ccd #客户端配置目录,如果需要固定客户端 IP 地址,可以在该目录下创建文件,文件名是客户端证书的名字,文件内容是客户端的 IP 地址
client-to-client #允许客户端之间互相访问
duplicate-cn #允许重复的 CN
keepalive 10 120 #保持连接,第一个参数为每10秒发送一次心跳包,第二个参数为如果120秒内没有收到心跳包,则断开连接
cipher AES-256-CBC #加密算法
comp-lzo #压缩算法
persist-key #VPN重启后保持密钥
persist-tun #VPN重启后保持隧道
status /var/log/openvpn/openvpn-status.log #状态日志文件
verb 3 #日志级别
explicit-exit-notify 1 #退出通知客户端

改好配置后,启动服务端的 openvpn 服务

1
systemctl start openvpn@server

配置 Windows 客户端

官网下载 openvpn 客户端,解压并安装
将创建好的客户端证书(client.crt)、私钥(client.key)和服务端的CA证书(ca.crt)放在 openvpn 安装目录的config目录下,例如 C:\Users\NeroUMU\OpenVPN\config
再在config目录下创建一个客户端配置文件 client.ovpn,这里的client为openvpn识别的客户端可以自定义,内容为

1
2
3
4
5
6
7
8
9
10
11
12
client #这里表示客户端模式,不可自定义
dev tun
proto udp
remote 服务端IP 1194 #openvpn服务端的IP和端口号
resolv-retry infinite
nobind
ca ca.crt
cert client.crt
key client.key
verb 3
persist-key
comp-lzo

配置完成后,启动 Open VPN,即可连接 openvpn 服务器

配置 Linux 客户端

我是在 Arch Linux 上配置的,Arch Linux 的大部分操作都与 Ubuntu 相似,但有几处命令不同,这里可以查询 Arch Linux Wiki
安装 openvpn

1
sudo pacman -S openvpn

将创建好的客户端证书(client.crt)、私钥(client.key)和服务端的CA证书(ca.crt)放在 /etc/openvpn/client
再创建配置文件 /etc/openvpn/client/.client.conf,内容与 Windows 客户端相同,注意一定是.client.conf,不能是 client.conf

1
2
3
4
5
6
7
8
9
10
11
12
client #这里表示客户端模式,不可自定义
dev tun
proto udp
remote 服务端IP 1194 #openvpn服务端的IP和端口号
resolv-retry infinite
nobind
ca ca.crt
cert client.crt
key client.key
verb 3
persist-key
comp-lzo

如果是 Ubuntu,则都放在 /etc/openvpn 目录下,且配置文件名为 client.conf

启动客户端

1
systemctl start openvpn-client@.client

固定客户端 IP 地址

如果想要固定客户端 IP 地址,可以在服务端 /etc/openvpn/ccd 目录下创建文件,文件名是客户端证书的名字(CN),文件内容如下

1
ifconfig-push 客户端IP 对端IP

注意客户端 IP 和 对端 IP 都是服务器网段的,并且同在一个 255.255.255.252 的网段内,比如 10.8.0.210.8.0.110.8.0.5010.8.0.49都是一对合法的客户端 IP 和 对端 IP


搭建 Open VPN 服务器看上去很复杂,但是一路搭建下来会发现脉络清晰,很简单的,在搭建过程中碰到的最大的问题可能就是最后固定IP了,那里一开始没有理解报错信息里的网段,导致浪费了一些时间,不过好在都解决了Ciallo~(∠・ω< )⌒☆