去评论
推扬网

OpenVPN的配置和使用

admin
2020/05/03 15:25:15

  OpenVPN是一个用于创建虚拟专用网络加密通道的软件包,允许创建的VPN使用公开密钥、数字证书、或者用户名/密码来进行身份验证。OpenVPN能在Solaris、Linux、OpenBSD、FreeBSD、NetBSD、Mac OS X与Windows 2000/XP/Vista/7以及Android和iOS上运行,并包含了许多安全性的功能。

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

  OpenVPN 支持基于证书的双向认证,也就是说客户端需认证服务端,服务端也要认证客户端,

  服务端和客户端验证对方的第一步是验证对方提供的证书是由认证机构(CA)颁发的。然后测试第一步认证通过的证书的头部信息,如:证书的common name,证书的类型(客户端还是服务端)。

  从VPN的观点来看,这一安全模式满足一系列要求:

生成认证机构(master Certificate Authority(CA))证书 & 私钥

  在这一节我们生成一个认证机构(master CA)证书/私钥,一个服务端证书/私钥,两个客户端的证书/私钥。

  我们使用OpenVPN捆绑的一组脚本。

  在Linux下打开一个Sehll,进入OpenVPN下的easy-rsa目录。如果OpenVPN是从RPM包安装的,easy-rsa目录通常在/usr/share/doc/packages/openvpn或/usr/share/doc/openvpn-2.0目录下(最好在改动之前将这一目录拷到别的地方,比如/etc/openvpn,以免以后OpenVPN的升级覆盖所做的改动)。

  在Windows下,打开一个命令行窗口进入\Program Files\OpenVPN\easy-rsa目录,运行下面的批处理文件将配置文件拷到正确的位置(这一命令会覆盖先前存在的vars.bat和openssl.cnf文件)。

init-config

  编辑vars文件(在Windows下是vars.bat)设置KEY_COUNTRY、KEY_PROVINCE、 KEY_CITY, KEY_ORG和KEY_EMAIL参数,这些参数不能有一个是空白。

  下一步,初始化PKI,Linux下:

. ./vars
./clean-all
./build-ca

  Windows下:

vars
clean-all
build-ca

  最后命令(build-ca)通过调用交互地openssl命令生成认证机构(CA)的证书和私钥。

ai:easy-rsa # ./build-ca
Generating a 1024 bit RSA private key
............++++++
...........++++++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [KG]:
State or Province Name (full name) [NA]:
Locality Name (eg, city) [BISHKEK]:
Organization Name (eg, company) [OpenVPN-TEST]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:OpenVPN-CA
Email Address [me@myhost.mydomain]:

  上面的序列中,大多数询问参数的默认值是在vars或vars.bat文件中设定的值。唯一一个需要明确输入的参数是Common Name,上面的例子中输入的是"OpenVPN-CA"。

为服务端生成证书&私钥

  为服务端生成证书和私钥。Linux/BSD/Unix:

./build-key-server server

  Windows:

build-key-server server

  和前面的一步类似,大多数参数可以保持默认值。当询问Common Name时,输入"server" 。另外两个回答"y"的问题,"Sign the certificate? [y/n]"和"1 out of 1 certificate requests certified, commit? [y/n]"。
Two other queries require positive responses, "Sign the certificate? [y/n]" and "1 out of 1 certificate requests certified, commit? [y/n]".

为3个客户端生成证书&私钥

  生成客户端证书和前一步类似。Linux/BSD/Unix:

./build-key client1
./build-key client2
./build-key client3

  Windows:

build-key client1
build-key client2
build-key client3

  如果你想使用口令保护你的客户端私钥,则使用build-key-pass脚本而不是build-key。

  为每个客户端输入适合的Common Name,也就是"client1", "client2", "client3"。总是为每个客户端指定一个独一无二的名字。

生成 Diffie Hellman 参数

  必须为OpenVPN服务端生成 Diffie Hellman 参数。Linux/BSD/Unix:

./build-dh

  Windows:

build-dh

  输出:

ai:easy-rsa # ./build-dh
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
.................+...........................................
...................+.............+.................+.........
......................................

密钥文件

  在keys目录下生成的私钥和证书。下面是这些文件的解释:

  

