从4.8升级到4.8.3后chinadns-ng报错
环境 树莓5. 升级到4.8.3后.,chinadns-ng报错 [opt.zig:482 opt_verdict_cache] invalid opt-value: '-m'
chinadns-ng 更新到最新版本。
chinadns-ng --version ChinaDNS-NG 2025.03.27 601c689 | wolfssl-5.7.6 | target:arm-linux-musleabihf | cpu:generic+v7a | mode:fast+lto
这应该是最新的啊
不能吧,你是不是自己加了什么参数?把 ss-tproxy.conf 发来看看。
ss-tproxy v4.8.3 我老早就升级了,一切正常的。
估计你的 ss-tproxy.conf 缺少配置了,查看 https://github.com/zfl9/ss-tproxy/compare/v4.8...v4.8.3 (找到 ss-tproxy.conf,同步变更的部分)
## 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='true' # true: TPROXY(tcp) + TPROXY(udp) ## 纯 tproxy 模式 ##
# false: REDIRECT(tcp) + TPROXY(udp) ## redirect 模式 ##
## tcponly
tcponly='true' # true:仅代理TCP流量 | false:代理TCP和UDP流量
## selfonly
selfonly='false' # true: 只代理ss-tproxy主机(本机)传出的流量
# false: 代理本机、内网机传出的流量(网关和dns指向ss-tproxy主机)
## proxy
#
proxy_procgroup='proxy' # 本机代理进程的group(fsgid),所有代理进程都需要以此身份运行,用于流量放行
proxy_tcpport='60080' # ss/ssr/v2ray/ipt2socks 等本机进程的 TCP 监听端口,该端口支持"透明代理"
proxy_udpport='60080' # ss/ssr/v2ray/ipt2socks 等本机进程的 UDP 监听端口,该端口支持"透明代理"
proxy_startcmd='start_ss' # 用于启动"本机代理进程(组)"的 shell 命令行,该命令行不应该执行过长时间
proxy_stopcmd='stop_ss' # 用于关闭"本机代理进程(组)"的 shell 命令行,该命令行不应该执行过长时间
start_ss() {
# 设置 setgid 权限位 (只需执行一次)
set_proxy_group ss-redir
for i in $(seq 1 $(nproc)); do
(ss-redir -c /home/pi/ss.json </dev/null &>>/dev/null &)
done
}
stop_ss() {
kill -9 $(pidof ss-redir) &>/dev/null
}
## dns
dns_custom='false' # true:使用自定义dns | false:使用内置dns方案
dns_procgroup='proxy_dns' # dns进程的group(fsgid),不能与proxy_procgroup相同,所有dns进程都需要以此身份运行
dns_mainport='60053' # dns请求的逻辑主入口(监听端口),脚本内部会将"所有"dns请求重定向至此监听端口
dns_direct='192.168.88.1 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
# 只要 ping 失败,就一直等待,请修改为实际的网关 IP
while ! ping -c1 -W1 www.baidu.com &>/dev/null; do
echo "waiting for network up [$((++i))] ..."
sleep 1
done
#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传来的命令行参数(位置参数)
我发现只要把 chinadns_cache_db='dns-cache.db' chinadns_verdict_db='verdict-cache.db' 备注掉就正常了
ss-tproxy start -x 我看看启动 chinadns-ng 时发生了什么
root@Stunnel:/var/log# ss-tproxy start -x
- (( ++i ))
- (( i < 2 ))
- '[' 1 -eq 0 ']'
- '[' /etc/ss-tproxy ']'
- '[' ss-tproxy.conf ']'
- cd -- /etc/ss-tproxy
- load_config
- file_required ss-tproxy.conf
- file_is_exists ss-tproxy.conf
- '[' -f ss-tproxy.conf ']'
- source ss-tproxy.conf start ++ mode=chnroute
看这个日志没问题呀,参数正常,chinadns-ng的PID也获取到了,说明运行成功。
你看最底,
- _status chinadns process_is_running 3069
- local name=chinadns func=process_is_running
- shift 2
- process_is_running 3069
- kill -0 3069 ++ color_red '[stopped]' ++ printf '\e[35m[stopped]\e[0m'
- echo -e 'chinadns:\t[stopped]' chinadns: [stopped]
事实就是我不管是stop再start 或restart,都是 mode: chnroute proxy/tcp: [running] chinadns: [stopped]
只要把这两行备注掉,都正常了 chinadns_cache_db='dns-cache.db' chinadns_verdict_db='verdict-cache.db'
chinadns_cache_db='dns-cache.db' chinadns_verdict_db='verdict-cache.db'
你这两个文件内容是啥?删了这两个 .db 文件看看 (先 ss-tproxy stop,然后删除 /etc/ss-tproxy/*.db,再 ss-tproxy start)
里面是空的,删除之后好了...感谢 这太奇怪了
里面是空的,删除之后好了...感谢 这太奇怪了
空的是指 ls -l 看到的文件 size 是 0?
我记得这种情况测试过,是没问题的。
你现在 restart 后看看这两个文件有生成吗,文件 size 是多少?start 后是否正常?
生成了 -rw-r--r-- 1 root proxy_dns 156 Apr 7 12:27 dns-cache.db -rw-r--r-- 1 root proxy_dns 0 Apr 7 12:27 verdict-cache.db
然后一切正常了
更新一下: 发现一个规律 只要更改过ss-tproxy.conf,重起ss-tproxy ChinaDNS必然失败,必须删除dns-cache.db跟verdict-cache.db,才能正常重起
只要更改过ss-tproxy.conf
比如改了什么内容?
只要更改过ss-tproxy.conf
比如改了什么内容?
比如我把ss从ss-libev改成ss-rust.或者tproxy='false'改成true
错误信息是一样的吗? 打开chinadns-ng的verbose日志,然后重现下,看看log。
是的,错误信息完全一样, 我只要把那两行注释掉,这些问题全消失
我复现不出来,暂时也想不出什么原因(看起来故障点很奇怪),等有空我再看看。