Online as milkman · Junjie Wang王骏杰 · 网上常用名 milkman王 駿杰(ワン・ジュンジエ)· ネットでは milkman

I run my own small internet,
and I like making it faster.
我养着一张自己的小互联网,
总想让它再快一点。
小さなインターネットを、自分で運用しています。
速くするのが、何より好きです。

Home networks in Japan and China, servers abroad, one virtual LAN across all of them. I measure routes, tune routers, and write everything down. MSc student at the University of Tokyo (2028), AWS Certified Solutions Architect – Associate. 日本的住处、国内的家,加上散在各地的几台服务器,用一张虚拟局域网串成一体。平时就是测线路、调路由器,顺手把每一步都记下来。目前在东京大学读硕士(2028 年毕业),持有 AWS 解决方案架构师助理级认证。日本の自宅、中国の実家、そして各地に置いた数台のサーバーを、ひとつの仮想 LAN でつないでいます。回線を測り、ルーターを調整し、やったことはすべて記録に残すのが日課です。現在は東京大学の修士課程に在籍(2028 年修了予定)。AWS 認定ソリューションアーキテクト – アソシエイトを取得しています。

milkman@lab: ~

    
0home networks, Japan and China套家庭网络,日本和国内各一つの家庭ネットワーク(日本と中国)
0virtual LAN across countries张横跨几国的虚拟局域网つの国をまたぐ仮想 LAN
0projects on this page个项目,都在下面つのプロジェクトを紹介
0dated work records份按日期归档的工作记录件の日付つき作業記録

My lab, on one map一张图,看清我的实验室ラボの全体図

Turn the layers on and off, and click any node.各个图层可以单独开关,点一下节点就能看到说明。レイヤーは個別にオン・オフでき、ノードをクリックすると説明が表示されます。

dot: monitored by橙点:已接入监控,详见オレンジの点:監視中。詳細は

My place · Japan日本的住处日本の自宅 Servers服务器サーバー each hub sends traffic to the exit with the best route两个枢纽都按线路把流量分到最合适的出口どちらのハブも、経路の良い出口へ通信を振り分けます Family home · China国内的家中国の実家 fiber to each room光纤到每个房间各部屋へ光ファイバー direct直连直接 WireGuard Hong Kong · GSL香港 · GSL香港 · GSL tunnel隧道トンネル ▭PC & phones电脑和手机PC とスマホ ⌂Main router主路由メインルーター ◎Japan sites日本网站国内サイト HUBJapan VPS日本 VPS日本 VPS ◆Europe · RETN欧洲 · RETN欧州 · RETN ◆Singapore · GSL新加坡 · GSLシンガポール · GSL ◆US · GSL美国 · GSL米国 · GSL HUBHong Kong VPS香港 VPS香港 VPS ⌂Family router家里的路由器実家のルーター ▤NASNASNAS ⇄Switch · VLANs交换机 · VLANスイッチ · VLAN ▢Room房间部屋 ▢Room房间部屋 ▢Room房间部屋

Projects项目プロジェクト

Each one is a short story: why, what I did, the result, and what I learned.每个项目都按同一个顺序讲:为什么做、怎么做、做成了什么、学到了什么。どのプロジェクトも「きっかけ・やったこと・結果・学び」の順で紹介しています。

Network网络ネットワーク
Performance性能パフォーマンス
Services服务サービス
Home家里実家
Method方法進め方
traceroute · WireGuard · policy routing · RETN / GSL

Choosing the best route按线路分流経路ごとの振り分け

Why起因きっかけOur ISP's international routes are sometimes poor: traffic to Europe can take a long detour.运营商的国际线路时好时坏,去欧洲的流量经常要绕一大圈才到。プロバイダの国際回線は品質にムラがあり、欧州向けの通信はかなり遠回りすることがあります。

