要说我为啥要搞这个,只因我身边的一个玄学网络环境死活届不到 Mojang。

1

怎么办?给 Minecraft 加特技。
这事放到 Windows/MacOS 都好办,客户端本身就能做系统代理和访问规则,就算做不到也可以来个 PAC 规则自己加着用。然而 Linux 客户端没有这种方便的系统代理功能,之前一直靠着浏览器 SwitchyOmega、终端 proxychains 全局苟命,现在仅靠 proxychains 难以解决这个问题,尝试 NetworkManager 设置 PAC 也没有见效,我需要一个船新的解决方案。

怎么办?问 Google。
搜索一番之后我找到了它,Linux TCP+UDP 透明代理 ss-tproxy,应该算得上是终极解决方案,就决定用它了。


目录

开始

Update: 原项目持续更新,本文内容可能落后,仅供参考。

这个 Github 项目本身的 README 文档还是写得比较详细的,作者在 blog 写得更详细,最后还有作者在 blog 写的 FAQ 链接,大部分操作我就直接复制过来了。开始偷懒

安装

首先确保解决依赖问题: TPROXY 模块、iproute、dnsmasq、chinadns、perl、ipset、curl、base64。部分软件包可直接从各发行版的包管理器获取,我就不全写出来了。偷懒

TPROXY

# 查找 TPROXY 模块
find /lib/modules/$(uname -r) -type f -name '*.ko*' | grep 'xt_TPROXY'

# 正常情况下的输出
/lib/modules/4.19.14-1-MANJARO/kernel/net/netfilter/xt_TPROXY.ko.xz

ChinaDNS

AUR 大法好!(破音)

# 获取
wget https://github.com/shadowsocks/ChinaDNS/releases/download/1.3.2/chinadns-1.3.2.tar.gz

# 解压
tar xf chinadns-1.3.2.tar.gz

# 安装
cd chinadns-1.3.2/
./configure
make && make install

安装主程序之前

你需要在 ss/ssr/v2ray 之中选择一个作为客户端,我使用的是 shadowsocks-libev。使用 ssr 或者 v2ray 的可以参考作者 blog 安装和配置,我就不写了。偷懒

安装主程序

git clone https://github.com/zfl9/ss-tproxy
cd ss-tproxy
chmod +x ss-tproxy
cp -af ss-tproxy /usr/local/bin
mkdir -p /etc/ss-tproxy
cp -af ss-tproxy.conf gfwlist.* chnroute.* /etc/ss-tproxy

配置

服务端

shadowsocks-libev 服务端的部署 by 飞羽博客

请确保服务端启用了 UDP 转发,否则本地无法解析国外网站。国外网站的国内 DNS 解析结果被滤了,没启用 UDP 转发下的代理查询请求没有返回,你会永远查不到 IP,此处被坑两小时

修改 shadowsocks 的 systemd 文件,在 ExecStart 添加 -u 参数,执行 systemctl daemon-reload 后重启服务,UDP 转发就开启了。

客户端

shadowsocks

/etc/shadowsocks/config.json

{
       "server":"",
       "server_port":,
       "local_address": "",
       "local_port":,
       "password":"",
       "timeout":,
       "method":""
}

服务器地址/端口/密码/加密方式,还有超时时间这些就不用说了,本地监听地址和端口要注意一下。
local_port 要和 ss-tproxy 的proxy_tcportproxy_tcport 一致。
local_address 的设置这点,由于我只用于本机代理,就设置为 127.0.0.1。如果有需要请设置为 0.0.0.0,并按作者 blog 操作。

主程序

/etc/ss-tproxy/ss-tproxy.conf

## mode
#mode='global'
mode='gfwlist'
#mode='chnroute'

## proxy
proxy_tproxy='false'   # 纯TPROXY方式
proxy_server=()   # 服务器的地址,括号内填写
proxy_dports=''        # 服务器的端口
proxy_tcport='60080'   # TCP 监听端口
proxy_udport='60080'   # UDP 监听端口
proxy_runcmd='ss-redir -c /etc/shadowsocks/config.json -u </dev/null &>>/var/log/ss-redir.log &'  # 启动的命令行
proxy_kilcmd='kill -9 $(pidof ss-redir)'  # 停止的命令行

