OpenVPN 是一个基于 OpenSSL 库的应用层 VPN 实现。和传统 VPN 相比,它的优点是简单易用。

OpenVPN允许参与建立VPN的单点使用共享金钥,电子证书,或者用户名/密码来进行身份验证。它大量使用了OpenSSL加密库中的SSLv3/TLSv1 协议函式库。OpenVPN能在Solaris、Linux、OpenBSD、FreeBSD、NetBSD、Mac OS X与Windows 2000/XP/Vista上运行,并包含了许多安全性的功能。它并不是一个基于Web的VPN软件,也不与IPsec及其他VPN软件包兼容。

OpenVPN2.0后引入了用户名/口令组合的身份验证方式,它可以省略客户端证书,但是仍有一份服务器证书需要被用作加密。 OpenVPN所有的通信都基于一个单一的IP端口, 默认且推荐使用UDP协议通讯,同时TCP也被支持。OpenVPN连接能通过大多数的代理服务器,并且能够在NAT的环境中很好地工作。服务端具有向客 户端“推送”某些网络配置信息的功能,这些信息包括:IP地址、路由设置等。OpenVPN提供了两种虚拟网络接口:通用Tun/Tap驱动,通过它们, 可以建立三层IP隧道,或者虚拟二层以太网,后者可以传送任何类型的二层以太网络数据。传送的数据可通过LZO算法压缩。在选择协议时候,需要注意2个加密隧道之间的网络状况,如有高延迟或者丢包较多的情况下,请选择TCP协议作为底层协议,UDP协议由于存在无连接和重传机制,导致要隧道上层的协议进行重传,效率非常低下。

for Win10:openvpn-install-2.4.8-I601-Win10.exe.zip
for Win7: openvpn-install-2.4.8-I601-Win7.exe.zip
for Linux:openvpn-2.4.8.tar.gz
for Android:openvpn-3.1.0.apk
for macOS:openvpn-2.4.8.zip
for Apple iOS:经证实需将地区改为美国后,在appstore中可以安装


OpenVPN 合并证书到配置文件中 (.ovpn)

删除或者注释以下几行内容:
ca ca.crt  改为:#ca ca.crt
cert client.crt  改为:#cert client.crt
key client.key  改为:#key client.key
tls-auth ta.key 1  改为:#tls-auth ta.key 1

在最后面添加以下内容:

<ca>
ca.crt 文件内容
</ca>

<cert>
client.crt 文件内容
</cert>

<key>
client.key 文件内容
</key>

key-direction 1
<tls-auth>
ta.key 文件内容
</tls-auth>

客户端指定静态路由

通常openvpn部署好以后,客户端连接VPN后会被配置一些路由,其客户端的路由会被修改为所有的流量都通过VPN来传输。但有时候,我们需要客户端的某些IP走VPN或者本地网关。这里有两种方法进行openvpn的路由配置

第一种方法: 客户端进行配置
在配置文件下增加如下内容:

route-nopull # 客户端连接openvpn后 不从服务端获取路由
max-routes 1000 # 设置路由的最大条数,默认是100,这里可以根据需求修改
route 192.168.0.0 255.255.0.0 net_gateway # 使192.168.0.0/24网段,不走vpn网关
route 192.168.1.0 255.255.0.0 vpn_gateway # 使192.168.1.0/24网段,走vpn网关

第二种方法: 在服务端进行配置
服务端和客户端的配置略有不同

push "route 192.168.0.0 255.255.0.0 net_gateway" # 将引号中的路由推送到客户端
push "route 192.168.1.0 255.255.0.0 vpn_gateway " # 将引号中的路由推送到客户端

注意: 如果这里有 若配置中有redirect-gateway则需要先删除

配置完成后,需要重启openvpn服务。

两种方法选取其一即可。

客户端配置文件,定义DNS服务器

dhcp-option DNS 8.8.8.8
dhcp-option DNS 8.8.4.4

OpenVPN 配置参数详解

