Skip to content

#一、server端

❌ 注意

server端配置详解,针对多客户端的OpenVPN 2.2 的服务器端配置文件示例 '#号'和;号开头的都是注释

#该命令是可选的,如果不设置,则默认监听本机的所有IP地址。
#使用那种协议,可选的有,udp tcp-server tcp-client
    proto udp  
    port 1194

#tun路由模式,tap桥模式,据说tun效率高于tap,但是tun只能转发IP数据,tap是二层可以封装任何协议,window下只有tap模式
    dev tun

#该参数能防止密码被缓存到内存中
    auth-nocache    

#openvpn网络模式,默认是net30:表示掩码30位,有地址浪费,还有P2P模式,当然还有subnet这是比较推荐的
    topology subnet

#push表示推送,即将配置推送给客户端,让客户端也使用subnet模式
    push "topology subnet"

#定义分配给客户端的IP段,服务端自己默认使用第一个可以地址
    server 172.16.0.0 255.255.255.0

#在openvpn重启时,再次连接的客户端将依然被分配和以前一样的IP地址
    #ipp.txt文件格式 "nanchang,172.16.0.22"  一行一个
    ifconfig-pool-persist /etc/openvpn/beihai/ipp.txt

#认证相关的信息
    ca /etc/openvpn/ca/pki/ca.crt
    cert /etc/openvpn/ca/pki/issued/beihai.crt
    key /etc/openvpn/beihai/pki/private/beihai.key
    #dh 是server必须要有的,客户端可以不要,它定义了如何进行密钥交换
    dh /etc/openvpn/beihai/pki/dh.pem
    ##防DDOS攻击,openvpn控制通道的tls握手进行保护,服务器端0,客户端1
    tls-auth /etc/openvpn/beihai/ta.key 0

#待openvpn初始化完成后,将其降级为nobody权限运行
    user nobody
    group nobody

    persist-key #通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys
    persist-tun #通过keepalive检测超时后,重新启动VPN,一直保持tun或者tap设备是linkup的,否则网络连接会先linkdown然后linkup
    comp-lzo        #允许数据压缩,如果启用了客户端配置文件也需要有这项
    keepalive 5 20  #表示每隔5秒ping一下客户端/服务端,若是20秒内无响应,认为down,随即重启openvpn(强烈开启)
    max-clients 100 #最大客户端并发连接数量    

    push "dhcp-option DNS 8.8.8.8"  #指定客户端使用的主DNS
    push "dhcp-option DNS 8.8.4.4"  #指定客户端使用的备DNS
    client-to-client            #默认客户端间不能互访,开启客户端互访,tap模式会形成广播域,tun不会
    duplicate-cn                    #支持一个证书多个客户端登录使用,建议不启用

#开启对客户端进行细粒度控制(该目录需要手动创建,名字为客户端的证书辨识名)
    client-config-dir /etc/openvpn/beihai/ccd

# 给openvpn服务器添加静态路由,目的是让openvpn服务器知道怎么去客户端网段,走vpn接口(tun0)
    route 192.168.29.0 255.255.255.0

#推送路由给客户端,通知客户端添加静态路由,让客户端去这两个网段走vpn接口(tun0
#推送路由,vpn,根据自己后面有多少服务器填写
    push "route 192.168.11.0 255.255.255.0"

#重定向默认网关
为什么要重定向网关:vpn客户端是经常出差的,网络环境不安全,希望它将所有流量传到公司,经公司出口
    #其中包含的flags有"local autolocal def1 bypass-dhcp bypass-dns block-local ipv6 !ipv4"(多个标志之间用空格分隔),
    #推荐使用def1,它使用0.0.0.0/1和128.0.0.0/1而不是0.0.0.0/0来覆盖默认网关,即有新路由也保留原始默认网关,只是优先匹配而已
    #block-local 是表示当客户端拨入后,阻断其除与本地网关的访问外,本地的其他IP都不允许访问
    push "redirect-gateway def1 bypass-dhcp"

#记录日志,每次重新启动openvpn后追加原有的log信息
    log-append /var/log/openvpn.log

#日志记录级别,可选0-9,0只记录错误信息,4能记录普通的信息,5和6在连接出现问题时能帮助调试,9显示所有信息,甚至连包头等信息都显示(像tcpdump) 
    verb 3

#状态文件:定期(默认60s)把状态信息写到该文件,以便自己写程序计费或者进行其他操作(需要关闭selinux)
    status /var/log/openvpn-status.log

#相同信息的数量,如果连续出现 20 条相同的信息,将不记录到日志中。
    mute 20


