forked from zfl9/ss-tproxy
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ss-tproxy.conf
284 lines (251 loc) · 16 KB
/
ss-tproxy.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
## mode
#mode='global' # 全局:{ignlist}走直连,其他走代理
#mode='gfwlist' # 黑名单:{gfwlist}走代理,其他走直连 (回国模式也是这个,后面有详细说明)
mode='chnroute' # 大陆白名单:{gfwlist}走代理,{ignlist,chnlist,chnroute}走直连,其他走代理
## ipv4/6
ipv4='true' # 是否对ipv4启用'透明代理': true启用 false不启用
ipv6='false' # 是否对ipv6启用'透明代理': true启用 false不启用
## tproxy
tproxy='false' # true: TPROXY(tcp) + TPROXY(udp) ## 纯 tproxy 模式 ##
# false: REDIRECT(tcp) + TPROXY(udp) ## redirect 模式 ##
#
# 具体取决于'本机代理进程'的透明代理传入'协议'
#
# ss/ssr/trojan 通常为 redirect 模式
# v2ray 两者都支持,具体取决于 v2ray 配置
# ipt2socks 默认为纯 tproxy 模式,也可切换为 redirect 模式
# ss-libev 3.3.5+ 支持纯 tproxy 模式,参数为"-T"、"tcp_tproxy": true
# trojan 原生不支持 udp 透明代理,但可以配合 ipt2socks 来实现
# trojan-go 只使用纯 tproxy 模式,支持 tcp 和 udp
#
# 其他代理软件请自行甄别测试,配置错误将无法正常透明代理
## tcponly
tcponly='false' # true:仅代理TCP流量 | false:代理TCP和UDP流量
# 取决与'代理套件',有些代理/机场不支持UDP协议的代理
# DNS查询默认走UDP,若代理不支持UDP,请将此选项设为true
## selfonly
selfonly='false' # true: 只代理ss-tproxy主机(本机)传出的流量
# false: 代理本机、内网机传出的流量(网关和dns指向ss-tproxy主机)
# 由于dns_remote必须走代理,且dns逻辑在本机进行,因此本机必须走代理
# 虽然可以只处理dns流量,其他流量不走代理,但感觉意义不大,还是简单点好
## proxy
#
# 本机代理进程相关,如透明代理端口,进程启动和停止命令(如果想自己控制进程启停,可以留空)
#
# ss-tproxy要求"代理进程"不参与ip分流,也不参与dns解析,专心让iptables过来的tcp/udp流量走代理即可
# 本机代理进程只会收到"纯ip"的tcp/udp流量,不会有dns相关的东西让你知晓,因为这些已被dns解析组件处理
# 因此ss-tproxy的设计原则是:各组件只负责自己的专业领域,无需知晓透明代理的全局面貌,做好自己的事就行
#
# 如果要切换代理/节点,请直接操作代理进程,而不是修改ss-tproxy.conf、重启ss-tproxy
# 因为这是一个重量级操作,除非tproxy模式、tcponly模式等涉及iptables规则的配置发生了更改
# 换句话说,ss-tproxy应该主要用于iptables管理,以及附带的dns方案,顺便帮你启动/关闭代理进程
#
proxy_procgroup='proxy' # 本机代理进程的group(fsgid),所有代理进程都需要以此身份运行,用于流量放行
# 不允许填root或0,脚本会自动帮你创建group(如果填的是name),建议使用name
#
proxy_tcpport='60080' # ss/ssr/v2ray/ipt2socks 等本机进程的 TCP 监听端口,该端口支持"透明代理"
proxy_udpport='60080' # ss/ssr/v2ray/ipt2socks 等本机进程的 UDP 监听端口,该端口支持"透明代理"
# 代理进程只需监听"127.0.0.1"(v4环境)+"::1"(v6环境),不需要监听"全0地址"
#
proxy_startcmd='' # 用于启动"本机代理进程(组)"的 shell 命令行,该命令行不应该执行过长时间
proxy_stopcmd='' # 用于关闭"本机代理进程(组)"的 shell 命令行,该命令行不应该执行过长时间
# 如果想自己接管"本机代理进程"的启动/停止,可以在startcmd/stopcmd上留空
#
# 如果命令行比较长,建议封装为函数,然后在startcmd/stopcmd中调用这些函数
# shell函数可以定义在ss-tproxy.conf的任何位置,比如ss-tproxy.conf的末尾
#
# startcmd 中可调用 set_proxy_group 给可执行文件设置所属 group、setgid 权限位
# 例如:"set_proxy_group ss-redir",此后启动的 ss-redir 进程将会自动切换 group
#
# 如果 startcmd/stopcmd 留空,则需要手动控制"本机代理进程"的启动和停止
# 此时可使用 ss-tproxy 的 set-proxy-group 命令给可执行文件设置所属 group、setgid 权限位
# 例如:"sudo ss-tproxy set-proxy-group ipt2socks",然后再启动 ipt2socks 等本机代理进程
## dns
dns_custom='false' # true:使用自定义dns方案(高级用户,见下面的说明) | false:使用内置dns方案
# 使用自定义dns方案时,所有dns相关的配置被忽略,内置的域名分流规则也会失效
# 需要自己实现域名解析/分流;udp代理未启用时,如果想走代理,请记得走tcp协议
#
dns_procgroup='proxy_dns' # dns进程的group(fsgid),不能与proxy_procgroup相同,所有dns进程都需要以此身份运行
# 不允许填root或0,脚本会自动帮你创建group(如果填的是name),建议使用name而不是gid
#
dns_mainport='60053' # dns请求的逻辑主入口(监听端口),脚本内部会将"所有"dns请求重定向至此监听端口
# 为了接收本机dns请求,监听地址必须能覆盖到"127.0.0.1"(v4环境)+"::1"(v6环境)
# 如果要代理内网,则监听地址还需覆盖到相关网卡,为了简单,建议监听通配地址(全0)
# 下面的这些 dns_* 配置,只有在使用"内置dns方案"时才有效
#
# 直连DNS和远程DNS,控制的是"内置dns组件"的DNS上游服务器参数
# 使用局域网内的DNS作为上游时,请务必留意white/black相关参数
#
# DNS地址格式: [proto://][host@]ip[#port] (详见chinadns-ng)
# - "1.1.1.1": UDP/TCP 上游 (取决于发起方使用UDP还是TCP)
# - "udp://1.1.1.1": UDP 上游
# - "tcp://1.1.1.1": TCP 上游
# - "tls://1.1.1.1": DoT 上游 (wolfssl版本支持DoT)
#
# white和black,控制的是"ipset白名单/黑名单",即:直连还是代理
# 放在这里是为了方便修改dns配置,不必修改ignlist.ext/gfwlist.ext
#
# white和black允许以下3类值,以dns_direct_white为例(其他同理)
# - 'true' # dns_direct的ip加入白名单,使其走直连
# - 'false' # dns_direct的ip不加入白名单,比如局域网ip
# - '1.2.3.4' # 将1.2.3.4这个ip加入白名单,可填多个ip,空格隔开
# > 注意:对于填写ip的情况,带6的选项请填ipv6地址,不带6的填ipv4地址
# 直连DNS,用于解析“白名单”(不走代理的)域名
# 对直连DNS的所有网络访问(TCP/UDP)必须走“直连”
dns_direct='223.5.5.5' # 直连DNS(用于v4透明代理),允许配置多个DNS,用空格隔开
dns_direct6='240C::6666' # 直连DNS(用于v6透明代理),允许配置多个DNS,用空格隔开
dns_direct_white='true' # 将dns_direct的ip加入白名单(global/chnroute),使其走直连
dns_direct6_white='true' # 将dns_direct6的ip加入白名单(global/chnroute),使其走直连
# 远程DNS,用于解析“黑名单”(要走代理的)域名
# 对远程DNS的最终网络访问(TCP/UDP)必须走“代理”
dns_remote_tcp='tcponly' # 对“无协议限定”的上游进行修改,以满足当前的代理配置
# - tcponly: tcponly模式时自动使用tcp上游(避免污染)
# - always: 总是自动使用tcp上游(例如代理的udp不太行)
# - 留空: 不处理,尊重dns_remote/dns_remote6的配置值
dns_remote='8.8.8.8' # 远程DNS(用于v4透明代理),允许配置多个DNS,用空格隔开
dns_remote6='2001:4860:4860::8888' # 远程DNS(用于v6透明代理),允许配置多个DNS,用空格隔开
dns_remote_black='true' # 将dns_remote的ip加入黑名单(gfwlist/chnroute),使其走代理
dns_remote6_black='true' # 将dns_remote6的ip加入黑名单(gfwlist/chnroute),使其走代理
## chinadns
# 使用自定义dns方案时,chinadns-ng相关配置被忽略,chinadns-ng不会启动
# 这里允许chinadns-ng监听其他端口,是为了在它前面加入其他进程,优先处理dns
chinadns_bind_port='' # 监听端口,留空则表示端口同 dns_mainport
chinadns_cache_size='4096' # dns 缓存容量(响应消息数量),0 表示禁用缓存(不建议)
chinadns_cache_stale='65535' # 允许使用过期缓存(并立即后台刷新),参数是允许的最大过期时长(秒)
chinadns_cache_refresh='20' # 若当前查询的缓存的 TTL 不足 N(%),则发送缓存的同时,在后台刷新缓存
chinadns_cache_db='dns-cache.db' # 若非空,则启用 DNS 缓存持久化,重启 chinadns-ng 将会保留缓存数据
chinadns_verdict_cache='4096' # tag:none 域名的判决缓存容量(tag:none 域名数量),用于 chnroute 模式
chinadns_verdict_db='verdict-cache.db' # 若非空,则启用 verdict 缓存持久化,重启 chinadns-ng 将会保留缓存数据
chinadns_chnlist_first='false' # 优先加载 chnlist 域名列表,默认是 gfwlist 优先,用于 chnroute 模式
chinadns_config_files='' # 加载 chinadns 配置文件,多个文件请用空格隔开,具体配置见 chinadns-ng
chinadns_extra_options='' # 追加 chinadns 命令行参数,请勿覆盖已有的参数,具体参数见 chinadns-ng
chinadns_verbose='false' # 记录详细运行日志,除非进行调试,否则不建议启用
chinadns_logfile='/var/log/chinadns.log' # 日志文件,如果不想保存日志可以改为 /dev/null
## ipts
ipts_if_lo='lo' # 环回接口的名称,在标准发行版中,通常为 lo,如果不是请修改
ipts_rt_tab='233' # iproute2 路由表名或表 ID,除非产生冲突,否则不建议改动该选项
ipts_rt_mark='0x2333' # iproute2 策略路由的防火墙标记,除非产生冲突,否则不建议改动该选项
ipts_set_snat='false' # 设置 ipv4 MASQUERADE(SNAT) 规则,selfonly=false 时有效,详见 README
ipts_set_snat6='false' # 设置 ipv6 MASQUERADE(SNAT) 规则,selfonly=false 时有效,详见 README
ipts_reddns_onstop='223.5.5.5#53' # stop后重定向内网主机发来的dns至指定dns,selfonly=false 时有效,详见 README
ipts_reddns6_onstop='240C::6666#53' # stop后重定向内网主机发来的dns至指定dns,selfonly=false 时有效,详见 README
ipts_proxy_dst_port='' # 要代理哪些端口,留空表示全部,多个逗号隔开,冒号表示范围(含边界),详见 README
ipts_drop_quic='tcponly' # 丢弃发往"黑名单"的QUIC: 留空:不丢弃 | tcponly:tcponly时丢弃 | always:总是丢弃
## opts
opts_ss_netstat='auto' # auto/ss/netstat,用哪个端口检测工具: auto(自动选择,优先考虑ss) | ss | netstat
## url
# 用于更新gfwlist.txt,格式:`域名后缀`或`server=/域名后缀/dns_ip`(dnsmasq格式,只关心`域名后缀`字段)
url_gfwlist='https://raw.githubusercontent.com/pexcn/daily/gh-pages/gfwlist/gfwlist.txt'
# 用于更新chnlist.txt,格式:`域名后缀`或`server=/域名后缀/dns_ip`(dnsmasq格式,只关心`域名后缀`字段)
url_chnlist='https://raw.githubusercontent.com/felixonmars/dnsmasq-china-list/master/accelerated-domains.china.conf'
# 用于更新chnroute*.txt,目前只支持APNIC格式,如果想使用其他ip库,建议在当前文件重写ss-tproxy的相关函数
url_chnroute='https://ftp.apnic.net/stats/apnic/delegated-apnic-latest'
## 回国模式
#
# 在国外访问大陆网站时,可能会出现ip区域限制等问题,导致无法正常使用大陆网络服务
# 此时可以使用"回国模式",通过代理回到国内,摆脱ip区域限制等问题,原理与翻墙类似
#
# ss-tproxy支持回国模式,要切换到回国模式,请执行以下步骤:
#
# - 使用 gfwlist 分流模式,即 mode='gfwlist'
# - 互换 dns_direct* 和 dns_remote* 的配置内容
# - url_gfwlist 改为大陆域名列表的url,如 url_chnlist
# - 注释 gfwlist.ext 中的 Telegram 地址段 (这是给国内用的)
# - 执行 ss-tproxy update-gfwlist (将gfwlist.txt换成大陆域名)
#
# 以上步骤只需执行一次,之后就是正常使用 ss-tproxy start/stop 了
###################### 钩子函数 ######################
# 此函数在"启动逻辑之前"执行
pre_start() {
# do something
return
}
# 此函数在"启动逻辑之后"执行
post_start() {
# do something
return
}
# 此函数在"停止逻辑之前"执行
pre_stop() {
# do something
return
}
# 此函数在"停止逻辑之后"执行
post_stop() {
# do something
return
}
# 额外状态,如curl测试代理是否ok
extra_status() {
# do something
return
}
# 此函数在start的最后一步执行,获取运行时状态(如进程pid),保存到文件
extra_pid() {
# 格式同shell变量赋值,注意变量命名,防止冲突/覆盖
# pid文件是一个shell脚本,下次执行时会source加载它
# echo "pid_foo=$pid_foo"
# echo "pid_bar=$pid_bar"
return
}
###################### 自定义dns方案 ######################
# 自定义dns方案时,你需要自己实现"域名分流"(ignlist/chnlist/gfwlist)
# 并且将相关域名解析出来的ip加入ipset黑/白名单,以便与iptables规则联动
# 黑名单: sstp_black、sstp_black6 | 白名单: sstp_white、sstp_white6
# 以下接口不要求全部实现,你可以根据需要自由组织代码,保证逻辑正确即可
# 如果不知道怎么实现,可以参考ss-tproxy脚本中有关dns的源码,依葫芦画瓢
# 初始化,脚本加载时调用
custom_dns_init() {
# do something
return
}
# 要加入白名单的ip,启动dns之前调用
custom_dns_whiteip() {
# 格式同 ignlist.ext,一行一个
# echo "-223.5.5.5"
# echo "~240C::6666"
return
}
# 要加入黑名单的ip,启动dns之前调用
custom_dns_blackip() {
# 格式同 gfwlist.ext,一行一个
# echo "-8.8.8.8"
# echo "~2001:4860:4860::8888"
return
}
# 启动dns进程,请务必以dns_procgroup身份运行
custom_dns_start() {
# do something
return
}
# 关闭dns进程,stop时调用
custom_dns_stop() {
# do something
return
}
# 打印运行状态,status时调用
custom_dns_status() {
# do something
return
}
# 清空dns缓存,flush-dnscache时调用
custom_dns_flush() {
# do something
return
}
# 此函数在start的最后一步执行,获取运行时状态,同extra_pid
custom_dns_pid() {
# 格式同shell变量赋值,注意变量命名,防止冲突/覆盖
# pid文件是一个shell脚本,下次执行时会source加载它
# echo "pid_foo=$pid_foo"
# echo "pid_bar=$pid_bar"
return
}
# 除了上述钩子函数,你还可以定义其他shell函数和变量
# 你也可以在当前文件使用ss-tproxy中已定义的函数和变量
#
# 若定义的函数与ss-tproxy中的同名,则本文件定义的函数覆盖原函数
# 使用自定义dns方案时,此特性可帮助你快速与原脚本融合(见脚本源码)
#
# ss-tproxy.conf是一个shell脚本,可以使用source来加载其他shell脚本
# ss-tproxy.conf被执行时,可以访问ss-tproxy传来的命令行参数(位置参数)