惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Martin Fowler
Martin Fowler
WordPress大学
WordPress大学
月光博客
月光博客
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
大猫的无限游戏
大猫的无限游戏
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 聂微东
Apple Machine Learning Research
Apple Machine Learning Research
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
雷峰网
雷峰网
小众软件
小众软件
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 叶小钗
美团技术团队
宝玉的分享
宝玉的分享
Hugging Face - Blog
Hugging Face - Blog
阮一峰的网络日志
阮一峰的网络日志
A
About on SuperTechFans
Jina AI
Jina AI
D
Docker
Last Week in AI
Last Week in AI
MongoDB | Blog
MongoDB | Blog
Stack Overflow Blog
Stack Overflow Blog
Microsoft Azure Blog
Microsoft Azure Blog

方永、南天紫雲

linux透明代理 技术的边界 停机问题通俗说明 Rust与oracle、redis集群的纠结 学习能力的增长 微信调试的原语 mac外接移动硬盘安装ArchLinux linux的死机问题 linux下全键盘操作 漂亮又好用的bspwm linux本机透明代理 ssh、mosh、autossh linux不能待机又一例 从WordPress切换到Hugo 折腾电脑开机 linux系统QQ新思路 Arch Linux的字体渲染 svn管理之submin OpenWrt自动fucking墙記錄 二维码(qrcode)名片的一些事儿 用lua nginx module搭建一个二维码(qr code)生成器 CentOS 7 安裝註記 php程序連接MySQL时只能127.0.0.1而localhost無法連接的問題 ThinkPad之FAN_ERROR、hi fi聲卡 jetty多端口部署 OpenWrt簡單暴力限網 linux中cron之PATH变量 OpenWrt的WDS無線橋接模式 再敘OpenWrt下的rtl8187無線中繼 sed之模擬tail
WireGuard使用记录
zola · 2022-03-27 · via 方永、南天紫雲

WireGuard 实现简洁,性能、安全性高,最近用 WireGuard 组建了一个 full mesh 的网络, 故记录之,以备忘也。

安装

如果内核版本不低于 5.6 ,那么 WireGuard 已经集成到了内核,只需安装其配置工具 wireguard-tools即可; 若内核版本低于5.6,建议安装用户空间的实现 boringtun 一个 boringtun 的 systemd service 文件:

  [Unit]
  Description=wireguard with boringtun
  After=network.target
  Wants=network.target

  [Service]
  Type=oneshot
  RemainAfterExit=yes
  Environment=WG_QUICK_USERSPACE_IMPLEMENTATION=boringtun WG_SUDO=1
  ExecStart=/usr/bin/wg-quick up wg0
  ExecStop=/usr/bin/wg-quick down wg0
  ExecReload=/bin/bash -c 'exec /usr/bin/wg syncconf wg0 <(exec /usr/bin/wg-quick strip wg0)'
  Environment=WG_ENDPOINT_RESOLUTION_RETRIES=infinity

  [Install]
  WantedBy=multi-user.target

配置

现在有3台机器,如下表:

序号名称网络情况WireGuard使用的IP
1home中国移动宽带,NAT 后面,无公网IP172.16.0.3
2office中国电信宽带,NAT 后面,无公网IP172.16.0.2
3vps国外网络,有公网IP(1.2.3.4)172.16.0.1

要实现两两互联,有如下配置:

home:

[Interface]
PrivateKey = <...>
Address = 172.16.0.3/24


# vps
[Peer]
PublicKey = <...>
Endpoint = 1.2.3.4:51820
AllowedIPs = 172.16.0.1/32

# office
[Peer]
PublicKey = <...>
# 192.168.100.0/24,该网段是 office 所在机器的内网网段,添加的目的是允许 home 访问该网段
AllowedIPs = 172.16.0.2/32,192.168.100.0/24
PersistentKeepalive = 25

office:

[Interface]
PrivateKey = <...>
Address = 172.16.0.2/24

# vps
[Peer]
PublicKey = <...>
Endpoint = 1.2.3.4:51820
AllowedIPs = 172.16.0.1/32

# home
[Peer]
PublicKey = <...>
AllowedIPs = 172.16.0.3/32
PersistentKeepalive = 25

vps:

[Interface]
Address = 172.16.0.1/24
# 可选
ListenPort = 51820
PrivateKey = <...>
# 可选,默认不用配置
MTU = 1300

# office
[Peer]
PublicKey = <...>
AllowedIPs = 172.29.254.2/32
PersistentKeepalive = 25

# home
[Peer]
PublicKey = <...>
AllowedIPs = 172.29.254.3/32
PersistentKeepalive = 25

公钥/私钥生成:

wg genkey | tee privatekey | wg pubkey > publickey

执行 wg-quick up wg0 即可使配置生效。

当然,配置文件里不用添加任何 Peerwg-quick up wg0 也会执行成功,可以通过 wg set ... 动态去添加。

WireGuard 默认是静默模式,配置生效后,连接并没有建立,在发送数据时才会完成握手,建立连接; 而添加 PersistentKeepalive 选项的原因也在于此,在一个时间间隔内发一个心跳数据,防止 NAT 建立的映射因一段时间内没有数据传输而收回。

vps 上 执行 wg show,可以看到 WireGuard 工作状态。

然后,在 homeoffice 上执行 ping 172.16.0.1,可以看到网络是连通的, 再在 vps 上 执行 wg show,会看到 peer 已更新,多了 endpoint 等几项, 分别记下 home peer 及 office peer 的 endpoint, 并在 homevps 执行 wg set wg0 peer <...> endpoint <...> 命令更新对应的 endpoint, 比如在 home 上执行时, wg set ... 这里的 endpoint 对应的就是 office 的。

home 上执行 ping 172.16.0.2,会看到 homeoffice 机器的网络已直连成功。 此时,执行 ping 192.168.100.1,网络不通,在 office 上执行如下命令,开启IP转发:

sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

但是最好在 office的配置中加入如下选项,在 WireGuard 配置更新时一并生效:

[Interface]
PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

总结

  1. 若要和某个 Peer 直连,必要条件是添加该 Peer 的配置
  2. 某个 PeerEndpoint 有变更时,需要更新所有配置了该 Peer 的配置

网上现有的一些工具,比如 netmaker , tailscale 等 ,提供了友好UI界面,方便管理网络,并实现了一个 “控制面(control plane)”,在配置变更时,及时地对受影响的 peer 的配置进行更新。