V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Awes0me
V2EX  ›  WireGuard

如何让 wireguard 自动重新连接

  •  
  •   Awes0me · 2022-06-30 09:02:56 +08:00 · 6643 次点击
    这是一个创建于 876 天前的主题,其中的信息可能已经有所发展或是发生改变。

    由于家里宽带的 ip 经常变动所以我 endpoint 写的是域名,这就导致了 Windows 和 Android 的客户端连接时间长了就连不上了,他们又不会自动重新链接,需要手动断开一次,很麻烦。

    iOS 上我用的 surge 作为客户端就没问题,请问有没有什么办法可以解决?

    24 条回复    2023-08-23 11:52:34 +08:00
    XiLingHost
        1
    XiLingHost  
       2022-06-30 09:06:23 +08:00   ❤️ 1
    Windows 上我是靠计划任务实现的
    写一个 ps1 脚本
    ```powershell
    $profileName = ""
    $servicesName = "WireGuardTunnel`$$profileName"

    $log = wireguard.exe /dumplog | Select-String -Pattern $profileName | Select-Object -Last 10 | Select-String -Pattern retrying
    if ($log.Length -gt 3) {
    Write-Output $log
    Stop-Service $servicesName
    Start-Sleep -Seconds 5
    Start-Service $servicesName
    }
    ```
    然后让它 5 分钟跑一次
    0o0O0o0O0o
        3
    0o0O0o0O0o  
       2022-06-30 09:08:12 +08:00 via iPhone
    Linux 上配置 PersistentKeepalive 是可以自动重连的
    y830CAa5nink4rUQ
        4
    y830CAa5nink4rUQ  
       2022-06-30 09:13:37 +08:00
    @0o0O0o0O0o 我发现 PersistentKeepalive 无效,我最终的方法是弄个 cronjob 每隔几分钟 ping 一次服务器。
    0o0O0o0O0o
        5
    0o0O0o0O0o  
       2022-06-30 09:15:48 +08:00 via iPhone
    @DrX #4 抱歉我没认真看就回复了,原来是这种场景

    没有这么配合 DDNS 用过,你和#2 应该是正解
    madao2015
        6
    madao2015  
       2022-06-30 09:21:18 +08:00
    只能检测 ddns 变化然后定时重启了
    Awes0me
        7
    Awes0me  
    OP
       2022-06-30 09:49:28 +08:00
    @XiLingHost

    这个确实可以,谢谢

    还有 Android 上的不知道怎么办
    bjfane
        8
    bjfane  
       2022-06-30 09:58:12 +08:00
    PersistentKeepalive 好使 也没断过,想用就用,但是没发现 ip 变化,ip 变化帝都好像是大概两周 1 次,还好,也配置了 ddns ,
    zhixiao
        9
    zhixiao  
       2022-06-30 10:00:05 +08:00
    我这 ip 已经快 1 个月没变了。。。其实 ip 变化的也不频繁,断了手动连一下就是了
    Awes0me
        10
    Awes0me  
    OP
       2022-06-30 10:28:07 +08:00
    @bjfane
    @zhixiao

    下载量大一点就会变得很频繁,一天要变个四五次
    Stendan
        11
    Stendan  
       2022-06-30 10:46:43 +08:00
    ```
    git clone https://git.zx2c4.com/wireguard-tools /usr/share/wireguard-tools
    ```

    ```
    # nano /etc/systemd/system/wireguard_reresolve-dns.service
    [Unit]
    Description=Reresolve DNS of all WireGuard endpoints
    Wants=network-online.target
    After=network-online.target

    [Service]
    Type=oneshot
    ExecStart=/bin/sh -c 'for i in /etc/wireguard/*.conf; do /usr/share/wireguard-tools/contrib/reresolve-dns/reresolve-dns.sh "$i"; done'
    ```

    ```
    # nano /etc/systemd/system/wireguard_reresolve-dns.timer
    [Unit]
    Description=Periodically reresolve DNS of all WireGuard endpoints

    [Timer]
    OnCalendar=*:*:0/30

    [Install]
    WantedBy=timers.target
    ```

    ```
    systemctl enable wireguard_reresolve-dns.service wireguard_reresolve-dns.timer --now
    ```
    Stendan
        12
    Stendan  
       2022-06-30 10:47:55 +08:00
    @Stendan 这个是 Linux 的
    billytom
        13
    billytom  
       2022-06-30 11:19:26 +08:00 via iPhone
    @Stendan 请收下我的膝盖,正要找这个。顺便向大神请教,譬如我有个服务器 A ,装的 WG 算主节点吧,还有公司电脑 1 ,家中 ooenwrt 软路由及下面 nat 的几台设备,能否通过 wg 把他们整成个大内网类似 SD-Wan ,我之前试过了,访问服务器 A 没问题,访问 1 和 2 都没问题,但 2 下的 nat 设备就无法访问
    Stendan
        14
    Stendan  
       2022-06-30 11:30:09 +08:00
    @billytom noob 一枚~~ 你描述的可能是这个问题?
    运行在 NAT 路由器后面的内网服务器,默认是不能被外部网络直接访问的。例如,假设我们有一个 HTTP 服务运行在内网机器 192.168.1.2 ,NAT 路由器的地址是 192.168.1.1 ,并通过另一张有公网 IP 123.123.123.123 的网卡连接到了外部网络。要使得外网机器可以访问 192.168.1.2 的服务,需要执行:
    ```
    # redirect http traffic to 192.168.1.2:
    $> iptables -t nat -A PREROUTING -p tcp -i eth1 --dport 80 -j DNAT --to 192.168.1.2
    ```
    然后,就可以通过公网 IP 123.123.123.123 的 80 端口访问 192.168.1.2 的 HTTP 服务了。
    Stendan
        15
    Stendan  
       2022-06-30 11:30:51 +08:00
    me221
        16
    me221  
       2022-06-30 12:45:28 +08:00
    @billytom 我猜你的问题是: /t/857269

    @Stendan 这个问题应该是在路由器添加端口转发就可以了
    m4d3bug
        17
    m4d3bug  
       2022-06-30 13:06:51 +08:00 via Android
    好奇楼主的为什么下载量大就频繁了,full mesh 组网?
    Awes0me
        18
    Awes0me  
    OP
       2022-06-30 13:32:22 +08:00
    @m4d3bug 应该是电信那边限制了吧
    heiher
        19
    heiher  
       2022-06-30 20:20:56 +08:00
    Linux 上内核实现的 wireguard ,内核 API 只接受 AF_INET 或 AF_INET6 的 endpoint 地址,所以域名是在用户态由 wg 配置工具在配置时刻解析的,那么 DDNS 的话,解析记录更新内核也无法感知。还需要用户态的 daemon 监测并更新配置。
    hanguofu
        20
    hanguofu  
       2022-06-30 22:58:39 +08:00
    顺便问问: 有没有检查本地 IP 地址变化的 LINUX 脚本啊 ? 谢谢~
    billytom
        21
    billytom  
       2022-07-01 00:00:42 +08:00
    @Stendan
    @me221
    感谢两位大神的回答,我这会用 zerotier 了,最近不知道为啥好几个 梅林固件(华硕路由器)都把 wireguard 取消了,但 zerotier 在 koolcenter 应用商城里有,它那个自带 NAT 下级路由,所以就先这样了。但就性能来说,同是 UDP ,这 zerotier 性能一言难尽(虽然它标称直连)
    nxuu
        22
    nxuu  
       2022-12-13 22:06:15 +08:00
    家宽的公网 ip 变化 你在光猫设置 一般是一周变化一次。如果是用路由器 就根据路由器的设置来变化了。不会频繁变化的。
    kenvix
        23
    kenvix  
       2023-08-13 20:54:53 +08:00   ❤️ 1
    补一个 openwrt 的,直接在 luci 面板的计划任务里面添加:
    * * * * * /usr/bin/wireguard_watchdog
    jueti
        24
    jueti  
       2023-08-23 11:52:34 +08:00
    广东电信是两天变一次 IP
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1770 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 16:34 · PVG 00:34 · LAX 08:34 · JFK 11:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.