参照 OpenVPN文档

大概流程:

  • 安装 OpenVPN
  • 生成 PKI:CA 证书和密钥、服务器端证书和密钥、客户端证书和密钥、迪菲·赫尔曼密钥
  • 服务器端配置
  • 客户端配置

OpenVPN Server

安装 OpenVPN

1
apt-get install openvpn easy-rsa

OpenVPN PKI

构建 OpenVPN 配置的第一步是建立一个公钥基础设施(PKI)。PKI 包括:

  • 一个主证书颁发机构(CA)的证书(即公钥)和密钥,用于签名服务器和客户端的证书(English:a master Certificate Authority (CA) certificate and key which is used to sign each of the server and client certificates.)
  • OpenVPN Server 证书(公钥)和密钥
  • OpenVPN Client 证书(公钥)和密钥

1、CA 设置,生成证书和密钥

  • 用安装的 easy-rsa 包来制作 CA/服务器端/客户端的证书和密钥

    1
    cp -r /usr/share/easy-rsa/ /etc/openvpn/
  • 设置默认的基本参数: /etc/openvpn/easy-rsa/vars

    1
    2
    3
    4
    5
    6
    7
    8
    export KEY_COUNTRY="CN"
    export KEY_PROVINCE="GuangDong"
    export KEY_CITY="FoShan"
    export KEY_ORG="easecloud" # organization 组织
    export KEY_EMAIL="*@easecloud.cn"
    export KEY_OU="easecloud" # organization unit 单位
    export KEY_NAME="easecloudVPN"
    export KEY_CN="ecVPN" # common name for all keys 常用名
  • 生成 CA 证书和密钥

    1
    2
    3
    source vars
    ./clean-all
    ./build-ca # 生成 CA 证书和密钥

    执行 ./build-ca时,可以一直回车,默认使用 vars 的设置。执行完之后,就会生成 CA 证书(keys/ca.crt)和密钥(keys/ca.key)。

运行 ./build-ca 时可能报错:

错误一:
error on line 198 of /etc/openvpn/easy-rsa/openssl-1.0.0.cnf
139749463725728:error:0E065068:configuration file routines:STR_COPY:variable has no value:conf_def.c:618:line 198

错误二:
error on line 220 of /etc/openvpn/easy-rsa/openssl-1.0.0.cnf
140566456841888:error:0E065068:configuration file routines:STR_COPY:variable has no value:conf_def.c:618:line 220

解决:
分别注释到 openssl-1.0.0.cnf 文件中 198 和 220 行的内容 subjectAltName=$ENV::KEY_ALTNAMES

2、服务器端证书和密钥,迪菲·赫尔曼密钥

  • 生成服务器端的证书和密钥

    1
    ./build-key-server myservername
    • myservername:服务器证书名称,如:easecloudVPN
    • 执行:一直回车,直到 Sign the certificate?[y/n]y1 out of 1 certificate requests certified, commit? [y/n]y
    • 执行完之后,我们就可以得到服务器证书(keys/easecloudVPN.crt)和密钥(keys/easecloudVPN.key)。
  • 同时,为 OpenVPN 服务器生成迪菲·赫尔曼密钥

    1
    ./build-dh

    执行完 ./build-dh 之后,会根据 /easy-ras/vars 的 KEY_SIZE 参数来生成相应的 Diffie Hellman 参数文件(keys/dh-2048.pem)

迪菲·赫尔曼密钥交换(Diffie–Hellman key exchange,简称“D–H”) 是一种安全协议。它可以让双方在完全没有对方任何预先信息的条件下通过不安全信道创建起一个密钥。这个密钥可以在后续的通讯中作为对称密钥来加密通讯内容。

3、客户端证书和密钥

生成客户端证书。一般,不同的客户端各自创建自己的客户端证书和密钥。

1
2
cd /etc/openvpn/easy-rsa/
./build-key clientName

  • clientName:客户端证书名称,如:lizs
  • 执行:一直回车,直到 Sign the certificate?[y/n]y1 out of 1 certificate requests certified, commit? [y/n]y
  • 执行完之后,我们就可以得到客户端证书(keys/lizs.crt)和密钥(keys/lizs.key)
  • 先将以下证书拷贝到 OpenVPN Client 所在环境,等下配置客户端 OpenVPN 要用到
    • ca.crt
    • lizs.crt
    • lizs.key

