## 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='188' # ss/ssr/v2ray/ipt2socks 等本机进程的 TCP 监听端口,该端口支持"透明代理" proxy_udpport='188' # 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的末尾 # # 可以调用 set_proxy_group 给可执行文件设置所属 group、setgid 权限位 # 比如:"set_proxy_group ss-redir",执行 ss-redir 时会自动切换 group ## 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请求的逻辑入口(udp监听端口),脚本内部会将"所有"dns请求重定向至此udp端口 # 监听地址必须能覆盖到"127.0.0.1"(v4环境)+"::1"(v6环境),用于接收本机dns请求 # 如果要代理内网,则监听地址还需覆盖到相关网卡,为了简单,建议监听通配地址(全0) # # 下面的这些 dns_* 配置,只在使用"内置dns方案"时有效 # # 直连DNS和远程DNS,控制的是"内置dns组件"的上游dns服务器参数 # 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_direct='10.8.1.8#53' # 直连DNS(v4环境使用),必须指定端口,可使用本地/内网服务器 dns_direct6='' # 直连DNS(v6环境使用),必须指定端口,可使用本地/内网服务器 dns_direct_white='true' # 将dns_direct的ip加入白名单(global/chnroute),使其走直连 dns_direct6_white='false' # 将dns_direct6的ip加入白名单(global/chnroute),使其走直连 # dns_remote='10.8.1.8#53' # 远程DNS(v4环境使用),必须指定端口,可使用本地/内网服务器 dns_remote6='' # 远程DNS(v6环境使用),必须指定端口,可使用本地/内网服务器 dns_remote_black='true' # 将dns_remote的ip加入黑名单(gfwlist/chnroute),使其走代理 dns_remote6_black='false' # 将dns_remote6的ip加入黑名单(gfwlist/chnroute),使其走代理 ## dnsmasq # 使用自定义dns方案时,dnsmasq相关配置被忽略,dnsmasq不会启动 # 这里允许dnsmasq监听其他端口,是为了在它前面加入其他进程,优先处理dns dnsmasq_bind_port='' # dnsmasq监听端口,留空表示端口同dns_mainport dnsmasq_cache_size='4096' # 最多缓存多少条,0表示禁用缓存,太大会影响性能 dnsmasq_cache_time_min='3600' # 最短缓存多少秒,上限值为3600,0表示禁用此功能 dnsmasq_query_maxcnt='1024' # dns查询最大并发数(dns-forward-max),默认150 dnsmasq_log_enable='false' # 记录详细日志,除非进行调试,否则不建议启用 dnsmasq_log_file='/var/log/dnsmasq.log' # 日志文件,如果不想保存日志可以改为 /dev/null dnsmasq_conf_dir=() # `--conf-dir` 选项的参数,可以填多个,空格隔开 dnsmasq_conf_file=() # `--conf-file` 选项的参数,可以填多个,空格隔开 dnsmasq_conf_string=() # 自定义配置,一个数组元素就是一行配置,空格隔开 ## chinadns # 使用自定义dns方案时,chinadns相关配置被忽略,chinadns-ng不会启动 chinadns_for_gfwlist='true' # 用于mode=gfwlist,提升域名匹配性能 chinadns_bind_port='65353' # 监听端口,若 65353 被占用,请注意更改 chinadns_chnlist_first='false' # 优先加载 chnlist 域名 (默认优先 gfwlist) chinadns_extra_options='' # 其他附加的命令行选项(已有的选项就别再填了) chinadns_verbose='false' # 记录详细日志,除非进行调试,否则不建议启用 chinadns_logfile='/var/log/chinadns.log' # 日志文件,如果不想保存日志可以改为 /dev/null ## dns2tcp # 使用自定义dns方案时,dns2tcp相关配置被忽略,dns2tcp不会启动 # 如果udp代理效果一般,建议启用dns2tcp,个人测试tcp查询快于udp,可能是isp/gfw对udp进行了qos # 这里提供禁用选项,主要是为了方便使用其他dns工具替代dns2tcp,比如dnsproxy,走doh,也是tcp协议 dns2tcp_enable='auto' # auto:tcponly时启用 | true:总是启用 | false:禁用 dns2tcp_bind_port='65454' # 监听端口,若 65454 被占用,请注意更改 dns2tcp_extra_options='' # 其他附加的命令行选项(已有的选项就别再填了) dns2tcp_verbose='false' # 记录详细日志,除非进行调试,否则不建议启用 dns2tcp_logfile='/var/log/dns2tcp.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='10.8.1.18#53' # stop后重定向内网主机发来的dns至指定dns,selfonly=false 时有效,详见 README ipts_reddns6_onstop='' # 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传来的命令行参数(位置参数)