;log
#输出一个简短的状态文件,用于显示当前的连接状态,该文件每分钟都会清空并重写一次
status openvpn-status.log  


#"log-append"这是在之前的日志内容后进行追加
log-append openvpn.log 

#"log"方式在每次启动时都会清空之前的日志文件
log server.log   
;你可以使用两种方式之一(但不要同时使用)


verb 3
#为日志文件设置适当的冗余级别(0~9)。冗余级别越高,输出的信息越详细。

; 0 表示静默运行,只记录致命错误。
; 4 表示合理的常规用法。
; 5 和 6 可以帮助调试连接错误。
; 9 表示极度冗余,输出非常详细的日志信息

#忽略无线,无用头信息
mute-replay-warnings

#吊销用户证书
crl-verify crl.pem
#该命令是可选的,如果不设置,则默认监听本机的所有IP地址。
#使用那种协议,可选的有,udp tcp-server tcp-client
    proto udp  
    port 1194

#tun路由模式,tap桥模式,据说tun效率高于tap,但是tun只能转发IP数据,tap是二层可以封装任何协议,window下只有tap模式
    dev tun

#该参数能防止密码被缓存到内存中
    auth-nocache    

#openvpn网络模式,默认是net30:表示掩码30位,有地址浪费,还有P2P模式,当然还有subnet这是比较推荐的
    topology subnet

#push表示推送,即将配置推送给客户端,让客户端也使用subnet模式
    push "topology subnet"

#定义分配给客户端的IP段,服务端自己默认使用第一个可以地址
    server 172.16.0.0 255.255.255.0

#在openvpn重启时,再次连接的客户端将依然被分配和以前一样的IP地址
    #ipp.txt文件格式 "nanchang,172.16.0.22"  一行一个
    ifconfig-pool-persist /etc/openvpn/beihai/ipp.txt

#认证相关的信息
    ca /etc/openvpn/ca/pki/ca.crt
    cert /etc/openvpn/ca/pki/issued/beihai.crt
    key /etc/openvpn/beihai/pki/private/beihai.key
    #dh 是server必须要有的,客户端可以不要,它定义了如何进行密钥交换
    dh /etc/openvpn/beihai/pki/dh.pem
    ##防DDOS攻击,openvpn控制通道的tls握手进行保护,服务器端0,客户端1
    tls-auth /etc/openvpn/beihai/ta.key 0

#待openvpn初始化完成后,将其降级为nobody权限运行
    user nobody
    group nobody

    persist-key #通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys
    persist-tun #通过keepalive检测超时后,重新启动VPN,一直保持tun或者tap设备是linkup的,否则网络连接会先linkdown然后linkup
    comp-lzo        #允许数据压缩,如果启用了客户端配置文件也需要有这项
    keepalive 5 20  #表示每隔5秒ping一下客户端/服务端,若是20秒内无响应,认为down,随即重启openvpn(强烈开启)
    max-clients 100 #最大客户端并发连接数量    

    push "dhcp-option DNS 8.8.8.8"  #指定客户端使用的主DNS
    push "dhcp-option DNS 8.8.4.4"  #指定客户端使用的备DNS
    client-to-client            #默认客户端间不能互访,开启客户端互访,tap模式会形成广播域,tun不会
    duplicate-cn                    #支持一个证书多个客户端登录使用,建议不启用

#开启对客户端进行细粒度控制(该目录需要手动创建,名字为客户端的证书辨识名)
    client-config-dir /etc/openvpn/beihai/ccd

# 给openvpn服务器添加静态路由,目的是让openvpn服务器知道怎么去客户端网段,走vpn接口(tun0)
    route 192.168.29.0 255.255.255.0

#推送路由给客户端,通知客户端添加静态路由,让客户端去这两个网段走vpn接口(tun0
#推送路由,vpn,根据自己后面有多少服务器填写
    push "route 192.168.11.0 255.255.255.0"

#重定向默认网关
为什么要重定向网关:vpn客户端是经常出差的,网络环境不安全,希望它将所有流量传到公司,经公司出口
    #其中包含的flags有"local autolocal def1 bypass-dhcp bypass-dns block-local ipv6 !ipv4"(多个标志之间用空格分隔),
    #推荐使用def1,它使用0.0.0.0/1和128.0.0.0/1而不是0.0.0.0/0来覆盖默认网关,即有新路由也保留原始默认网关,只是优先匹配而已
    #block-local 是表示当客户端拨入后,阻断其除与本地网关的访问外,本地的其他IP都不允许访问
    push "redirect-gateway def1 bypass-dhcp"

