使用wireguard进行组网

环境

  • 位置一: Openwrt 动态公网, 已配置DDNS
  • 位置二: ROS 移动大内网, 有IPv6
  • 位置三: Windows笔记本
  • wg虚拟网络: 10.12.0.0/24

位置一配置流程

  • 安装wireguard包, 重启Openwrt

  • 新建接口(wg0)

    • 协议选择WireGuard VPN
    • 点击生成新的密钥对, 并且记下公钥
    • 端口填写一个高位端口
    • IP这里设置了.1
  • 防火墙直接加入到lan区域即可

  • 保存并应用

位置二配置

  • Winbox首页点击WireGuard, 添加一个接口

    • 端口也是随意填写一个, 反正正常没有设备会连接到这个节点, 也连不上
    • 公私钥如果空着点击Apply后会自动生成, 也可以事先生成好
  • Peer配置

    • 公钥添加上面位置一的公钥
    • 端口添加位置一的端口
    • Allowed Address填写位置一的Wireguard的虚拟IP
  • IP-Addresses 配置

  • IP->Firewall->NAT 增加一条伪装

位置三配置

  • 安装WireGuard安装包

  • 添加空隧道, 填入下面的配置

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    
    [Interface]
    PrivateKey = 本机的私钥
    Address = 10.12.0.3/24
    
    [Peer]
    PublicKey = 位置一的公钥
    AllowedIPs = 10.12.0.1/32, 10.11.0.0/24
    Endpoint = ddns域名:位置一的端口
    PersistentKeepalive = 30
    
    [Peer]
    PublicKey = 位置二的公钥
    AllowedIPs = 10.12.0.2/32, 10.11.0.0/24
    PersistentKeepalive = 30
    
  • 启动即可

检查连接

由于Openwrt上可以查看各个节点的连接情况, 状态-WireGuard

包装左边两个小电脑都亮起即表示连接成功

AllowIPs说明

网上一个说明很不错, 以第一人称视角来看.

例如, 我现在是10.12.0.3/32这台windows机器, 对我来说, 10.12.0.3/32 这台可能会以什么IP访问我.

  • 10.12.0.3/32 它自己自身的IP
  • 10.11.0.0/24 它所在局域网的网段

而由于我的网络环境下只有一台有公网的机器, 那么10.12.0.3和10.12.0.2之间如果要通讯, 有两种方式

  • .3通过IPv6连接到.2
  • .3通过.1中转到.2

~~方式一由于ROS上不好搞IPv6的DDNS, 每次连接会比较麻烦. ~~

采用方式二, 需要在.3的对端配置中给 .1这个Peer的AllowIP添加.2的局域网IP段. 同时.1的对端配置中也要把.2的局域网网段配置进去(即使.1不需要访问.2的局域网)

ROS配置IPv6 DDNS

让ROS上的wireguard可以被连接, 这样就可以少一层中转

ddns中转服务

参考 https://github.com/lsprain/Aliddns-Ros, 进行轻微修改, 加入AAAA记录的支持

最终是这样的请求地址

1
https://ros.linx.run/aliddns?AccessKeyID=&AccessKeySecret=&DomainName=&RR=&IpAddr=&rt=6

ROS脚本

这里脚本也经过修改, 原版是从pppoe接口中获取地址, 原版只能获取ipv4地址, ipv6需要从ipv6下的Address里获取

1
2
3
4
# 从ipv6的地址中获取br-lan的地址
:local IpAddr [/ipv6 address get [find interface=br-lan advertise=yes] address]
# 截取/前面的内容
:set IpAddr [:pick $IpAddr 0 [:find $IpAddr "/"]] 
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#xxxx处替换为需要解析的域名AccessKeyID  
:local AccessKeyID "xxx"  
#xxxx处替换为需要解析的域名AccessKeySecret  
:local AccessKeySecret "xxx"   
#xxxx处替换为需要解析的域名,如baidu.com  
:local DomainName "linx.run"  
#xxxx处替换为需要解析的子域名,如home.baidu.com只需要填home即可   
:local RR "ros6"   
#xxxx处替换为网络出口名称,如pppoe-out1  
:local pppoe "pppoe-cm"   

:local IpAddr [/ipv6 address get [find interface=br-lan advertise=yes] address]
:set IpAddr [:pick $IpAddr 0 [:find $IpAddr "/"]]  
:log warning "当前公网IPv6地址:$IpAddr"  

:local aliddns "https://ros.linx.run/aliddns?AccessKeyID=$AccessKeyID&AccessKeySecret=$AccessKeySecret&RR=$RR&DomainName=$DomainName&rt=6&IpAddr=$IpAddr"  

:local result [/tool fetch url=("$aliddns") mode=http http-method=get as-value output=user];  
#:log warning $result  

:if ($result->"status" = "finished") do={  

:if ($result->"data" = "loginerr") do={  
:log warning "阿里云登录失败!!";  
}  
:if ($result->"data" = "iperr") do={  
:log warning "修改解析地址信息失败!";  
}  
:if ($result->"data" = "ip") do={  
:log warning "修改解析地址信息成功!";  
}  
:if ($result->"data" = "domainerr") do={  
:log warning "添加新域名解析失败!";  
}  
:if ($result->"data" = "domain") do={  
:log warning "添加新域名解析成功!";  
}  
:if ($result->"data" = "same") do={  
:log warning "当前配置解析地址与公网IP相同,不需要修改!";  
}  
:if ($result->"data" = "ip") do={  
:log warning "更新IP信息成功!";  
:log warning "$IpAddr!";  
}  
:if ($result->"data" = "domain") do={  
:log warning "增加域名信息成功!";  
}  
}  
}  

先放到System->Scripts中进行测试, 如果能正确更新dns记录, 再放到System->Scheduler中. 时间间隔则需要进行观察, 看看pppoe多久会自动重新获取地址.

Licensed under CC BY-NC-SA 4.0
记录平时瞎折腾遇到的各种问题, 方便查找
使用 Hugo 构建
主题 Stack 3.29.0Jimmy 设计