起初,使用OpenVPN时,使用预共享密钥(pre-shared keys)的点对点模式是唯一可用的选项。如今,有多种方法可以使用OpenVPN,但点对点模式仍然可用。point-to-point mode using pre-shared keys 通常缩写为 pre-shared keys。
在点对点模式下,OpenVPN使用预定义端点的预共享密钥进行配置,一次只能有一个端点连接到服务器实例。服务器一词可能会被认为具有误导性,因为在功能方面,两个端点或多或少是对等的。发起连接的端点被视为客户端,另一个端点则被视为服务器。
我们将从一个非常基本的例子开始演示。之后,我们将讨论OpenVPN提供的更多功能。我们将探讨以下主题:
使用预共享密钥模式的主要用例是连接两个远程网络,例如,一家小公司的主办公室和远程办公室。只要需要三个以上的用户或端点,就可以更容易地使用客户端/服务器模式,如第四章 客户端/服务器方式与tun设备 所述。本章稍后将给出一个如何使用预共享密钥将三个站点连接在一起的示例,这将清楚为什么预共享密钥模式不能很好地扩展到三个站点或用户之外。
使用预共享密钥模式的主要优点如下:
使用预共享密钥模式的缺点是:
重要的是要意识到,与使用证书和客户端/服务器设置相比,使用预共享密钥时OpenVPN的实际操作方式不同。OpenVPN中遵循的代码路径实际上非常不同,例如,不需要控制信道协商。普通终端用户不会看到这些差异,但在需要对OpenVPN连接进行故障排除时,了解这些差异非常重要。此外,当读取详细程度设置未高(即高于5)的OpenVPN日志文件时,预共享密钥连接的输出与基于证书的连接的输出看起来会有很大不同。
除非另有说明,否则本章中的示例均基于运行CentOS 6 64bit的端点。安装的OpenVPN软件版本未v2.3.2,取自CentOS-EPEL存储库。
使用OpenVPN连接两台计算机的最简单和最短的示例是在监听模式下启动第一个端点,使用固定IP地址和tun式网络:
xxxxxxxxxx
[root@server] # openvpn \
--ifconfig 10.200.0.1 10.200.0.2 \
--dev tun
接下来启动OpenVPN client :
xxxxxxxxxx
[root@client] # openvpn \
--ifconfig 10.200.0.2 10.200.0.1 \
--dev tun \
--remote openvpnserver.example.com
在另一个终端窗口中,列出网络设备:
xxxxxxxxxx
[root@client] # ip addr show tun0
7: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500
qdisc pfifo_fast state UNKNOWN group default
qlen 100 link/none
inet 10.200.0.2 peer 10.200.0.1/32 scope global tun0
valid_lft forever preferred_lft forever
以下屏幕截图显示了如何建立连接:
xxxxxxxxxx
# openvpn --ifconfig 10.200.0.2 10.200.0.1 --dev tun --remote openvpnserver.example.com
......
4.如果防火墙和SELinux规则允许,我们现在可以从任何一端ping OpenVPN端点。
连接日志显示了一些有趣的细节。客户端的OpenVPN版本是2.3.2 x86_64-redhat-linux-gnu。这验证了我们正在64位版本的RedHat Linux衍生产品上运行v2.3.2。
连接日志显示警告:
xxxxxxxxxx
Mon Sep 8 18:27:29 2014 ******* WARNING *******: all encryption and authentication features disabled -- all data will be tunnelled as cleartext
打印此警告是因为没有指定用于加密连接的密钥,这使得此示例不太安全。
tun0
已打开以进行连接。我们指定了--dev-tun
,它告诉OpenVPN打开第一个可用的tun
适配器。如果现在启动了第二个OpenVPN连接,下一个实例将使用tun1
。iproute2/sbin/ip
命令用于设置tun0
网络适配器。指定的IP地址已分配,同时默认的最大传输单元(maximum transfer unit——MTU)为1500字节。如果打印了以下消息,则连接已成功完成。然而,我们将在后面的示例中看到,这并不一定意味着VPN运行正常。
xxxxxxxxxx
Mon Sep 8 18:27:40 2014 Initialization Sequence Completed
OpenVPN使用的默认协议是UDP,因为它通常更适合VPN连接。然而,如果需要TCP协议,那么前面的例子只需要稍作修改:
在监听端,使用以下方式启动OpenVPN服务器:
xxxxxxxxxx
[root@server] # openvpn \
--ifconfig 10.200.0.1 10.200.0.2 \
--dev tun \
--proto tcp-server
在客户端,使用以下代码:
xxxxxxxxxx
[root@client] # openvpn \
--ifconfig 10.200.0.2 10.200.0.1 \
--dev tun \
--proto tcp-client \
--remote openvpnserver.example.com
OpenVPN现在将通过TCP端口1194连接。也可以使用--port参数覆盖端口号,例如 --port 5000
。
如果需要通过VPN隧道传递非TCP/IP流量(例如,传统的AppleTalk或IPX流量),则需要一个 tap 设备。tap 设备提供了一个接口,用于通过VPN隧道传递完整的以太网帧。传递完整以太网帧时的开销可以忽略不计。tap 设备的IP分配不同于 tun 设备,因为 tap 设备充当常规(regular)网络适配器,需要为其分配单个IP地址和网络掩码。
前面的例子现在被修改了。在监听端,启动OpenVPN服务器进程:
xxxxxxxxxx
[root@server] # openvpn \
--ifconfig 10.200.0.1 255.255.255.0 \
--dev tap
在客户端,使用以下代码:
xxxxxxxxxx
[root@client] # openvpn \
--ifconfig 10.200.0.2 255.255.255.0 \
--dev tap \
--remote openvpnserver.example.com
然后,我们列出了网络设备配置:
xxxxxxxxxx
[root@client] # ip addr show tap0
8: tap0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500
qdisc pfifo_fast state UNKNOWN group default qlen 100
link/ether 6e:ea:0e:47:a3:d8 brd ff:ff:ff:ff:ff:ff
inet 10.200.0.2/24 brd 10.200.0.255 scope global tap0
valid_lft forever preferred_lft forever
inet6 fe80::6cea:eff:fe47:a3d8/64 scope link
valid_lft forever preferred_lft forever
将其与第一个示例中的配置进行比较。
OpenVPN 2.1及更高版本支持一种新的拓扑,一种用于在tun式网络中分配IP地址的拓扑子网,与tap式网络使用的IP地址非常相似。使用 --topology subnet
时,将单个IP地址和网络掩码分配给tun接口,而不指定对等地址。
虽然将此拓扑模式用于专用点对点链路没有多大意义,但可以使用此拓扑选项使tun式点对点设置与相应的抽头式设置几乎完全相同。要使用这种新的拓扑模式,请使用下面描述的设置。
在监听端,使用以下命令:
xxxxxxxxxx
[root@server] # openvpn \
--ifconfig 10.200.0.1 255.255.255.0 \
--dev tun \
--topology subnet
在客户端,使用以下命令:
xxxxxxxxxx
[root@client] # openvpn \
--ifconfig 10.200.0.2 255.255.255.0 \
--dev tun \
--topology subnet \
--remote openvpnserver.example.com
--ifconfig
行现在与tap示例中的行相同。唯一的另一个变化是在两端添加了 --topology subnet
。
前面的示例不使用任何加密密码或身份验证密钥;因此,您将收到以下警告:
xxxxxxxxxx
Mon Sep 8 18:27:29 2014 ******* WARNING *******: all encryption and authentication features disabled -- all data will be tunnelled as cleartext
然而,明文隧道确实有其用途。在安全性在不同级别处理的可信环境中(例如,使用专用光纤电缆),明文隧道比加密隧道提供更好的性能,并且更容易监控隧道上的流量。
此外,如果你事先知道所有通过隧道的流量都是加密的(例如,所有流量都是严格的HTTPS),那么可以使用明文隧道来避免双重加密,这有时会导致性能下降。特别是在小型或嵌入式硬件(例如Raspberry Pi甚至一些Arduino板)上运行OpenVPN时,加密会对性能造成很大损失。
可以使用上一节中给出的示例设置明文隧道。如果没有指定密钥,则自动禁用加密和身份验证(HMAC签名)。也可以明确禁用它们:
在监听端,使用以下命令:
xxxxxxxxxx
[root@server] # openvpn \
--ifconfig 10.200.0.1 10.200.0.2 \
--dev tun \
--cipher none --auth none
在客户端,使用以下命令:
xxxxxxxxxx
[root@client] # openvpn \
--ifconfig 10.200.0.2 10.200.0.1 \
--dev tun \
--cipher none --auth none \
--remote openvpnserver.example.com
连接建立后,我们可以使用tcpdump命令(或等效命令,例如Wireshark)验证内容是否确实以明文形式发送:
启动连接
启动tcpdump并监听定时的网络接口,不是通道接口本身,然后使用以下命令过滤出OpenVPN包(UDP 端口 1194):
xxxxxxxxxx
[root@server] # tcpdump -l -w - eth0 udp port 1194 | strings
现在使用nc(netcat)通过隧道发送一些文本: 在服务器端:
xxxxxxxxxx
$ nc -l -p 31000
在客户端:
xxxxxxxxxx
$ nc 10.200.0.1 31000
hello from openvpn client
goodbye
tcpdump输出现在应该显示如下内容:
xxxxxxxxxx
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
V~hello from openvpn client
5goodbye
以文本消息形式显示的字符是OpenVPN数据包封装的产物。
为了保护OpenVPN连接,需要一个密钥。首先,我们将生成这样一个密钥。然后,需要使用安全通道将其复制到远程端点(例如SCP):
xxxxxxxxxx
$ openvpn --genkey --secret secret.key
在FreeBSD14.1中,实际命令为 openvpn --genkey secret secret.key
请注意,没有必要以root身份运行此命令(因此提示$)。生成的密钥文件具有以下格式:
xxxxxxxxxx
#
# 2048 bit OpenVPN static key
#
-----BEGIN OpenVPN Static key V1-----
1393ae687606c1f7d465d70227bf63e8
8963e9d1401450002d073d6eab1bffde
b06d1a33cc5c45d4a667016339e921d3
3ac36b1a949eb52e9217e41e4b035a7b
987ddfa9d6766d3b5e4c952dc27f518d
12ccff6b2f0966284382ddc0f62b824a
f576f0982beec9d6a4728d0788499a75
0fd7055ef681404fd463d9862d3a40a9
31fca7d87997c70c07b8303a1b85f1ff
76aa7790e7c341353d2b4ea5049b11a2
51346e7dd39fc1f1e53ae57c46cf60c8
24db00a871262fee78050a9df6a57322
0bb0d980b6cf1be90a2f304f99fb9cde
7cdf72d20e7dee555c7c99950aa4d8e6
86a020c3a63125fb99d56181ff4ca20c
d6711eab15a4d6faf706f2601eb6 61b7
-----END OpenVPN Static key V1-----
在这里发布密钥后,它就不再是秘密了。
openvpn--genkey命令生成2048位密钥,即256字节的随机数据。这256个字节在secret.key文件中以十六进制格式列出,但目前并非所有256个字节都已使用(我们稍后将看到)。
OpenVPN使用密钥对每个数据包进行加密和身份验证(签名)。默认加密密码是Blowfish密码(BF-CBC),默认HMAC算法是SHA1。Blowfish密码使用128位加密,而SHA1算法使用的密钥是160位。
如果OpenVPN启动时调试输出增加(--verb 7或更高),则启动时会打印使用的密钥:
在监听端,使用以下命令启动OpenVPN守护进程:
xxxxxxxxxx
[root@server] # openvpn \
--ifconfig 10.200.0.1 10.200.0.2 \
--dev tun \
--secret secret.key \
--verb 7
在客户端,命令如下:
xxxxxxxxxx
[root@client] # openvpn \
--ifconfig 10.200.0.2 10.200.0.1 \
--dev tun \
--secret secret.key \
--remote openvpnserver.example.com
服务器端日志输出将包含以下格式的行:
xxxxxxxxxx
Static Encrypt: Cipher 'BF-CBC' initialized with 128 bit key
Static Encrypt: CIPHER KEY: 1393ae68 7606c1f7 d465d702 27bf63e8
Static Encrypt: CIPHER block_size=8 iv_size=8
Static Encrypt: Using 160 bit message hash 'SHA1' for
HMAC authentication
Static Encrypt: HMAC KEY: 987ddfa9 d6766d3b 5e4c952d c27f518d 12ccff6b
Static Encrypt: HMAC size=20 block_size=20
Static Decrypt: Cipher 'BF-CBC' initialized with 128 bit key
Static Decrypt: CIPHER KEY: 1393ae68 7606c1f7 d465d702 27bf63e8
Static Decrypt: CIPHER block_size=8 iv_size=8
Static Decrypt: Using 160 bit message hash 'SHA1' for
HMAC authentication
Static Decrypt: HMAC KEY: 987ddfa9 d6766d3b 5e4c952d c27f518d 12ccff6b
Static Decrypt: HMAC size=20 block_size=20
BF-CBC
密码密钥是1393 ae68 7606 c1f7 d465 d702 27bf 63e8
,这正是OpenVPN密钥文件的第一行。
SHA1
HMAC密钥是987d dfa9 d676 6d3b 5e4c 952d c27f 518d 12cc ff6b
,也可以在从第五行开始的密钥文件中找到。
请注意,相同的密钥用于加密和解密数据,以及用于验证数据。在下一节中,我们将了解如何使用不同的密钥进行加密、解密和身份验证。
OpenVPN支持使用方向(directional)密钥,也就是说,传入和传出数据使用不同的密钥。这进一步增强了安全性。通过在--secret
参数中添加方向标志,我们可以指定使用不同的密钥。方向标志需要在一端设置为0,在另一端设置为1:
在服务器端:
xxxxxxxxxx
[root@server] # openvpn \
--ifconfig 10.200.0.1 10.200.0.2 \
--dev tun \
--secret secret.key 0\
--verb 7
在客户端:
xxxxxxxxxx
[root@client] # openvpn \
--ifconfig 10.200.0.2 10.200.0.1 \
--dev tun \
--secret secret.key 1\
--remote openvpnserver.example.com \
--verb 7
服务器端日志输出现在将包含以下格式的行:
xxxxxxxxxx
Static Encrypt: CIPHER KEY: 1393ae68 7606c1f7 d465d702 27bf63e8
Static Encrypt: HMAC KEY: 987ddfa9 d6766d3b 5e4c952d c27f518d
12ccff6b
Static Decrypt: CIPHER KEY: 31fca7d8 7997c70c 07b8303a 1b85f1ff
Static Decrypt: HMAC KEY: 0bb0d980 b6cf1be9 0a2f304f 99fb9cde
7cdf72d2
加密CIPHER和HMAC密钥现在与解密CIPHER及HMAC密钥明显不同。此外,每个密钥都可以在OpenVPN secret.key文件中找到:
CIPHER KEY
从第1行开始、长128 位 或 16 字节HMAC KEY
从第5行开始、长160位或20字节CIPHER KEY
从第9行、长128位或16字节HMAC KEY
从第13行开始,长160位或20字节此外,客户端的日志输出显示密钥颠倒:
xxxxxxxxxx
Static Encrypt: CIPHER KEY: 31fca7d8 7997c70c 07b8303a 1b85f1ff
Static Encrypt: HMAC KEY: 0bb0d980 b6cf1be9 0a2f304f 99fb9cde
7cdf72d2
Static Decrypt: CIPHER KEY: 1393ae68 7606c1f7 d465d702 27bf63e8
Static Decrypt: HMAC KEY: 987ddfa9 d6766d3b 5e4c952d c27f518d
12ccff6b
这对于VPN隧道的运行是必要的,因为服务器端加密数据所需的密钥需要客户端解密数据,反之亦然。
OpenVPN支持许多不同的加密和身份验证(HMAC签名)算法。每个加密密码和HMAC算法中使用的密钥大小各不相同。密码(如AES256)的当前最大值为256位,HMAC密钥(例如SHA512)的最大值为512位。OpenVPN静态密钥长2048位,对于512位密码和512位HMAC密钥来说足够大。
默认的 BF-CBC 不被 FreeBSD 支持,所以如果未指定 cipher,OpenVPN无法启动
如果我们将AES256指定为加密密码,将SHA512指定为身份验证算法,那么我们会看到使用的密钥的大小在增长:
在服务器端:
xxxxxxxxxx
[root@server] # openvpn \
--ifconfig 10.200.0.1 10.200.0.2 \
--dev tun \
--secret secret.key 0\
--cipher AES256 --auth SHA512 \
--verb 7
在客户端:
xxxxxxxxxx
[root@client] # openvpn \
--ifconfig 10.200.0.2 10.200.0.1 \
--dev tun \
--secret secret.key 1\
--cipher AES256 --auth SHA512 \
--remote openvpnserver.example.com \
--verb 7
服务器端日志输出现在包含以下行:
xxxxxxxxxx
Static Encrypt: Cipher 'AES-256-CBC' initialized with 256 bit key
Static Encrypt: CIPHER KEY: 1393ae68 7606c1f7 d465d702 27bf63e8
8963e9d1 40145000 2d073d6e ab1bffde
Static Encrypt: CIPHER block_size=16 iv_size=16
Static Encrypt: Using 512 bit message hash 'SHA512' for
HMAC authentication
Static Encrypt: HMAC KEY: 987ddfa9 d6766d3b 5e4c952d c27f518d
12ccff6b 2f096628 4382ddc0 f62b824a
f576f098 2beec9d6 a4728d07 88499a75
0fd7055e f681404f d463d986 2d3a40a9
Static Encrypt: HMAC size=64 block_size=64
Static Decrypt: Cipher 'AES-256-CBC' initialized with 256 bit key
Static Decrypt: CIPHER KEY: 31fca7d8 7997c70c 07b8303a 1b85f1ff
76aa7790 e7c34135 3d2b4ea5 049b11a2
Static Decrypt: CIPHER block_size=16 iv_size=16
Static Decrypt: Using 512 bit message hash 'SHA512' for
HMAC authentication
Static Decrypt: HMAC KEY: 0bb0d980 b6cf1be9 0a2f304f 99fb9cde
7cdf72d2 0e7dee55 5c7c9995 0aa4d8e6
86a020c3 a63125fb 99d56181 ff4ca20c
d6711eab 15a4d6fa f706f260 1eb661b7
此日志可以与secret.key文件进行匹配:
它可以类似地匹配解密密钥。
注: VPN隧道的功能与以前一样,但现在有了更强的加密和身份验证。如果将来引入更强大的密码或HMAC算法,OpenVPN静态密钥格式将不得不更新。
如前所述,点对点式网络的主要用例是通过安全隧道连接两个远程网络。在前面的示例中,建立了安全隧道,但没有添加网络路由。
对于下一个示例,考虑以下网络布局:
客户端网络192.168.4.0/24(具有网络掩码255.255.255.0)需要通过VPN隧道路由到服务器。
在服务器端:
xxxxxxxxxx
[root@server] # openvpn \
--ifconfig 10.200.0.1 10.200.0.2 \
--dev tun \
--secret secret.key 0\
--route 192.168.4.0 255.255.255.0 \
--daemon --log /var/log/movpn-02-server.log
在客户端:
xxxxxxxxxx
[root@client] # openvpn \
--ifconfig 10.200.0.2 10.200.0.1 \
--dev tun \
--secret secret.key 1\
--remote openvpnserver.example.com \
--daemon --log /var/log/movpn-02-client.log
在服务器端,添加了一个路由声明,告诉OpenVPN网络192.168.4.0/24位于隧道的另一端。OpenVPN本身对此做得很少,但它会发出适当的/sbin/route或/sbin/ip route命令来配置系统路由表。除了使用OpenVPN的--route语句,我们还可以使用以下命令:
xxxxxxxxxx
[root@server] # route add -net 192.168.4.0/24 gw 10.200.0.2
建立VPN连接后,我们也可以使用iproute2
命令:
xxxxxxxxxx
[root@server] # ip route add 192.168.4.0/24 via 10.200.0.2
本例中添加的第二行语句指示OpenVPN自行守护(即在后台静默运行),并将所有消息记录到/var/log/movpn-02-server.log
文件中。
同样,在客户端添加了相同的daemon+log
语句。
注:
每次OpenVPN启动时,--log
语句都会截断log
文件。如果要附加到上一个日志文件,请使用以下命令:
xxxxxxxxxx
--log-append /var/log/movpn-02-server.log
目前,该示例尚未完全发挥作用。如果我们从VPN服务器ping客户端局域网上的主机,那么我们将不会收到任何响应。这与OpenVPN本身关系不大,但主要与TCP/IP路由有关。OpenVPN用户邮件列表和OpenVPN互联网论坛上提出的大多数问题实际上都是路由问题。
没有从客户端局域网收到响应的原因有两个:
xxxxxxxxxx
net.ipv4.ip_forward = 1
通过发出以下命令可以避免重新启动:
xxxxxxxxxx
# sysctl -p
xxxxxxxxxx
# route add -net 10.200.0.0/24 gw 192.168.4.100
此处,192.168.4.100 是OpenVPN客户端的LAN IP地址。
注意,以这种方式添加的路由不是持久的,将在重启后消失。建议以持久方式添加路由。
现在,该示例正在按预期运行。从OpenVPN服务器,我们可以ping客户端局域网上机器的局域网IP,反之亦然:
xxxxxxxxxx
$ ping -c 2 192.168.4.100
PING 192.168.4.100 (192.168.4.100) 56(84) bytes of data.
64 bytes from 192.168.4.100: icmp_seq=1 ttl=64 time=5.97 ms
64 bytes from 192.168.4.100: icmp_seq=2 ttl=64 time=4.22 ms
$ ping -c 2 192.168.4.10
PING 192.168.4.10 (192.168.4.10) 56(84) bytes of data.
64 bytes from 192.168.4.10: icmp_seq=1 ttl=63 time=7.37 ms
64 bytes from 192.168.4.10: icmp_seq=2 ttl=63 time=6.09 ms
正如你从前面的示例中看到的,OpenVPN的命令行参数可能会很快变得冗长而复杂。也可以(并且建议)使用配置文件来存储OpenVPN的常用选项。通常,可以使用以下命令在命令行上指定每个选项:
xxxxxxxxxx
--<some option> <option-arguments>
而在配置文件中则使用 <some option> <option-arguments>
格式来指定选项。就是去掉命令行选项前面的两个横杠。
配置文件是在命令行上使用 --config <path> 选项指定的。配置文件中指定的几乎所有选项都被视为命令行上指定的选项。正如我们将在本书后面看到的,可以将证书和私钥文件内联存储在配置文件中。使用命令行参数不容易做到这一点。
也可以混合配置文件和命令行参数。这使得在配置文件中存储常用选项变得容易,可以使用命令行参数覆盖配置文件——即,命令行参数优先级高于配置文件。
但是,不是所有配置选项都可以被覆盖。某些选项可以多次指定(特别是 remote <remote-host>
)。在这些情况下,通常先尝试第一次出现的。
前面示例中的服务器命令行可以转换为以下配置文件:
xxxxxxxxxx
ifconfig 10.200.0.1 10.200.0.2
dev tun
secret secret.key 0
route 192.168.4.0 255.255.255.0
daemon
log /var/log/movpn-02-server.log
如果将以上内容保存在名为 movpn-02-01-server.conf
的文件中,则启用侦听的命令如下:
xxxxxxxxxx
[root@server] # openvpn --config movpn-02-01-server.conf
注意,命令行参数的顺序很重要。在 --config <path>
选项之前指定的所有选项都将被配置文件中指定的选项覆盖;在 --config
选项后面指定的所有选项都会推翻配置文件中的选项(如前所述,有少数例外)。
基于前面的示例,我们现在可以使用配置文件构建完整的生产级(production-level)配置,包括路由、日志、IPv6支持以及OpenVPN提供的其他一些生产功能。
示例网络拓扑:
左侧为客户端,Site A LAN:
右侧为服务器端,Site B LAN:
对于服务器,我们创建配置文件 movpn-02-02-server.conf,内容如下:
xxxxxxxxxx
dev tun
proto udp
local openvpnserver.example.com
lport 1234
remote openvpnclient.example.com
rport 4321
secret secret.key 0
ifconfig 10.200.0.1 10.200.0.2
route 192.168.4.0 255.255.255.0
tun-ipv6
ifconfig-ipv6 2001:610:120::200:0:1 2001:610:120::200:0:2
user nobody
groupnobody # use 'group nogroup' on Debian/Ubuntu
persist-tun
persist-key
keepalive 10 60
ping-timer-rem
verb 3
daemon
log-append /var/log/openvpn.log
在客户端,我们创建配置文件 movpn-02-02-client.conf,内容如下:
xxxxxxxxxx
dev tun
proto udp
local openvpnclient.example.com
lport 4321
remote openvpnserver.example.com
rport 1234
secret secret.key 1
ifconfig 10.200.0.2 10.200.0.1
route 192.168.122.0 255.255.255.0
tun-ipv6
ifconfig-ipv6 2001:610:120::200:0:2 2001:610:120::200:0:1
user nobody
group nobodygroup nobody # use 'group nogroup' on Debian/Ubuntu
persist-tun
persist-key
keepalive 10 60
ping-timer-rem
verb 3
daemon
log-append /var/log/openvpn.log
客户端和服务器端配置文件非常相似,除了镜像地址和镜像密钥方向。
这些配置文件中引入了一些新选项:
proto udp
是默认协议,但明智的做法是在配置文件中明确列出它,以避免任何混淆。local <IP>
是OpenVPN将监听传入连接的本地IPv4地址。如果未指定此地址,OpenVPN将监听地址 0.0.0.0 ,这意味着所有接口。lport
是OpenVPN将监听的本地端口。默认值为1194,但可以使用任何有效和可用的端口号。remote <IP>
是OpenVPN服务器进程将接受传入连接的远程IPv4地址。如果未指定此地址,OpenVPN将接受来自所有地址的传入连接。rport
是OpenVPN将连接到的远程端口。通常,这是使用port
指定的,但当使用不同的本地端口时,显式指定 rport
会更方便。tun-ipv6
指示OpenVPN创建一个能够传递IPv6流量的隧道。ifconfig-ipv6
配置本地和远程IPv6端点。对于此例,IPv6地址的最后三个数字与IPv4端点匹配。user nobody
和 group nobody
指示OpenVPN在连接建立后将其切换到Unix用户nobody并对其进行分组。这进一步增强了安全性,因为对隧道的攻击不太可能导致根漏洞利用。请注意,在Debian/Ubuntu上,使用的是nogroup
组。persist-tun
和 persist-key
指示OpenVPN在隧道重新启动时不要重新打开tun设备或生成新的密钥材料。这些选项与"user nobody" 结合使用特别有用,因为用户nobody通常没有打开新tun接口的访问权限。keep-alive 10 60
和 ping-timer-rem
是确保VPN连接保持正常的有用选项,即使隧道中没有流量。我们现在可以使用以下命令启动隧道两端,而不是指定一个非常长的命令行来启动隧道两端:
xxxxxxxxxx
[root@server] # openvpn --config movpn-02-02-server.conf
[root@client] # openvpn --config movpn-02-02-client.conf
在两端检查openvpn.log文件,应该有以下行:
xxxxxxxxxx
Thu Sep 11 13:21:51 2014 Initialization Sequence Completed
最后,我们验证了我们可以使用ping和ping6到达隧道的另一端:
xxxxxxxxxx
# remote IPv4 LAN address
$ ping -c 2 192.168.4.100
PING 192.168.4.100 (192.168.4.100) 56(84) bytes of data.
64 bytes from 192.168.4.100: icmp_seq=1 ttl=64 time=3 ms
64 bytes from 192.168.4.100: icmp_seq=2 ttl=64 time=5 ms
# remote IPv6 tunnel address
$ ping6 -c 2 2001:610:120::200:0:2
PING 2001:610:120::200:0:2(2001:610:120::200:0:2) 56 data bytes
64 bytes from 2001:610:120::200:0:2: icmp_seq=1 ttl=64 time=4 ms
64 bytes from 2001:610:120::200:0:2: icmp_seq=2 ttl=64 time=4 ms
# remote IPv6 LAN address
$ ping6 -c 2 2001:610:120::168:4:100
PING 2001:610:120::168:4:100(2001:610:120::168:4:100) 56 data byte
64 bytes from 2001:610:120::168:4:100: icmp_seq=1 ttl=64 time=6 ms
64 bytes from 2001:610:120::168:4:100: icmp_seq=2 ttl=64 time=3 ms
注意,为了使路由正常工作,我们需要在两端进行IP转发,以及局域网段上计算机的返回路由。在客户端局域网上,我们需要类似以下的路由:
xxxxxxxxxx
# route add -net 10.200.0.0/24 gw 192.168.4.100
# route add -net 192.168.122.0/24 gw 192.168.4.100
此处,192.168.4.100是OpenVPN客户端的LAN地址。
在服务器端LAN,我们需要做以下设置:
xxxxxxxxxx
# route add -net 10.200.0.0/24 gw 192.168.122.1
# route add -net 192.168.4.0/24 gw 192.168.122.1
此处,192.168.122.1是OpenVPN服务器端的LAN地址。
注意,目前即使隧道仅支持IPv6,也需要始终使用ifconfig指定IPv4地址。这个缺点将在OpenVPN2.4+无IP设置中得到解决。
OpenVPN允许在启动VPN连接时运行用户定义的脚本,这允许进行一些高级设置。
在这个例子中,我们将使用自定义的up脚本来创建OpenVPN隧道,而不向隧道的端点分配IP地址。在路由网络设置中,这确保了隧道端点本身永远无法到达,这增加了一些安全性,也可以使路由表更短一些。
此脚本仅在Linux系统上进行了测试,因为它需要一些在其他平台上不可用的网络接口配置。我们使用与上例相同的网络布局,但没有IPv6地址:
左侧为客户端,Site A LAN:
右侧为服务器端,Site B LAN:
在服务器端,我们创建一个配置文件 movpn-02-03-server.conf:
xxxxxxxxxx
dev tun
secret secret.key
ifconfig-noexec
up /etc/openvpn/up.sh
script-security 2
verb 3
daemon
log-append /var/log/openvpn.log
伴随up.sh脚本:
xxxxxxxxxx
/sbin/ifconfig $1 0.0.0.0 up
/sbin/ip route add 192.168.4.0/24 dev $1
此处,网络192.168.4.0/24是我们希望从服务器端局域网到达的客户端局域网。对于客户端,我们创建文件 movpn-02-03-client.conf :
xxxxxxxxxx
dev tun
secret secret.key
ifconfig-noexec
remote openvpnserver.example.com
up /etc/openvpn/up.sh
script-security 2
verb 3
daemon
log-append /var/log/openvpn.log
同样伴随up.sh脚本:
xxxxxxxxxx
/sbin/ifconfig $1 0.0.0.0 up
/sbin/ip route add 192.168.122.0/24 dev $1
在进行VPN连接之前,应确定up.sh脚本为可执行(chmod a+x up.sh)。
在两端分别启动隧道:
xxxxxxxxxx
[root@server]# openvpn --config movpn-02-03-server.conf
[root@client]# openvpn --config movpn-02-03-client.conf
检查两端的openvpn.log文件,应该有以下内容:
xxxxxxxxxx
Thu Sep 11 15:57:51 2014 Initialization Sequence Completed
检查分配给tun0接口的地址:
xxxxxxxxxx
$ ifconfig tun0
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:6 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:504 (504.0 b) TX bytes:504 (504.0 b)
或者,可以使用更现代的iproute2命令:
xxxxxxxxxx
$ ip addr show dev tun0
接口已启动,但没有IP地址。接下来,我们要验证路由表:
xxxxxxxxxx
$ /sbin/ip route show
[...]
192.168.4.0/24 dev tun0 scope link
[...]
正确的路由已经存在,所以,最后我们验证了我们可以ping客户端局域网上的主机:
xxxxxxxxxx
[root@centos6-kvm ~]# ping -c 2 192.168.4.10
PING 192.168.4.10 (192.168.4.10) 56(84) bytes of data.
64 bytes from 192.168.4.10: icmp_seq=1 ttl=62 time=5 ms
64 bytes from 192.168.4.10: icmp_seq=2 ttl=62 time=5 ms
正如引言中所述,当连接少量端点时,点对点网络是一个很好的选择。在这个例子中,我们将展示如何使用点对点隧道将三个站点连接在一起,它还将显示这种设置有多快会变得非常复杂。
网络架构如下:
Site A LAN——192.168.4.0/24
Site B LAN——192.168.5.0/24
Site C LAN——192.168.6.0/24
以上三个网络通过VPN两两互通。
我们将在两个地点之间修建三条隧道,并设置冗余路线。这样,如果其中一条隧道坍塌,所有地点都会彼此可见。然而,这是以性能损失为代价的。假设A与B之间的链接断开,备份路由从A到C再到B,因此,现在从站点A到站点B的流量必须进行额外的跳转。
首先,我们创建三个密钥:
xxxxxxxxxx
$ openvpn –-genkey –-secret AtoB.key
$ openvpn –-genkey –-secret AtoC.key
$ openvpn –-genkey –-secret BtoC.key
然后,我们通过安全通道(比如scp)将这些密钥传输到所有端点。
接下来,我们创建六个配置文件:三个侦听器或服务器配置、三个客户端配置。
第一个,创建服务器配置文件 BtoA.conf :
xxxxxxxxxx
dev tun
proto udp
port 1194
remote siteA
secret AtoB.key 0
ifconfig 10.200.0.1 10.200.0.2
route 192.168.4.0 255.255.255.0 vpn_gateway 5
route 192.168.6.0 255.255.255.0 vpn_gateway 10
route-delay
keepalive 10 60
verb 3
daemon
log-append /var/log/openvpn-BtoA.log
接下来,创建CtoA.conf :
xxxxxxxxxx
dev tun
proto udp
port 1195
remote siteAsecret AtoC.key 0
ifconfig 10.200.0.5 10.200.0.6
route 192.168.4.0 255.255.255.0 vpn_gateway 5
route 192.168.5.0 255.255.255.0 vpn_gateway 10
route-delay
keepalive 10 60
verb 3
daemon
log-append /var/log/openvpn-CtoA.log
然后,创建最后一个服务器配置文件 BtoC.conf:
xxxxxxxxxx
dev tun
proto udp
port 1196
remote siteC
secret BtoC.key 0
ifconfig 10.200.0.9 10.200.0.10
route 192.168.4.0 255.255.255.0 vpn_gateway 10
route 192.168.6.0 255.255.255.0 vpn_gateway 5
route-delay
keepalive 10 60
verb 3
daemon
log-append /var/log/openvpn-BtoC.log
现在,我们创建客户端(连接器)配置文件 AtoB.conf :
xxxxxxxxxx
dev tun
proto udp
port 1194
remote siteB
secret AtoB.key 1
ifconfig 10.200.0.2 10.200.0.1
route 192.168.5.0 255.255.255.0 vpn_gateway 5
route 192.168.6.0 255.255.255.0 vpn_gateway 10
route-delay
keepalive 10 60
verb 3
daemon
log-append /var/log/openvpn-AtoB.log
接下来,我们创建客户端配置文件 AtoC.conf :
xxxxxxxxxx
dev tun
proto udp
port 1195
remote siteC
secret AtoC.key 1
ifconfig 10.200.0.6 10.200.0.5
route 192.168.5.0 255.255.255.0 vpn_gateway 10
route 192.168.6.0 255.255.255.0 vpn_gateway 5
route-delay
keepalive 10 60
verb 3
daemon
log-append /var/log/openvpn-AtoC.log
最后,我们创建客户端配置文件 CtoB.conf:
xxxxxxxxxx
dev tun
proto udp
port 1196
remote siteB
secret BtoC.key 1
ifconfig 10.200.0.10 10.200.0.9
route 192.168.4.0 255.255.255.0 vpn_gateway 10
route 192.168.5.0 255.255.255.0 vpn_gateway 5
route-delay
keepalive 10 60
verb 3
daemon
log-append /var/log/openvpn-CtoB.log
启动每台服务器并连接其相应的客户端:
xxxxxxxxxx
[siteB]# openvpn --config BtoA.conf
[siteA]# openvpn --config AtoB.conf
检查隧道两侧的日志文件,并在继续下一个站点之前验证路由是否(部分)正常工作:
xxxxxxxxxx
[siteB]$ openvpn --config BtoC.conf
[siteC]$ openvpn --config CtoB.conf
最后:
xxxxxxxxxx
[siteC]$ openvpn --config CtoA.conf
[siteA]$ openvpn --config AtoC.conf
此时,所有路线都应该存在,包括冗余路线。例如,从路由表可以看出,站点A有两条到站点B的路由(LAN 192.168.5.0/24):
xxxxxxxxxx
[siteA]$ ip route show
[…]
192.168.5.0/24 via 10.200.0.1 dev tun0 metric 5
192.168.5.0/24 via 10.200.0.5 dev tun1 metric 10
[…]
从这个表中我们可以观察到以下内容:
这种设置的优点是,如果一个隧道发生故障,那么在60秒后,连接及其相应的路由就会中断。然后,到另一个网络的备份路由会自动接管,所有三个站点都可以再次相互连接。原始隧道恢复后,具有较高度量的路线再次优先,并恢复到原始状态。
这种配置的缺点是,在这60秒内,所有流量都会丢失。RIPv2或OSPF等路由协议可能有助于更快地发现故障路由,从而减少网络停机时间。
以下配置语句在此设置中至关重要。
vpn_gateway
是一个特殊的OpenVPN关键字,它指定了VPN远程端点地址。通常,不必指定此关键字,除非还需要为此路由指定度量(metric)。
route
指令的语法和选项为:
xxxxxxxxxx
route <network> <netmask> vpn_gateway <metric>
此处,gateway
可以显式设置为IPv4地址,也可以使用特殊关键字 vpn_gateway
或 net_gateway
。如果没有指定网关和度量,则使用 vpn_gateway
。
关键字 net_gateway
用于指定不应通过VPN明确路由的子网。在第四章 客户端/服务器模式与tun设备 中,将对路由选项进行更详细的解释。
该指标有一个默认指标,可以使用以下命令设置:
xxxxxxxxxx
route-metric m
这适用于所有路线。如果希望推翻特定路由的度量(正如我们在这个例子中所做的那样),那么需要指定网关(在我们的例子中是vpn_gateway),然后指定该特定路由的指标。
这里需要配置声明route-delay
,以确保在所有连接可用后添加路由。如果没有它,可能会过早添加路由,导致无法将路由添加到远程子网之一。
专用点对点VPN的另一个高级用例是将两个远程网段桥接在一起。OpenVPN允许你将具有相同IP地址范围的两个网络桥接在一起,形成一个透明的网段。通常不建议这样做,因为这种桥接网络的性能不是最佳的。在某些情况下,这是不可避免的。通常,最好为两端分配不同的子网,但有时特殊软件会绑定到特定的IP地址,除了在两端拥有相同的子网别无选择。
考虑以下网络布局:
Site A LAN——192.168.4.0/24,Client br0:192.168.4.128
Site B LAN——192.168.4.0/24,Server br0:192.168.4.65
在客户端,网络192.168.4.0/24正在使用中,OpenVPN客户端位于192.168.4.128。在服务器端,使用相同的子网——OpenVPN服务器位于192.168.4.65。目标是将两个网络连接在一起,这样两端的所有机器都可以透明地看到彼此。
在 dev tap
模式下,OpenVPN将创建一个新的或打开一个现有的tap适配器。在大多数现代操作系统上,tap适配器的行为就像常规网络适配器一样,如果操作系统支持适配器桥接,则tap适配器可以与系统中的另一个网络适配器桥接。众所周知,这适用于Linux、BSD和MS Windows。在Linux上,需要安装bridge-utils
包才能使此实例工作。
在这个例子中,tap适配器与OpenVPN客户端和服务器的LAN接口桥接。为了能够做到这一点,在初始化VPN连接之前,在持久状态下创建tap适配器:
xxxxxxxxxx
# openvpn --mktun --dev tap0
Thu Sep 11 16:57:30 2014 TUN/TAP device tap0 opened
Thu Sep 11 16:57:30 2014 Persist state set to: ON
然后,创建并初始化网桥。在客户端执行以下命令:
xxxxxxxxxx
# brctl addbr br0
# brctl addif br0 eth0
# brctl addif br0 tap0
# ifconfig eth0 0.0.0.0 up
# ifconfig tap0 0.0.0.0 up
# ifconfig br0 192.168.4.128 netmask 255.255.255.0 up
在继续之前,请检查网桥与其相关适配器的状态。此外,请确保仍然可以访问局域网:
xxxxxxxxxx
# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.5c260a307224 no eth0
tap0
# ifconfig -a
br0 Link encap:Ethernet HWaddr 5C:26:0A:30:72:24
inet addr:192.168.4.128 Bcast:192.168.4.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:4 errors:0 dropped:0 overruns:0 frame:0
TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:244 (244.0 b) TX bytes:732 (732.0 b)
eth0 Link encap:Ethernet HWaddr 5C:26:0A:30:72:24
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2087 errors:0 dropped:0 overruns:0 frame:0
TX packets:2427 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:203516 (198.7 KiB) TX bytes:231571 (226.1 KiB)
Interrupt:20 Memory:f5400000-f5420000
tap0 Link encap:Ethernet HWaddr CA:85:1E:AE:AF:59
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:11 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
# ping -c 2 192.168.4.10
服务器端的输出应该相似;网桥IP地址为192.168.4.65。
接下来,我们创建配置文件 movpn-02-05.conf,此配置文件在两端相同:
xxxxxxxxxx
dev tap0
secret secret.key
verb 3
daemon
log-append /var/log/openvpn.log
注:在配置文件中,使用设备tap0的全名。如果省略0,则OpenVPN将打开一个新的tap适配器,网桥将无法运行。
然后,我们开始服务器和客户端:
xxxxxxxxxx
[root@server] # openvpn --config movpn-02-05.conf \
--remote openvpnclient.example.com
[root@client] # openvpn --config movpn-02-05.conf \
--remote openvpnserver.example.com
初始化序列完成后,网段被桥接。通过ping远程端的主机来验证这一点。
观察隧道上的流量也很有用。桥接网络的缺点是,一端产生的所有(广播)流量都会复制到另一端。这可能会导致网络性能不佳。如果有很多网络背景噪音,那么这将显示在tap0接口上的tcpdump中:
xxxxxxxxxx
17:19:57.280459 72:24:b4:f0:16:81 > 01:80:c2:00:00:00, 802.3, length 52: LLC, dsap STP (0x42) Individual, ssap STP (0x42) Command, ctrl 0x03: STP 802.1d, Config, Flags [none], bridge-id 8000.52:54:00:6e:cd:0b.8003, length 35
17:19:59.280486 72:24:b4:f0:16:81 > 01:80:c2:00:00:00, 802.3, length 52: LLC, dsap STP (0x42) Individual, ssap STP (0x42) Command, ctrl 0x03: STP 802.1d, Config, Flags [none], bridge-id 8000.52:54:00:6e:cd:0b.8003, length 35
17:20:00.112516 52:54:00:6e:cd:0b > 98:4f:ee:00:7d:e1, ethertype ARP (0x0806), length 42: Request who-has 192.168.122.23 tell 192.168.122.1, length 28
17:20:01.112534 52:54:00:6e:cd:0b > 98:4f:ee:00:7d:e1, ethertype ARP (0x0806), length 42: Request who-has 192.168.122.23 tell 192.168.122.1, length 28
17:20:01.280468 72:24:b4:f0:16:81 > 01:80:c2:00:00:00, 802.3, length 52: LLC, dsap STP (0x42) Individual, ssap STP (0x42) Command, ctrl 0x03: STP 802.1d, Config, Flags [none], bridge-id 8000.52:54:00:6e:cd:0b.8003, length 35
17:20:02.112524 52:54:00:6e:cd:0b > 98:4f:ee:00:7d:e1, ethertype ARP (0x0806), length 42: Request who-has 192.168.122.23 tell 192.168.122.1, length 28
17:20:04.161591 98:4f:ee:00:7d:e1 > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 60: Request who-has 192.168.4.100 tell 192.168.4.10, length 46
17:20:05.153670 98:4f:ee:00:7d:e1 > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 60: Request who-has 192.168.4.100 tell 192.168.4.10, length 46
此tcpdump捕获的输出显示,通过发出以下命令,生成树协议已在服务器端的网络上启用:
xxxxxxxxxx
# brctl stp br0 off
流量停止了,导致网桥上的噪音大大降低。
注意:只有当你知道自己在做什么时,才关闭网桥上的STP。在这种情况下,没有环路的风险,因为只有一个网桥,只有两个设备连接。
在tcpdump捕获中看到的ARP请求不容易被抑制。然而,这些请求非常小,不应导致性能大幅下降。然而,在高延迟线路上,这些请求将成为瓶颈。
如果不再需要网桥,最好删除网桥和持久tap0设备:
xxxxxxxxxx
# ifconfig br0 down
# brctl delif br0 tap0
# brctl delif br0 eth0
# brctl delbr br0
# openvpn --rmtun --dev tap0
Thu Sep 11 18:55:22 2014 TUN/TAP device tap0 opened
Thu Sep 11 18:55:22 2014 Persist state set to: OFF
记得让eth0网络接口重新联机。
对于下一个例子,我们借用了第3章“PKI和证书”中的一些内容。在客户端/服务器模式下,OpenVPN使用公钥基础设施(Public Key Infrastructure——PKI)配置,具有X.509证书和私钥。还可以使用X.509证书和私钥来建立点对点隧道。与预共享密钥相比,使用X.509证书的优点是它提供了完美转发保密性(Perfect Forwarding Secrecy——PFS),大大提高了VPN数据的安全性。如果没有PFS,如果攻击者在某个时候设法破解了加密,那么所有之前记录的VPN流量都可以被解密。使用PFS,无法解密旧数据。
为了使用证书建立点对点隧道,我们必须首先复制CA证书和两个端点的证书/私钥对:
xxxxxxxxxx
[root@server] # mkdir -p /etc/openvpn/movpn
[root@server] # chmod 700 /etc/openvpn/movpn
[root@server] # cd /etc/openvpn/movpn
[root@server] # PKI=<PKI_DIR>/ssladmin/active
[root@server] # cp -a $PKI/ca.crt movpn-ca.crt
[root@server] # cp -a $PKI/Mastering_OpenVPN_Server.crt server.crt
[root@server] # cp -a $PKI/Mastering_OpenVPN_Server.key server.key
和:
xxxxxxxxxx
[root@client] # mkdir -p /etc/openvpn/movpn
[root@client] # chmod 700 /etc/openvpn/movpn
[root@client] # cd /etc/openvpn/movpn
[root@client] # PKI=<PKI_DIR>/ssladmin/active
[root@client] # cp -a $PKI/ca.crt movpn-ca.crt
[root@client] # cp -a $PKI/client1.crt client1.crt
[root@client] # cp -a $PKI/client1.key client1.key
在服务器端,我们还需要生成VPN会话密钥所需的Diffle-Hellman(密钥交换)参数文件。会话密钥是临时密钥,在首次建立客户端和服务器之间的连接时生成。
Diffie-Hellman——简称DH或dh,是一种确保共享key安全穿越不安全网络的方法,它是OAKLEY的一个组成部分。仅用于密钥的交换,不能进行消息的加密和解密。
要生成DH参数文件,请执行以下命令:
xxxxxxxxxx
[root@server] # cd /etc/openvpn/movpn
[root@server] # openssl dhparam -out dh2048.pem 2048
我们现在已准备好设置OpenVPN配置文件。在服务器端,创建以下配置文件,并将其另存为movpn-02-06-server.conf:
xxxxxxxxxx
proto udp
port 1194
dev tun
tls-server
ifconfig 10.200.0.1 10.200.0.2
tls-auth /etc/openvpn/movpn/ta.key 0
dh /etc/openvpn/movpn/dh2048.pem
ca /etc/openvpn/movpn/movpn-ca.crt
cert /etc/openvpn/movpn/server.crt
key /etc/openvpn/movpn/server.key
persist-key
persist-tun
keepalive 10 60
user nobody
group nobody
# use 'group nogroup' on Debian/Ubuntu
verb 3
daemon
log-append /var/log/openvpn.log
在客户端,创建配置文件 movpn-02-06-client.conf:
xxxxxxxxxx
port 1194
dev tun
tls-client
ifconfig 10.200.0.2 10.200.0.1
remote openvpnserver.example.com
remote-cert-tls server
tls-auth /etc/openvpn/movpn/ta.key 1
ca /etc/openvpn/movpn/movpn-ca.crt
cert /etc/openvpn/movpn/client1.crt
key /etc/openvpn/movpn/client1.key
persist-key
persist-tun
keepalive 10 60
user nobody
group nobody
# use 'group nogroup' on Debian/Ubuntu
verb 3
daemon
log-append /var/log/openvpn.log
然后,我们启动服务器和客户端:
xxxxxxxxxx
[root@server] # openvpn --config movpn-02-06-server.conf
[root@client] # openvpn --config movpn-02-06-client.conf
初始化序列完成后,我们将看到创建的隧道与使用预共享密钥创建的隧道具有相同的属性。
点对点是OpenVPN初始版本中唯一支持的配置。在本章中,我们从一个非常基本的点对点示例开始。我们介绍了OpenVPN的更多功能,并发现有充分的理由在生产环境中使用这种模式。在最后一个用例中,桥接TAP适配器在客户端和服务器端都使用。
这是解释点对点模式的唯一一章。在下一章中,我们将正确设置使用OpenVPN的另一种模式(客户端/服务器模式)所需的证书。