#记录日志,每次重新启动openvpn后追加原有的log信息
    log-append /var/log/openvpn.log

#日志记录级别,可选0-9,0只记录错误信息,4能记录普通的信息,5和6在连接出现问题时能帮助调试,9显示所有信息,甚至连包头等信息都显示(像tcpdump) 
    verb 3

#状态文件:定期(默认60s)把状态信息写到该文件,以便自己写程序计费或者进行其他操作(需要关闭selinux)
    status /var/log/openvpn-status.log

#相同信息的数量,如果连续出现 20 条相同的信息,将不记录到日志中。
    mute 20


;log
#输出一个简短的状态文件,用于显示当前的连接状态,该文件每分钟都会清空并重写一次
status openvpn-status.log  


#"log-append"这是在之前的日志内容后进行追加
log-append openvpn.log 

#"log"方式在每次启动时都会清空之前的日志文件
log server.log   
;你可以使用两种方式之一(但不要同时使用)


verb 3
#为日志文件设置适当的冗余级别(0~9)。冗余级别越高,输出的信息越详细。

; 0 表示静默运行,只记录致命错误。
; 4 表示合理的常规用法。
; 5 和 6 可以帮助调试连接错误。
; 9 表示极度冗余,输出非常详细的日志信息

#忽略无线,无用头信息
mute-replay-warnings

#吊销用户证书
crl-verify crl.pem

#二、client端配置

# 定义是一个客户端
client

# 定义使用设备类型,与服务端一致
dev tun

#协议,与服务端一致
proto tcp

sndbuf 0
rcvbuf 0

#远程vpn服务地址
remote 103.61.37.156 33022

#解析服务器域名
resolv-retry infinite

# 客户端不需要绑定端口
nobind

#加密
persist-key
persist-tun


remote-cert-tls server
auth SHA512
cipher AES-256-CBC
setenv opt block-outside-dns
key-direction 1
verb 3
compress lzo

#采用用户名密码方式验证,若不用证书的话,可以考虑这种方式,可以结合LDAP或者mysql
;auth-user-pass

#不存储验证缓存
auth-nocache
 
#设置IP地址过期时间
ip-win32 dynamic 0 7200

<ca>
ca.crt的内容粘贴到这里
</ca>
 
<cert>
client.crt的内容粘贴到这里
</cert>
 
<key>
client.key的内容粘贴到这里
</key>
# 定义是一个客户端
client

# 定义使用设备类型,与服务端一致
dev tun

#协议,与服务端一致
proto tcp

sndbuf 0
rcvbuf 0

#远程vpn服务地址
remote 103.61.37.156 33022

#解析服务器域名
resolv-retry infinite

# 客户端不需要绑定端口
nobind

#加密
persist-key
persist-tun


remote-cert-tls server
auth SHA512
cipher AES-256-CBC
setenv opt block-outside-dns
key-direction 1
verb 3
compress lzo

#采用用户名密码方式验证,若不用证书的话,可以考虑这种方式,可以结合LDAP或者mysql
;auth-user-pass

#不存储验证缓存
auth-nocache
 
#设置IP地址过期时间
ip-win32 dynamic 0 7200

<ca>
ca.crt的内容粘贴到这里
</ca>
 
<cert>
client.crt的内容粘贴到这里
</cert>
 
<key>
client.key的内容粘贴到这里
</key>

三、

