Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于谷歌等不能正常访问的ip双栈选择策略? #360

Closed
MeIsReallyBa opened this issue Feb 15, 2020 · 8 comments
Closed

关于谷歌等不能正常访问的ip双栈选择策略? #360

MeIsReallyBa opened this issue Feb 15, 2020 · 8 comments

Comments

@MeIsReallyBa
Copy link

问题现象
启用双栈优选,访问谷歌等V4 V6等均不能ping通的网址,同时返回V4 V6地址

运行环境

  1. 固件型号
    padavan路由器,路由器运行shadowsocks,开启路由自身代理
  2. 运营商
    中国移动
    重现步骤
  3. 上游DNS配置。
    smartdns做dnsmasq的上游
  4. 访问的域名。
    google.com

信息收集
[2020-02-15 13:07:46,929][ INFO][ dns_client.c:2571] send request google.com, qtype 1, id 720
[2020-02-15 13:07:46,939][ INFO][ dns_server.c:676 ] result: google.com, rcode: 0, 59.24.3.174
[2020-02-15 13:07:46,944][ INFO][ dns_server.c:2266] query server google.com from 127.0.0.1, qtype = 28
[2020-02-15 13:07:46,945][ INFO][ dns_client.c:2571] send request google.com, qtype 1, id 721
[2020-02-15 13:07:46,946][ INFO][ dns_client.c:2571] send request google.com, qtype 28, id 722
[2020-02-15 13:07:47,814][ INFO][ dns_server.c:712 ] result: google.com, rcode: 0, 2607:f8b0:4007:0804:0000:0000:0000:200e

客户端同时返回v4 v6 ip,但路由器的shadowsocks透明代理不支持v6,会导致访问异常。因此可否考虑启用双栈优选时,如果v4 v6均不通,只返回v4而不是同时返回?

@MeIsReallyBa
Copy link
Author

路由器上运行mtr -4 -T google.com,延迟1ms,看起来mtr的tcp流量走的是shadowsocks。但是测速选择tcp 80后,依然同时返回v4 和 v6地址,不知道是不是smartdns的tcp走的直连。。。

@pymumu
Copy link
Owner

pymumu commented Feb 16, 2020

bind已支持禁用IPV6解析。

@onion83
Copy link

onion83 commented Feb 16, 2020

@pymumu bind 一刀切感觉太暴力了 某些场景下 ipv6 还是 快于 ipv4 的 不如在新功能 domain-rules 上加 force-AAAA-SOA 吧

@tty228
Copy link

tty228 commented Feb 17, 2020

@pymumu bind 一刀切感觉太暴力了 某些场景下 ipv6 还是 快于 ipv4 的 不如在新功能 domain-rules 上加 force-AAAA-SOA 吧

已经加上了啊,如果是lean版本,自行修改luci,或者关闭第二dns
自定义规则
bind [::]:5335 -group office -no-dualstack-selection -force-aaaa-soa

然后好像很诡异的失效了,昨天我测试的时候还好好的,只返回 V4 地址,ipv6 测试 也会显示无法解析,玩了一天不知道啥原因居然无效了

@pymumu
Copy link
Owner

pymumu commented Feb 17, 2020

@onion83 用address /xx/#6

@onion83
Copy link

onion83 commented Feb 17, 2020

@pymumu 我觉得 domain-rules 的功能已经和 address、nameserver 重合了,可以考虑整合一下。否者用户心智上可能比较麻烦

保留 bind、server、domain、[ip/set]-list 四个概念足以

  • bind 按一般的网络编程习惯,一般用来监听端口和套接字,提供访问入口,不会在上面附加过多功能.
  • server 一般只是相同属性的上游服务器,并且可以加载一些默认的规则,如 no-speed-check、force-aaaa-soa 之类的,用于处理默认的域名解析
  • domain 就是域名规则了,结合 gfwlist ,ad-host 之类的应该会有大量的社区生态,但是需求千差万异,其实 no-speed-check \ force-aaaa-soa \ ipset \ ttl \ 增加linux x64版下载。 #4|6- 都属于动作,附加在域名规则上反而最灵活
  • ip/set 本质上就是一个list,现在就一个 white / black 感觉不够灵活,本质都是列表,黑、白、添、删除、过期都是动作,如果想不同 group 都有自己独立的 white/black list 呢?