What I did做法やったことMy router in Japan keeps a WireGuard tunnel to a VPS in Japan, which acts as the hub. Based on traceroute, the hub sends each destination to the exit with the best route: Europe over RETN; Singapore, the US and Hong Kong over GSL. Japanese sites go straight out from home. My family's home in China uses the same design, with Hong Kong as the hub.日本住处的路由器通过 WireGuard 连到一台日本 VPS,由它做中转枢纽:根据 traceroute 的结果,把每个目的地交给线路最好的出口——欧洲走 RETN,新加坡、美国、香港走 GSL。访问日本本地的网站,则直接从家里出去。国内的家用的也是这套方案,只是枢纽换成了香港。日本の自宅ルーターは WireGuard で日本の VPS につながり、その VPS がハブになります。traceroute の結果をもとに、宛先ごとに最も経路の良い出口へ振り分けます。欧州は RETN、シンガポール・米国・香港は GSL です。国内サイトは自宅からそのまま出します。中国の実家も同じ構成で、ハブだけを香港に置いています。

Result结果結果When the ISP's route is bad, the connection gets much faster, and local traffic takes no extra hop.碰上运营商线路差的时候,速度能好上一大截;本地流量也不用白白多绕一跳。プロバイダの経路が悪いときほど、速度が大きく改善しました。国内向けの通信も、余計な遠回りをしません。

Lesson收获学びMeasure the path before choosing the server, and route by need instead of sending everything through one tunnel.先量路,再挑服务器;按需分流,别把所有流量一股脑塞进一条隧道。まず経路を測ってからサーバーを選ぶ。すべてをひとつのトンネルに押し込まず、必要な分だけ振り分ける。

Where should this packet go?这个包该走哪条路?このパケットはどこを通る?

          Illustrative paths; the real rules match destination prefixes.路径只是示意,实际的规则按目标网段匹配。経路は概念図です。実際のルールは宛先のネットワーク単位で判定しています。
        
ZeroTier · overlay network

One LAN across countries一张跨国的局域网国をまたぐひとつの LAN

Why起因きっかけMy devices and servers are spread across Japan, China and other countries, and the network in China is restricted.我的设备和服务器分散在日本、国内和海外好几个地方,国内的网络环境又比较封闭,互相访问很不方便。端末とサーバーが日本・中国・海外に散らばっているうえ、中国のネットワークは閉じた環境なので、互いにアクセスするのが大変でした。

What I did做法やったことI built one virtual LAN with ZeroTier. Every device gets a stable private address and can reach the others, wherever it is.用 ZeroTier 组了一张虚拟局域网,每台设备都有一个固定的内网地址,人在哪儿都能直接互访。ZeroTier で仮想 LAN を組み、すべての端末に固定のプライベートアドレスを割り当てました。どこにいても直接アクセスできます。

Result结果結果I can reach home devices and servers from anywhere in the world, as if they were on the same switch.不管身在何处,访问家里的设备和服务器都像插在同一台交换机上一样。世界のどこにいても、自宅の機器やサーバーへ、同じスイッチにつないでいるような感覚でアクセスできます。

Lesson收获学びAn overlay network separates who can talk to whom from where they physically are.叠加网络把“谁能和谁通信”和“人在哪里”这两件事拆开了。オーバーレイネットワークは「誰と誰が通信できるか」と「物理的にどこにいるか」を切り離してくれます。

Same addresses, anywhere人在哪儿,地址都不变どこにいてもアドレスは同じ

NAT · traffic shaping · QUIC

A tunnel over a game accelerator借游戏加速器打通的隧道ゲーム用アクセラレーターに乗せたトンネル

Why起因きっかけMy family in China needed a stable link to our servers in Hong Kong and Japan, and the normal cross-border path is often slow.国内的家需要稳定地连到我们在香港和日本的服务器,可普通的跨境线路常常又慢又不稳。中国の実家から香港と日本のサーバーへ安定してつなぎたかったのですが、通常の国際回線は遅く、不安定でした。

What I did做法やったことA commercial game-acceleration network has better cross-border routes, so I ran our own tunnel on top of it. The router makes the tunnel look like a device the accelerator knows, caps the speed to stay within its capacity, and pins the proxy to one CPU core.商业游戏加速器的跨境线路质量好得多,我就借它当“路”,在上面跑我们自己的隧道。路由器负责让隧道流量看起来像加速器认识的设备,同时限住速度、别超出它的承载,再把代理程序固定在一个 CPU 核上。商用のゲームアクセラレーターは国際区間の回線品質がずっと良いので、それを「道路」として借り、その上に自前のトンネルを通しました。ルーター側では、トンネルの通信がアクセラレーターの加速対象の端末として扱われるようにし、容量を超えないよう帯域を制限し、プロキシのプロセスを 1 つの CPU コアに固定しています。

