我想在我的android或flutter应用程序中添加自定义IPV4 DNS(如1.1.1.1),这意味着我的应用程序(如firebase/glide/retrofit)的所有流量都必须从我的自定义DNS路由我应该如何执行呢?我已经尝试了一些方法在NDK设置DNS为整个Android设备,但我不想接触Android DNS,只是我的应用程序应该使用该DNS
mum43rcc1#
这看起来像一个XY problem。您可能正在尝试使用自定义DNS实现一些我们不知道的功能(例如将对某个主机的请求替换为不同的服务器),但我们无法确定,因为您认为将DNS服务器更改为您的应用将是一个更好的解决方案,无论您遇到什么问题,但事实是这非常困难。
不可能仅为一个应用程序更改DNS,因为DNS配置对于设备是全局性的,因此任何网络请求都将默认使用设备的DNS服务器。实现这一目标的唯一可能途径是重新发明轮子:使用DnsResolver手动查询每个目标主机的DNS服务器,然后向特定IP地址发出请求。但使用HTTP时,您会发现如果您向一个IP地址发出请求,该IP地址将成为源报头,而不是域名,唯一的解决方案是使用裸套接字并手动实现所有HTTP有效载荷和报头,以给予不同的源。它也不适用于Firebase和其他闭源SDK,因为你不能修改它们,它只适用于你自己的代码发送的请求,或者允许你修改服务器地址的SDK。
1条答案
按热度按时间mum43rcc1#
你想要达到什么目标?
这看起来像一个XY problem。您可能正在尝试使用自定义DNS实现一些我们不知道的功能(例如将对某个主机的请求替换为不同的服务器),但我们无法确定,因为您认为将DNS服务器更改为您的应用将是一个更好的解决方案,无论您遇到什么问题,但事实是这非常困难。
虽然技术上可行,但极具挑战性。
不可能仅为一个应用程序更改DNS,因为DNS配置对于设备是全局性的,因此任何网络请求都将默认使用设备的DNS服务器。
实现这一目标的唯一可能途径是重新发明轮子:使用DnsResolver手动查询每个目标主机的DNS服务器,然后向特定IP地址发出请求。
但使用HTTP时,您会发现如果您向一个IP地址发出请求,该IP地址将成为源报头,而不是域名,唯一的解决方案是使用裸套接字并手动实现所有HTTP有效载荷和报头,以给予不同的源。
它也不适用于Firebase和其他闭源SDK,因为你不能修改它们,它只适用于你自己的代码发送的请求,或者允许你修改服务器地址的SDK。