最佳代理实践之 trojan-gfw (2023-05-14)
Proxy
2023-05-14 7167字

不断变化的 GFW

GFW 不断在变化, 而我们的代理策略也要一直更新, 我会定期总结 FQ 的最佳攻略, 方便自己备忘。

注意: 文中的 your_vps_ip 要换成你自己的服务器 IP 地址。

1. 配置 Trojan 代理

1.1 准备工作

1.2 VPS 安装 Debian 9

一般 VPS 都有操作系统安装服务, 安装 Debian 9 以后, 替换 /etc/apt/sources.list 文件内容为 163 镜像源, 提升软件安装速度:

deb http://mirrors.163.com/debian/ stretch main non-free contrib
deb http://mirrors.163.com/debian/ stretch-updates main non-free contrib
deb http://mirrors.163.com/debian/ stretch-backports main non-free contrib
deb-src http://mirrors.163.com/debian/ stretch main non-free contrib
deb-src http://mirrors.163.com/debian/ stretch-updates main non-free contrib
deb-src http://mirrors.163.com/debian/ stretch-backports main non-free contrib
deb http://mirrors.163.com/debian-security/ stretch/updates main non-free contrib
deb-src http://mirrors.163.com/debian-security/ stretch/updates main non-free contrib

1.3 安装 Trojan 服务端

通过命令 ssh root@your_vps_ip 登录 VPS 服务器后, 执行下面脚本自动安装和配置 Trojan 服务端:

wget -N --no-check-certificate https://raw.githubusercontent.com/mark-hans/trojan-wiz/master/ins.sh && chmod +x ins.sh && bash ins.sh

安装过程中提示“请选择证书模式”, 选择”使用 IP 自签发证书”的模式。

1.4 启动 Trojan 服务端

安装完成后, 使用命令systemctl start trojan-gfw 启动 trojan 服务端, 同时可以用命令systemctl status trojan-gfw来检查 trojan 服务端的状态, 如果状态为active(running), 证明 trojan 服务端已经启动。

1.5 拷贝服务端配置文件

trojan 服务端配置成功以后会在 VPS 的/home/trojan/目录下生成 client.json 和 ca-cert.pem 两个文件:

比如你的 VPS IP 为 xxx.xxx.xxx.xxx, 使用下面的命令来完成拷贝服务端配置文件到本机:

scp root@xxx.xxx.xxx.xxx:/home/trojan/ca-cert.pem ./

scp root@xxx.xxx.xxx.xxx:/home/trojan/client.json ./

**注意 client.json 的 local_addr 需要设置为 0.0.0.0 , 方便后面的 proxy-ns 可以正常代理。 **

1.6 下载 Trojan 客户端

下载 trojan-1.14.1-linux-amd64.tar.xz 后, 解压文件, 把 ca-cert.pem 和 client.json 拷贝到 trojan 目录下。

1.7 启动 Trojan 客户端

./trojan -c client.json 即可在 127.0.0.1:1080 建立本地代理连接, 最后通过 Chrome SwitchyOmega 来配置浏览器的代理设置。

在浏览器验证可以 FQ 以后, 你可以清除刚刚在本机 /etc/hosts 的 github 设置。

**注意 client.json 的 local_addr 需要设置为 0.0.0.0 , 方便后面的 proxy-ns 可以正常代理。 **

2. 配置命令行代理

2.1 安装 proxy-ns

proxy-ns 和其他工具的实现原理不一样的是, 它利用的是 Linux 的 namespace 来实现, 可以很好的支持进程下所有子进程的代理, 即使是那些静态编译的工具。

安装方法 yay -S proxy-ns, 用 sudo systemctl start proxy-nsd@main.service 命令启动 proxy-nsd 服务, 同时用 sudo systemctl enable proxy-nsd@main.service --now 命令加入到系统启动服务中。

备注: 因为 yay 安装 proxy-ns 的时候会调用 git 命令, 有可能导致安装不成功, 只要上面的 trojan 服务器配置好了, 可以临时用 sshuttle 来建立一个全局代理来安装 proxy-ns: sshuttle -vv --dns -r root@your_vps_ip -x your_vps_ip 0/0

2.2 禁用 IPv6

proxy-ns 新版在代理服务器支持 IPv6 时, IPv6 的流量也会走代理。 但是这个功能会导致我的代理服务器没法工作, 下面是禁用这个选项的方法: 打开 /etc/proxy-nsd/main.conf 文件, 找到 ENABLE_IPV6 选项, 改成 ENABLE_IPV6=0

