<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Wireguard on H⁺ + OH⁻ → H₂O</title><link>https://naizi.ch/tags/wireguard/</link><description>Recent content in Wireguard on H⁺ + OH⁻ → H₂O</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Tue, 12 Dec 2023 00:00:00 +0000</lastBuildDate><atom:link href="https://naizi.ch/tags/wireguard/atom.xml" rel="self" type="application/rss+xml"/><item><title>OpenWrt 使用 WireGuard 组网及局域网文件共享设置</title><link>https://naizi.ch/2023/12/12/openwrt-%E4%BD%BF%E7%94%A8-wireguard-%E7%BB%84%E7%BD%91%E5%8F%8A%E5%B1%80%E5%9F%9F%E7%BD%91%E6%96%87%E4%BB%B6%E5%85%B1%E4%BA%AB%E8%AE%BE%E7%BD%AE/</link><pubDate>Tue, 12 Dec 2023 00:00:00 +0000</pubDate><guid>https://naizi.ch/2023/12/12/openwrt-%E4%BD%BF%E7%94%A8-wireguard-%E7%BB%84%E7%BD%91%E5%8F%8A%E5%B1%80%E5%9F%9F%E7%BD%91%E6%96%87%E4%BB%B6%E5%85%B1%E4%BA%AB%E8%AE%BE%E7%BD%AE/</guid><description>&lt;p>一直以来都是依靠群友/同事的帮助来配置当甩手掌柜，最近路由升级 OpenClash 又炸了，加上之前神秘的 DNS 转发失败的问题，决定从零开始自己重新配置一遍软路由，实践出真知。&lt;/p>
&lt;h2 id="前期准备">前期准备&lt;/h2>
&lt;p>硬件上用的是两台 FriendlyARM NanoPi R2S，闲鱼现在 200 出头就可以收到，主要是体积小巧，本来的需求也只是跑个 OpenWrt + WireGuard 组网，性能完全够用。家里的网络也没有千兆，不担心跑不满带宽的问题。&lt;/p>
&lt;p>因为是要打算跟公司里的设备组网，显然公司是不会给你 IP / 端口转发的，所以家里的宽带需要申请公网 IP + 桥接。之前买了台小米的 Redmi AX6S 用作家里的软路由，但刷机不如 R2S 方便，就刷回原厂用作 AP 了。&lt;/p>
&lt;p>考虑到公网 IP 拨号可能重新分配，最好还是绑定个域名做 DDNS，便于之后 WireGuard 通信，避免意外断电重启找不到 IP。&lt;/p>
&lt;!-- raw HTML omitted -->
&lt;h2 id="openwrt-配置">OpenWrt 配置&lt;/h2>
&lt;p>因为 R2S 已经在 OpenWrt 的支持列表里了，这里简单从&lt;a class="link" href="https://firmware-selector.openwrt.org/" target="_blank" rel="noopener"
>官网&lt;/a>下一个镜像，目前的版本是 23.05.2。&lt;/p>
&lt;p>镜像选择了 SQUASHFS 格式，主要是为了方便重置配置备份升级。但缺点是默认的分区大小可能有些局促，需要进行一下扩容。&lt;/p>
&lt;p>刷写完毕启动后，SSH 进入 OpenWrt，执行以下命令：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 更换为国内镜像源加快下载&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sed -i &lt;span style="color:#e6db74">&amp;#39;s/downloads.openwrt.org/mirrors.ustc.edu.cn\/openwrt/g&amp;#39;&lt;/span> /etc/opkg/distfeeds.conf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>opkg update
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>opkg install cfdisk losetup f2fs-tools
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># https://github.com/anaelorlinski/OpenWrt-NanoPi-R2S-R4S-Builds/blob/main/docs/resize-f2fs.md&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cfdisk /dev/mmcblk0
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 选择第二个分区，扩容，写入，退出&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>LOOP&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;span style="color:#66d9ef">$(&lt;/span>losetup -n -O NAME | sort | sed -n -e &lt;span style="color:#e6db74">&amp;#34;1p&amp;#34;&lt;/span>&lt;span style="color:#66d9ef">)&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ROOT&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;span style="color:#66d9ef">$(&lt;/span>losetup -n -O BACK-FILE &lt;span style="color:#e6db74">${&lt;/span>LOOP&lt;span style="color:#e6db74">}&lt;/span> | sed -e &lt;span style="color:#e6db74">&amp;#34;s|^|/dev|&amp;#34;&lt;/span>&lt;span style="color:#66d9ef">)&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>OFFS&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;span style="color:#66d9ef">$(&lt;/span>losetup -n -O OFFSET &lt;span style="color:#e6db74">${&lt;/span>LOOP&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#66d9ef">)&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>LOOP&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;span style="color:#66d9ef">$(&lt;/span>losetup -f&lt;span style="color:#66d9ef">)&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>losetup -o &lt;span style="color:#e6db74">${&lt;/span>OFFS&lt;span style="color:#e6db74">}&lt;/span> &lt;span style="color:#e6db74">${&lt;/span>LOOP&lt;span style="color:#e6db74">}&lt;/span> &lt;span style="color:#e6db74">${&lt;/span>ROOT&lt;span style="color:#e6db74">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>fsck.f2fs -f &lt;span style="color:#e6db74">${&lt;/span>LOOP&lt;span style="color:#e6db74">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>mount &lt;span style="color:#e6db74">${&lt;/span>LOOP&lt;span style="color:#e6db74">}&lt;/span> /mnt
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>umount &lt;span style="color:#e6db74">${&lt;/span>LOOP&lt;span style="color:#e6db74">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>resize.f2fs &lt;span style="color:#e6db74">${&lt;/span>LOOP&lt;span style="color:#e6db74">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>reboot
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>重启后扩容完成，可以继续 &lt;code>opkg install&lt;/code> 需要的包了。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 因为还是有后期加上 OpenClash 的打算，先替换 dnsmasq&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>opkg remove dnsmasq &lt;span style="color:#f92672">&amp;amp;&amp;amp;&lt;/span> opkg install dnsmasq-full
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># OpenClash 的依赖包&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>opkg install coreutils-nohup bash curl ca-certificates ipset ip-full libcap libcap-bin ruby ruby-yaml kmod-tun kmod-inet-diag unzip kmod-nft-tproxy luci-compat luci luci-base
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># WireGuard + 自己需要的包&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>opkg install luci-app-wireguard nano-full bind-dig
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>两边的 OpenWrt 要分配不同的网段，访问 OpenWrt 页面（默认地址 192.168.1.1）：&lt;/p>
&lt;p>Network -&amp;gt; Interfaces -&amp;gt; Lan -&amp;gt; Edit -&amp;gt; IPv4 address&lt;/p>
&lt;p>这里举例家里设备为 &lt;code>192.168.10.1/24&lt;/code> 公司为 &lt;code>192.168.20.1/24&lt;/code>。&lt;/p>
&lt;h2 id="wireguard">WireGuard&lt;/h2>
&lt;p>前述已经安装好了 WireGuard，配置时最好能够同时访问两台设备，操作都是相同的。&lt;/p>
&lt;h3 id="添加新接口">添加新接口&lt;/h3>
&lt;p>Network -&amp;gt; Interfaces -&amp;gt; Add new interface&amp;hellip;&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>Name: WireGuard
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Protocol: WireGuard VPN
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="设置新接口">设置新接口&lt;/h3>
&lt;p>Network -&amp;gt; Interfaces -&amp;gt; WireGuard -&amp;gt; Edit -&amp;gt; General Settings&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>Listen Port: 50251
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>IP Addresses: 192.168.192.10
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这里的 IP 地址是 WireGuard 识别自身设备的地址，给两个设备设置在同一个子网 (192.168.192.0) 里就行，比如另一台设备设置为 &lt;code>192.168.192.20&lt;/code>，末位数和 LAN 的地址数字相同便于自己识别。&lt;/p>
&lt;p>点击 &lt;code>Generate new key pair&lt;/code>，复制生成的 &lt;code>Public Key&lt;/code> 记录下来，之后要用。&lt;/p>
&lt;p>转到 &lt;code>Firewall Settings&lt;/code>，选择 &lt;code>LAN&lt;/code>。&lt;/p>
&lt;p>然后再转到 &lt;code>Peers&lt;/code> 点击 &lt;code>Add peer&lt;/code> 添加对端设备。&lt;/p>
&lt;p>在 &lt;code>192.168.10.1&lt;/code> 上配置&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>Public Key: 192.168.20.1 的 `Public Key`
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Allowed IPs: 192.168.192.20/24, 192.168.20.1/24
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Route Allowed IPs: ☑
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Endpoint Host: 留空
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Endpoint Port: 留空
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Persistent Keep Alive: 25
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>在 &lt;code>192.168.20.1&lt;/code> 上配置&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>Public Key: 192.168.10.1 的 `Public Key`
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Allowed IPs: 192.168.192.10/24, 192.168.10.1/24
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Route Allowed IPs: ☑
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Endpoint Host: ddns.router.home（绑定了公网 IP 的 DDNS 域名）
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Endpoint Port: 50251
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Persistent Keep Alive: 25
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>两边配置完成后重启 WireGuard 接口，如无意外应该能看到握手数据，互相 ping 对面设备的 LAN 地址，正常返回数据则 WireGuard 已经正常工作。&lt;/p>
&lt;p>最后配置 watchdog，意外断电重启公网 IP 变动后 WireGuard 可以及时重新连接：&lt;/p>
&lt;blockquote>
&lt;p>echo &amp;lsquo;* * * * * /usr/bin/wireguard_watchdog&amp;rsquo; &amp;raquo; /etc/crontabs/root&lt;/p>
&lt;/blockquote>
&lt;h3 id="允许-wireguard-通过防火墙">允许 WireGuard 通过防火墙&lt;/h3>
&lt;p>Network -&amp;gt; Firewall -&amp;gt; Traffic Rules -&amp;gt; &lt;code>Add&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>Name: Allow-WireGuard
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Protocol: UDP
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Source zone: WAN
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Destination zone: Device (input)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Destination port: 50251
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Action: accept
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="配置-dns-解析和转发">配置 DNS 解析和转发&lt;/h2>
&lt;p>有了 WireGuard 后最方便的事情就是可以在家访问公司内网服务，只要通过位于内网路由的 DNS 来解析内网地址就行。&lt;/p>
&lt;p>在内网也可以访问家里的设备，两边设置不同的域即可，对应的域转发给对应的 DNS 来解析。&lt;/p>
&lt;p>Network -&amp;gt; DHCP and DNS -&amp;gt; General Settings&lt;/p>
&lt;p>在 &lt;code>192.168.10.1&lt;/code> 上配置&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>Local server: /home/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Local domain: home
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>DNS forwardings: /office/192.168.192.20
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Rebind protection: ☐
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>在 &lt;code>192.168.20.1&lt;/code> 上配置&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>Local server: /office/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Local domain: office
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>DNS forwardings: /home/192.168.192.10
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Rebind protection: ☐
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>需要在家里（&lt;code>192.168.10.1&lt;/code>）访问内网时，按两步走：&lt;/p>
&lt;ol>
&lt;li>将对应的内网域名以 &lt;code>/abc.xyz/192.168.192.20&lt;/code> 的格式添加到 &lt;code>DNS forwardings&lt;/code> 中&lt;/li>
&lt;li>将对应的解析 IP/IP段 添加到对端 Peer 的 &lt;code>Allowed IPs&lt;/code> 中&lt;/li>
&lt;li>也可以直接将内网 DNS 地址添加到 &lt;code>Allowed IPs&lt;/code> 中，&lt;code>1&lt;/code> 中的 LAN IP 直接换成内网 DNS 地址。&lt;/li>
&lt;/ol>
&lt;p>这样就能用正确的 DNS 结果（通过 WireGuard 转发给公司上游 DNS 解析），访问到内网 IP 上的服务。&lt;/p>
&lt;p>通过 dig 命令可以查看是否正确转发了 DNS 请求。&lt;/p>
&lt;p>设置完成后可以通过 hostname.domain (比如 raspberry.office, router.home) 的方式访问两边的设备，不用再记难记的 IP 地址了。&lt;/p>
&lt;h2 id="主机防火墙策略">主机防火墙策略&lt;/h2>
&lt;p>通过上述方式建立了局域网之后，理所应当就可以在局域网里共享文件进行传输了，由于两边子网不同，需要一些简单的设置。&lt;/p>
&lt;p>首先打开当前连接网络的网络配置文件，看一下网络状态是&lt;code>公用&lt;/code>还是&lt;code>专用&lt;/code>网络。然后打开：&lt;/p>
&lt;ul>
&lt;li>Windows 10：控制面板\网络和 Internet\网络和共享中心\高级共享设置&lt;/li>
&lt;li>Windows 11：设置\网络和 Internet\高级网络设置\高级共享设置&lt;/li>
&lt;/ul>
&lt;p>在对应的配置文件里启用&lt;code>网络发现&lt;/code>和&lt;code>文件和打印机共享&lt;/code>，在&lt;code>所有网络&lt;/code>的配置文件里启用&lt;code>有密码保护的共享&lt;/code>。&lt;/p>
&lt;p>打开防火墙设置：&lt;/p>
&lt;ul>
&lt;li>Windows 10：控制面板\系统和安全\Windows Defender 防火墙\高级设置&lt;/li>
&lt;li>Windows 11：设置\网络和 Internet\高级网络设置\Windows 防火墙\高级设置&lt;/li>
&lt;/ul>
&lt;p>在&lt;code>入站规则&lt;/code>中找到&lt;code>文件和打印机共享(SMB-In)&lt;/code>（有多个，选择对应网络配置的那一个），双击打开属性，选择&lt;code>作用域&lt;/code>，在&lt;code>远程IP地址&lt;/code>处选择&lt;code>任何IP地址&lt;/code>，或者添加对应子网，比如访问家里设备的共享，就添加公司的子网地址&lt;code>192.168.20.0/24&lt;/code>。&lt;/p>
&lt;h2 id="局域网文件传输">局域网文件传输&lt;/h2>
&lt;p>上述设置完成后，比如我们在家里电脑上共享一个文件夹&lt;code>Share&lt;/code>：&lt;/p>
&lt;blockquote>
&lt;p>\\computer.home\Share&lt;/p>
&lt;/blockquote>
&lt;p>我就可以直接通过这个网络地址打开共享，输入账号密码认证后像本地文件夹一样传输文件了。&lt;/p>
&lt;p>至此，我终于不用受限于公司 VPN 的各种问题，也不需要靠 WSL 做桥梁，用最习惯的方式同步文件了。&lt;/p>
&lt;p>而且此前设置的 OpenSSH 也能互相正常访问，爽到。&lt;/p>
&lt;h2 id="一些额外的折腾">一些额外的折腾&lt;/h2>
&lt;p>完全是为了用 robocopy 而用 robocopy 的折腾，记录一下。&lt;/p>
&lt;p>原因还是 SCP 不够灵活，想要类似 rsync 的体验。其实就是需要一个差异同步的功能减少传输数据量节约时间，结果还得是 robocopy，而且 robocopy 支持形如 &lt;code>\\computer.home\Share&lt;/code> 的网络地址，完美。&lt;/p>
&lt;p>考虑到 robocopy 的 &lt;code>/compass&lt;/code> 参数需要&lt;a class="link" href="https://learn.microsoft.com/zh-cn/windows-server/storage/file-server/smb-compression" target="_blank" rel="noopener"
>条件支持&lt;/a>，批量小文件传输速度本身也会比较慢，而后者的影响比较大，打算利用 robocopy 导出差异列表，然后打包小文件变成一个大文件来传输提高效率。&lt;/p>
&lt;blockquote>
&lt;p>RoboCopy [source] [dist] &lt;em>.&lt;/em> /E /Z /COPY:DAT /DCOPY:T /XD __pycache__ node_modules venv .git .github /XO /IT /XJ /R:3 /W:3 /REG /NC /NS /NDL /NJH /NJS /LOG:diff.txt&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;p>7z a -t7z diff.7z -i@&amp;ldquo;diff.txt&amp;rdquo; -scsWIN -spf&lt;/p>
&lt;/blockquote>
&lt;h2 id="eof">EOF&lt;/h2>
&lt;p>这下折腾爽了。&lt;/p></description></item></channel></rss>