肇鑫的日常博客

日常

ClashX配置Trojan

更新说明

  • 将ClashXR,因为Clash核心支持SSR之后,ClashXR宣布放弃后续开发。(更新日期2020年9月17日)

安装

brew cask install clashx

配置

  1. 打开ClashX。
  2. 点击菜单栏的图标,配置->打开本地配置文件夹
  3. 复制config.yaml,修改为trojan.yaml
  4. 使用编辑器打开trojan.yaml

Proxy:下,添加新内容:

Proxy::
-   name: "tro"
    type: trojan
    server: server # 服务器的IP地址
    port: 443
    password: yourpsk #密码
    # udp: true
    sni: tro.example.com # 用于trojan识别的二级域名
    # alpn:
    #   - h2
    #   - http/1.1
    # skip-cert-verify: true

修改服务器ip,密码和二级域名。保存,切换配置到新配置。出站规则选全局连接,然后选择设置为系统代理

ClashXR的配置对于tab十分敏感。如果tab不对,即便配置是对的,也不会生效。
选全局代理的原因是因为ClashXR本身不自带任何规则。选全局之后,可以上几个网站尝试一下看看是不是生效了。
https://github.com/paradiseduo/ClashXR

添加规则

https://github.com/Hackl0us/SS-Rule-Snippet/blob/master/LAZY_RULES/clash.yaml

上面的是其它人提供的一个Clash的模板,需要规则的,可以从上面复制规则到你自己的配置中。规则从Rule:开始一直到结尾。复制粘贴规则时,同样要注意到tab。

它的规则中定义了Proxy,我们原本的配置里没有。因此我们需要添加。找到Proxy Group:,添加如下的内容。

Proxy Group:
# select 用来允许用户手动选择 代理服务器 或 服务器组
# 您也可以使用 RESTful API 去切换服务器,这种方式推荐在 GUI 中使用
  - name: Proxy
    type: select
    proxies:
      - tro

添加好规则后,重新加载配置,我们就可以将全局连接改成规则判断了。

https://lancellc.gitbook.io/clash/clash-config-file/proxies/config-a-torjan-proxy

其它

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

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

不建议购买混合多口的PD快充

由于之前的事情,iPad Pro 9.7无法充电之后发生的事,这段时间我使用过多款混合多口(1A1C,2A1C)PD快充充电器。最终,我把混合多口的充电器都退货了,选择了单口的充电器。

充电器的选择,多口VS单口

选择多口的充电器,不仅可以在插排上节约多个接口,并且旅行时,也可以少带几个充电器,减轻重量,这也是为什么大家都喜欢选择多口的充电器。

我以前也买过多口的充电器,比如紫米的18W双A口充电器,就很好用。因此,在选择C口PD快充充电器的时候,我最初也是选择了多口的。结果2A1C的63W绿巨能充电器和1A1C的30W omthing充电器,都让我失望了。

我们先来了解一个概念——打嗝。

打嗝是支持多协议的充电器,在与设备连接,匹配最佳协议时,不能第一时间获得最佳协议的而产生的多次匹配充电协议的状态。其表现是充电设备显示瞬间断电并再次充电。

比如,一款充电器,支持5V1A,5V2A,Apple 2.4A,PD快充18W,那么它在与苹果的iPhone连接时,可能一开始并没有直接匹配到PD快充18W,而是使用了5V2A连接上了。之后,它又检测到设备实际上支持PD快充的,最终采用PD快充18W进行充电。

这个过程,表现在iPhone上,就是一开始发出充电的嘟的一声,然后很短的时间内,又发出嘟的一声。

小结

打嗝本来是一种设计缺陷。但是由于它过于普遍,居然被网友们认为是正常的,更有甚者,认为只有打嗝了,出了两声嘟,才是真正的PD快充,只有一声就是快充不成功。

这种错误观点甚至造成了在技术进步之后,有些充电器,直接一次就连上PD快充了,还要在产品的购买的页面额外注明,一声还是两声嘟不能作为PD快充是否成功的证据,唯一的证明是在0%充电,30分钟能够充50%就是PD快充。

混合多口

以前的多口,都是多个A口,所以是属于单一多口。但是现在随着PD快充的普及,目前的多口充电器,多口多是混合多口。即又有A口,又有C口。

但是A口和C口不是简单的外观不同。实际上,混合多口充电器,在技术的复杂性上,要高于单一多口。而每个接口本身又是支持多协议的,厂家为了成本,多口之间肯定是有共享的电路,而不是设计两套单独的电路。这也就造成了,混合多口之间,是互相干扰的,最明显的就是,单口输出的时候,充电器的上限高于多口同时输出。比如63W的绿巨能充电器,多口同时使用,最高输出只有45W。而30W的omthing充电器,多口同时使用,最高也只有25W。

这种干扰还体现在当一个口在充电时,如果你再使用另一个口充电,前面充电的会瞬间断流,并重新匹配协议。

这些问题,在我之前使用的单一双A口充电器的时候,都没有出现过。

更严重的断流问题

特别的,我在使用iPhone 6s Plus通过A口充电的时候,我还发现。这些混合多口的充电器,在单独通过A口充电的时候,会随机出现断流的情况,特别的,在小电流的时候尤其明显。比如这两款充电器,在手机充电99%以上的时候,都不同程度地出现了瞬间断流的问题。特别的,如果C口同时还有设备在充电,这种瞬间断流会更加频繁。

结论

基于上面的理由,我建议大家在购买PD快充的时候,尽量选择单口的充电器。单口的充电器不仅可以达到标称的上限,并且由于设计更为精简,出现打嗝的几率更小,更不会有混合多口充电器互相干扰的问题。

此外,如果还是要选多口的产品,建议你直接购买单一多口的充电器,即多个C的PD快充,而不要购买混合多口的。

因为即便是不支持PD快充的iPhone,也可以通过C转L的充电线,使用支持Apple 2.4A协议的充电器进行快速充电。

不过有一点要注意。即便你的充电器支持Apple 2.4A的协议,也需要C转L线同时支持也才可以。我以前以为不需要线的配合,后来我遇到了有不支持的线,导致虽然充电器支持,也还是无法使用Apple 2.4A快充的情况。

其它

iPad Pro 9.7无法充电之后发生的事