local 172.16.0.100                               # 监听的ip
port 1999                                        # 监听的端口,默认1194,我设置1999,根据你的需求改就行
proto tcp                                        # 使用的协议,默认udp,因为经常要通过vpn传文件对可靠性要求比较高,所以用tcp
dev tun                                          # 使用tun(隧道)模式,openvpn有两种模式,一种是TUN,另一种是TAP
ca   /etc/openvpn/easy-rsa/keys/ca.crt           # 这四条都是指定证书的路径,要确保路径或文件能够访问
cert /etc/openvpn/easy-rsa/keys/vpnserver.crt
key  /etc/openvpn/easy-rsa/keys/vpnserver.key  
dh   /etc/openvpn/easy-rsa/keys/dh2048.pem
server 10.8.0.0 255.255.255.0                    # 设置成server模式并给客户端分配的ip段,服务端会用其中.1和.2两个ip,不要和你的内网冲突
ifconfig-pool-persist ipp.txt                    # 当vpn断开或重启后,可以利用该文件重新建立相同的IP地址连接
push "route 172.16.0.0 255.255.255.0"            # 这三条是给客户端推的路由,客户端连上后会根据这个添加路由,vpn服务器后端有几个网段就写几个
push "route 172.16.2.0 255.255.255.0"            # 这些路由的作用是告诉客户端去另一个子网都转发给TUN接口,类似于静态路由
push "route 10.10.10.0 255.255.255.0"                       
client-config-dir /etc/openvpn/ccd               # 客户端的个性配置目录,比如针对每个客户端推送不同的路由、配置不同的ip
keepalive 10 120                                 # 每10秒ping一次,如果超过120s认为对方已经down了,需要重连
comp-lzo                                         # 在vpn链接上启用压缩,服务端开启客户端也必须开启
max-clients 100                                  # 最多有几个vpn客户端可以连
user nobody                                      # 启动openvpn的用户和组,建议用nobody
group nobody                                     
client-to-client                                 # 允许vpn客户端之间通信
duplicate-cn                                     # 允许多个客户端使用同一个证书登陆,生产环境建议为每个用户都生成自己的证书
persist-key                                      # 通过keepalived检测后重新启动vpn,不重新读取keys,保留第一次使用的keys
persist-tun                                      # 通过keepalived检测后重新启动vpn,一直保持tun或tap设备是linkup
status   /var/log/openvpn/openvpn-status.log     # openvpn的状态日志文件
log      /var/log/openvpn/openvpn.log            # openvpn的日志文件
writepid /var/run/openvpn/server.pid             # pid文件
verb 3                                           # 日志级别
mute 20                                          # 如果连续出现20条相同的日志,只记录一条
local 172.16.0.100                               # 监听的ip
port 1999                                        # 监听的端口,默认1194,我设置1999,根据你的需求改就行
proto tcp                                        # 使用的协议,默认udp,因为经常要通过vpn传文件对可靠性要求比较高,所以用tcp
dev tun                                          # 使用tun(隧道)模式,openvpn有两种模式,一种是TUN,另一种是TAP
ca   /etc/openvpn/easy-rsa/keys/ca.crt           # 这四条都是指定证书的路径,要确保路径或文件能够访问
cert /etc/openvpn/easy-rsa/keys/vpnserver.crt
key  /etc/openvpn/easy-rsa/keys/vpnserver.key  
dh   /etc/openvpn/easy-rsa/keys/dh2048.pem
server 10.8.0.0 255.255.255.0                    # 设置成server模式并给客户端分配的ip段,服务端会用其中.1和.2两个ip,不要和你的内网冲突
ifconfig-pool-persist ipp.txt                    # 当vpn断开或重启后,可以利用该文件重新建立相同的IP地址连接
push "route 172.16.0.0 255.255.255.0"            # 这三条是给客户端推的路由,客户端连上后会根据这个添加路由,vpn服务器后端有几个网段就写几个
push "route 172.16.2.0 255.255.255.0"            # 这些路由的作用是告诉客户端去另一个子网都转发给TUN接口,类似于静态路由
push "route 10.10.10.0 255.255.255.0"                       
client-config-dir /etc/openvpn/ccd               # 客户端的个性配置目录,比如针对每个客户端推送不同的路由、配置不同的ip
keepalive 10 120                                 # 每10秒ping一次,如果超过120s认为对方已经down了,需要重连
comp-lzo                                         # 在vpn链接上启用压缩,服务端开启客户端也必须开启
max-clients 100                                  # 最多有几个vpn客户端可以连
user nobody                                      # 启动openvpn的用户和组,建议用nobody
group nobody                                     
client-to-client                                 # 允许vpn客户端之间通信
duplicate-cn                                     # 允许多个客户端使用同一个证书登陆,生产环境建议为每个用户都生成自己的证书
persist-key                                      # 通过keepalived检测后重新启动vpn,不重新读取keys,保留第一次使用的keys
persist-tun                                      # 通过keepalived检测后重新启动vpn,一直保持tun或tap设备是linkup
status   /var/log/openvpn/openvpn-status.log     # openvpn的状态日志文件
log      /var/log/openvpn/openvpn.log            # openvpn的日志文件
writepid /var/run/openvpn/server.pid             # pid文件
verb 3                                           # 日志级别
mute 20                                          # 如果连续出现20条相同的日志,只记录一条

CCD配置文件语法,CCD能对客户端进行细粒度控制

    ifconfig-push    :向客户端推送虚拟IP地址,它将会覆盖掉 --config-pool的动态分配地址
    local
    remote-netmask    :他们的设置相当于--config 选项,用于在客户端机器上远程执行vpn通道的配置
    push
    push-reset
    iroute  :用于从服务器向特定的客户端生成内部路由,不管客户端从哪里拨入,总是将某个特定子网从服务器路由到客户端,同时需要在服务器端使用--route指令添加该系统路由
    config

