之前写过树莓派 3B 使用 clash 作为透明网关 ,后面由于 3B 只有百兆网口,遂改成直接用刷了老毛子的 Newifi3 运行 clash 。 这几年一直用免费的 oracle vps 作为梯子,勉强够用,直到最近开通了 YouTube Premium 才觉得不够用,就买了个机场服务,速度真是屌,晚高峰4K 无压力。 这时路由器性能就成了瓶颈,YouTube 速度只有 30 Mbps , 而电脑直接运行 clash 可达到 80 Mbps。又得搬出停灰已久的树莓派了。

这次树莓派不作为透明网关,而是单独的翻墙机器,只提供socks5 代理,国内流量不经过它。 示意图如下:

需要的工具有 ss-tproxyipt2socksclash 其中 ss-tproxy 和 ipt2socks 运行在路由器上,clash 运行在树莓派上。 国外流量走向:ss-tproxy(iptables) -> ip2socks -> clash 好在老毛子固件自带了 ss-tproxy 和 ipt2socks, 不过默认的ipt2socks 配置不太行,只好用ss-tproxy 直接拉起ipt2socks,不走 web 配置。 最终只需要配置 ss-tproxy 就行了。

修改以下 4 处的配置:

ss_tproxy启动前运行脚本

#!/bin/bash
pre_start() {
    echo "ss-tproxy 启动前执行脚本"
    # 为了不用每次都下载ip2socks, 拷贝到了/etc/storage 目录下
    # 假设你的树莓派上的clash socks5 代理端口为 7891
    /etc/storage/app/ipt2socks/ipt2socks  -s '树莓派IP' -p 7891 -l 1098 > /dev/null 2>&1 &
    
}
post_start() {
    echo "ss-tproxy 启动后执行脚本"
    
}
pre_stop() {
    echo "ss-tproxy 停止前执行脚本"
    
}
post_stop() {
    echo "ss-tproxy 停止后执行脚本"
    
}

ss_tproxy配置文档

# ss-tproxy 配置文件
# https://github.com/zfl9/ss-tproxy
## mode
#mode='global'  # global 模式 (不分流)
#mode='chnlist' # 回国模式 (china走代理)
#mode='gfwlist' # gfwlist 模式 (黑名单)
mode='chnroute' # chnroute 模式 (白名单)

## ipv4/6
ipv4='true' # true:启用ipv4透明代理; false:关闭ipv4透明代理
ipv6='false' # true:启用ipv6透明代理; false:关闭ipv6透明代理

## tproxy
tproxy='true' # true:TPROXY+TPROXY; false:REDIRECT+TPROXY

## tcponly
tcponly='true' # true:仅代理TCP流量; false:代理TCP和UDP流量

## selfonly
selfonly='false' # true:仅代理本机流量; false:代理本机及"内网"流量

## ss_tproxy 配置文件的配置参数覆盖 web 的配置参数
ext_dns_start_dnsproxy='' #app_112 0:自动开启第三方 DNS 程序(dnsproxy) ; 1:跳过自动开启第三方 DNS 程序但是继续把DNS绑定到 8053 端口的程序
ext_ss_dnsproxy_x='0'      #DNS程序选择,0:dnsproxy ; 1:pdnsd ; 2:dnsmasq
ext_ss_pdnsd_all='1'       # 0使用[本地DNS] + [GFW规则]查询DNS ; 1 使用 8053 端口查询全部 DNS
ext_ss_pdnsd_cn_all='0'    #app_113 0:使用 8053 端口查询全部 DNS 时进行 China 域名加速 ; 1:不进行 China 域名加速
## iptables -t nat -I SSTP_OUTPUT -j RETURN
ext_output_return=''      #app_114 0:代理本机流量; 1:跳过代理本机流量
ext_output_udp_return=''  #ss_udp_enable 0:停用本机 UDP 转发; 1:启动本机 UDP 转发 (需服务器支持 UDP 代理才有效)
ext_ss_all_udp=''         #app_81 0:udp 分流模式跟随 tcp 设置; 1:全局 UDP 转发,不分流
## iptables -t nat -I SSTP_OUTPUT -m owner --uid-owner 777 -j RETURN
uid_owner='0' # 非 0 时进行用户ID匹配跳过代理本机流量
gid_owner='1321' # 非 0 时进行组ID匹配跳过代理本机流量