Result结果結果A later check found the speed cap had silently stopped working: the accelerator kept inserting its rule above mine. A watcher now restores the order every five seconds. Speed is stable, with no packet loss.后来复查时发现,限速其实早就悄悄失效了:加速器每次重建连接,都会把自己的规则插到我的前面。现在有个脚本每五秒检查一次、把顺序摆正,速度稳定,不再丢包。後日の点検で、帯域制限が実はとっくに効いていなかったことに気づきました。アクセラレーターが接続を張り直すたびに、自分のルールを私のルールより前に差し込んでいたのです。今は 5 秒ごとに順番を確認して直すスクリプトを置いていて、速度は安定し、パケットロスもありません。

Lesson收获学びConfigured does not mean working. Check that a control actually takes effect.配置写了,不等于真的生效,一定要回头确认。設定したことと、実際に効いていることは別物。必ず効果を確かめる。

Play with the data path自己动手调一调実際に触ってみる
Devices Router cap: on CPU 62% AcceleratorIPv4IPv6 Servers
Speed cap限速帯域制限working
Accelerator load加速器负载アクセラレーターの負荷normal
Router CPU路由器 CPUルーターの CPU62%
Simplified. Each packet crosses the accelerator twice, over IPv4 and IPv6.图已简化:每个包都会经 IPv4、IPv6 各走一遍加速器。図は簡略化しています。実際には各パケットが IPv4 と IPv6 の両方でアクセラレーターを通ります。
NSS / PPE · Xray · AES-GCM · Go

Making a small router fast榨干一台小路由器小さなルーターの性能を引き出す

Why起因きっかけA router has a small CPU. If every packet and every encrypted byte goes through it, it becomes the bottleneck.路由器的 CPU 本来就弱,要是每个包、每个加密字节都得它亲自处理,它就成了整条链路的瓶颈。ルーターの CPU はもともと非力です。すべてのパケット、すべての暗号処理を CPU が担うと、そこが全体のボトルネックになります。

What I did做法やったことI learned how the Qualcomm chip's NSS and PPE engines take over a connection after its first packets, and enabled that for my ISP's IPv4-over-IPv6 tunnel and for Wi-Fi. For proxy traffic, I modified Xray (Go) so its AES-GCM encryption can run on the router's hardware crypto engine through /dev/crypto, in batches of up to eight records, with a CPU fallback.我研究了高通芯片里的 NSS、PPE 加速引擎:一条连接的前几个包过后,转发就交给硬件接管。我把它用在了运营商的 IPv4 over IPv6 隧道和 Wi-Fi 上。代理流量这边,我改了 Xray(Go 写的),让 AES-GCM 加密能通过 /dev/crypto 交给路由器的硬件加密引擎,每次最多攒 8 条记录一起送,硬件不可用时自动退回 CPU。Qualcomm チップの NSS・PPE という転送エンジンを調べました。コネクションの最初の数パケットが過ぎると、以降の転送はハードウェアが引き受けます。これをプロバイダの IPv4 over IPv6 トンネルと Wi-Fi に適用しました。プロキシの通信については Xray(Go 製)に手を入れ、AES-GCM の暗号処理を /dev/crypto 経由でルーターの暗号エンジンに渡せるようにしました。最大 8 レコードずつまとめて送り、ハードウェアが使えないときは自動で CPU に戻ります。

Result结果結果With hardware offload, one test forwarded 8.4 Gbps with the CPU at about 1–3%. Profiling also showed that the cipher is only part of the cost: packet I/O and the tunnel matter just as much.开启硬件卸载后,有一次测试跑到了 8.4 Gbps,CPU 只占 1–3% 左右。性能采样还告诉我:加密只是开销的一部分,收发包和隧道本身同样吃资源。ハードウェアオフロードを有効にしたテストでは 8.4 Gbps を記録し、CPU 使用率は 1〜3% 程度でした。プロファイリングからは、暗号化はコストの一部にすぎず、パケットの送受信やトンネル自体も同じくらい重いことが分かりました。