文件名 需要者
Needed By
说明
Purpose
秘密
Secret
ca.crt 服务端和所有客户端
server + all clients
根证书
Root CA certificate
否
NO
ca.key 签发私钥的机器 
key signing machine only
根私钥 
Root CA key
是
YES
dh{n}.pem 服务器
server only
Diffie Hellman parameters 否
NO
server.crt 服务器
server only
服务器证书
Server Certificate
否
NO
server.key 服务器
server only
服务器私钥
Server Key
是
YES
client1.crt client1 only Clinet1的证书
Client1 Certificate
否
NO
client1.key client1 only Clinet1的私钥
Client1 Key
是
YES
client2.crt client2 only Client2的证书
Client2 Certificate
否
NO
client2.key client2 only Client2的私钥
Client2 Key
是
YES
client3.crt client3 only Client3的证书
Client3 Certificate
否
NO
client3.key client3 only Client3的私钥
Client3 Key
是
YES

  生成密钥的最后一步是将密钥文件拷到需要它们的机器上。


为服务端和客户端创建配置文件

得到例子配置文件 Getting the sample config files

  最好用OpenVPN的例子配置文件作为你自己配置文件的起点。 这些文件在以下目录

  在Linux, BSD, or unix操作系统中,样例配置文件是server.conf和client.conf。 在Windows下是server.ovpn and client.ovpn。

编写服务端配置文件

  样例配置文件使用虚拟TUN网络接口(路由模式for routing)创建一个VPN,它在 UDP端口1194(OpenVPN的官方端口)上监听客户端连接请求,并且从10.8.0.0/24 子网为连接的客户端分配虚拟地址。

  使用样例配置文件之前,首先要编辑ca、cert、key 和dh 参数,使之指向你在上一节PKI中生成的文件。

  这时服务端配置文件就可以使用了,也可以进一步修改它:

  如果想在同一台机器上运行多个OpenVPN,每个VPN使用一个不同的配置文件, 是可以做到的:

编写客户端配置文件

  客户端配置文件的例子(client.conf Linux/BSD/Unix或client.ovpn Windows) 和服务端配置文件的例子相对应。


启动并测试VPN的初始连接

启动服务端

  首先,确保OpenVPN服务端能从internet访问。这意味着:

  下一步,确保TUN/TAP虚拟网卡没有被屏蔽。 

  为了减少错误,最好从命令行启动OpenVPN服务端(或者在Windows下,右击.ovpn文件), 不要将其作为后台或服务运行。 

一个服务端的启动过程:
Sun Feb  6 20:46:38 2005 OpenVPN 2.0_rc12 i686-suse-linux [SSL] [LZO] [EPOLL] built on Feb  5 2005
Sun Feb 6 20:46:38 2005 Diffie-Hellman initialized with 1024 bit key
Sun Feb 6 20:46:38 2005 TLS-Auth MTU parms [ L:1542 D:138 EF:38 EB:0 ET:0 EL:0 ]
Sun Feb 6 20:46:38 2005 TUN/TAP device tun1 opened
Sun Feb 6 20:46:38 2005 /sbin/ifconfig tun1 10.8.0.1 pointopoint 10.8.0.2 mtu 1500
Sun Feb 6 20:46:38 2005 /sbin/route add -net 10.8.0.0 netmask 255.255.255.0 gw 10.8.0.2
Sun Feb 6 20:46:38 2005 Data Channel MTU parms [ L:1542 D:1450 EF:42 EB:23 ET:0 EL:0 AF:3/1 ]
Sun Feb 6 20:46:38 2005 UDPv4 link local (bound): [undef]:1194
Sun Feb 6 20:46:38 2005 UDPv4 link remote: [undef]
Sun Feb 6 20:46:38 2005 MULTI: multi_init called, r=256 v=256
Sun Feb 6 20:46:38 2005 IFCONFIG POOL: base=10.8.0.4 size=62
Sun Feb 6 20:46:38 2005 IFCONFIG POOL LIST
Sun Feb 6 20:46:38 2005 Initialization Sequence Completed

启动客户端

  和服务端一样,最好从命令行(或在Windows下右击client.ovpn文件)启动OpenVPN。

Windows下客户端的启动和上面的服务端启动类似,并且最后以 Initialization Sequence Completed 消息结束。

  现在,从客户端通过VPN发送ping包,如果你使用路由模式(服务端配置文件里是dev tun),输入下面命令: 

  如果使用桥接模式(服务端配置文件是dev tap),尝试ping服务端所在子网的某台机子的IP地址。 

  如果ping成功,祝贺你!你已经有了一个能正常工作的VPN。  

常见问题

  如果ping失败,或者OpenVPN客户端初始化失败,请检查下列现象和解决办法:  

  来源:guest_server投稿。