用命令 sudo systemctl restart proxy-nsd@main.service 重启 proxy-ns 服务即可。

2.3 更改特定应用的启动网络配置

以 Emacs 为例, 找到 /usr/share/applications/emacs.desktop 中 Exec 字段, 在字段开头加上 proxy-ns 后, Emacs 从启动器启动后就会自动应用代理网络, 包括 Emacs 所启动的子进程。

3. 配置手机代理

3.1 安装 Igniter

  1. 在 PC 上配置好代理, 首先下载 Trojan 的安卓客户端 Igniter
  2. 使用 filebrowser-bin 这个应用来传递文件给平板
  3. 安装 Igniter

3.2 配置 Igniter

启动 Igniter 后, 按照下面的方式在平板上配置 Trojan 信息:

  1. 填写服务器别名和服务器 IP 地址
  2. 填写服务器 Trojan 协议密码, 一般在 client.json 文件中的 password 字段中
  3. 禁用 “验证证书” 选项, 因为第一步填写的是 IP 地址, 所以不用验证证书, 要不是会显示 Closed by peer 的错误

配置好以后, 点击底部链接按钮, 然后在 Igniter 右上角点击地球图标按钮先测试一下代理网络是否正常。 代理网络正常会显示 “连接 https://www.google.com 用时 xxx ms” 的提示。

3.3 增加过滤应用

在 Igniter 右上角有一个菜单按钮, 选择过滤应用, 找到对应的应用(比如浏览器), 打开过滤开关即可针对特定应用使用代理, 而不会让所有应用(比如网易云音乐)走代理网络。

4. 配置规则代理

4.1 安装 Clash

首先从 Clash 安装 Clash, Arch 直接用 pacman 安装即可。

4.2 配置 Clash

首先你需要在本地配置一个本地 socks5 代理, 比如本地 socks5 代理是 127.0.0.1 的 1080 端口(如果不是, 请修改下面配置中 proxies 字段内容), 然后新建一个 config.yml 配置文件:

# config.yml
# 本地 http(s)代理端口
port: 18080
# 本地 socks5 代理端口
socks-port: 10808
# 是否允许局域网中其他机器访问
allow-lan: false
# 仅当 allow-lan 设置为 true 时生效
# '*': 绑定所有 IP
# 192.168.122.11:绑定单个 IPV4
# "[aaaa::a8aa:ff:fe09:57d8]":绑定单个 IPV6
bind-address: '*'
# 运行模式
# rule: 基于规则
# global: 全局代理
# direct: 不代理
mode: rule
# 日志输出级别
# info / warning / error / debug / silent
log-level: info
# 当设置为 false 时, 不解析 IPV6 地址
ipv6: false
# 流量出口
interface-name: wlp4s0

# DNS 设置
dns:
  enable: false
  listen: 0.0.0.0:53
  # ipv6: false # when the false, response to AAAA questions will be empty

  # These nameservers are used to resolve the DNS nameserver hostnames below.
  # Specify IP addresses only
  default-nameserver:
    - 114.114.114.114
    - 8.8.8.8
  enhanced-mode: redir-host # or fake-ip
  fake-ip-range: 198.18.0.1/16 # Fake IP addresses pool CIDR
  # use-hosts: true # lookup hosts and return IP record

  # Hostnames in this list will not be resolved with fake IPs
  # i.e. questions to these domain names will always be answered with their
  # real IP addresses
  # fake-ip-filter:
  #   - '*.lan'
  #   - localhost.ptlogin2.qq.com

  # Supports UDP, TCP, DoT, DoH. You can specify the port to connect to.
  # All DNS questions are sent directly to the nameserver, without proxies
  # involved. Clash answers the DNS question with the first result gathered.
  nameserver:
    - 114.114.114.114 # default value
    - 8.8.8.8 # default value
    - tls://dns.rubyfish.cn:853 # DNS over TLS
    - https://1.1.1.1/dns-query # DNS over HTTPS
    - dhcp://en0 # dns from dhcp

  # When `fallback` is present, the DNS server will send concurrent requests
  # to the servers in this section along with servers in `nameservers`.
  # The answers from fallback servers are used when the GEOIP country
  # is not `CN`.
  # fallback:
  #   - tcp://1.1.1.1

  # If IP addresses resolved with servers in `nameservers` are in the specified
  # subnets below, they are considered invalid and results from `fallback`
  # servers are used instead.
  #
  # IP address resolved with servers in `nameserver` is used when
  # `fallback-filter.geoip` is true and when GEOIP of the IP address is `CN`.
  #
  # If `fallback-filter.geoip` is false, results from `nameserver` nameservers
  # are always used if not match `fallback-filter.ipcidr`.
  #
  # This is a countermeasure against DNS pollution attacks.
  # fallback-filter:
  #   geoip: true
  #   geoip-code: CN
  #   ipcidr:
  #     - 240.0.0.0/4
  #   domain:
  #     - '+.google.com'
  #     - '+.facebook.com'
  #     - '+.youtube.com'

  # Lookup domains via specific nameservers
  # nameserver-policy:
  #   'www.baidu.com': '114.114.114.114'
  #   '+.internal.crop.com': '10.0.0.1'
