最近SSR实在太不稳定了。断断续续的十分难受。于是,趁着还能上的时间,查询新的翻墙方法。经过测试,决定使用Trojan的方式。
原理
Trojan原理
Trojan服务器获得HTTP请求,如果请求的格式正确,就返回代理的数据,否则就返回HTTP网页,这样在第三方看来Trojan就和一台HTTP服务器没区别。
虽然Trojan可以伪装为HTTP服务器,但是它的服务很基本,比如根本不支持虚拟多站点,只能伪装成一个站点。
因此,(为了省钱,)我们还需要另外搭配Nginx来使用。
Trojan+Nginx多站点原理
HTTP访问Nginx,开启了预读模块的Nginx,会对数据流进行分析,如果访问的域名是Trojan预先定义的域名,就访问内部的Trojan端口。否则则访问Nginx的端口。有以下几点需要注意:
- Nginx的预读模块本身使用的是443端口,而Nginx模块的HTTP服务使用是4443端口。这是因为,我们需要外部访问服务器时,统一使用443端口,而在服务器内部,通过内部的端口进行中转。
- 对于外部(比如防火墙或其它类似设置),理论上我们只需要开启443端口。但是在实际使用中,我发现有些域名会自动跳转到4443端口,因此如果你遇到外部无法访问特定域名的问题,可以开放4443端口试试。
- Trojan默认跑在443端口,但是为了配合Nginx使用,需要修改到其它端口,我这里选的是4433端口。
- 这个原理,整体来说,就是在外部看来,统一访问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多站点
假设你有一个网站叫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是默认开启的,不用单独开。