#一、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 tun | vpn server的模式采用路由模式,可选tap或tun |
ca ca.crt | ca证书,注意此文件和server.conf在一个目录下,否则要用绝对路径调用 |
cert server.crt | |
key server.key | this 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.log | openvpn日志状态信息 |
log /var/log/openvpn.log | 日志文件 |
verb 3 | 指定日志文件冗余 |
4.客户端路由配置
主要由 route-nopull
、vpn_gateway
、net_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