proxies:
# 代理服务器配置, 更多的代理设置请查看: https://lancellc.gitbook.io/clash/clash-config-file/an-example-configuration-file
  - name: "local-socks5"
    type: socks5
    server: localhost
    port: 1080

proxy-groups:
  # 组策略
  # url-test 自动选择最快的节点进行访问.
  - name: "auto"   #策略名
    type: url-test
    proxies:
      - local-socks5
    # tolerance: 150
    url: 'http://www.gstatic.com/generate_204'
    interval: 300

rules:
# 规则策略
# 当一级域名是 google.com 时使用 auto 策略
  - DOMAIN-SUFFIX,google.com,auto
  - DOMAIN-SUFFIX,github.com,auto
  - DOMAIN-SUFFIX,github.io,auto
  - DOMAIN-SUFFIX,gitee.com,DIRECT
  - DOMAIN-SUFFIX,emacs-china.org,DIRECT
  - DOMAIN-SUFFIX,ruby-china.org,DIRECT
  - DOMAIN-SUFFIX,baidu.com,DIRECT
# 当域名含有关键词 google 时使用 auto
  - DOMAIN-KEYWORD,google,auto
  - DOMAIN,google.com,auto
# 当一级域名是 ad.com 时拒绝访问, 可以用于屏蔽广告
  - DOMAIN-SUFFIX,ad.com,REJECT
# 内网服务 ip 不走代理
  - SRC-IP-CIDR,192.168.1.0/32,DIRECT
  - SRC-IP-CIDR,10.0.0.0/8,DIRECT
# 可选参数 "no-resolve" , 基于 IP 的规则 (GEOIP, IP-CIDR, IP-CIDR6)
  - IP-CIDR,127.0.0.0/8,DIRECT
  - GEOIP,CN,DIRECT
# 目标端口是 8888 时, 直接访问不走代理
  - SRC-PORT,8888,DIRECT
# 默认规则
  - MATCH,auto

接着运行命令 clash -f config.yml 来启动 Clash, Clash 会对外暴露一个 http 类型的 18080 端口代理。

机场的使用方法

在国内, VPN 协议基本上全军覆没, 因为 GFW 根据 VPN 协议和 VPN 供应商的 IP 地址就很容易进行封锁, 虽然 VPS 方便安全, 但是 VPS 有一个问题是, 如果目标网站封锁了购买 VPS 的 IP 地址, 每次都要找供应商更换 IP 也很麻烦。

所以, 目前我的方案是, 日常购买一台 VPS 用于上网和测试远程代码。 如果遇到封锁 IP 的情况就临时找一个机场来解决, 机场本质就是在供应商服务器上已经搭建好翻墙方案(比如 v2ray, trojan 等), 本地安装好 clash 后, 只需要下载机场供应商的 config.yaml 配置文件即可快速联网。

机场安装方法如下:

  1. 下载 clash: wget https://github.com/Dreamacro/clash/releases/download/v1.14.0/clash-linux-amd64-v1.14.0.gz
  2. 解压 clash: gzip -f clash.gz -d
  3. 给执行权限: chmod u+x clash
  4. 第一次启动: 先启动 clash 一次, 生成配置文件 ~/.config/clash/config.yaml 后, 按 Ctrl + C 终止
  5. 下载供应商配置文件: wget -U "Mozilla/6.0" -O ~/.config/clash/config.yaml clash-url, 其中 clash-url 是机场供应商的 Clash 订阅链接
  6. 执行 clash: ./clash

Clash 启动以后, 会在本地暴露两个通讯端口, 分别是 HTTP 的 7890 和 SOCKS5 的 7891, 在浏览器 SwitchyOmega 中添加对应端口的规则即可。