一、 openvpn server的部署:
部署的方式 略,网上有很多的教程,我使用的是docker的部署方式,以下的shell都基于docker部署的openvpn server
二、 常见问题:
1. 为用户分配固定IP后,连接证书时失败。
错误信息:trun_prop_error:ifconfig addresses ar not in the same /30 subnet (topology net30)

原因分析:从提示上看是IP地址与子网掩码不匹配,查询openvpn的CCD路由配置文件,内容如下:
client
ifconfig-push 10.10.10.3 10.10.10.4
错误原因:为该用户配置了固定的IP,且IP不符合openvpn规则,openvpn每个节点会占用4个IP一个接收数据一个发送数据,还有两个IP用于和网关通信。10.10.10.3就是分配给网关通信的IP不能分配给客户端。能分配给客户端的两个IP一个必须是1+4的倍数,另一个IP是该IP的前一位或者后一位。
解决办法: 改成 ifconfig-push 10.10.10.4 10.10.10.5 或者:ifconfig-push 10.10.10.5 10.10.10.6就可以正确连接了。
2. 证书在windows的客户端连接正常,在Linux客户端上连接失败。
错误信息:
Initialization Sequence Completed
[132.xxx.xxx.xxx] Inactivity timeout (--ping-restart), restarting
SIGUSR1[soft,ping-restart] received, process restarting
TCP/UDP: Preserving recently used remote address: [AF_INET]132.xxx.xxx.xxx:1194
UDP link local: (not bound)
UDP link remote: [AF_INET]132.xxx.xxx.xxx:1194
[132.xxx.xxx.xxx] Peer Connection Initiated with [AF_INET]132.xxx.xxx.xxx:1194
Preserving previous TUN/TAP instance: tun0
Initialization Sequence Completed
错误原因: 从表象上看是初始化成功之后,到服务器连接超时了。在windows上又能正常连接,考虑应该是路由表配置错误,排查所有路由发现一行:push "route 132.xxx.xxx.xxx 255.255.255.255 vpn_gateway",把openvpn server的公网IP添加到路由中了。
解决办法:由于openvpn服务器上还有服务需要访问,不能直接删除该路由策略,故修改ccd文件中的路由到vpn的内网IP。
push "route 172.16.0.3 255.255.255.255 vpn_gateway"
3. 用户A和用户B连接不稳定,经常掉线,但VPN客户端的状态一直是正常的,只是vpn功能无法使用。
错误原因: 掉线的频率不固定,有时候能用很久,有时候会不断掉线。跟踪掉线的重连的时间,发现A和B会相互把对方踢下线,一开始怀疑证书重复了,拉取新证书还是会相互踢下线。后确认是给客户端分配的IP重复了,A的CCD文件是复制的B的配置,分配的固定IP相同了。
解决办法:在CCD配置文件中 ifconfig-push 分配不同的IP后解决。
4. 有一台香港的linux客户端,一开始连接正常,过一段时间后就连接断开,之后一直无法重连。
错误原因: openvpn不能跨境通信,无论是客户端在境外还是服务器在境外都会被屏蔽。
解决办法:换方案吧,非人力可为。
三、 部署openvpn server后一些常用的维护shell
1. 开通新账号
#! /bin/bash
# 判断创建是否跟了证书名称,没有名称就退出。
if [ ! -n "$1" ];then
echo '缺少用户名参数'
else
# 创建服务器端证书
echo 'password' | sudo -S docker run -v /data/openvpn/:/etc/openvpn --rm -i kylemanna/openvpn easyrsa build-client-full "$1" nopass
# 生成客户端的证书,把该证书发送给用户,目录:/data/openvpn/clients/
docker run -v /data/openvpn/:/etc/openvpn --rm kylemanna/openvpn ovpn_getclient "$1" > /data/openvpn/clients/"$1".ovpn
#echo 'ifconfig-push '$theip'
# 写入允许客户访问的服务器的IP,也可以是IP段。
echo ' push "route 10.10.0.0 255.255.0.0 vpn_gateway"' >/data/openvpn/ccd/$1
# 如果要固定IP则添加
# client
# ifconfig-push 10.10.10.77 10.10.10.78 #openvpn需要一个IP发送一个IP接收,所以需要两个IP
fi
2. 删除账号
# delete_user.exp 由于需要自动输入密码,shell不能支持该功能,服务器上需要安装expect。内容如下:
#!/usr/bin/expect -f
if {$argc < 1} {
puts "用户名不能为空。\n例:./delete_user.exp user"
exit 1
}
spawn docker run --rm -i -v /data/openvpn/:/etc/openvpn kylemanna/openvpn ovpn_revokeclient [lindex $argv 0] remove
expect "revocation:" { send "yes\r" }
expect "ca.key:" { send "password\r" }
expect "ca.key:" { send "password\r" }
spawn rm -f ccd/[lindex $argv 0]
spawn rm -f clients/[lindex $argv 0].ovpn
3. 添加路由
#!/bin/bash
# set -x
# 检查参数数量是否等于1
if [ "$#" -ne 2 ]; then
echo -e "请输入IP地址和用户名。示例:\n ./add_ip.sh 192.168.0.5 user\n为所有用户添加用户名输入all"
exit 1
fi
# 工作目录
cd /data/openvpn
# 正则表达式匹配IPv4地址
if [[ "$1" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]]; then
# 分割成四个部分并检查每个部分是否在0到255之间
IFS='.' read -r -a octets <<< "$1"
valid=true
for octet in "${octets[@]}"; do
if ((octet < 0 || octet > 255)); then
valid=false
break
fi
done
if $valid; then
if [ "$2" = "all" ];then
find ccd -type f -exec sh -c 'sed -i "$ a $0" {}' "\ \ push \"route $1 255.255.255.255 vpn_gateway\"" \;
else
echo " push \"route $1 255.255.255.255 vpn_gateway\"" >> ccd/"$2"
fi
else
echo "请输入正确的IP地址。"
exit 2
fi
else
echo "请输入正确的IP地址。"
exit 2
fi
7297

被折叠的 条评论
为什么被折叠?