## dnsmasq
dnsmasq_cache_size='4096'              # DNS 缓存条目
dnsmasq_cache_time='3600'               # DNS 缓存时间
dnsmasq_log_enable='false'              # 是否记录日志
dnsmasq_log_file='/var/log/dnsmasq.log' # 日志文件路径

## chinadns
chinadns_mutation='false'                # DNS 压缩指针
chinadns_verbose='false'                 # 记录详细日志
chinadns_logfile='/var/log/chinadns.log' # 日志文件路径

## dns
dns_modify='false'           # 直接修改 resolv.conf
dns_remote='1.1.1.1:53'      # 国外 DNS,必须指定端口
dns_direct='223.5.5.5' # 国内 DNS,不能指定端口

## ipts
ipts_rt_tab='100'              # iproute2 路由表名或 ID
ipts_rt_mark='0x2333'          # iproute2 策略路由的标记
ipts_non_snat='false'          # 不设置 SNAT iptables 规则
ipts_intranet=(127.0.0.1/32) # 内网网段,多个请用空格隔开

## opts
opts_ss_netstat="auto"  # 'auto|ss|netstat',使用哪个端口检测命令

## file
file_gfwlist_txt='/etc/ss-tproxy/gfwlist.txt'   # gfwlist 黑名单文件 (默认规则)
file_gfwlist_ext='/etc/ss-tproxy/gfwlist.ext'   # gfwlist 黑名单文件 (扩展规则)
file_chnroute_txt='/etc/ss-tproxy/chnroute.txt' # chnroute 地址段文件 (chinadns)
file_chnroute_set='/etc/ss-tproxy/chnroute.set' # chnroute 地址段文件 (iptables)

确认一下全部参数填写完毕(不为空),其中 ipts_intranet 同样是因为我只用于本机代理,填写的是 127.0.0.1/32,有需要的请按作者 blog 操作。

/etc/ss-tproxy/gfwlist.ext

# gfwlist 黑名单语法:
# 地址:如 11.22.33.44
# 网段:如 123.123.0.0/16
# 域名:如 example.com (匹配 example.com、*.example.com),即域名后缀
# 注意:修改本文件需重启 ss-tproxy 生效,另外请删除每行首尾多余的空白符

# Telegram
91.108.4.0/22
91.108.8.0/22
91.108.12.0/22
91.108.20.0/22
91.108.36.0/23
91.108.38.0/23
91.108.56.0/22
149.154.160.0/20
149.154.164.0/22
149.154.172.0/22

# Minecraft
mojang.com
minecraft.net
amazonaws.com
minecraftforge.net
liteloader.com

需要指定代理的地址/网段/域名请添加到这个文件里,我在这里加入了 Minecraft 的 Mojang 服务器。

启动

systemctl start ss-tproxy.service

设置开机自启

  1. mv -f ss-tproxy.service /etc/systemd/system
  2. systemctl daemon-reload
  3. systemctl enable ss-tproxy.service

检查状态

  • systemctl status ss-tproxy.service
  • ss-tproxy status

没有什么问题的话就可以开始用了。
顺便贴上 ss-tproxy 命令用法

  • ss-tproxy help:查看帮助
  • ss-tproxy start:启动代理 建议使用 systemctl 操作启动和停止
  • ss-tproxy stop:关闭代理 建议使用 systemctl 操作启动和停止
  • ss-tproxy restart:重启代理 建议使用 systemctl 操作启动和停止
  • ss-tproxy status:代理状态
  • ss-tproxy check-command:检查命令是否存在
  • ss-tproxy flush-dnscache:清空 DNS 查询缓存
  • ss-tproxy flush-gfwlist:清空 ipset-gfwlist IP 列表
  • ss-tproxy update-gfwlist:更新 gfwlist(restart 生效)
  • ss-tproxy update-chnonly:更新 chnonly(restart 生效)
  • ss-tproxy update-chnroute:更新 chnroute(restart 生效)
  • ss-tproxy show-iptables:查看 iptables 的 mangle、nat 表
  • ss-tproxy flush-iptables:清空 raw、mangle、nat、filter 表

结束

结束了?是的,结束了。如果配置遇到问题,还有 ssr/v2ray/透明代理/网关配置等需求的请阅读 GitHub 文档和作者 blog。

这个也能用到软路由上,以后要是有软路由了,就靠它了?嘛,谁知道呢。

算是有生之年码的首篇长 blog 吧,难得难得,有空再写吧。老板:上班时间写 blog,扣你钱

标签: none

添加新评论