#事例
cat /etc/openvpn/beihai/ccd/nanchang

ifconfig-push 172.16.0.88 255.255.255.0    #表示给客户端分配一个特定IP地址
push "redirect-gateway def1 bypass-dhcp"   #重定向默认网关
    ifconfig-push    :向客户端推送虚拟IP地址,它将会覆盖掉 --config-pool的动态分配地址
    local
    remote-netmask    :他们的设置相当于--config 选项,用于在客户端机器上远程执行vpn通道的配置
    push
    push-reset
    iroute  :用于从服务器向特定的客户端生成内部路由,不管客户端从哪里拨入,总是将某个特定子网从服务器路由到客户端,同时需要在服务器端使用--route指令添加该系统路由
    config

#事例
cat /etc/openvpn/beihai/ccd/nanchang

ifconfig-push 172.16.0.88 255.255.255.0    #表示给客户端分配一个特定IP地址
push "redirect-gateway def1 bypass-dhcp"   #重定向默认网关

openvpn client端配置文件参数解释

#随机选择一个Server连接,否则按照顺序从上到下依次连接。该选项默认不启用。
    remote-random

#始终重新解析Server的IP地址(如果remote后面跟的是域名),保证Server IP地址是动态的使用DDNS动态更新DNS后,Client在自动重新连接时重新解析Server的IP地址。这样无需人为重新启动,即可重新接入VPN。
    resolv-retry infinite
#随机选择一个Server连接,否则按照顺序从上到下依次连接。该选项默认不启用。
    remote-random

#始终重新解析Server的IP地址(如果remote后面跟的是域名),保证Server IP地址是动态的使用DDNS动态更新DNS后,Client在自动重新连接时重新解析Server的IP地址。这样无需人为重新启动,即可重新接入VPN。
    resolv-retry infinite

常用配置说明

配置参数参数说明
local 10.0.0.28(外网卡地址)哪一个本地地址要被openvpn进行监听
port 52115监听的端口,默认是1194,这里为了安全起见,修改为52115
proto udp指定监听的协议,当并发访问多时,推荐tcp
dev tunvpn server的模式采用路由模式,可选tap或tun
ca ca.crtca证书,注意此文件和server.conf在一个目录下,否则要用绝对路径调用
cert server.crt
key server.keythis file should be kept secret
dh dh1024.pem
server 10.8.0.0这个是vpn server动态分配给vpn client的地址池,一般不需要更改。这个段不要和任何网络地址段冲突或者重复
ifconfig-pool-persist ipp.txt
push “route 172.16.1.0 255.255.255.0”这个是vpn server所在的内网网段,如果有多个可以写多个push,注意,此命令实际作用是在vpn client本地生成vpn sever所在的内网网段路由,确保能够和vpn server所在的内网网段通信
client-to-client允许拨号的多个vpn client互相通信
duplicate-cn允许多个客户端使用同一个帐号连接
keepalive 10 20每10秒ping一次,若是120秒未收到包,即认定客户端断线
comp-lzo开启压缩功能
persist-key当vpn超时后,当重新启动vpn后,保持上一次使用的私钥,而不重新读取私钥
persist-tun通过keepalive检测vpn超时后,当重新启动vpn后,保持tun或者tap设备自动连接状态
status openvpn-status.logopenvpn日志状态信息
log /var/log/openvpn.log日志文件
verb 3指定日志文件冗余

4.客户端路由配置

主要由 route-nopullvpn_gatewaynet_gateway 三个参数决定

route-nopull

当客户端加入这个参数后,openvpn 连接后不会添加路由,也就是不会有任何网络请求走 openvpn.

vpn_gateway

当客户端加入 route-nopull 后,所有出去的访问都不从 Openvpn 出去,但可通过添加 vpn_gateway 参数使部分IP访问走 Openvpn 出去

route 192.168.1.0 255.255.0.0 vpn_gateway
route 172.121.0.0 255.255.0.0 vpn_gateway
route 192.168.1.0 255.255.0.0 vpn_gateway
route 172.121.0.0 255.255.0.0 vpn_gateway

net_gateway

这个参数和 vpn_gateway 相反,表示在默认出去的访问全部走 Openvpn 时,强行指定部分IP访问不通过 Openvpn 出去. max-routes 参数表示可以添加路由的条数,默认只允许添加100条路由,如果少于100条路由可不加这个参数

max-routes 1000
route 172.121.0.0 255.255.0.0 net_gateway
max-routes 1000
route 172.121.0.0 255.255.0.0 net_gateway