Lesson收获学びProfile before optimizing. On network devices, the fastest path is the one the CPU never touches.先采样,再优化。在网络设备上,最快的路是 CPU 压根不用碰的那条。最適化の前に、まず計測。ネットワーク機器では、CPU が一切触れない経路こそ最速です。

Who processes the packet?谁来处理这个包?このパケットは誰が処理する?
CPU4 cores
Crypto engine加密引擎暗号エンジンAES-GCM
PPE / NSSpacket engine包处理引擎パケット処理エンジン
CPU loadCPU 占用CPU 使用率

SmartDNS · CDN · EDNS Client Subnet

DNS and CDNsDNS 与 CDNDNS と CDN

Why起因きっかけDNS decides which CDN node you reach. I run SmartDNS at home for ad blocking and to pick faster nodes, and my servers taught me a lot about how CDNs choose.访问哪个 CDN 节点,往往由 DNS 说了算。我在家里用 SmartDNS 拦广告、挑快节点;自己的服务器多了以后,对 CDN 怎么调度也摸清了不少。どの CDN ノードにつながるかは、たいてい DNS で決まります。自宅では SmartDNS で広告をブロックし、速いノードを選んでいます。自前のサーバーが増えるにつれ、CDN の振り分けの仕組みにもだいぶ詳しくなりました。

What I did做法やったことI measured loss and latency of CDN nodes and steered some domains with client-subnet hints. One day a blocked site still opened on my phone: newer devices also ask for an "HTTPS" record, and its answer pointed to an unblocked alias. I proved it with a small test, tried the fix on a separate copy, then applied it.我测过各个 CDN 节点的丢包和延迟,再用客户端子网(ECS)把部分域名引到更合适的节点。有一回,明明屏蔽了的网站在手机上照样能打开。查下来发现,新设备还会额外查一种“HTTPS”记录,而这条记录指向了一个没被拦的别名。我先用小实验坐实原因,在一份独立的副本上试好修复,才正式上线。各 CDN ノードのパケットロスと遅延を測り、クライアントサブネット(ECS)で一部のドメインをより適したノードへ誘導しています。あるとき、ブロックしたはずのサイトがスマホでは普通に開けてしまいました。調べると、新しい端末は「HTTPS」レコードも追加で問い合わせていて、その応答がブロックされていない別名を指していたのです。小さな実験で原因を確かめ、本番とは別のコピーで修正を試してから反映しました。

Result结果結果The block works on every device, and the same fix covered the whole list of about 63,000 ad domains.所有设备上都拦住了,这一处修复还顺带补上了整份约 6.3 万条的广告列表。どの端末でも正しくブロックされるようになり、同じ修正で約 6.3 万件の広告リスト全体の抜け穴もふさがりました。

Lesson收获学びTest from the user's side, and test a change before it goes live.站在用户那一端去测;改动先试,再上线。ユーザー側から確かめる。変更は試してから本番へ。

Send a DNS query发个 DNS 查询试试DNS クエリを送ってみる
📱Your phone你的手机あなたのスマホ
🛡️SmartDNS
🌐Upstream上游 DNS上流の DNS

          
Docker · Docker Compose

NAS with Docker ComposeNAS 上的容器化服务NAS 上のコンテナ化サービス

Why起因きっかけThere is a NAS at my family's home in China for storage and self-hosted services, and installing things by hand gets messy fast.国内家里有台 NAS,用来存东西、跑一些自建服务。软件一多,手动装很快就乱成一锅粥。実家にはファイル置き場とセルフホスト用の NAS があります。ソフトが増えるにつれ、手作業でのインストールはすぐに収拾がつかなくなりました。

What I did做法やったことEvery service runs in a Docker container, described in a Docker Compose file: image, ports, volumes and restart policy in one place.每个服务都放进各自的 Docker 容器,用 Docker Compose 写清楚:镜像、端口、数据卷、重启策略,全在一个文件里。サービスごとに Docker コンテナを分け、Docker Compose でイメージ・ポート・ボリューム・再起動ポリシーを 1 つのファイルにまとめました。

Result结果結果Starting, updating or moving a service is one command, and the whole setup is easy to rebuild.启动、升级、搬家都只要一条命令,整套环境推倒重来也不费事。起動も更新も移設もコマンド 1 つ。環境を丸ごと作り直すのも簡単です。

