openvpn 使用

安装

apt-get install openvpn easy-rsa

创建 ca 目录

make-cadir ~/openvpn-ca

配置 ca 变量

cd ~/openvpn-ca
vim vars

在文件底部找到类似下面这样的行,这些值是提供给 vpn 的默认配置值,可以随便修改,但是不要为空

export KEY_COUNTRY="US"
export KEY_PROVINCE="CA"
export KEY_CITY="SanFrancisco"
export KEY_ORG="Fort-Funston"
export KEY_EMAIL="me@myhost.mydomain"
export KEY_OU="MyOrganizationalUnit"

找到下面的行

export KEY_NAME = "EasyRSA"

设置成一个其他的值。

建立证书颁发机构

source vars

如果正确 source,你会看到

NOTE: If you run ./clean-all, I will be doing a rm -rf on /root/openvpn-ca/keys

确保我们在一个干净的环境里操作

./clean-all

构建 ca

./build-ca

由于我们在 vars 里已经配置好了,这里直接回车就好了。

创建服务器证书,密钥和加密文件

./build-key-server server 

server 为指定的名称,也可以使用其他的,如果使用其他的名字,需要对应修改 /etc/openvpn/server.conf 文件来指向正确的 .crt 和 .key 文件。

同样一路回车,最后两个问题输入 y 来签署和提交证书。

通过下面的命令生成 Diffie-Hellman 密钥以在密钥交换的过程中使用。

./build-dh

Diffie-Hellman key exchange,是一种安全协议,可以让双方在完全没有对方任何预先信息的情况下通过不安全通道创建起一个密钥。

生成的 ta.key 主要是用于防御DoS,UDP 淹没等攻击。

然后生成一个 HMAC 签名来加强服务器的 TLS 完整性验证功能。

openvpn --genkey --secret keys/ta.key

生成客户端证书和密钥对

cd ~/openvpn-ca
source vars
./build-key laily

使用 laily 作为证书/密钥对的值。

配置 openvpn 服务

把必要的文件拷贝到 openvpn 目录中

cd ~/openvpn-ca/keys
sudo cp ca.crt server.crt server.key ta.key dh2048.pem /etc/openvpn

解压一份配置文件到 openvpn 的配置目录中

gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz | sudo tee /etc/openvpn/server.conf

修改 openvon 配置

// 取消 tls-auth 的注释,添加 key-derection
tls-auth ta.key 0
key-direction 0

// 修改加密部分
cipher AES-128-CBC

// 加上 auth 来选择 HMAC 消息算法
auth SHA256

// 找到 user 和 group 取消注释
user nobody
group nogroup

// 配置客户端全部网络流量通过 VPN 进行重定向访问,取消下面这一行的注释
push "redirect-gateway def1 bypass-dhcp"

// 默认的虚拟局域网网段,不要和实际的局域网冲突
server 10.8.0.0 255.255.255.0 

// vpn 服务器所在的网段,推送到客户端,让客户端访问这个网段的请求都通过 vpn 访问。这样就可以访问 vpn 服务器局域网内的其他机器
// 这里开启了之后还要在 /etc/sysctl.conf 配置 net.ipv4.ip_forward = 1。配置文档 https://community.openvpn.net/openvpn/wiki/BridgingAndRouting#Usingrouting
push "172.16.42.0 255.255.240.0"

启动服务

使用 systemd 单元启动的时候需要指定配置文件名,我们的配置文件叫 /etc/openvpn/server.conf,所以启动的时候使用 systemctl start openvpn@server

正常启动后可以看到如下输出。

Nov 18 19:37:27 mix2 ovpn-server[4205]: /sbin/ip addr add dev tun0 local 10.8.0.1 peer 10.8.0.2
Nov 18 19:37:27 mix2 ovpn-server[4205]: /sbin/ip route add 10.8.0.0/24 via 10.8.0.2
Nov 18 19:37:27 mix2 ovpn-server[4205]: GID set to nogroup
Nov 18 19:37:27 mix2 ovpn-server[4205]: UID set to nobody
Nov 18 19:37:27 mix2 ovpn-server[4205]: UDPv4 link local (bound): [undef]
Nov 18 19:37:27 mix2 ovpn-server[4205]: UDPv4 link remote: [undef]
Nov 18 19:37:27 mix2 ovpn-server[4205]: MULTI: multi_init called, r=256 v=256
Nov 18 19:37:27 mix2 ovpn-server[4205]: IFCONFIG POOL: base=10.8.0.4 size=62, ipv6=0
Nov 18 19:37:27 mix2 ovpn-server[4205]: IFCONFIG POOL LIST
Nov 18 19:37:27 mix2 ovpn-server[4205]: Initialization Sequence Completed

创建客户端配置

在 home 目录下创建一个目录来保存文件

mkdir -p ~/client-configs/files

锁定权限

chmod 700 ~/client-configs/files

创建一个基本配置

cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf

修改配置

// 定位到 remote 指令,把 ip 改成 openvpn 的服务器地址
remote your_openvpn_server_ip your_openvpn_port

// 修改协议,和服务端配置一样
proto udp

// 取消 user 和 group 的注释
user nobody
group nogroup

// 找到ca, cert, key 指令,注释掉,我们用另外的方式添加
# SSL/TLS parms.
# See the server config file for more
# description.  It's best to use
# a separate .crt/.key file pair
# for each client.  A single ca
# file can be used for all clients.
#ca ca.crt
#cert client.crt
#key client.key

// 修改 cipher 和 auth
cipher AES-128-CBC
auth SHA256

// 在 tls-auth 下添加 key-direction 1
// tls-auth 不取消注释
key-direction 1

创建配置生成脚本

在 ~/client-configs/ 下创建 make_config.sh,内容如下

#!/bin/bash

# First argument: Client identifier

KEY_DIR=~/openvpn-ca/keys
OUTPUT_DIR=~/client-configs/files
BASE_CONFIG=~/client-configs/base.conf

cat ${BASE_CONFIG} \
    <(echo -e '<ca>') \
    ${KEY_DIR}/ca.crt \
    <(echo -e '</ca>\n<cert>') \
    ${KEY_DIR}/${1}.crt \
    <(echo -e '</cert>\n<key>') \
    ${KEY_DIR}/${1}.key \
    <(echo -e '</key>\n<tls-auth>') \
    ${KEY_DIR}/ta.key \
    <(echo -e '</tls-auth>') \
    > ${OUTPUT_DIR}/${1}.ovpn

设置权限

chmod 700 ~/client-configs/make_config.sh

生成客户端

之前我们生成了 laily.crt 文件和 laily.key 文件。

现在生成配置

./make_configs.sh laily

那么在 ~/client-configs/files 目录下会生成一个 laily.ovpn 文件

传输这个文件到客户端设备就可以配置客户端 vpn 了。