iplist [NAME] [SIZE?] [TTL?] x.x.x.x

iplist AAAA 8.8.8.8 4.4.4.4 1.1.1.1 1.0.0.1
iplist BBBB 4.4.4.4 5.5.5.5 6.6.6.6 7.7.7.7
iplist BBBB 210e:/16

iplist CCCC 1.0.0.0/8
iplist DDDD 240e::/16

iplist TTL-LIST 65533 60s 110.110.119.119
.....
server 1.2.3.4  -group ISP -allow-iplist AAAA -deny-iplist BBBB 
server 5.6.7.8  -group ISP -allow-iplist AAAA -allow-iplist BBBB  -deny-iplist CCCC -deny-iplist DDDD
server 9.10.11.12  -group TTL -allow-iplist AAAA -add-iplist TTL-LIST

可以考虑实现服务内的限量、限时列表,减少对外部 ipset 模块的依赖,并实现添加指令

ip[4|6]set [NAME] [TTL] x.x.x.x

ip4set  V4set 200 4.4.4.4 5.0.0.0/8 
ip6set  V6set -1 240e::/16
.....
server 1.2.3.4  -group ISP -allow-iplist AAAA -deny-iplist BBBB -add-ip4set V4set -add-ip6set V6set 
.....
domain-rules /www.baidu.com/  -add-ip4set V4set
domain-rules /www.google.com/ -add-ip4set V4set -add-ip6set V6set -speed-check-mode none

另外 有没有发现多条 server 指令会产生一些二义性,会导致程序需要做一些合并功能的操作,如果再抽一层出来,将功能加载在服务器组上 那就没这些麻烦了

server-group [NAME] [... ACTION]

server-group  g1 -add-ip4set V4set -add-ip6set V6set -speed-check-mode none
server-group  g2 -speed-check-mode none -force-AAAA-SOA yes
server-group  g3 -add-iplist TTL-LIST

server(node?)指令精简如下,不再具备功能,对外服务最小单位为 server-group

server 1.1.1.1  -server-group  g1
server 3.3.3.3  -server-group  g1
server 5.5.5.5 6.6.6.6  -server-group  g1

server 2.2.2.2 -server-group  g2
server 4.4.4.4 -server-group  g2

server 110.110.119.119 -server-group  g3

domain-rules /.google.com/ -server-group g1
nameserver /.baidu.com/g2
nameserver /.twitter.com/g3
还希望直接引入hosts 文件,直接使用大量社区成果.

hosts-file [FILENAME]

hosts-file /etc/smartdns/no-ad.conf

no-ad.conf
------------
0.0.0.0 www.baidu.com
0.0.0.0 .baidu.com

以上,会不会更清晰、更好玩一些:)

@pymumu
Copy link
Owner

pymumu commented Feb 17, 2020

address, nameserver, ipset, server等都是继承自dnsmasq的,这个大家都比较熟悉了,容易理解,并且在配置转换上也比较容易。 至于domain-rules部分功能和上述重复,这个就是设计成这样的,因为如果一个域名,如果要配置多个参数,那么就用domain-rules,一条记录,否则就用address,nameserver等,这样方便管理。
未来一些不常用的高级配置,会直接放入domain-ruls.

所以,配置格式不会有大的变化,也不会再搞一套配置。

至于host,host其实是很难维护管理的,因为host并不包含子域名,这些都会导致host体积过大,且处理上不高效。host都是早期的IP、主机维护方法。
host要转换成address也很容易,也就是一个命令的事情,比如

grep -v '^\s*$\|^\s*\#' hosts | awk '{if ($1 ~/0.0.0.0/){printf "address /%s/#\n", $2}else if( $1 ~/:/){printf "address /%s/[%s]\n", $2, $1} else {printf "address /%s/%s\n", $2, $1}}'

所以,host不会支持。

@MeIsReallyBa
Copy link
Author

domain-rules /google.com/ -address #6 -nameserver foreign
暂时还是只用domain-rules,手动屏蔽掉gfw的v6解析

@pymumu pymumu closed this as completed Jun 9, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants