Skip to content
  • 官方文档

https://openvpn.net/community-resources/how-to/

[SOLVED] OpenVPN 重复的消息: TEST ROUTES: 0/0 succeeded len=1 ret=0 a=0 u/d=down

Wed Jun 08 01:55:59 2011 C:\WINDOWS\system32\route.exe ADD 128.0.0.0 MASK 128.0.0.0 10.8.0.5
Wed Jun 08 01:55:59 2011 Warning: route gateway is not reachable on any active network adapters: 10.8.0.5
Wed Jun 08 01:55:59 2011 Route addition via IPAPI failed [adaptive]
Wed Jun 08 01:55:59 2011 C:\WINDOWS\system32\route.exe ADD 128.0.0.0 MASK 128.0.0.0 10.8.0.5
Wed Jun 08 01:55:59 2011 Warning: route gateway is not reachable on any active network adapters: 10.8.0.5
Wed Jun 08 01:55:59 2011 Route addition via IPAPI failed [adaptive]

解决方式:

Warning: route gateway is not reachable on any active network adapters: 10.8.0.5

  • 到你安装OpenVPN\bin目录下,将openvpn.exe, openvpn-gui-1.0.3.exe以及openvpnserv.exe设置管理员权限和windows xp 兼容模式(右击-属性-兼容性)
  • 修改客户端配置文件(.ovpn),增加一行:route-method exe

优化vpn速度

sever端

sndbuf 393216
rcvbuf 393216
push "sndbuf 393216"
push "rcvbuf 393216"
tun-mtu 9000
cipher none       // 关闭加密 
auth none          //关闭MAC
sndbuf 393216
rcvbuf 393216
push "sndbuf 393216"
push "rcvbuf 393216"
tun-mtu 9000
cipher none       // 关闭加密 
auth none          //关闭MAC

client端

tun-mtu 9000
mute 20
cipher none       // 关闭加密 
auth none          //关闭MAC
tun-mtu 9000
mute 20
cipher none       // 关闭加密 
auth none          //关闭MAC

可以把压缩删除

OpenSSL加密与LZO压缩的影响

对于不是特别古老的CPU,这两项都不会成为性能瓶颈。然而:

(1)VPS等环境下,cpu被共享,服务器能用于压缩和加密的计算资源不多
(2)客户端设备繁多,可能存在性能瓶颈。

对SSL,OpenVPN先查看可用的加密方法:

	openvpn --show-ciphers
注意区别于

	openvpn --show-tls
后者是指在交换密钥时用到的加密方法,而前者是指对于数据通道的加密方法。前者真正影响传输性能。

速度比较快的加密方法也只有bf-cbc和aes-128-cbc两种。然后分别在服务端和客户端进行一下OpenSSL性能测试,Win下的OpenSSL在OpenVPN安装目录下的bin文件夹内。

	openssl speed bf-cbc aes-128-cbc
根据实际速度选择合适的加密算法,然后在服务器和客户端的openvpn配置文件中用cipher BF-CBC或者cipher AES-128-CBC指明,服务端和客户端配置文件都需要更改。注意部分Intel i5/i7和AMD的Bulldozer处理器支持AES-NI指令集,搭配OpenSSL的AES-NI补丁可以将AES-128-CBC的速度提升7倍。

对lzo我没有找到简单科学的的测试方法,我的测试方法是运行

	dd count=10240 if=/dev/urandom | lzop -c >/dev/null
然后把上面的结果处以top里面看到的lzop的cpu占用率,得到lzop真实效率。在我的测试中,Xeon(R) CPU X3220@2.40GHz的一个核心上,占用14%的cpu时间,只能处理5.0MB/s的压缩。官方的数据在这里。

意义
不使用OpenVPN时,下载有多线程工具,视频网站有CDN加速,RWIN和RTT的限制都被很好地避免了。然而OpenVPN需要将所有流量全部经由单个UDP/TCP连接传输,保证单个接口/连接的吞吐率就非常重要
对于不是特别古老的CPU,这两项都不会成为性能瓶颈。然而:

(1)VPS等环境下,cpu被共享,服务器能用于压缩和加密的计算资源不多
(2)客户端设备繁多,可能存在性能瓶颈。

对SSL,OpenVPN先查看可用的加密方法:

	openvpn --show-ciphers
注意区别于

	openvpn --show-tls
后者是指在交换密钥时用到的加密方法,而前者是指对于数据通道的加密方法。前者真正影响传输性能。

速度比较快的加密方法也只有bf-cbc和aes-128-cbc两种。然后分别在服务端和客户端进行一下OpenSSL性能测试,Win下的OpenSSL在OpenVPN安装目录下的bin文件夹内。

	openssl speed bf-cbc aes-128-cbc
根据实际速度选择合适的加密算法,然后在服务器和客户端的openvpn配置文件中用cipher BF-CBC或者cipher AES-128-CBC指明,服务端和客户端配置文件都需要更改。注意部分Intel i5/i7和AMD的Bulldozer处理器支持AES-NI指令集,搭配OpenSSL的AES-NI补丁可以将AES-128-CBC的速度提升7倍。

对lzo我没有找到简单科学的的测试方法,我的测试方法是运行

	dd count=10240 if=/dev/urandom | lzop -c >/dev/null
然后把上面的结果处以top里面看到的lzop的cpu占用率,得到lzop真实效率。在我的测试中,Xeon(R) CPU X3220@2.40GHz的一个核心上,占用14%的cpu时间,只能处理5.0MB/s的压缩。官方的数据在这里。

意义
不使用OpenVPN时,下载有多线程工具,视频网站有CDN加速,RWIN和RTT的限制都被很好地避免了。然而OpenVPN需要将所有流量全部经由单个UDP/TCP连接传输,保证单个接口/连接的吞吐率就非常重要

3安装方式

https://luanlengli.github.io/2019/11/25/CentOS7%E9%83%A8%E7%BD%B2OpenVPN%E5%AE%9E%E7%8E%B0%E5%86%85%E7%BD%91%E4%BA%92%E9%80%9A.html

配置模版

#通讯协议,可以选择TCP或者UDP,UDP更适合于在丢包率较大的环境使用
proto tcp

#端口号
port 1194

#使用tun或者tap设备
dev tun

#实现/24子网掩码换算,最大客户端有255个
topology subnet

#设置子网,默认是10.8.0.0/24
server 10.8.0.0 255.255.255.0

#认证算法
auth SHA256

#加密算法
cipher AES-256-CBC

#使用LZO压缩
comp-lzo adaptive

#告知客户端通讯将采用LZO压缩
push "comp-lzo adaptive"

#此处是全局路由选项,即告知客户端将所有流量通过VPN隧道发送,一般是不使用
push "redirect-gateway def1 bypass-dhcp"

#推送DNS信息,下同
push "dhcp-option DNS 1.1.1.1" 
push "dhcp-option DNS 8.8.8.8"

#服务器CA证书路径
ca /etc/openvpn/cert/ca.crt 
#diffie hellman密钥路径
dh /etc/openvpn/cert/dh1024.pem 
#服务器证书路径
cert /etc/openvpn/cert/server.crt 
#服务器密钥路径
key /etc/openvpn/cert/server.key 
#在SSL/TLS握手包的基础上增加额外的签名以提高安全性。
tls-auth /etc/openvpn/cert/ta.key 
#此选项使VPN在重连时不重新读取key且不会将tun设备关闭
persist-key 
persist-tun
#通过yum安装的,可将其配置为以openvpn用户和组运行,增加安全性
user openvpn
group openvpn
#openvpn账号密码认证脚本
auth-user-pass-verify /etc/openvpn/openvpn3config/checkpsw.sh via-env

#使用客户端提供的用户名作为common name
username-as-common-name

#不要求客户端提供证书
client-cert-not-required

#脚本运行级别为3,否则无法认证用户名密码
script-security 3

#客户端配置文件,可以配置客户端的IP
client-config-dir /etc/openvpn/ccd

#生成日志
log /var/log/openvpn.log
log-append /var/log/openvpn.log

#将最大客户端设置为255
max-clients 255

#该选项允许客户端直接通讯而在路由上不经过网关
client-to-client

#10秒钟ping一次对端以确定对方是否在线,60秒未响应则断开连接,适合客户端在NAT后使用
keepalive 10 60

nice 3
#日志级别设置
verb 4
mute 10

explicit-exit-notify 1
当服务器重新启动时,通知客户端,以便它可以自动重新连接。仅在UDP协议是可用
#通讯协议,可以选择TCP或者UDP,UDP更适合于在丢包率较大的环境使用
proto tcp

#端口号
port 1194

#使用tun或者tap设备
dev tun

#实现/24子网掩码换算,最大客户端有255个
topology subnet

#设置子网,默认是10.8.0.0/24
server 10.8.0.0 255.255.255.0

#认证算法
auth SHA256

#加密算法
cipher AES-256-CBC

#使用LZO压缩
comp-lzo adaptive

#告知客户端通讯将采用LZO压缩
push "comp-lzo adaptive"

#此处是全局路由选项,即告知客户端将所有流量通过VPN隧道发送,一般是不使用
push "redirect-gateway def1 bypass-dhcp"

#推送DNS信息,下同
push "dhcp-option DNS 1.1.1.1" 
push "dhcp-option DNS 8.8.8.8"

#服务器CA证书路径
ca /etc/openvpn/cert/ca.crt 
#diffie hellman密钥路径
dh /etc/openvpn/cert/dh1024.pem 
#服务器证书路径
cert /etc/openvpn/cert/server.crt 
#服务器密钥路径
key /etc/openvpn/cert/server.key 
#在SSL/TLS握手包的基础上增加额外的签名以提高安全性。
tls-auth /etc/openvpn/cert/ta.key 
#此选项使VPN在重连时不重新读取key且不会将tun设备关闭
persist-key 
persist-tun
#通过yum安装的,可将其配置为以openvpn用户和组运行,增加安全性
user openvpn
group openvpn
#openvpn账号密码认证脚本
auth-user-pass-verify /etc/openvpn/openvpn3config/checkpsw.sh via-env

#使用客户端提供的用户名作为common name
username-as-common-name

#不要求客户端提供证书
client-cert-not-required

#脚本运行级别为3,否则无法认证用户名密码
script-security 3

#客户端配置文件,可以配置客户端的IP
client-config-dir /etc/openvpn/ccd

#生成日志
log /var/log/openvpn.log
log-append /var/log/openvpn.log

#将最大客户端设置为255
max-clients 255

#该选项允许客户端直接通讯而在路由上不经过网关
client-to-client

#10秒钟ping一次对端以确定对方是否在线,60秒未响应则断开连接,适合客户端在NAT后使用
keepalive 10 60

nice 3
#日志级别设置
verb 4
mute 10

explicit-exit-notify 1
当服务器重新启动时,通知客户端,以便它可以自动重新连接。仅在UDP协议是可用
  • client
#声明为客户端
client
#使用tun/tap设备,必须与服务端一直
dev tun
#连接协议,必须与服务端一直
proto tcp
#远程服务器的地址和端口号,可以是域名也可以是IP地址
remote IP or Domain name Portnum
#在服务器中断后自动连接
resolv-retry infinite
#不指定网卡
nobind
#以下同服务端说明
persist-key
persist-tun
auth SHA256
cipher AES-256-CBC
comp-lzo adaptive
nice 0
verb 3
mute 10
#认证文件,即用户名密码,下次无需再输入
auth-user-pass pass.txt
#ca证书路径,也可使用<ca></ca>的形式直接将证书粘贴于此
ca ca证书路径
#key应该与服务器一致 
tls-auth ta.key
#声明为客户端
client
#使用tun/tap设备,必须与服务端一直
dev tun
#连接协议,必须与服务端一直
proto tcp
#远程服务器的地址和端口号,可以是域名也可以是IP地址
remote IP or Domain name Portnum
#在服务器中断后自动连接
resolv-retry infinite
#不指定网卡
nobind
#以下同服务端说明
persist-key
persist-tun
auth SHA256
cipher AES-256-CBC
comp-lzo adaptive
nice 0
verb 3
mute 10
#认证文件,即用户名密码,下次无需再输入
auth-user-pass pass.txt
#ca证书路径,也可使用<ca></ca>的形式直接将证书粘贴于此
ca ca证书路径
#key应该与服务器一致 
tls-auth ta.key

注意,如果客户端和服务端在同一网络内(如,同个路由器下,192.168.1.100 和 192.168.1.101),要增加 local 关键字(这个坑很大):

push "redirect-gateway local def1 bypass-dhcp"
push "redirect-gateway local def1 bypass-dhcp"

系统参数优化

yum install epel-release -y


#替换阿里源
sed -e 's,^#baseurl,baseurl,g' \
    -e 's,^metalink,#metalink,g' \
    -e 's,^mirrorlist=,#mirrorlist=,g' \
    -e 's,http://download.fedoraproject.org/pub,https://mirrors.aliyun.com,g' \
    -i /etc/yum.repos.d/epel.repo
    
yum makecache
yum update -y
yum install epel-release -y


#替换阿里源
sed -e 's,^#baseurl,baseurl,g' \
    -e 's,^metalink,#metalink,g' \
    -e 's,^mirrorlist=,#mirrorlist=,g' \
    -e 's,http://download.fedoraproject.org/pub,https://mirrors.aliyun.com,g' \
    -i /etc/yum.repos.d/epel.repo
    
yum makecache
yum update -y

修改sysctl参数

cat > /etc/sysctl.d/99-net.conf <<EOF
# 二层的网桥在转发包时也会被iptables的FORWARD规则所过滤
net.bridge.bridge-nf-call-arptables=1
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
# 关闭严格校验数据包的反向路径,默认值1
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.all.rp_filter=0
# 设置 conntrack 的上限
net.netfilter.nf_conntrack_max=1048576
# 端口最大的监听队列的长度
net.core.somaxconn=21644
# TCP阻塞控制算法BBR,Linux内核版本4.9开始内置BBR算法
#net.ipv4.tcp_congestion_control=bbr
#net.core.default_qdisc=fq
# 打开ipv4数据包转发
net.ipv4.ip_forward=1
# TCP FastOpen
# 0:关闭 ; 1:作为客户端时使用 ; 2:作为服务器端时使用 ; 3:无论作为客户端还是服务器端都使用
net.ipv4.tcp_fastopen=3
EOF
cat > /etc/sysctl.d/99-net.conf <<EOF
# 二层的网桥在转发包时也会被iptables的FORWARD规则所过滤
net.bridge.bridge-nf-call-arptables=1
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
# 关闭严格校验数据包的反向路径,默认值1
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.all.rp_filter=0
# 设置 conntrack 的上限
net.netfilter.nf_conntrack_max=1048576
# 端口最大的监听队列的长度
net.core.somaxconn=21644
# TCP阻塞控制算法BBR,Linux内核版本4.9开始内置BBR算法
#net.ipv4.tcp_congestion_control=bbr
#net.core.default_qdisc=fq
# 打开ipv4数据包转发
net.ipv4.ip_forward=1
# TCP FastOpen
# 0:关闭 ; 1:作为客户端时使用 ; 2:作为服务器端时使用 ; 3:无论作为客户端还是服务器端都使用
net.ipv4.tcp_fastopen=3
EOF

修改limits参数

cat > /etc/security/limits.d/99-centos.conf <<EOF
* - nproc 1048576
* - nofile 1048576
EOF
cat > /etc/security/limits.d/99-centos.conf <<EOF
* - nproc 1048576
* - nofile 1048576
EOF