赞
踩
在实际场景中,两端分别使用CentOS搭建了WireGuard进行组网,两边的网段和配置文件如下:
配置好后,在核心路由上,将对端网段的下一跳,指向本地的Wireguard主机即可。
问题描述:
当配置调好后,双边都可以互相访问。
实际运行过程中,发现了用户用着用着就会断网,一般来说,重启WG网卡可以恢复正常。
怀疑点分析:
(1)是否是因为PersistentKeepalive参数值设置导致的这个问题。
但是无论怎么调整这个参数,两端都设置了,从0-300的值都试过,这边仍然会经常断网;
(2)经过各种排查无果,怀疑的点转移到网络中断上,是否是因为某种原因,导致网络中断后,wg0网卡不会自动重连导致的。
而网络中断有几种可能原因,因为非固定IP的一端,会不定期变动公网IP,如果变动后,wg0网卡不重连,那么自然就断网了。
思路
(1)主要是要能够感知网络是否中断
(2)网络中断后,是否可以自动发起重连
(3)找出网络中断的原因
解决方法
(1)写一个脚本,定期的发包给对端wg0的网卡地址,如果中断的话就很快能知道
(2)当发现中断后,支持wg0网卡重启的操作,让其自动重连
(3)再写一个脚本,定期去看看自己的公网IP是否变化,并且通过查看公网IP变化的时间,对比网络中断的时间是否一致
具体操作
由于不会编程,那么就用bash脚本来实现吧,使用ping命令即可,每10秒ping一个包的方式。由于centos里,ping如果不通的话,不会显示回显信息,那么可以把ping的结果追加到一个log文件内,这样只需要定期读取log文件的行数,就知道是否断网了,那么这个脚本实现的方式可以是这样:
(1)先做一个crontab定时任务,每天执行一次ping操作
将下面的脚本写到/etc/wireguard/keepalive.sh文件中
- #!/bin/bash
- #先延迟5秒再执行脚本
- sleep 5
-
- # 获取当前日期并格式化为YYYY-MM-DD
- current_date=$(date +"%Y-%m-%d")
-
- # 定义日志文件名
- log_file="$current_date.log"
-
- # 执行ping命令,每10秒一个ping包,一天有86400秒,这里一天给8660个ping包足够覆盖全天时间,然后将结果追加到以当天日期命名的log日志文件中
- ping 192.168.0.1 -i 10 -c 8660 >> "/etc/wireguard/pinglog/$log_file"
做个定时任务,每天零点开始执行这个脚本,那么每天执行都会有一个log日志文件,来记录ping的结果,按照脚本设计的内容,这里的log日志文件会写到/etc/wireguard/pinglog目录下。
使用crontab -e命令
0 0 * * * sh /etc/wireguard/keepalive.sh &
(2)再做一个检查pinglog目录内的日志文件总行数的脚本,如果总行数一直增加,那么代表ping是正常的,如果断网了,那么代表ping不通啦,如果连续好几个包都ping不通的话,就重启wg0网卡。
把下面的脚本内容写到/etc/wireguard/checkping.sh文件中
- #!/bin/bash
- . /etc/profile
- # 定义日志文件路径
- pinglog_dir="/etc/wireguard/pinglog"
- checklog_dir="/etc/wireguard/checklog"
- checklog="$checklog_dir/check.log"
- restartlog="$checklog_dir/restartWG.log"
-
- # 检查日志目录是否存在,如果不存在则创建
- mkdir -p "$checklog_dir"
-
- # 初始化行数计数
- prev_line_count=0
-
- while true; do
- # 获取第一次统计的时间和结果
- first_time=$(date +"%Y-%m-%d %H:%M:%S")
- first_line_count=$(cat "$pinglog_dir"/* 2>/dev/null | wc -l)
-
- # 等待15秒
- sleep 15
-
- # 获取第二次统计的时间和结果
- second_time=$(date +"%Y-%m-%d %H:%M:%S")
- second_line_count=$(cat "$pinglog_dir"/* 2>/dev/null | wc -l)
-
- # 写入第一次和第二次统计结果到check.log文件
- echo "$first_time 第一次统计结果: $first_line_count" >> "$checklog"
- echo "$second_time 第二次统计结果: $second_line_count" >> "$checklog"
- echo "***********************************************" >> "$checklog"
-
- # 检查是否有增加的行数
- if [ "$second_line_count" -gt "$first_line_count" ]; then
- # 退出脚本
- exit 0
- else
- # 第二次统计行数没有增加,等待15秒再次统计
- sleep 15
-
- # 获取第三次统计的时间和结果
- third_time=$(date +"%Y-%m-%d %H:%M:%S")
- third_line_count=$(cat "$pinglog_dir"/* 2>/dev/null | wc -l)
-
- # 写入第三次统计结果到check.log文件
- echo "$third_time 第三次统计结果: $third_line_count" >> "$checklog"
- echo "--------------------------------------------------------------------------------" >> "$checklog"
-
- # 检查是否有增加的行数
- if [ "$third_line_count" -gt "$second_line_count" ]; then
- # 行数增加就退出脚本
- exit 0
- else
- # 如果行数仍然没有增加,执行重启命令
- echo "回包数30秒未增加,执行重启wg0操作" >> "$checklog"
- echo "--------------------------------------------------------------------------------" >> "$checklog"
- /usr/bin/wg-quick down /etc/wireguard/wg0.conf
- /usr/bin/wg-quick up /etc/wireguard/wg0.conf
-
- # 退出脚本
- exit 0
- fi
- fi
- done
再做个定时任务,每5分钟执行一次这个脚本,用来检查pinglog目录下,log日志的行数是否增加.
使用crontab -e命令:
*/5 * * * * sh /etc/wireguard/checkping.sh
OK,这么做以后,发现断网问题解决了。看起来确实是因为某种原因断网后,wg0网卡没有重连导致的,现在由于能够感知断网问题重连,至少用户没有反馈断网问题了。
(3)怀疑是由于公网IP变化导致的断网,再写个脚本验证一下
把下面的内容写到/etc/wireguard/pubip.sh文件中,公网IP的记录信息会在/etc/wireguard/checklog/PubIP.log日志文件中
- #!/bin/bash
- # 获取公网IP
- ip_pub1=$(curl -sS ipinfo.io/ip)
- ip_pub2=$(curl -sS ifconfig.me)
- ip_pub3=$(curl -sS icanhazip.com)
-
- # 获取当前时间
- datetime=$(date +"%Y-%m-%d %H:%M:%S")
- # 组合信息
- info1="ipinfo.io/ip获取到的公网IP为: $ip_pub1, 获取时间为: $datetime"
- info2="ifconfig.me获取到的公网IP为: $ip_pub2, 获取时间为: $datetime"
- info3="icanhazip.com获取到的公网IP为: $ip_pub3, 获取时间为: $datetime"
-
- # 追加到文件中
- echo $info1 >> /etc/wireguard/checklog/PubIP.log
- echo $info2 >> /etc/wireguard/checklog/PubIP.log
- echo $info3 >> /etc/wireguard/checklog/PubIP.log
- echo "*************************************" >> /etc/wireguard/checklog/PubIP.log
- # 打印当前信息
- #echo $info
再做个定时任务,每十分钟查看一次公网IP,使用crontab -e命令:
*/10 * * * * sh /etc/wireguard/pubip.sh
OK,问题得到验证,公网IP变化后,pinglog丢包的时间差不多能够吻合。
在生产环境中,由于公网IP的稀缺性,导致只能由非固定公网IP的一端,主动去连接有固定公网IP的一端,因此,非固定公网IP的一端,会经常因为公网IP变化导致wireguard的连接中断,而wireguard或许是因为缺少这种自检测机制,不会重连,因此会导致真正使用wireguard组网的时候,会出现公网IP变化而断网的情况。
这个小问题主要是一个简单的脚本实现,比较鸡肋,仅能解决单一问题,在实际生产环境中,可能还会出现其他的不可预知的问题。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。