ss-tproxy icon indicating copy to clipboard operation
ss-tproxy copied to clipboard

从4.8升级到4.8.3后chinadns-ng报错

Open sophauer opened this issue 8 months ago • 19 comments

环境 树莓5. 升级到4.8.3后.,chinadns-ng报错 [opt.zig:482 opt_verdict_cache] invalid opt-value: '-m'

sophauer avatar Apr 07 '25 03:04 sophauer

chinadns-ng 更新到最新版本。

zfl9 avatar Apr 07 '25 03:04 zfl9

chinadns-ng --version ChinaDNS-NG 2025.03.27 601c689 | wolfssl-5.7.6 | target:arm-linux-musleabihf | cpu:generic+v7a | mode:fast+lto

这应该是最新的啊

sophauer avatar Apr 07 '25 03:04 sophauer

不能吧,你是不是自己加了什么参数?把 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,同步变更的部分)

zfl9 avatar Apr 07 '25 03:04 zfl9

## 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传来的命令行参数(位置参数)

sophauer avatar Apr 07 '25 03:04 sophauer

我发现只要把 chinadns_cache_db='dns-cache.db' chinadns_verdict_db='verdict-cache.db' 备注掉就正常了

sophauer avatar Apr 07 '25 03:04 sophauer

ss-tproxy start -x 我看看启动 chinadns-ng 时发生了什么

zfl9 avatar Apr 07 '25 04:04 zfl9

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

sophauer avatar Apr 07 '25 04:04 sophauer

看这个日志没问题呀,参数正常,chinadns-ng的PID也获取到了,说明运行成功。

zfl9 avatar Apr 07 '25 04:04 zfl9

你看最底,

  • _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'

sophauer avatar Apr 07 '25 04:04 sophauer

chinadns_cache_db='dns-cache.db' chinadns_verdict_db='verdict-cache.db'

你这两个文件内容是啥?删了这两个 .db 文件看看 (先 ss-tproxy stop,然后删除 /etc/ss-tproxy/*.db,再 ss-tproxy start)

zfl9 avatar Apr 07 '25 04:04 zfl9

里面是空的,删除之后好了...感谢 这太奇怪了

sophauer avatar Apr 07 '25 04:04 sophauer

里面是空的,删除之后好了...感谢 这太奇怪了

空的是指 ls -l 看到的文件 size 是 0?

我记得这种情况测试过,是没问题的。

你现在 restart 后看看这两个文件有生成吗,文件 size 是多少?start 后是否正常?

zfl9 avatar Apr 07 '25 04:04 zfl9

生成了 -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

然后一切正常了

sophauer avatar Apr 07 '25 04:04 sophauer

更新一下: 发现一个规律 只要更改过ss-tproxy.conf,重起ss-tproxy ChinaDNS必然失败,必须删除dns-cache.db跟verdict-cache.db,才能正常重起

sophauer avatar Apr 07 '25 06:04 sophauer

只要更改过ss-tproxy.conf

比如改了什么内容?

zfl9 avatar Apr 07 '25 06:04 zfl9

只要更改过ss-tproxy.conf

比如改了什么内容?

比如我把ss从ss-libev改成ss-rust.或者tproxy='false'改成true

sophauer avatar Apr 07 '25 06:04 sophauer

错误信息是一样的吗? 打开chinadns-ng的verbose日志,然后重现下,看看log。

zfl9 avatar Apr 07 '25 06:04 zfl9

是的,错误信息完全一样, 我只要把那两行注释掉,这些问题全消失

sophauer avatar Apr 07 '25 06:04 sophauer

我复现不出来,暂时也想不出什么原因(看起来故障点很奇怪),等有空我再看看。

zfl9 avatar Apr 10 '25 07:04 zfl9