Lesson收获学びIf it is written as code, it can be reviewed, repeated and recovered.写成代码的东西,才能被检查、被复现、被恢复。コードとして書いたものだけが、レビューでき、再現でき、復旧できる。

One file, one command一个文件,一条命令ファイル 1 つ、コマンド 1 つ

          

          An example file in the style I use, not my exact setup.示例文件,演示我的写法,并非完整配置。書き方を示すためのサンプルで、実際の設定そのものではありません。
        
Nezha · observability

Monitoring with Nezha哪吒监控Nezha による監視

Why起因きっかけWith servers and routers in several countries, I need to see their health without logging into each one.服务器和路由器散在好几个国家,总不能一台台登录上去看状态。サーバーとルーターが何か国にも分散していて、1 台ずつログインして確認するのは現実的ではありません。

What I did做法やったことI run a Nezha dashboard and install its agent on my servers and even on my routers, so CPU, memory, traffic and uptime are on one page.我搭了哪吒监控面板,服务器、路由器上都装了 agent,CPU、内存、流量、在线时长一页看全。Nezha の監視ダッシュボードを立て、サーバーだけでなくルーターにもエージェントを入れました。CPU・メモリ・通信量・稼働時間を 1 画面で確認できます。

Result结果結果Problems show up on the dashboard before anyone complains, and I can compare servers when choosing routes.出了问题,面板往往比人先发现;挑线路的时候,也能直接拿几台服务器放在一起比。問題が起きると、誰かが気づくより先にダッシュボードに現れます。経路を選ぶときも、サーバー同士をその場で比較できます。

Lesson收获学びYou cannot fix what you cannot see.看不见的问题,就无从修起。見えない問題は、直せない。

It is live right now此刻正在运行いまも稼働中
The bars are a preview animation; the dashboard shows the real numbers.上面的条形图只是预览动画,真实数据请看监控面板。上のグラフはプレビュー用のアニメーションです。実際の数値はダッシュボードでご覧ください。
fiber · switch VLANs · China home

Fiber to every room光纤拉进每个房间各部屋に光ファイバーを

Why起因きっかけAt my family's home in China, the rooms had no Ethernet ports, so everything used Wi-Fi, with higher and less stable latency.国内家里的房间原本都没有网线口,所有设备只能连 Wi-Fi,延迟高,还忽上忽下。実家の部屋にはもともと LAN ポートがなく、すべて Wi-Fi 頼みで、遅延が大きく不安定でした。

What I did做法やったことI ran nearly invisible fiber from the main router to each room myself, and used VLANs on a switch to keep different kinds of traffic separate.我自己用隐形光纤从主路由拉到每个房间,再在交换机上划好 VLAN,把不同用途的流量隔开。メインルーターから各部屋まで目立たない光ファイバーを自分で引き、スイッチで VLAN を切って用途ごとに通信を分けました。

Result结果結果Every room got a wired connection, and latency dropped a lot.每个房间都用上了有线,延迟降了一大截。すべての部屋が有線になり、遅延が大きく下がりました。

Lesson收获学びSometimes the best fix is physical.有时候,最好的办法就是从物理层下手。物理層から手を入れるのが、一番の近道なこともある。

Wi-Fi or fiber?Wi-Fi 还是光纤?Wi-Fi か、光ファイバーか
Illustration: Wi-Fi latency jumps around, the wired link stays flat.示意图:Wi-Fi 延迟忽高忽低,有线连接则稳稳当当。概念図:Wi-Fi は遅延が上下し、有線は安定しています。
runbooks · change records · AI agents

Handover notes for AI agents给 AI 写交接文档AI のための引き継ぎ資料

Why起因きっかけThese projects ran for months with AI coding agents, and every new session starts with no memory. An agent without context can repeat a dangerous experiment.这些项目前后做了好几个月,全程都有 AI 编程助手参与,可它每开一个新会话就什么都不记得。没有上下文的 AI,很可能把危险的实验再做一遍。これらのプロジェクトは数か月にわたり、ずっと AI コーディングエージェントと一緒に進めてきました。ただ、AI は新しいセッションを開くたびに過去を覚えていません。文脈を持たない AI は、危険な実験を繰り返してしまうおそれがあります。