## proxy
proxy_all_svraddr='/opt/app/ss_tproxy/conf/proxy_all_svraddr.conf' # 服务器的地址或域名的配置文件,会自动处理分类IPv4、IPv6,允许填写多个服务器地址(文件里面每一行一个服务器地址)
proxy_svraddr4="/opt/app/ss_tproxy/conf/proxy_svraddr4.conf" # 服务器的 IPv4 地址或域名的配置文件,允许填写多个服务器地址(文件里面每一行一个服务器地址)
proxy_svraddr6="/opt/app/ss_tproxy/conf/proxy_svraddr6.conf" # 服务器的 IPv6 地址或域名的配置文件,允许填写多个服务器地址(文件里面每一行一个服务器地址)
proxy_svrport='1:65535' # 服务器的监听端口,可填多个端口,格式同 ipts_proxy_dst_port
proxy_tcpport='1098' # ss/ssr/v2ray 等本机进程的 TCP 监听端口,该端口支持透明代理
proxy_udpport='1098' # ss/ssr/v2ray 等本机进程的 UDP 监听端口,该端口支持透明代理
proxy_startcmd='date' # 用于启动本机代理进程的 shell 命令,该命令应该能立即执行完毕
proxy_stopcmd='date' # 用于关闭本机代理进程的 shell 命令,该命令应该能立即执行完毕

## dns
dns_direct='223.5.5.5' # 本地 IPv4 DNS,不能指定端口,也可以填组织、公司内部 DNS
dns_direct6='240C::6666' # 本地 IPv6 DNS,不能指定端口,也可以填组织、公司内部 DNS
dns_remote='1.1.1.1#53' # 远程 IPv4 DNS,必须指定端口,提示:访问远程 DNS 会走代理
dns_remote6='::1#8053' # 远程 IPv6 DNS,必须指定端口,提示:访问远程 DNS 会走代理
dns_bind_port='8053' # 本地 dnsproxy 服务器监听端口

## dnsmasq
dnsmasq_bind_port='53' # dnsmasq 服务器监听端口,见 README
dnsmasq_conf_dir='/tmp/ss_tproxy/dnsmasq.d' # `--conf-dir` 选项的参数,可以填多个,空格隔开
dnsmasq_conf_file='/opt/app/ss_tproxy/dnsmasq_conf_file.txt' # `--conf-file` 选项的参数,可以填多个,空格隔开
dnsmasq_conf_string='/opt/app/ss_tproxy/conf/dnsmasq_conf_string.conf' # 自定义配置的配置文件(文件里面每一行一个配置)

## dns2tcp
dns2tcp_bind_port='65454'               # dns2tcp 转发服务器监听端口,如有冲突请修改
dns2tcp_verbose='false'                 # 记录详细日志,除非进行调试,否则不建议启用
dns2tcp_logfile='/tmp/syslog.log'  # 日志文件,如果不想保存日志可以改为 /dev/null

## ipts
lan_ipv4_ipaddr='127.0.0.1' #
lan_ipv6_ipaddr='::1'
ipts_if_lo='lo'                 # 环回接口的名称,在标准发行版中,通常为 lo,如果不是请修改
ipts_rt_tab='233'               # iproute2 路由表名或表 ID,除非产生冲突,否则不建议改动该选项
ipts_rt_mark='0x2333'           # iproute2 策略路由的防火墙标记,除非产生冲突,否则不建议改动该选项
ipts_set_snat='false' # 设置 iptables 的 MASQUERADE 规则,布尔值,`true/false`,详见 README
ipts_set_snat6='false' # 设置 ip6tables 的 MASQUERADE 规则,布尔值,`true/false`,详见 README
ipts_reddns_onstop='false' # ss-tproxy stop 后,是否将其它主机发至本机的 DNS 重定向至直连 DNS,详见 README
ipts_reddns_onstart='false' # ss-tproxy start 后,是否将其它主机发至本机的 DNS 重定向至自定义 IPv4 地址
ipts_reddns_ip='192.168.123.1' # 自定义 DNS 重定向地址(只支持 IPv4 )
ipts_proxy_dst_port_tcp='1:65535' # tcp 黑名单 IP 的哪些端口走代理,多个用逗号隔开,冒号为端口范围(含边界),详见 README
ipts_proxy_dst_port_udp='1:65535' # udp 黑名单 IP 的哪些端口走代理,多个用逗号隔开,冒号为端口范围(含边界),详见 README
# LAN_AC_IP 内网LAN代理转发白名单设置
# 0 常规, 未在 file_lanlist_ext 设定的 内网IP 根据 mode 配置工作模式 走代理
# 1 全局, 未在 file_lanlist_ext 设定的 内网IP 使用 全局代理模式 走代理
# 2 绕过, 未在 file_lanlist_ext 设定的 内网IP 不使用 代理
LAN_AC_IP='0' # 默认值 0

## opts
opts_ss_netstat='auto'                  # auto/ss/netstat,用哪个端口检测工具,见 README
opts_ping_cmd_to_use='auto'             # auto/standalone/parameter,ping 相关,见 README
opts_hostname_resolver='auto'           # auto/doh/dig/getent/ping,用哪个解析工具,见 README
opts_overwrite_resolv='false' # true/false,定义如何修改 resolv.conf,见 README
opts_ip_for_check_net='' # 检测外网是否可访问的 IP,ping,留空表示跳过此检查

