安装

1
2
3
4
git clone https://github.com/likaiyuan00/openvpn-install.git
cd openvpn-install && bash openvpn-install.sh
#systemctl start openvpn@client.service 启动的账号密码 auth-user-pass 控制客户端密码验证
echo "test test@123" > /etc/openvpn/userfile.sh

配置文件字段解读

server端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
在#openvpn服务端的监听地址
local 0.0.0.0
#openvpn服务端的监听端口(默认1194)
port 1115
#使用的协议,tcp/udp
proto tcp
#使用三层路由ip隧道(tun),还是二层以太网隧道(tap),一般使用tun
dev tun
#ca证书、服务端证书、服务端秘钥和秘钥交换文件
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/server.crt
key /etc/openvpn/server/server.key
dh /etc/openvpn/server/dh.pem
#vpn服务端为自己和客户端分配的ip地址池。
#服务端自己获取网段的第一个地址(此处是10.8.0.1),后为客户端分配其他的可用地址。以后客户端就可以和10.8.0.1进行通信。
注意:以下网段地址不要和已有网段冲突或重复
server 10.8.0.0 255.255.255.0
#使用一个文件记录已分配虚拟ip的客户端和虚拟ip的对应关系。以后openvpn重启时,将可以按照此文件继续为对应的客户端分配此前相同的ip(自动续借ip)
ifconfig-pool-persist ipp.txt
#使用tap模式的时候考虑此选项
server-bridge XXXXXX
#vpn服务端向客户端推送vpn服务端内网网段的路由配置,以便让客户端能够找到服务端的内网。多条路由写多个push指令
push "route 10.0.10.0 255.255.255.0"
push "route 192.168.10.0 255.255.255.0" #允许客户端访问的内网网段
#让vpn客户端之间可以通信。默认情况客户端只能服务端进行通信
#默认此项是注释的,客户端之间不能相互通信
client-to-client
#允许多个客户端使用同一个vpn账号连接服务端
#默认是注释的,不支持多个客户端登录一个账号
duplicate-cn
#每10秒ping一次,120秒后没收到ping就说明对方挂了
keepalive 10 120
#加强认证方式,防攻击。如果配置文件中启用此项(默认是启用的),需要执行openvpn --genkey --secret ta.key,并把ta.key放到/etc/openvpn/server/目录,服务端第二个参数为0;同时客户端也要有此文件,且client.conf中此指令的第二个参数需要为1
tls-auth /etc/openvpn/server/ta.key 0
#选择一个密码。如果在服务器上使用了cipher选项,那么也必须在这里指定它。注意,v2.4客户端/服务端将在tls模式下自动协商AES-256-GCM
cipher AES-256-CBC
#openvpn 2.4版本的vpn才能设置此选项。表示服务端启用lz4的压缩功能 ,传输数据给客户端时会压缩数据包。
Push后在客户端也配置启用lz4的压缩功能,向服务端发数据时也会压缩。如果是2.4版本以下的老版本,则使用用comp-lzo指令
compress lz4-v2
push "compress lz4-v2"
#启用lzo数据压缩格式,此指令用于低于2.4版本的老版本,且如果服务端配置了该指令,客户端也必须要配置
comp-lzo
#并发客户端的连接数
max-clients 1000
#通过ping得知超时时,当重启vpn后将使用同一个秘钥文件以及保持tun连接状态
persist-key
persist-tun
#在文件中输出当前的连接信息,每分钟截断并重写一次该文件
status openvpn-status.log
#log指令表示每次启动vpn时覆盖式记录到指定日志文件中
#log-append则表示每次启动vpn时追加式的记录到指定日志中
#但两者只能选其一,或者不选时记录到rsyslog中
log /var/log/openvpn.log
log-append /var/log/openvpn.log
#日志记录的详细级别
verb 3
#当服务器重新启动时,通知客户端,以便它可以自动重新连接。仅在UDP协议是可用
explicit-exit-notify 1
#沉默的重复信息。最多20条相同消息类别的连续消息将输出到日志
mute 20

client

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#标识这是个客户端
client
#使用的协议,tcp/udp,服务端是什么客户端就是什么
proto tcp
#使用三层路由ip隧道(tun),还是二层以太网隧道(tap),服务端是什么客户端就是什么
dev tun
#服务端的地址和端口
remote 10.0.0.190 1194
#一直尝试解析OpenVPN服务器的主机名
resolv-retry infinite
#大多数客户机不需要绑定到特定的本地端口号
nobind
#初始化后的降级特权(仅非windows)
user nobody
group nobody
#尝试在重新启动时保留某些状态
persist-key
persist-tun
#ca证书、客户端证书、客户端密钥
#如果它们和client.conf或client.ovpn在同一个目录下则可以不写绝对路径,否则需要写绝对路径调用
ca ca.crt
cert client.crt
key client.key
#通过检查certicate是否具有正确的密钥使用设置来验证服务器证书。
remote-cert-tls server
#加强认证方式,防攻击。服务端有配置,则客户端必须有
tls-auth ta.key 1
#选择一个密码。如果在服务器上使用了cipher选项,那么您也必须在这里指定它。注意,v2.4客户端/服务器将在TLS模式下自动协商AES-256-GCM。
cipher AES-256-CBC
# 服务端用的什么,客户端就用的什么
#表示客户端启用lz4的压缩功能,传输数据给客户端时会压缩数据包
comp-lzo
# 日志级别
verb 3
#沉默的重复信息。最多20条相同消息类别的连续消息将输出到日志
mute 20

如何直连openvpn服务端其他局域网服务器

客户端(10.8.0.10)

ping (服务端)172.16.1.7 正常

ping (服务端其他内网机器)172.16.1.8失败

  1. 第一种方法 配置路由
    route add -net 10.8.0.0 netmask 255.255.255.0 gw 172.16.1.7

    10.8.0.0 客户端IP

    172.16.1.7 openvpn 服务端IP

  1. 第二种方法使用snat转发

    iptables -t nat -A POSTROUTING -d 10.8.0.0/24 -o eth0 -j MASQUERADE

    iptables -A FORWARD -s 10.8.0.0 -j ACCEPT

额外

服务端
route 192.168.0.0 255.255.0.0 指令作用是在服务端加一条路由,网关是客户端ip
alt text

服务端只能ping通客户端的tun0的ip,内网ip不行,即使加了路由也不行
alt text

客户端
push “route 192.168.10.0 255.255.255.0”作用是在客户端多加一条路由。网关是服务端的tun0IP(也就是server 指令配置分配的地址池)
alt text
alt text