肇鑫的日常博客

肇鑫 / Owen Zhao

独立开发者,主要开发 iOS、watchOS、macOS 应用。

目前在维护 SleepTapRooster Time,以及 Markdown Writer 相关工具。

最新文章

Ubuntu 18.04下将Apache2多站点改为Nginx多站点,同时开启Trojan

技术

最近SSR实在太不稳定了。断断续续的十分难受。于是,趁着还能上的时间,查询新的翻墙方法。经过测试,决定使用Trojan的方式。

原理

Trojan原理

trojan原理

Trojan服务器获得HTTP请求,如果请求的格式正确,就返回代理的数据,否则就返回HTTP网页,这样在第三方看来Trojan就和一台HTTP服务器没区别。

虽然Trojan可以伪装为HTTP服务器,但是它的服务很基本,比如根本不支持虚拟多站点,只能伪装成一个站点。

因此,(为了省钱,)我们还需要另外搭配Nginx来使用。

Trojan+Nginx多站点原理

Trojan+Nginx多站点原理

HTTP访问Nginx,开启了预读模块的Nginx,会对数据流进行分析,如果访问的域名是Trojan预先定义的域名,就访问内部的Trojan端口。否则则访问Nginx的端口。有以下几点需要注意:

  1. Nginx的预读模块本身使用的是443端口,而Nginx模块的HTTP服务使用是4443端口。这是因为,我们需要外部访问服务器时,统一使用443端口,而在服务器内部,通过内部的端口进行中转。
    1. 对于外部(比如防火墙或其它类似设置),理论上我们只需要开启443端口。但是在实际使用中,我发现有些域名会自动跳转到4443端口,因此如果你遇到外部无法访问特定域名的问题,可以开放4443端口试试。
  2. Trojan默认跑在443端口,但是为了配合Nginx使用,需要修改到其它端口,我这里选的是4433端口。
  3. 这个原理,整体来说,就是在外部看来,统一访问443端口。然后Nginx的预读,会分流转发到Trojan和Nginx。

安装

卸载Apache2

sudo apt remove apache2
sudo apt autoremove

删除apache2,之后删除掉不再需要的依赖。

安装Nginx

Ubuntu 18.04自带的Nginx本身没有开启ngx_stream_ssl_preread_module。我们安装Nginx官方提供的版本,这个版本开启了所有的可开启扩展。

sudo vi /etc/apt/sources.list

在文件最下面添加并保存

# for latest nginx
deb http://nginx.org/packages/mainline/ubuntu/ bionic nginx
deb-src http://nginx.org/packages/mainline/ubuntu/ bionic nginx

添加服务器签名,签名在这里nginx_signing.key。点开前面的网页,复制里面的文本内容,保存到nginx_signing.key。不要直接下载。因为是网页,不是纯文本。

sudo apt-key add nginx_signing.key

安装Nginx并开启防火墙端口

sudo apt update
sudo apt install nginx
sudo ufw allow 'Nginx Full'

你现在可以打开浏览器,然后输入vps的ip地址,如果看到了nginx的欢迎界面,就代表nginx配置成功了。

nginx: Linux packages

配置Nginx多站点

假设你有一个网站叫example.com,网页位置在/var/www/html/example.com/html。新建一个配置文件。

sudo vi /etc/nginx/sites-available/example.com

内容如下