## file
file_gfwlist_txt='/opt/app/ss_tproxy/rule/gfwlist.txt' # gfwlist/chnlist 模式预置文件
file_gfwlist_ext='/opt/app/ss_tproxy/gfwlist.ext' # gfwlist/chnlist 模式扩展文件
file_ignlist_ext='/opt/app/ss_tproxy/ignlist.ext' # global/chnroute 模式扩展文件
file_lanlist_ext='/etc/storage/shadowsocks_ss_spec_lan.sh' # 内网(LAN)IP行为 模式扩展文件
file_wanlist_ext='/etc/storage/shadowsocks_ss_spec_wan.sh' # 外网(WAN)IP行为 模式扩展文件
file_chnroute_txt='/opt/app/ss_tproxy/rule/chnroute.txt' # chnroute 地址段文件(文件里面每一行一个IP)
file_chnroute6_txt='/opt/app/ss_tproxy/rule/chnroute6.txt' # chnroute 地址段文件(文件里面每一行一个IP)
file_chnroute_set='/opt/app/ss_tproxy/chnroute.set' # chnroute 地址段文件 (iptables)
file_chnroute6_set='/opt/app/ss_tproxy/chnroute6.set' # chnroute6 地址段文件 (ip6tables)
file_dnsserver_pid='/opt/app/ss_tproxy/.dnsserver.pid' # dns 服务器进程的 pid 文件 (shell)

点这里自定义内网(LAN)IP访问代理转发控制功能

# 绕过树莓派IP,不然就死循环了
b,192.168.123.2

点这里自定义强制WAN的IP转发或忽略代理中转设置控制功能

# DNS
G,1.1.1.1
G,8.8.8.8
G,8.8.4.4
G,208.67.222.222
G,208.67.220.220
# 
# Telegram IPv4
G,91.108.4.0/22
G,91.108.8.0/22
G,91.108.12.0/22
G,91.108.20.0/22
G,91.108.36.0/23
G,91.108.38.0/23
G,91.108.56.0/22
G,149.154.160.0/20
G,149.154.161.0/24
G,149.154.162.0/23
G,149.154.164.0/22
G,149.154.168.0/21
G,149.154.172.0/22
G,149.154.160.1/32
G,149.154.160.2/31
G,149.154.160.4/30
G,149.154.160.8/29
G,149.154.160.16/28
G,149.154.160.32/27
G,149.154.160.64/26
G,149.154.160.128/25
G,149.154.164.0/22
G,91.108.4.0/22
G,91.108.56.0/24
G,109.239.140.0/24
G,67.198.55.0/24
G,91.108.56.172
G,149.154.175.50
# 
# Telegram IPv6
~G,2001:67c:4e8::/48
~G,2001:0b28:f23d::/48
# 
# api
@g,api.telegram.org
@g,raw.githubusercontent.com
@b,api.cloud.189.cn
@b,ddns.oray.com
@b,members.3322.org
@b,members.3322.net
@b,ip.3322.net
@b,www.cloudxns.net
@b,dnsapi.cn
@b,api.dnspod.com
@b,www.ipip.net
@b,myip.ipip.net
@b,alidns.aliyuncs.com
@b,services.googleapis.cn
# 
# 以下样板是四个网段分别对应BLZ的美/欧/韩/台服
#G,24.105.0.0/18
#G,80.239.208.0/20
#G,182.162.0.0/16
#G,210.242.235.0/24
#b,192.168.123.2
# 苹果服务,直连
b,17.0.0.0/8
b,63.92.224.0/19
b,65.199.22.0/23
b,139.178.128.0/18
b,144.178.0.0/19
b,144.178.36.0/22
b,144.178.48.0/20
b,192.35.50.0/24
b,198.183.17.0/24
b,205.180.175.0/24

然后在树莓派上运行 clash 就行了,这里不赘述。

最后效果跟直接在电脑上运行clash 一样,看YouTube 速度能拉满。、

如果你有更好的方法,欢迎留言。

注意:如果不开sniffer 的话,clash 只能根据 IP 分流。 sniffer 开启方法:

使用 Clash Premium , 并配置:

experimental:
  sniff-tls-sni: true

但是这要求DNS 查询走clash,需要修改路由器上 /etc/storage/script/sh_ss_tproxy.sh 里面的 dnsproxy 配置,指定你的树莓派IP 的clash 的DNS 端口,很麻烦。

建议直接使用 Clash.Meta,并配置:

sniffer:
    enable: true
    override-destination: true
    sniff:
      http: { ports: [80, 8080] }
      tls: { ports: [443, 8443] }
    skip-domain:
      #Apple
      - 'courier.push.apple.com'
      #mi
      - 'Mijia Cloud'