smartdns icon indicating copy to clipboard operation
smartdns copied to clipboard

在ipv6与ipv4都存在的情况下,怎么样仅仅返回ipv6?

Open gexiaopeng opened this issue 1 year ago • 13 comments

需求应用场景 有些域名比如dbiptv.sn.chinamobile.com(陕西) 会有ipv6与ipv4,但ipv4外省电信网络被屏蔽了,对于普通客户端会优先使用ipv6的,这个没有问题。但我需要用ngxin转发这个地址(proxy_pass http://dbiptv.sn.chinamobile.com/xxx),用nginx的resolver 做dns解析时,nginx会随机选择一个ip(可能是ipv6,也可能是ipv4),这样导致有时访问超时

建议的方案 希望可以增加配置属性,在ipv6与ipv4同时存在的情况下,只返回ipv6 (可以扩展为 在ipv6与ipv4同时存在的情况下,只返回ipv4)

(dualstack-ip-allow-force-AAAA yes 不起作用)

设备信息 研凌工控机j3160

gexiaopeng avatar Dec 08 '23 07:12 gexiaopeng

大概和 #1407差不多。 但是正常情况下,如果dns同时返回了ipv6和ipv4,终端会首选ipv6去连接。nginx没理解是哪个过程,正向代理?

PikuZheng avatar Dec 08 '23 12:12 PikuZheng

address /dbiptv.sn.chinamobile.com/#4

pymumu avatar Dec 09 '23 09:12 pymumu

移动iptv 全移动都可以用

lalasou avatar Dec 10 '23 03:12 lalasou

大概和 #1407差不多。 但是正常情况下,如果dns同时返回了ipv6和ipv4,终端会首选ipv6去连接。nginx没理解是哪个过程,正向代理?

nginx用 proxy_pass  http://dbiptv.sn.chinamobile.com/xxx.xxx 会从resolver获取到的nds随机设置一个,可能是ipv4也有可能是ipv6

gexiaopeng avatar Dec 11 '23 01:12 gexiaopeng

address /dbiptv.sn.chinamobile.com/#4

这个设置是仅仅对特定的域名dbiptv.sn.chinamobile.com 禁用ipv4 ,我是想对所有的域名,如果有ipv6与ipv4就只要ipv6,如果是单ipv4,就直接返回ipv4.

gexiaopeng avatar Dec 11 '23 01:12 gexiaopeng

移动iptv 全移动都可以用

但对电信运营商,屏蔽了ipv4地址,但是ipv6可以用。所以我的应用场景:对于所有域名,如果有ipv4与ipv6地址的,只要返回ipv6而不需要同时返回ipv4 。而单ipv4的还是直接返回ipv4。

gexiaopeng avatar Dec 11 '23 01:12 gexiaopeng

懂了,Nginx拿到DNS结果后的随机使用问题

PikuZheng avatar Dec 11 '23 04:12 PikuZheng

稍微查了一下,nginx在解析域名时的确是ipv6优先的,除非nginx自身所在的操作系统没有ipv6 https://github.com/nginx/nginx/blob/f9a25736fd049075baf76a35628d2351b20f8ab8/src/core/ngx_resolver.c ipv6优先是RFC的要求,nginx遵循此要求。

PikuZheng avatar Dec 11 '23 04:12 PikuZheng

稍微查了一下,nginx在解析域名时的确是ipv6优先的,除非nginx自身所在的操作系统没有ipv6 https://github.com/nginx/nginx/blob/f9a25736fd049075baf76a35628d2351b20f8ab8/src/core/ngx_resolver.c ipv6优先是RFC的要求,nginx遵循此要求。

但是从Nginx的错误日志来看,有时会解析到ipv4,操作系统有Ipv6的,我的nds服务器禁用ipv4以后,可以访问到ipv6的。

gexiaopeng avatar Dec 11 '23 05:12 gexiaopeng

。。。有时会?nginx不是只在启动时解析一次吗

PikuZheng avatar Dec 11 '23 06:12 PikuZheng

proxy_pass

请求proxy_pass 的时候再解析的

gexiaopeng avatar Dec 11 '23 06:12 gexiaopeng

查了一些资料,Nginx在proxy-pass配置域名时,仅在启动时解析一次。如果要在ttl超时后重新解析,需要使用resolv指定使用哪个dns服务器。 也可能你需要关闭smartdns的测速和双栈ip优选

PikuZheng avatar Dec 14 '23 00:12 PikuZheng

查了一些资料,Nginx在proxy-pass配置域名时,仅在启动时解析一次。如果要在ttl超时后重新解析,需要使用resolv指定使用哪个dns服务器。 也可能你需要关闭smartdns的测速和双栈ip优选

我在nginx使用了resolver 指定dns的(resolver 192.168.8.200;),我也关闭smartdns的测速和双栈ip优选。问题是smartdns同时返回ipv6与ipv4以后,nginx会随机选一个ip使用。所以smartdns最好能配置在双栈ip的情况下仅仅返回ipv6 (优选有时并不能满足特定场景)

gexiaopeng avatar Dec 14 '23 01:12 gexiaopeng