# #号和;号开头的都是注释
# 设置监听 IP,默认是监听所有 IP
#local 116.6.45.23
#Openvpn 服务器监听端口
port 2194
# 设置用 TCP 还是 UDP 协议?
;proto tcp
proto udp
# 设置创建 tun 的路由 IP 通道,还是创建 tap 的以太网通道
# 路由 IP 容易控制,所以推荐使用它;但如果如 IPX 等必须
# 使用第二层才能通过的通讯,则可以用 tap 方式,tap 也
# 就是以太网桥接
dev tun
# 配置 VPN 使用的网段,OpenVPN 会自动提供基于该网段的 DHCP
# 服务,但不能和任何一方的局域网段重复,保证唯一
# server 端 ip 默认会设为.1 的地址。
server 10.9.0.0 255.255.255.0
# 为客户端创建对应的路由,以另其通达公司网内部服务器
# 但记住,公司网内部服务器也需要有可用路由返回到客户端
push "route 172.18.2.0 255.255.255.0"
# 维持一个客户端和 virtual IP 的对应表,以方便客户端重新
# 连接可以获得同样的 IP
ifconfig-pool-persist    /usr/local/etc/ipp.txt
# 用 OpenVPN 的 DHCP 功能为客户端提供指定的 DNS、WINS 等
push "dhcp-option DNS 172.18.2.23"
push "dhcp-option DNS 202.96.128.86"
# 这里是重点,必须指定 SSL/TLS root certificate (ca),
# certificate(cert), and private key (key)
# ca 文件是服务端和客户端都必须使用的,但不需要 ca.key
# 服务端和客户端指定各自的.crt 和.key
# 请注意路径,可以使用以配置文件开始为根的相对路径,
# 也可以使用绝对路径
# 请小心存放.key 密钥文件
ca /usr/local/etc/keys/ca.crt
cert /usr/local/etc/keys/server.crt
key /usr/local/etc/keys/server.key
# 指定 Diffie hellman parameters.
dh /usr/local/etc/keys/dh1024.pem
#用于吊销客户证书
crl-verify /usr/local/etc/keys/vpncrl.pem
#增强安全性
# Generate with:
# openvpn --genkey --secret ta.key
#
# The server and each client must have
# a copy of this key.
# The second parameter should be 0
# on the server and 1 on the clients.
tls-auth /usr/local/etc/keys/ta.key 0
# 设置服务端检测的间隔和超时时间 每 10 秒 ping 一次,如果 120 秒没有回应则认为对方已经 down
keepalive 10 120
# 使用 lzo 压缩的通讯,服务端和客户端都必须配置
comp-lzo
# 输出短日志,每分钟刷新一次,以显示当前的客户端
status /var/log/openvpn-status.log
#设置日志要记录的级别。
#0 只记录错误信息。
#4 能记录普通的信息。
#5 和 6 在连接出现问题时能帮助调试
#9 是极端的,所有信息都会显示,甚至连包头等信息都显示(像 tcpdump)
verb 4
#相同信息的数量,如果连续出现 20 条相同的信息,将不记录到日志中。
mute 20
# 让 OpenVPN 以 nobody 用户和组来运行(安全)
user nobody
group nobody
# The persist options will try to avoid
# accessing certain resources on restart
# that may no longer be accessible because
# of the privilege downgrade.
# 重启时仍保留一些状态
persist-key
persist-tun

其他参数

# 为特定的客户端指定 IP 或指定路由,该路由通常是客户端后面的
# 内网网段,而不是服务端连接的网段
# ccd 是/etc/openvpn 下的目录,其中建有希望限制的客户端 Common
# Name 为文件名的文件,并通过下面的命令写入固定 IP 地址
# 例如 Common Name 为 client1,则在/etc/openvpn/ccd/client1 写有:
# ifconfig-push 10.9.0.1 10.9.0.2
client-config-dir /usr/local/etc/ccd
# 若客户端希望所有的流量都通过 VPN 传输,则可以使用该语句
# 其会自动改变客户端的网关为 VPN 服务器,推荐关闭
# 一旦设置,请小心服务端的 DHCP 设置问题
;push "redirect-gateway"
# 如果您希望有相同 Common Name 的客户端都可以登陆
# 也可以注释下面的语句,推荐每个客户端都使用不用的 Common Name
# 常用于测试
;duplicate-cn
# 设置最大用户数
#max-clients 3
# 打开管理界面,可以定义监控的 IP 和端口
management localhost 7505
# 缺省日志会记录在系统日志中,但也可以导向到其他地方
# 建议调试的使用先不要设置,调试完成后再定义
;log /var/log/openvpn/openvpn.log
;log-append /var/log/openvpn/openvpn.log
# 配置为以太网桥模式,但需要使用系统的桥接功能
# 这里不需要使用
;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100
#记录日志,每次重新启动 openvpn 后删除原有的 log 信息
log /var/log/openvpn.log
#和 log 一致,每次重新启动 openvpn 后保留原有的 log 信息,新信息追加到文件最后
;log-append openvpn.log
#定义运行 openvpn 的用户
user nobody
group nobody
#Run script or shell command cmd to validate client
#virtual addresses or routes. 具体查看 manual
;learn-address ./script
#其它的一些需要 PUSH 给 Client
#用于记录某个 Client 获得的 IP 地址,类似于 dhcpd.lease 文件,
#防止 openvpn 重新启动后“忘记”Client 曾经使用过的 IP 地址
ifconfig-pool-persist ipp.txt
#Bridge 状态下类似 DHCPD 的配置,为客户分配地址,由于这里工作在路由模式,所以不使用
;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100
# 随机选择一个 Server 连接,否则按照顺序从上到下依次连接
;remote-random
# 始终重新解析 Server 的 IP 地址(如果 remote 后面跟的是域名)                 ,
# 保证 Server IP 地址是动态的使用 DDNS 动态更新 DNS 后,Client 在自动重新连接时重新解析 Server 的
IP 地址
# 这样无需人为重新启动,即可重新接入 VPN
resolv-retry infinite
# 在本机不邦定任何端口监听 incoming 数据,Client 无需此操作,除非一对一的 VPN 有必要
nobind
# 如果你使用 HTTP 代理连接 VPN Server,把 Proxy 的 IP 地址和端口写到下面
# 如果代理需要验证,使用 http-proxy server port [authfile] [auth-method]
# 其中 authfile 是一个 2 行的文本文件,用户名和密码各占一行,auth-method 可以省略,详
细信息查看 Manual
;http-proxy-retry # retry on connection failures
;http-proxy [proxy server] [proxy port #]
# Server 使用 build-key-server 脚本什成的,在 x509 v3 扩展中加入了 ns-cert-type 选项
# 防止 VPN client 使用他们的 keys + DNS hack 欺骗 vpn client 连接他们假冒的 VPN Server
# 因为他们的 CA 里没有这个扩展
ns-cert-type server
a.定义 tun 为使用路由方式的 VPN
b.小心处理证书的路径,.key 文件要保存好,特别是 ca.key。
(ca.key 不需要在 OpenVPN 中用到,可以另外保存)
注意,每个虚拟 tun 网卡都是成对的,只有 inet addr 标识的才是用于 VPN 通讯。并且必须在/30 网段