服务器配置

  • 先将生成的相关证书复制到 /etc/openvpn/

    1
    2
    cd keys/
    cp easecloudVPN.crt easecloudVPN.key ca.crt dh2048.pem /etc/openvpn/
  • 安装了 OpenVPN 之后会自动带有一些服务器端和客户端的简单配置的例子。

    1
    2
    3
    ls -l /usr/share/doc/openvpn/examples/sample-config-files/
    -rw-r--r-- 1 root root 3427 Dec 2 2014 client.conf # 客户端配置
    -rw-r--r-- 1 root root 4141 Dec 2 2014 server.conf.gz # 服务器端配置
  • 服务器端配置,我们可以使用例子中的配置 server.conf.gz,将它复制到 /etc/openvpn/ 目录下解压就可以使用了

    1
    2
    cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
    gunzip /etc/openvpn/server.conf.gz
  • 接下来,编辑 server.conf

    1
    2
    3
    4
    ca ca.crt    # 刚生成的 CA 证书
    cert easecloudVPN.crt # 刚生成的服务器端证书
    key easecloudVPN.key # 刚生成的服务器端密钥
    dh dh2048.pem # 刚生成的 Diffie Hellman 参数文件
  • 编辑 sysctl 配置文件 /etc/sysctl.conf 并且重新加载

    1
    2
    #net.ipv4.ip_forward=1    # default
    net.ipv4.ip_forward=1 # we just need to uncomment it

    重新加载 sysctl

    1
    sysctl -p /etc/sysctl.conf
  • 开启服务器端 OpenVPN

    1
    service openvpn start
  • 检查 OpenVPN 是否创建了一个 tun0 接口(可以查看 server.conf 配置文件中的 dev 参数)

    1
    2
    3
    4
    5
    6
    7
    8
    $ ifconfig tun0
    tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
    inet addr:10.8.0.1 P-t-P:10.8.0.2 Mask:255.255.255.255
    UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
    RX packets:0 errors:0 dropped:0 overruns:0 frame:0
    TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:100
    RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

OpenVPN Client

安装 OpenVPN

1
sudo apt-get install openvpn

客户端配置

  • 先将服务器端生成的相关证书文件复制到 /etc/openvpn/ 目录下

    • ca.crt:CA 证书
    • lizs.crt:客户端证书
    • lizs.key:客户端密钥
  • 客户端配置也可以使用 OpenVPN 自带的客户端配置例子 client.conf,将其复制到 /etc/openvpn

    1
    sudo cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/
  • 编辑客户端配置文件 /etc/openvpn/client.conf:

    1
    2
    3
    4
    remote 123.123.123.123 1194
    ca ca.crt # 服务器端生成的 CA 证书
    cert lizs.crt # 客户端证书
    key lizs.key # 客户端密钥

    其中123.123.123.123为 OpenVPN Server 所在服务器的 IP 或域名。

  • 开启 OpenVPN Client

    1
    service openvpn@client start
  • 检查 OpenVPN 是否创建了一个 tun0 接口(可以查看 server.conf 配置文件中的 dev 参数)

    1
    ifconfig tun0

如果没有成功开启,重启服务器端的 OpenVPN 和 客户端的 OpenVPN 试试看。


附 windows openvpn client

  • 安装 OpenVPN GUI
  • 首先,将服务器生成的相关证书复制到安装目录的 config 文件夹下面。

    • ca.crt:CA 证书
    • lizs.crt:客户端证书
    • lizs.key:客户端密钥
  • 修改配置文件。同样,使用自带的配置例子 sample-config/client.ovpn。将其复制到 config 目录下,然后编辑:

    1
    2
    3
    4
    5
    dev tun    # 和服务器的保持一致
    remote 123.123.123.123 1194
    ca ca.crt # 服务器端生成的 CA 证书
    cert lizs.crt # 客户端证书
    key lizs.key # 客户端密钥

    其中123.123.123.123为 OpenVPN Server 所在服务器的 IP 或域名。

  • 最后以管理员身份运行 OpenVPN。启动之后,右键菜单栏 OpenVPN 图标,connect