当前位置:   article > 正文

记录一次WireGuard组网中断的问题_csdn zhangzhibo921

csdn zhangzhibo921

一、场景搭建

在实际场景中,两端分别使用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文件中

  1. #!/bin/bash
  2. #先延迟5秒再执行脚本
  3. sleep 5
  4. # 获取当前日期并格式化为YYYY-MM-DD
  5. current_date=$(date +"%Y-%m-%d")
  6. # 定义日志文件名
  7. log_file="$current_date.log"
  8. # 执行ping命令,每10秒一个ping包,一天有86400秒,这里一天给8660个ping包足够覆盖全天时间,然后将结果追加到以当天日期命名的log日志文件中
  9. 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文件中

  1. #!/bin/bash
  2. . /etc/profile
  3. # 定义日志文件路径
  4. pinglog_dir="/etc/wireguard/pinglog"
  5. checklog_dir="/etc/wireguard/checklog"
  6. checklog="$checklog_dir/check.log"
  7. restartlog="$checklog_dir/restartWG.log"
  8. # 检查日志目录是否存在,如果不存在则创建
  9. mkdir -p "$checklog_dir"
  10. # 初始化行数计数
  11. prev_line_count=0
  12. while true; do
  13. # 获取第一次统计的时间和结果
  14. first_time=$(date +"%Y-%m-%d %H:%M:%S")
  15. first_line_count=$(cat "$pinglog_dir"/* 2>/dev/null | wc -l)
  16. # 等待15秒
  17. sleep 15
  18. # 获取第二次统计的时间和结果
  19. second_time=$(date +"%Y-%m-%d %H:%M:%S")
  20. second_line_count=$(cat "$pinglog_dir"/* 2>/dev/null | wc -l)
  21. # 写入第一次和第二次统计结果到check.log文件
  22. echo "$first_time 第一次统计结果: $first_line_count" >> "$checklog"
  23. echo "$second_time 第二次统计结果: $second_line_count" >> "$checklog"
  24. echo "***********************************************" >> "$checklog"
  25. # 检查是否有增加的行数
  26. if [ "$second_line_count" -gt "$first_line_count" ]; then
  27. # 退出脚本
  28. exit 0
  29. else
  30. # 第二次统计行数没有增加,等待15秒再次统计
  31. sleep 15
  32. # 获取第三次统计的时间和结果
  33. third_time=$(date +"%Y-%m-%d %H:%M:%S")
  34. third_line_count=$(cat "$pinglog_dir"/* 2>/dev/null | wc -l)
  35. # 写入第三次统计结果到check.log文件
  36. echo "$third_time 第三次统计结果: $third_line_count" >> "$checklog"
  37. echo "--------------------------------------------------------------------------------" >> "$checklog"
  38. # 检查是否有增加的行数
  39. if [ "$third_line_count" -gt "$second_line_count" ]; then
  40. # 行数增加就退出脚本
  41. exit 0
  42. else
  43. # 如果行数仍然没有增加,执行重启命令
  44. echo "回包数30秒未增加,执行重启wg0操作" >> "$checklog"
  45. echo "--------------------------------------------------------------------------------" >> "$checklog"
  46. /usr/bin/wg-quick down /etc/wireguard/wg0.conf
  47. /usr/bin/wg-quick up /etc/wireguard/wg0.conf
  48. # 退出脚本
  49. exit 0
  50. fi
  51. fi
  52. 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日志文件中

  1. #!/bin/bash
  2. # 获取公网IP
  3. ip_pub1=$(curl -sS ipinfo.io/ip)
  4. ip_pub2=$(curl -sS ifconfig.me)
  5. ip_pub3=$(curl -sS icanhazip.com)
  6. # 获取当前时间
  7. datetime=$(date +"%Y-%m-%d %H:%M:%S")
  8. # 组合信息
  9. info1="ipinfo.io/ip获取到的公网IP为: $ip_pub1, 获取时间为: $datetime"
  10. info2="ifconfig.me获取到的公网IP为: $ip_pub2, 获取时间为: $datetime"
  11. info3="icanhazip.com获取到的公网IP为: $ip_pub3, 获取时间为: $datetime"
  12. # 追加到文件中
  13. echo $info1 >> /etc/wireguard/checklog/PubIP.log
  14. echo $info2 >> /etc/wireguard/checklog/PubIP.log
  15. echo $info3 >> /etc/wireguard/checklog/PubIP.log
  16. echo "*************************************" >> /etc/wireguard/checklog/PubIP.log
  17. # 打印当前信息
  18. #echo $info

再做个定时任务,每十分钟查看一次公网IP,使用crontab -e命令:

*/10 * * * * sh /etc/wireguard/pubip.sh

OK,问题得到验证,公网IP变化后,pinglog丢包的时间差不多能够吻合。

四、结论

在生产环境中,由于公网IP的稀缺性,导致只能由非固定公网IP的一端,主动去连接有固定公网IP的一端,因此,非固定公网IP的一端,会经常因为公网IP变化导致wireguard的连接中断,而wireguard或许是因为缺少这种自检测机制,不会重连,因此会导致真正使用wireguard组网的时候,会出现公网IP变化而断网的情况。

这个小问题主要是一个简单的脚本实现,比较鸡肋,仅能解决单一问题,在实际生产环境中,可能还会出现其他的不可预知的问题。

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号