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

推荐订阅源

Cyberwarzone
Cyberwarzone
V
Vulnerabilities – Threatpost
T
Tenable Blog
Forbes - Security
Forbes - Security
Simon Willison's Weblog
Simon Willison's Weblog
AWS News Blog
AWS News Blog
G
GRAHAM CLULEY
Know Your Adversary
Know Your Adversary
S
Securelist
C
Cybersecurity and Infrastructure Security Agency CISA
Project Zero
Project Zero
C
CXSECURITY Database RSS Feed - CXSecurity.com
V
Visual Studio Blog
WordPress大学
WordPress大学
Latest news
Latest news
K
Kaspersky official blog
T
Tailwind CSS Blog
T
Threat Research - Cisco Blogs
B
Blog RSS Feed
C
Cisco Blogs
博客园 - 聂微东
Martin Fowler
Martin Fowler
T
The Blog of Author Tim Ferriss
小众软件
小众软件
L
LangChain Blog
阮一峰的网络日志
阮一峰的网络日志
L
LINUX DO - 热门话题
Stack Overflow Blog
Stack Overflow Blog
罗磊的独立博客
P
Proofpoint News Feed
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
P
Privacy International News Feed
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
C
CERT Recently Published Vulnerability Notes
Cisco Talos Blog
Cisco Talos Blog
S
SegmentFault 最新的问题
Security Latest
Security Latest
Y
Y Combinator Blog
爱范儿
爱范儿
aimingoo的专栏
aimingoo的专栏
P
Privacy & Cybersecurity Law Blog
L
LINUX DO - 最新话题
月光博客
月光博客
The GitHub Blog
The GitHub Blog
博客园 - 三生石上(FineUI控件)
S
Security Affairs
P
Proofpoint News Feed
D
DataBreaches.Net
有赞技术团队
有赞技术团队
云风的 BLOG
云风的 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 終端進化之二零一三 linux下的郵件服務器:postfix_dovecot_roundcube 一次性密碼/動態口令卡原理 xl2tp之VPN靜態地址分配 rtl2838U2832试用记 linux中pptp协议VPN搭建 glances监控工具安装 CentOS6.4硬盘安装 Debian Wheezy硬盤/U盤安裝小記 Kirby小試 zsh shell怎么打开常用的目录? OpenWrt SSH免密码使用密钥登录 linux中的vsftpd的匿名(anonymous)用户配置 無光驅無USB無軟驅,怎麼修復硬盤MBR? 那些個人網站 linuxFreeBSD下的dnspod动态域名客户端 Windows系统盘的32K之殇 一枚Chrome插件引起的大量磁盤IO問題 用批處理切換網卡的IP(適用Win7、Win8) Windows中的DHCP服务器 Win8啓動時出現“您的電腦需要修復”問題的解決辦法 Windows8睡眠(待机)模式异常处理 最强大好用而又小巧的计算器 Windows8運行不能保存歷史命令 Win8下的红警2尤里复仇 为cmd添加readline,如Bash Shell般使用cmd 手动添加修改win8 win+x菜单 Win8運行卸載程序時提示2503之解決一法 烽火HG110提权一法 缓解眼疲劳有效的办法 mintty乱码解决办法 糟糠美妾 免费易用的Win8 ArchLinux的類box環境音量調節二三事 使用OpenWrt与curl挂QQ OpenWrt的安全 OpenWrt BCM63xx rtl8187使用注意事项 Arch Linux之systmed使用简介 Archlinux 2012.07.15之后发布的镜像新手安装完全向导 FreeBSD 9.0 安装简记 记一由FreeBSD引发的午夜惊魂 Jekyll or handmade wi-fi无线破解过程与原理简要介绍 修复QQ影音异常卸载后的文件关联 吐槽一下000webhost 为OpenWrt的luci Web界面加速 最小的sed for Windows linux的磁盘自动挂载 OpenWrt中crontab -e的使用 sddns(dnspod client for OpenWrt)使用说明 OpenWrt中vsftp添加新用户 php+markdown写博客 linux arp防火墙之p2p终结者 墙外的世界很精彩 OpenWrt使用dnspod的动态域名解析(ddns)功能 OpenWrt架设nginx php网站 openwrt架设uhttpd+php+sqlite网站 vim自动跳到上次离开的光标位置 OpenWrt无线中继配置文件 修行八支 漫步者R201T打摩升级改造 阿里(Ali)3328系dvb接收机软件升级方法 db120刷OpenWrt固件并使用ppp方式ADSL拨号 移动短信助手 chrome tips一则 cdate,显示中国传统农历日期 更改硬盘模式为AHCI后Windows及linux的调整 使用grub2加载软盘和光盘镜像 电脑用数据线连接手机上网 电脑通过蓝牙连接手机GPRS上网
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 的配置进行更新。