server {
	listen 80;
	listen [::]:80;

	server_name example.com www.example.com;

	root `/var/www/html/example.com/html;
	index index.html;

	location / {
		try_files ``uri ``uri/ =404;
	}
}

我们不用添加443端口,因为等下添加证书的时候,Certbot会帮我们自动生成新的配置文件。

将网站配置生效

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enable
sudo systemctl reload nginx

参考上面的步骤,添加你所有的站点。之后,再额外添加一个站点,用于Trojan的识别。

最后添加的站点,一定要是一个不需要用的二级域名,而不要使用一级域名。因为我发现Nginx的预读有bug。如果你使用了一级域名,那么它的二级域名也都会匹配。这将导致错误。
一级域名指的是example.com这种,二级指的是mail.example.com这种。

这里我们假设额外配置一个叫tro.example.com的二级域名站点。

为Nginx添加SSL证书

通过浏览器访问网站https://certbot.eff.org,选择Nginx和Ubuntu 18.04,安照网站的提示安装certbot。

sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository universe
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install certbot python3-certbot-nginx

申请证书

sudo certbot --nginx

按照提示进行操作。完成之后,你再通过浏览器访问网站,你会发现已经是https的了。

安装Trojan

sudo bash -c "$(curl -fsSL https://raw.githubusercontent.com/trojan-gfw/trojan-quickstart/master/trojan-quickstart.sh)"

修改Trojan配置

sudo vi /usr/local/etc/trojan/config.json

找到"local_port",将443,改成4433或者你希望的端口。
找到"password",修改为你想要设置的密码。
找到"ssl",将"cert"设置为“/etc/letsencrypt/live/example.com/fullchain.pem"。将"key"设置为"/etc/letsencrypt/live/example.com/privkey.pem"。

保存并退出。运行Trojan。设置为开机启动。

sudo systemctl start trojan
sudo systemctl enable trojan

配置Trojan+Nginx共存

sudo vi /etc/nginx/nginx.conf

在events和http两段之间,插入

stream {
    map ``ssl_preread_server_name ``name {
        tro.example.com trojan;
        default nginx;
    }
    upstream trojan {
        server 127.0.0.1:4433;
    }
    upstream nginx {
        server 127.0.0.1:4443;
    }
    server {
        listen 443;
        listen [::]:443;
        proxy_pass $name;
        ssl_preread on;
    }
}

保存,修改之前设置的所有网站的设置。打开/etc/nginx/sites-enable/中所有的网站的配置,将所有的443端口,改成4443端口,然后保存。

sudo systemctl reload nginx

在好多支持Trojan的客户端中,域名是可选的。但是由于我们需要使用域名来进行跳转,所以在设置客户端时,域名是必填的,必须填写为tro.example.com
Module ngx_stream_ssl_preread_module

开启BBR

sudo echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
sudo echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
sysctl -p

Ubuntu 18.04/18.10快速开启Google BBR的方法
19.04开始,BBR是默认开启的,不用单独开。

其它

Ubuntu 20.04下安装Nginx与Trojan

ClashXR配置Trojan

macOS Sonoma默认开启磁盘静态加密

技术

昨天将主力系统从macOS Ventura升级到了Sonoma beta 5。今天时光机备份的时候,弹出了一个通知,提示:正在将加密磁盘备份到非加密磁盘。

我很诧异。很多年前,我因为好奇,开启过macOS的磁盘加密功能。后来系统坏掉了,加密的磁盘怎么也进不去,丢了不少资料。打那个时候起,我就不再使用磁盘加密功能了。因为在我看来,加密磁盘对我自身造成的麻烦,大于它给的收益。

所以,我的磁盘是没有使用加密的。难道是升级到新系统之后的那些设置里,有有关磁盘加密的,我没注意就激活了吗?带着这个疑问,我打开设置进行查找。结果“文件保险箱”功能并没有打开,所以我的磁盘并没有全盘加密。

然后我又查看磁盘状态,结果看到了这个:已加密的设置是“否(已静态加密)”。

disk_encryption

我不懂什么是静态加密,于是查询了一下。按照我的理解,这个静态加密,比较类似iPhone上的默认加密。就是当用户没有登录的情况下,磁盘数据是被保护的。只有登录之后,磁盘上的数据才被解锁,才可以访问。

作为对比,我又看了我另外一台还停留在Ventura下的Mac。它的磁盘状态对应的已加密,只有一个简单的“否”。

结论:macOS Sonoma增加了磁盘的安全性。除了以前的文件保险箱功能之外,还提供了默认的静态加密。当然,我不清楚这个特性是不是苹果芯片的Mac独占的,还是英特尔芯片的Mac也有。

macOS Sonoma 14 beta 安装在外置硬盘的方法

技术

WWDC2023来了,新系统也来了。不过安装新系统到外置硬盘却出了问题。经过一天的尝试,我终于解决这个问题。如果你有幸看到这个文章,你也许可以节省掉一个购买雷电3硬盘盒的钱。

安装方法

  1. 下载macOS 14的安装包。
  2. 解包,来到应用程序,找到installer,双击安装。
  3. 选择预先格式化好的磁盘分区进行安装。

这里第一个问题就是苹果并没有提供installer的安装地址。苹果官网只提供了恢复固件。我们可以从这里下载:

https://mrmacintosh.com/macos-sonoma-full-installer-database-download-directly-from-apple/

如果你使用的是usb-c的硬盘盒,一定要看这个!

macOS在使用外置的usb-c的硬盘盒时,如果你同时连接的Mac的usb-c接口,那么有概率安装系统之后,却没法从外置硬盘启动。解决办法是,换线,连接Mac的usb-a接口,然后重装外置硬盘的系统。

  • 如果是usb-c的外置硬盘
    • 连接type-c接口的Mac出现问题
    • 更换type-a接口的Mac,重新装macOS,问题解决
    • 如果是没有type-a的Mac,那么只能使用雷电3接口的硬盘盒。

最后的最后

虽然usb-a的兼容性更好,但是usb-a接口在Mac下的速率只有5Gbps,所以,在发现macOS可以正常启动之后,我尝试将线换回去,重新连到usb-c接口。结果这次,还是能正常启动。而且速度是10Gbps的。

虽然理论上10Gbps是5Gbps的二倍,但是实际使用中,是接近3倍。900MB/s和不到350MB/s。因此强烈建议macOS安装好之后,将线换回去c2c的。

How to install macOS on an external drive

苹果芯片Mac系统降级避坑指南

技术

两天重装了4次macOS,终于搞定了苹果芯片Mac的降级。

起因

升级到macOS 13.3之后,蓝牙相关的好多写作功能都失灵了。比如iPhone热点、接力、手表解锁Mac等。于是想要降级会13.2。

过程

最初的想法很简单。下载macOS 13.2.1安装包,制作安装优盘,然后覆盖安装即可。不过,覆盖安装的时候,提示不能降级。想使用时光机的时候,则提示,时光机不能直接降级,只能用于融合助手。于是只好格盘安装。格盘提示格盘之后会重启系统。

格盘之后的重启是个大坑

我跌进去了三次才最终发现这个坑。一开始,每次融合之后系统都是13.3,而不是13.2.1,我反复核对,发现我的安装盘没问题,选择的时光机镜像也是正确的日期。难道是苹果在后台自动升级了?

结果不是。原因是这个格盘之后的重启。虽然使用的优盘的恢复系统格式化的磁盘,但是重启后自动引导,不是优盘,而是系统默认的恢复。

与英特尔的Mac不同,苹果芯片的Mac不能通过长按键盘快捷键选择启动磁盘,而必须使用长按电源按钮的方式。
因为重启之后我没有长按电源按钮,所以就进入了Mac内置的恢复功能。
但是如果我长按了电源按钮,因为是重启而不是冷启动。电脑会在几秒后强制关机。然后需要再次长按,直到进入选择启动磁盘,然后选择优盘安装即可。

如何分辨是系统启动磁盘安装,还是优盘安装

最明显的是,系统启动磁盘安装是英文版,安装一开始提示还有2个多小时。而如果是优盘安装,安装界面是中文的,而且一开始提示的安装时间不到1小时。

后面就都一样了,不再赘述。

macOS备份策略(2023修正版)

技术

长久以来,我一直同时使用时光机和CCC(Carbon Copy Cloner)来对我的系统进行备份。这种双备份的策略能够兼顾备份和恢复的效率,同时还能支持文件的多个版本进行恢复。

最近,我从Intel版本的Mac,过渡到了苹果芯片的Mac。苹果芯片的Mac,对于很多方面进行了改变,这导致原本的备份策略不再完全适用。因此,写下此文进行小结。此文分Intel芯片篇和苹果芯片篇。

Intel芯片篇

时光机

无论你是使用何种备份方式,时光机都是首要推荐的。不仅是因为它是系统自带的,完全免费,而且它真的好用。

使用时光机备份,只需要打开时光机,选择合适的备份磁盘就可以了。相比较于网络备份,我更推荐使用移动硬盘。因为后者的备份/恢复速度更快。有条件的,可以直接使用移动固态硬盘进行备份,这样恢复的时候,你能体验到飞一般的感觉。

时光机的另一个主要功能,是用于单独文件/文件夹的恢复。只需要点击时光机,选择要恢复的时间,然后选择指定的文件或者文件夹,最后选择恢复就可以了。

CCC

CCC是我常用的备份恢复工具。我将它设置为每天上午七点半自动备份。相比于时光机,它的优势是恢复系统的时间更短。另外,通过传统模式备份的CCC备份,包含完整的系统,可以直接从备份盘启动。

CCC备份的问题是,传统模式备份的CCC备份,包含的系统是不会随着源盘的系统进行升级的。如果你想将系统也同时升级,就只能格盘重新运行一遍全新的传统模式备份。

苹果芯片篇

时光机的部分参考Intel芯片篇,不再赘述。

CCC

苹果芯片的Mac从外置硬盘启动时,修改了启动策略。对于苹果芯片的Mac,要想从外置硬盘启动,Mac的内置硬盘必须包含完整的系统,然后使用内置硬盘系统中的管理员账号授权,才能从外置硬盘启动。

这直接导致了,苹果芯片的Mac,是无法直接从外置硬盘启动系统的。这样,在外置硬盘保存完整的系统并用于单独启动的可能就变小了。为此,CCC也在文档中说明,在目前的Mac中,相对于传统备份方式,更推荐标准备份。标准备份只备份所有数据,不包含操作系统本身。因此不能用于单独启动,但是因为苹果芯片的Mac在系统挂掉的情况下,本来也不能从外置硬盘启动,因此可以说是没啥影响。

所以,如果你使用的是苹果芯片的Mac,并且没有多系统的需求。那么直接使用CCC的标准备份就可以了。如果你需要使用多个版本的Mac,那么还是使用传统备份,格式化硬盘,然后备份完整的系统。这样在内置系统完整的情况下,还是可以多系统启动的。

2023年1月31日更新

这两天遇到了一个新情况。之前原本能够成功启动的移动硬盘里的macOS Ventura无法启动了。并且重新制作也无法启动成功。没办法,我写了邮件给CCC,询问原因。

CCC的客服回复说,就目前M1芯片的苹果电脑。CCC的传统备份,仅支持备份完成之后立即使用这种形式。不再推荐长期使用这种方式进行备份,并随时准备从外置硬盘启动的情况。

有鉴于此,今后CCC的备份,推荐默认的备份方式。不再推荐传统备份的方式。传统备份,仅在大版本改变时推荐。即比如macOS 13升级到14之前,可以用传统备份,保存一个macOS 13的版本,单独保存。这样,可以双启动。

截屏2023-01-31 20.18.12

路由安装ShellClash后,设置方面的一些小结

技术

这段时间一直使用路由翻墙,重中之重是ShellClash的各种设置。设置好了,一切正常,设置冲突,可能就上不了网了。我并没有所有的设置都尝试过,因此,这只是我体验过的部分设置。

ShellClash的能力和限制

ShellClash可以代理TCP和UDP的流量。TCP的流量可以通过转发和TUN的方式,UDP的流量只能通过TUN的方式,但UDP必须是通过域名访问,直接通过IP访问的ShellClash会略过不处理。

模式、内核和设置

ShellClash的模式、内核和设置,是彼此相关的,你在设置时需要仔细阅读说明,考虑到他们之间的匹配性。

Redirect模式、官方内核、redirect DNS运行模式

官方内核占用的资源最小,但是功能也最精简。仅支持redirect模式和redirect DNS,能够代理TCP流量,对于UDP流量不做处理。

混合模式、Pre内核、fake-ip DNS运行模式

Pre内核功能更多一些,因此也占用更多的内存。除了可以代理TCP流量,UDP流量也可以通过TUN的方式进行代理。需要注意的是,此时必须选择fake-ip的DNS运行模式,不然UDP的流量还是无法代理。

TUN模式、Pre内核、fake-ip DNS运行模式

和上面的类似,但是TCP流量也不再使用转发,而是同样适用TUN的方式。

使用这个模式的时候,Telegram会上不了网。这是因为它是采用IP直连,会被TUN给略过。可以在Telegram的设置里,手动指定代理,方法就按照原的socks5的方式进行设置就可以。
此模式下,如果Firefox无法上网,可能是因为你同时安装了AdGuard应用。可以在AdGuard中,将Firefox设置为不过滤,然后在Firefox中使用AdGuard插件即可。

定时设置

刚开始启动时,ShellClash占用的内存是最小的,随着代理的增多,消耗内存逐渐变大。我们可以通过重启ShellClash的服务来释放内存,以免内存占用过多导致路由出现问题。我设置为每天3点自动重启ShellClash服务,因为那时我一般都在睡觉。

其他

ShellClash还有其他的一些模式和内核,但是由于我都没有尝试过,就不进行说明了。另外,本文针对的是1.6.8内测版。

Mac睡眠时经常异常唤醒问题的处理

技术

问题

最近从英特尔芯片的iMac 5K,换成了苹果芯片的Mac mini。一切都好,就是电脑在睡眠之后,经常会异常唤醒。表现为显示器由黑转亮,同时显示为无信号;键盘背景灯变亮;外置机械硬盘启动,发出噪音。然后几秒后,电脑又睡眠了。这个过程在电脑睡眠不久就会出现,而且会连续多次出现。

这个问题对于Mac mini这种无电池的台式机还算是小问题,最多就是有点儿烦人,费些电。但是如果是使用电池的Macbook,问题就严重多了。论坛上甚至有人反馈说,自己的电脑的电池电量,一小时就耗光了。

处理

确定了问题,就要研究如何处理。网上有很多种说法。甚至苹果自己也专门为这个问题开了技术说明。

如果 Mac 意外睡眠或唤醒

你可以先尝试使用苹果的提供的方法,如果还是没能解决你的问题。你再来使用我的方式。不过,我更建议你先使用我的方式进行调查,确定原因了之后,再使用苹果的或我的方式进行处理。

分析问题

网上对于这个问题的分析有多个思路。比如利用各种日志,通过命令行过滤来查询是什么原因唤醒了系统之类的。这些方法能查到原因,但是那些原因,一般都写得很技术,往往需要上网去查是什么意思,而且指向虽然有了,但是好多却不具备可操作性。

这里,我们采取更直接的方式,直接使用pmset来进行电源设置的查询。

我注意到Ventura下M1芯片的Mac min的节能设置中,并没有Power Nap的选项。我以为是Ventura的原因,毕竟我用M1不久。但是后来我在论坛上看到,有网友指出,苹果在M1芯片的Mac,移除了Power Nap的选项。我猜测,苹果大概是认为M1芯片的Mac足够省电,所以就把这个选项移除了。保持默认开启状态。

这个是我目前正常,没有异常唤醒状态的电源设置

zhaoxin@zhaoxins-Mac-mini-M1 ~ % pmset -g
System-wide power settings:
Currently in use:
 disksleep            10
 powernap             0
 womp                 1
 networkoversleep     0
 sleep                1 (sleep prevented by powerd, mds_stores)
 Sleep On Power Button 1
 ttyskeepawake        1
 tcpkeepalive         0
 autorestart          0
 standby              0
 displaysleep         10

每个选项的具体含义,可以参考下面的链接。

pmset
另外提一下第8行的sleep项,如果你的系统无法睡眠。那可能是有应用阻止了它睡眠。你可以看看这一行括号里的应用。这些应用都是可能阻止系统睡眠的。注意,是可能,而不是一定。所以你可以先尝试将能关闭的应用先关闭了,然后再来重新执行pmset -g这个命令,看看是不是生效了。然后再次尝试睡眠。

我的Mac mini,因为是从英特尔平台的系统迁移过来的,所以powernap默认时关闭的,如果是全新安装的系统,这一项应该是开启的。此外tcpkeepalive默认是开启的。在我的系统中,这一项的开启是导致系统的在睡眠后还被频繁唤醒的主要原因。

我的理解是,当系统睡眠后,如果tcpkeepalive还开着,那么系统就会因为各种通知唤醒。同时,由于苹果系统中的一些bug,一些可能具备网卡功能设备,比如各种USB设备(因为存在USB网卡这种设备),也能将系统唤醒。比如,我就在日志中发现,系统被我的M.2的外置移动硬盘唤醒过。

sudo pmset -a tcpkeepalive 0
sudo pmset -a powernap 0 // 如果有需要的话

现在再睡眠你的电脑,应该就不会有异常唤醒了。

New macbook Pro M1 chip waking when asleep with log "SMC.OutboxNotEmpty" wake reason

苹果芯片版macOS虚拟机的安装方法

技术

改用苹果芯片的macOS之后,连虚拟机都不会装了。一开始用VM Fusion,提示架构不对。于是又安装了Arm64的VM Fusion技术预览版,还是提示架构不对。

后来理解了,原来之前安装时一直用的pkg格式的安装包也不能用了,因为它是x86架构的。需要下载IPSW格式Arm版专用的。

虚拟机换成UTM,下载Monterery的IPSW刷机包。这次终于安装上虚拟机了。而且这个虚拟机占用还挺小了。我分配了4GB的内存,100GB的磁盘空间。结果运行虚拟机的时候,我的16GB内存的Mac mini居然都不需要启用交换分区。证明这个虚拟机内存占用还蛮少的,然后CPU的占用率也才50%,风扇也没转。看起来这个UTM还是不错的。

之所以安装这个,是因为有时候我向苹果报bug的时候,需要进行系统之间的对比。安装一个虚拟机,就不必经常在不同系统间进行切换了。

需要注意的是,安装好虚拟机之后,需要第一时间跑到时光机和CCC里,把虚拟机所在的文件夹添加到排除文件里,不要进行备份。因为这个文件夹有100多G,每次变动,这100多G就需要重新存储,所以还是不要备份了。需要的时候我重装一下就好了。🐒