今天在信箱📪里看到了这么一封信:

意思就是提醒你该“上供”了。
⛵️ 新生的力量,生机勃勃 ⛵️
作为一个(贫穷的)润人,生活在没有墙的地区,为什么还要用 VPN 呢?这才是 VPN 的本意:虚拟局域网,目标一定是少数网址。例如第一种情况:远程访问家里的 NAS 资源,则目标就是家庭的局域网 IP。此时需要在家庭的设备上搭建服务。
第二种情况是远程访问单位的内网资源,此时需要在单位的设备上搭建服务。由于单位的设备管控比家庭更加严格一些,所以就需要动动脑筋。
无论是哪种模式,因为目标网址都很少,所以在规则判断上比较简单,这与东方某大陆把物理因特网变成物理局域网,迫使程序员把虚拟局域网改造成虚拟因特网的情况截然不同。
单位提供官方的 VPN 客户端,但使用起来不太方便。单位还有一台性能不错的服务器仅供我一人使用,但是只能暴露80、443 端口和一个 SSH 端口。除此之外不能暴露别的端口。
开始的设想是:因为访问家庭资源用 WireGuard,那么在单位的服务器上也搭建一个 WireGuard 服务器,然后自己设备上用 WireGuard 客户端就能一举两用了。但是仅有的三个端口已经全部使用完毕,不能暴露别的端口,就无法直接搭建 WireGuard 服务。另外也不能使用 cloudflared 来曲线救国,因为 WireGuard 是使用 UDP 的,与 cloudflared 的 TCP 不太合得来,而且 QUIC 流量通过单位的防火墙时有问题。
因为访问单位内网仅仅是一些很轻量的数据浏览,ChatGPT 给出的方案是 SOCKS 5 代理(没错,在润之前也经常听过这个词)。
首先在自己电脑上(以我的 macOS 为例)的终端运行:
ssh -D 1080 -C -q -N [email protected]
这时就创建了一个微型 VPN:地址是 localhost 即 127.0.0.1,端口号是 1080。
由于我平时使用 Safari 浏览器,没有专门的扩展来给浏览器自己设置代理,而是需要在系统网络里面设置。首先我设置了全局代理,如右图所示。设置之后测试成功。
但因为并不需要全局代理,只是针对少数几个网址进行代理,ChatGPT 给出了 PAC 方案。即写一个名字叫做 proxy.pac 的文件,代码如下:
function FindProxyForURL(url, host) {
if (shExpMatch(host, "*.example.com") || shExpMatch(host, "another-site.com")) {
return "SOCKS5 127.0.0.1:1080";
}
return "DIRECT";
}
然后把文件地址 file:///path/to/proxy.pac
填入设置区域即可。(当然需要把之前测试用的全局代理取消)
以上是 ChatGPT 宣称的。然而填入之后发现完全没有任何效果,说明要么是 PAC 文件有问题,要么是 URL 填写有问题。
到此为止 ChatGPT 就无法进一步解释了,开始胡说八道了。最后是自己去网上搜到的两个坑。
这个在好几年前就是这样了(file:/// 无效),ChatGPT 却不知道。于是我用
python3 -m http.server 8000
搞一个本地 HTTP 服务器。但还是不行。
要把 SOCKS5 127.0.0.1:1080
这句话里面的 5 去掉,变成 SOCKS 127.0.0.1:1080
。这时就可以用了。
这么一搞问题变复杂了,这意味着电脑上需要跑两个背景进程,一个是 ssh 的 SOCKS 服务器进程,一个是 python 的微型 http 服务器进程。可是我的是 macbook 笔记本电脑平时用完就合上盖子,此时系统进入睡眠状态,这些网络进程一定会断掉。每次都要重新开启太麻烦了。于是我就想把两个进程转移到 VPS 上。
在 VPS 上设置好这两个进程之后,首先仍然在电脑上测试一下全局代理(把所有 127.0.0.1 换成 VPS 的 IP)。傻眼了,所有的网站都上不去了,说明 SOCKS 服务设置不对。
再次询问 ChatGPT,这回没有胡说八道:ssh -D
默认只认本地的 SOCKS,想要让它侦听远程来源的 SOCKS 访问请求,需要给 SOCKS 命令加上 0.0.0.0,即 ssh -D 0.0.0.0:1080
,此时就可以侦听远程来源的 SOCKS 访问请求。
设置之后,再测试全局代理成功。然后 VPS 本身有标准的 HTTP 服务,托管 proxy.pac
文件,把 URL 填入系统设置里面。测试成功。
VPS 对外是公网 IPv4 的地址,如果被黑客扫到 SOCKS5 代理的端口号,那问题会非常严重,他们只需要用 IP + 端口号就可以无限制利用我的微型 VPN,不需要任何验证。
虽然 SOCKS5 代理也有用户名和密码验证机制,但是比较麻烦。所以我决定转移三线:把 VPS 换成我的 OpenWRT 路由器!
在 OpenWRT 上运行 ssh -D 0.0.0.0:1080
….. 之类的命令,PAC文件则使用 OpenWRT 内置的 uhttpd 来进行托管。由于路由器在内网,虽然也写成了 0.0.0.0,但实际上只有自己能够访问,外面的人无法访问。如果自己不在家里而是在外面,则用 WireGuard 翻回家里即可。
黑客攻破 WireGuard 密钥的概率基本为0,这下子应该安全了。
虽然 PAC 文件是在当前某个 Wi-Fi 的菜单里面点进去设置的,但是它对所有 Wi-Fi 都是默认生效的,和我预期的不同。因此在外面网络环境下,需要一直连着 WireGuard 才行,否则系统无法从内网 IP 获取 PAC 文件,就不能正常上网。这也太浪费了吧!我只是偶尔用到这个 VPN 而已,就要一直开着 WireGuard?
于是就想出了 二线 + 三线的策略:PAC 文件放在 VPS 上,采用 https://mydomain.com/proxy.pac
的 URL,填入 macOS 系统的网络设置里面。而 proxy.pac
的文件的 SOCKS 代理地址则写路由器的内网地址。这样子就算是即方便又安全了。无论是在家里还是在外面,PAC 文件都能访问到,因此不影响正常上网。需要访问 VPN 时,就连上 WireGuard 进入家庭局域网,即可连接 SOCKS 代理。
太阳能发电很多人都熟悉,发的电可以:
但是燃气发电就相对来说比较罕见了。
燃气发电(日语:エネファーム)的设计理由是:太阳能发电只能在阳光充足的时候起作用,如果遇到连续的阴雨天(在特定季节很常见),发电量就会大打折扣,无用武之地了。相比较而言,燃气供应是全天候的,不受天气的影响,所以相对来说比较稳定。但是——且慢!
可能你很快就会提出反驳意见:太阳光是不要钱的,可是燃气是要钱的啊!那等于原来交给电力公司的电费现在变成了交给燃气公司的燃气费,有什么区别?而且多了一道转换手续,能量不是损失更多了吗?所以设计者就提出了如下方案:
上图是我家的燃气发电设备,由两台机器组成。左边是发电机和热水罐,右边是燃气热水器。因此就得提一下热水的问题。
普通家庭用的燃气热水器,如果把终端的水龙头(例如浴室的花洒🚿、厨房或洗脸台的热水龙头🚰)调到最热的一档,会感觉非常烫手,因为水温太高了。然而事实上对于洗热水澡、洗脸、以及冬天厨房洗碗洗菜来说,并不需要这么高的水温,令人感觉不冷就可以了,还能避免小孩子烫伤。因此,带有燃气发电设备的燃气热水器,其默认设置的最高水温是 40℃,这是令人感觉暖和而完全不烫手的温度。
冬天,自来水的温度接近 0 ℃,由于燃气发电时会产生热量和水(燃气中的氢元素和空气中的氧反应),这些热水和一部分自来水混合后形成温度大约为 20℃ 的温水,储存在左边发电机内部的热水罐里。等到用户需要用热水、打开终端的热水龙头后,右边的燃气热水器开始工作,把水继续从 20℃ 加热到 40℃。这样所消耗的燃气量,比起普通的燃气热水器一下子把水从 0 ℃ 加热到 60 ℃(烫!)要少得多。夏天由于自来水本身接近 20℃,则发电热量会把水温加热到 30℃ 左右保存起来。此时用户开热水时消耗的燃气量会更少(只需要从 30℃ 加热到40℃)。当然夏天洗菜洗碗洗脸不需要热水,但洗澡还是要用的。
我家的燃气发电最高功率是 700W。家庭总用电功率低于 700W时,它的发电量会随着用电功率动态变化,用多少电发多少电,这意味着完全不会再消耗额外的电力。超过 700W 时再用电力公司提供的额外的电。当然这个最高功率也不是恒定不变的,有时也会遇到发电只有 200W,剩余的电都走电力公司的现象。
我家是同时安装了太阳能发电和燃气发电。如果是晴天的白天,两者一起工作时,家庭用电会首先走燃气发电,超过部分(一般是超过 700W 时)再走太阳能发电。再超过时才走电力公司的电。由于太阳能发电功率高达 5000W,叠加燃气发电就是 5700W,对于我家来说是一个永远也达不到的值,所以晴天的早上7点到下午6点基本不会消耗额外的电。
然而燃气发电毕竟是消耗燃气费的,太阳充足的前提下我还是希望尽可能用太阳能发电,所以就学会了一招 —— 看天气预报行事。例如,晴天就开空调取暖、用电磁灶烧菜,阴雨天就开地暖来取暖、用燃气烧菜。有效利用天气之后,冬季一个月的“自费用电量”可以压缩到 70 度以内,这对于两层楼的独栋房子来说还是能接受的。
工作用的服务器不能远程登陆 SSH,这是为了安全考虑大部分机构都会这么做。想要远程登陆,我们的做法是专门设置一台“跳板机”进行中转登陆。可惜昨天“跳板机”出故障坏掉了,自然无法远程登陆了,维修需要在下周进行。那么我是不是只能到现场上班、无法远程工作了呢?当然不是,我想到了 cloudflared。
操作方法很简单,问 ChatGPT 就可以了。用英文提问会得到更加准确的回答。在提问时要指出来自己没有 root 权限,它就会告诉你每一步的操作步骤。简单来说就是:
VS Code 上自从有了 AI 辅助编程(代码补全)之后确实方便了很多。但也许是用的人多了,供应方觉得被薅羊毛太狠了,就开始对免费用户下手了。
我最开始使用的是 Codeium,大约用了半年还是一年(忘了)没出过问题,但就在最近一个月频繁出现 snoozing 错误。snoozing 这个单词查了才知道是“打盹💤”的意思。问题是你这是💤吗?这明明就是一睡不醒了。
我曾经写文章讲过关于 emoji 的事情,我的 Blog 里面现在就充满了 emoji 字符。今天又遇到一件特别令人惊讶的事情:有些机构在短信验证码里面居然会使用 emoji 字符。