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

一、场景搭建

在实际场景中,两端分别使用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变化而断网的情况。

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

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值