本文记录使用 OpenVPN 建立虚拟通道的命令行实践,不涉及 OpenVPN 原理及图形界面相关的配置。文中的所有操作均在 CentOS 7 上实验通过。
—Update 2017-01-16—
推荐一个 OpenVPN 管理工具 pritunl,对 OpenVPN 进行了封装,提供 Web 访问接口,方便使用。搭建配置都也比较容易,只不过免费版的只支持单台Server,Site-to-Site 不免费。
安装
点到点网络 - Shortest Setup
使用TUN设备
服务端启动 OpenVPN 进程,等待连接,注意时间戳。
客户端启动 OpenVPN 进程,连接服务端 10.0.63.202。
连接建立,使用 ip -a
可以看到如下网络接口:
可以使用 ping
来测试虚拟 IP 的连通性。
使用TAP设备
服务端启动 OpenVPN 进程,等待连接,注意时间戳。
客户端启动 OpenVPN 进程,连接服务端 10.0.63.202。
连接建立,使用 ip -a
可以看到如下网络接口:
注:使用如上方式没有任何加密和认证,数据以明文的方式传输。默认使用 UPD 协议进行传输,使用TCP需指明 –proto tcp-server/tcp-client
点到点网络 - OpenVPN secret keys
首先在服务端生成共享密钥,并将该秘钥传输到客户端:
然后启动 OpenVPN:
点到点网络 - Multiple secret keys
依然使用上面生成的共享密钥,然而使用多种密钥,包括:
- 客户端 Cipher key
- 客户端 HMAC key
- 服务端 Cipher key
- 服务端 HMAC key
点到点网络 - 路由
考虑如下网络拓扑图:
建立 VPN 通道:
VPN 服务端配置路由:
VPN 客户端配置:
Linux Client 上增加路由规则:
这样就能在 10.0.63.202 ping 通 192.168.126.153。
点到点网络 - 使用配置文件
服务端 .ovpn
客户端 .ovpn
配置公钥/私钥
使用公钥/私钥来进行访问应该是一种更安全的方式,这种方式需要事先配置公钥基础设置(Public Key Infrastructure)。
使用 easy-rsa
(a handy set of wrapper scripts around some of the openssl ca commands) 提供的脚本来配置 PKI 并生成公钥私钥及 Diffie-Hellman 密钥交换算法配置文件。
生成服务端证书
生成客户端使用的不带密码的证书
生成客户端使用的带密码 Pass Phrase 的证书
Diffie-Hellman
tls-auth key
Server-side routing
OpenVPN 客户端能访问到所有 OpenVPN 服务器后端的机器。
服务端配置
客户端配置
另外,还需要在 Server 端的网关添加路由规则,使得所有 VPN 的流量能返回到 VPN Server。
Reference:
1 Markus Feilner, Norbert Graf. Beginning OpenVPN 2.0.9. PACKT PUBLISHING. 2009.
2 Jan Just Keijser. OpenVPN 2 Cookbook. PACKT PUBLISHING. 2011.