What I did做法やったことThe agents keep a handover document (current state, rules, how to check and roll back) and a short record for every change. Every session starts by reading them.我立了个规矩:让 AI 维护一份交接文档,写清现状、规矩、怎么检查和回滚;每做一次改动,就留一份简短记录。每个新会话都先读完这些再动手。そこでルールを決めました。AI に引き継ぎ資料を書かせ、現状・守るべきルール・確認と切り戻しの手順をまとめる。変更のたびに短い記録を残す。新しいセッションは、まずそれを読んでから作業を始める。

Result结果結果When I switched to a different AI tool, it picked up the work at once and fixed a real problem the same day.后来我换了一个 AI 工具,它读完文档马上接上了手,当天就修好了一个真实存在的问题。別の AI ツールに乗り換えたときも、資料を読んだだけですぐに作業を引き継ぎ、その日のうちに実際の不具合を直してくれました。

Lesson收获学びLike runbooks in an operations team, the knowledge lives in the system. I set the goals and limits and make the calls; the agents run the commands.这和运维团队的操作手册是一个道理:知识要沉淀在体系里,而不是只存在某个人的脑子里。目标、边界和决定由我来定,具体命令交给 AI 执行。運用チームの手順書と同じで、知識は個人の頭ではなく仕組みに残すもの。目標・範囲・判断は私が決め、具体的なコマンドの実行は AI に任せています。

Run a session模拟一次会话セッションを 1 回動かす
Read the records先读记录記録を読む
Check live state只读核对现状現状を読み取りで確認
One change, rollback ready只改一处,备好回滚変更は 1 か所、切り戻しを準備
Write it down记下来記録する
session会话セッション#0

        

How I work我做事的习惯仕事の進め方

◎

Measure first先量再说まず測る

traceroute, counters and captures before opinions.traceroute、计数器、抓包,先看数据,再下结论。traceroute、カウンター、パケットキャプチャ。意見より先にデータを見る。

①

One change at a time一次只改一处変更は一度に 1 つ

So every result has one cause.这样每个结果都只对应一个原因。そうすれば、結果と原因が 1 対 1 で結びつきます。

↺

Keep a way back留好退路戻り道を用意する

Backup and rollback before the change.动手之前,先备份、先想好怎么回滚。手を動かす前に、バックアップと切り戻しの手順を用意する。

✎

Write it down记下来記録する

The next person, or agent, starts from the record.下一个接手的人或 AI,都从记录开始。次に引き継ぐ人も AI も、記録から始められるように。

How this site is built这个网站是怎么搭起来的このサイトの作り方

Small on purpose: no framework, no build step, no trackers. The interesting part is the delivery, through Cloudflare to my own server.刻意做得很轻:不用框架,不需要构建,也没有任何追踪。真正有意思的是交付这一环:经 Cloudflare,回源到我自己的服务器。あえて軽く作っています。フレームワークもビルドもトラッキングもありません。面白いのは届け方のほうで、Cloudflare を通して自分のサーバーから配信しています。

Your browser你的浏览器あなたのブラウザHTML · CSS · JS
CloudflareCDN edge · DDoS protectionCDN 边缘节点 · 抗攻击CDN エッジ · DDoS 対策
CaddyOracle Cloud ARM VM · Debian 12甲骨文云 ARM 主机 · Debian 12Oracle Cloud の ARM VM · Debian 12compression · security headers · static files压缩 · 安全响应头 · 静态文件圧縮 · セキュリティヘッダー · 静的ファイル
$ ./deploy.shEach deploy uploads a new release folder over SSH with a dedicated key, then switches a symlink atomically. Rolling back is one command: ./deploy.sh rollback.每次部署都用一把专用的 SSH 密钥上传一个新版本目录,再原子地切换软链接;想回滚,一条 ./deploy.sh rollback 就够了。デプロイのたびに専用の SSH 鍵で新しいリリースディレクトリをアップロードし、シンボリックリンクをアトミックに切り替えます。切り戻しも ./deploy.sh rollback の 1 コマンドです。

Let's talk聊聊?お話ししませんか

I'm looking for an infrastructure role starting in April 2028.正在找 2028 年 4 月入职的基础设施相关岗位,欢迎来信。2028 年 4 月入社のインフラ関連ポジションを探しています。お気軽にご連絡ください。

[email protected]