id: ce8a57262fd04a29841929f7213024d0
parent_id: 
item_type: 1
item_id: a6891ed02ead406ca57769ea53f79d70
item_updated_time: 1764345613913
title_diff: "[{\"diffs\":[[1,\"NAS党福音：近乎零成本优雅地实现家庭网络异地组网（二）\"]],\"start1\":0,\"start2\":0,\"length1\":0,\"length2\":28}]"
body_diff: "[{\"diffs\":[[1,\"<html>\\\r\\\n<head>\\\r\\\n  <title>NAS党福音：近乎零成本优雅地实现家庭网络异地组网（二）</title>\\\r\\\n  <basefont face=\\\"微软雅黑\\\" size=\\\"2\\\" />\\\r\\\n  <meta http-equiv=\\\"Content-Type\\\" content=\\\"text/html;charset=utf-8\\\" />\\\r\\\n  <meta name=\\\"exporter-version\\\" content=\\\"YXBJ Windows/608924 (zh-CN, DDL); Windows/10.0.0 (Win64); EDAMVersion=V2;\\\"/>\\\r\\\n  <meta name=\\\"content-class\\\" content=\\\"yinxiang.peso.superNote\\\"/>\\\r\\\n  <meta name=\\\"application-data:yinxiang.noteLayout\\\" content=\\\"{\\\"lineSpace\\\":\\\"recommend\\\",\\\"paragraphSpace\\\":\\\"recommend\\\"}\\\"/>\\\r\\\n  <style>\\\r\\\n\\tbody, td {\\\r\\\n\\t  font-family: 微软雅黑;\\\r\\\n\\t  font-size: 12pt;\\\r\\\n\\t}\\\r\\\n  </style>\\\r\\\n</head>\\\r\\\n<body>\\\r\\\n<a name=\\\"35409\\\"></a>\\\r\\\n<h1>NAS党福音：近乎零成本优雅地实现家庭网络异地组网（二）</h1>\\\r\\\n\\\r\\\n<div><span style=\\\"\\\"><div style=\\\"max-width: 700px;\\\"><p></p><div style=\\\"--en-blockquote: true; box-sizing: border-box; border-left: 3px solid #b4c0cc; background-position: initial initial; background-repeat: initial initial;\\\"><div>原文链接: <a href=\\\"http://mp.weixin.qq.com/s?__biz=MzkyMjEzNzE3MQ==&amp;mid=2247484361&amp;idx=1&amp;sn=f90d9f6e955c3ad05288b8a25d961126&amp;chksm=c07d098d4b1f19d79bc44b0b5215af99728e2ac3152b077d770eb08c6869cf3f38123b77dcd3&amp;mpshare=1&amp;scene=1&amp;srcid=0101mjussZCrCxOLOzKpa2r4&amp;sharer_shareinfo=fe765de30a7a08364e45427bd58d5a05&amp;sharer_shareinfo_first=fe765de30a7a08364e45427bd58d5a05#rd\\\"><span>http://mp.weixin.qq.com/s?__biz=MzkyMjEzNzE3MQ==&amp;mid=2247484...</span></a></div></div><p></p><div style=\\\"-webkit-tap-highlight-color: transparent;\\\"><div style=\\\"-webkit-tap-highlight-color: transparent;\\\"><div style=\\\"-webkit-tap-highlight-color: transparent;\\\"><div style=\\\"-webkit-tap-highlight-color: transparent;\\\"><span style=\\\"-webkit-tap-highlight-color: transparent;\\\">原创</span><span style=\\\"-webkit-tap-highlight-color: transparent;\\\"> 易雾君 </span><span style=\\\"-webkit-tap-highlight-color: transparent;\\\"><a style=\\\"-webkit-tap-highlight-color: transparent;\\\"> 易雾山庄 </a></span><span style=\\\"-webkit-tap-highlight-color: transparent;\\\"><em style=\\\"-webkit-tap-highlight-color: transparent;\\\"></em></span></div><div style=\\\"-webkit-tap-highlight-color: transparent;\\\"><p dir=\\\"auto\\\" style=\\\"-webkit-tap-highlight-color: transparent;\\\">第一篇快速将近期写的一个项目跑了起来，没怎么描述过多的细节，本篇做下补充。近期写的这个项目基于开源方案做了些许自动化处置，实现了无公网IPv4场景的大内网异地组网和发布家庭网的站点服务。标题中的零成本解释下，本方案涉及到域名可能会花点钱，有些免费域名也可以接入Cloudflare，其实完全可以做到不花钱的。</p><p dir=\\\"auto\\\" style=\\\"-webkit-tap-highlight-color: transparent;\\\">先梳理下当下的痛点及基础环境。组网方面，家庭为重庆移动宽带，有公网IPv6，无公网IPv4，曾经向运营商索要无果，针对IPv4场景，如公司的访客网仅支持ipv4，一度使用手头上的一台广州VPS中转，供手机在IPv4网络环境接入，国内的云服务器普遍管子特小，影响体验。而IPv6场景，则通过手机流量直连回家，稍微做下ddns，使用体验还能在接受方位内，虚拟隧道选的是wireguard。总体看下来，ipv4和ipv6回家链路不统一，不够优雅。然而，现在唯一的VPS不打算续期后，IPv4回家链路就没有了，急需解决办法，好在一直在关注p2p组网，正好有了此系列的折腾。</p><p dir=\\\"auto\\\" style=\\\"-webkit-tap-highlight-color: transparent;\\\">其次，家庭站点发布方面，之前采用 cloudflare zero atrust tunnel 发布站点，由于众所周知的跨境原因，网络经常不稳定，于是采用了Cloudflare反代模式，IPv6可以直接配置代理模式，而IPv4则通过打洞形式接入，回源重写端口达到优雅地免端口访问站点，顺便告诉大家一个消息，重庆移动的家宽443端口其实没有被封禁，不知道你们的家宽有没被封禁呢。这里顺便友情提示下，对公网暴露服务具有较大安全风险，如有需求，建议套一层雷池的WAF社区版，降低被攻破的概率。</p><p dir=\\\"auto\\\" style=\\\"-webkit-tap-highlight-color: transparent;\\\">我的家庭宽带是通过PVE下的OpenWRT进行直接拨号的，光猫改的桥接模式，曾经有段时间，我的IPv6经常不稳定，找了很久的原因，后来将网络模式由linux bridge改为openvswitch bridge 模式后基本稳定下来。担心哪天它又开始作妖，所以项目实现需要自动回退到IPv4模式，组网和发布站点都要能自动回退，也就是，即使我的网络环境没有ipv6公网IP，也能顺利异地组网和发布服务。</p><p dir=\\\"auto\\\" style=\\\"-webkit-tap-highlight-color: transparent;\\\">由于牵涉到大内网打洞，我们还希望简化网络结构，最好将打洞操作和组网服务捆绑在一块，出口网关作最小的操作，比如有些硬路由不支持软件扩展，但设置DMZ基础功能是具备的，避免让这些傻瓜路由来完成打洞操作，最终实现一键式编排。打洞能否成功，主要看你的真实网络类型，相关检测方法已在第一篇做了介绍，可跳转查看。<a href=\\\"https://mp.weixin.qq.com/s?__biz=MzkyMjEzNzE3MQ==&amp;mid=2247484356&amp;idx=1&amp;sn=e2548702a5d62e5aad42eb2baca32b38&amp;scene=21#wechat_redirect\\\" style=\\\"-webkit-tap-highlight-color: transparent;\\\" target=\\\"_blank\\\">NAS党福音：近乎零成本优雅地实现家庭网络异地组网（一）</a></p><p style=\\\"-webkit-tap-highlight-color: transparent; text-align: center;\\\"><img src=\\\":/78f674ea6efc4bdcb16f4e949575f376\\\" type=\\\"image/png\\\" data-filename=\\\"640.png\\\" style=\\\"--en-marks: %7B%22align%22%3A%22center%22%7D; -webkit-tap-highlight-color: transparent; width: auto;\\\" width=\\\"auto\\\"/></p><p dir=\\\"auto\\\" style=\\\"-webkit-tap-highlight-color: transparent;\\\"><strong style=\\\"-webkit-tap-highlight-color: transparent;\\\">反代服务（headscale-traefik）</strong>，用于反向代理多个web服务，有效减少打洞数量，每开放一个web服务就打一个洞及其不现实，同时接管tls证书自动签发，配合cloudflare和letencrypt。</p><p dir=\\\"auto\\\" style=\\\"-webkit-tap-highlight-color: transparent;\\\"><strong style=\\\"-webkit-tap-highlight-color: transparent;\\\">服务端（headscale-server）</strong>，开源的tailscale服务端版本，又叫协调服务器，负责wireguard节点的密钥交换、访问控制等。</p><p dir=\\\"auto\\\" style=\\\"-webkit-tap-highlight-color: transparent;\\\"><strong style=\\\"-webkit-tap-highlight-color: transparent;\\\">服务端控制后台（headscale-ui）</strong>，headscale的图形化控制，降低管理复杂度。</p><p dir=\\\"auto\\\" style=\\\"-webkit-tap-highlight-color: transparent;\\\"><strong style=\\\"-webkit-tap-highlight-color: transparent;\\\">中继节点（headscale-derp）</strong>，端到端打洞保底方案，且其本身就在境内，即使无法完成俩设备直连，回退到了中继方案，也能有很低的延迟。中继节点可同时开启DERP和STUN服务。</p><p dir=\\\"auto\\\" style=\\\"-webkit-tap-highlight-color: transparent;\\\"><strong style=\\\"-webkit-tap-highlight-color: transparent;\\\">客户端（headscale-client）</strong>，这个tailscale客户端主要充当两个角色，一个为接入家庭网的核心入口节点，一个为防止derp被白嫖的作用。</p><p dir=\\\"auto\\\" style=\\\"-webkit-tap-highlight-color: transparent;\\\"><strong style=\\\"-webkit-tap-highlight-color: transparent;\\\">核心维护容器（headscale-worker）</strong>，负责一些关键配置的初始化，tls证书同步，ipv4场景打洞并维持稳定，如存在ipv6，优先通过ipv6暴露web服务和stun服务，如ipv6地址掉了，能自动监测回退只ipv4环境，确保顺利组网且暴露服务功能正常。当打洞端口发生变化，ipv6地址发生变化，都会自动更新derp节点信息，确保headscale服务端能提供最新有效的中继信息。</p><p dir=\\\"auto\\\" style=\\\"-webkit-tap-highlight-color: transparent;\\\">项目实现上主要分两大板块，一是打洞，二是实时监测本地网络地址的变化，三是同步traefik的tls证书给derp。整体工作流如下，当检测到本地支持ipv6，优先通过ipv6暴露服务，ipv4方面本方案则采用的开源natter进行打洞，打洞的稳定性经一段时间测试还算比较稳定，对外仅需打洞暴露两个端口，一个traefik服务端口和stun服务端口，traefik后需接入cloudflare反代，从而实现面向公网暴露。</p><p dir=\\\"auto\\\" style=\\\"-webkit-tap-highlight-color: transparent;\\\">接下来看看我的项目实现。近期我对项目已做了一版更新，相对更加友好和人性化。赶快尝试体验吧！项目地址：</p><p dir=\\\"auto\\\" style=\\\"-webkit-tap-highlight-color: transparent;\\\">https://github.com/evling2020/hsmaker</p><div style=\\\"-webkit-tap-highlight-color: transparent;\\\"><div style=\\\"-webkit-tap-highlight-color: transparent;\\\"><div style=\\\"--en-codeblock: true; --en-meta: {&quot;title&quot;:&quot;&quot;,&quot;lang&quot;:&quot;Plain Text&quot;,&quot;theme&quot;:&quot;default&quot;,&quot;showLine&quot;:true,&quot;lineWrap&quot;:true}; box-sizing: border-box; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; background-color: rgb(251, 250, 248); border: 1px solid rgba(0, 0, 0, 0.14902); background-position: initial initial; background-repeat: initial initial;\\\"><pre><span>git clone https://github.com/evling2020/hsmaker.git</span><br/><span># 替换.env里相应的变量，替换获取到的cloudflare token到文件secrets/cf_api_token里边</span><br/><span>chmod 0600 certs/acme.json </span><br/><span>docker compose up -d</span><br/></pre></div></div></div><p style=\\\"-webkit-tap-highlight-color: transparent;\\\"><br style=\\\"-webkit-tap-highlight-color: transparent;\\\"/></p></div></div><div style=\\\"-webkit-tap-highlight-color: transparent;\\\"><div style=\\\"-webkit-tap-highlight-color: transparent;\\\"><div style=\\\"-webkit-tap-highlight-color: transparent;\\\"><div style=\\\"-webkit-tap-highlight-color: transparent; display: flex; color: rgba(0,0,0,.3);\\\"><div style=\\\"-webkit-tap-highlight-color: transparent; color: rgba(0,0,0,.3);\\\">个人观点，仅供参考</div></div></div></div></div></div></div></div></span>\\\n</div></body></html>\\u0000\"]],\"start1\":0,\"start2\":0,\"length1\":0,\"length2\":7294}]"
metadata_diff: {"new":{"id":"a6891ed02ead406ca57769ea53f79d70","parent_id":"f67288c3a0be4374b5d532b5dcc3aabc","latitude":"0.00000000","longitude":"0.00000000","altitude":"0.0000","author":"","source_url":"","is_todo":0,"todo_due":0,"todo_completed":0,"source":"joplin-desktop","source_application":"net.cozic.joplin-desktop","application_data":"","order":1764348822253,"markup_language":2,"is_shared":0,"share_id":"","conflict_original_id":"","master_key_id":"","user_data":"","deleted_time":0},"deleted":[]}
encryption_cipher_text: 
encryption_applied: 0
updated_time: 2025-11-28T21:03:49.674Z
created_time: 2025-11-28T21:03:49.674Z
type_: 13