OpenWrt 解决“连接被重置”

2019年03月10日 4929点热度 0人点赞 2条评论

随着 IPv6 网络在国内的普及,防火墙越来越厉害,IPv6 也逐渐开始被限制(最早的时候 IPv6 没有限制)。

如果有 IPv6 的小伙伴,并且在 OpenWrt 路由器上使用一些代理服务,最近使用 Chrome 浏览某些网站可能经常会遇到一个问题,Chrome 有时会提示 “连接被重置”。

如果把 IPv6 服务关闭,这个问题就不存在,那么这个问题是什么原因导致的,又该如何解决呢?

这个问题其实就是 IPv6 防火墙导致的,随着 IPv6 的普及,防火墙越来越厉害,开始试图封堵某些 IPv6 地址,但是现在所有的系统都是以 IPv6 为优先,如果域名同时解析出 IPv6 和 IPv4 地址,默认会尝试与 IPv6 地址连接,当无法连接时,才会切换至 IPv4。但是防火墙神奇的地方是,它并不会直接返回无法连接,而是连接被重置,这样可能就会导致系统或软件不停的尝试连接 IPv6,不会主动切换回 IPv4,还是很鸡贼的。

那么这篇教程小山就教大家如何解决这个问题,两个方法,粗暴和优雅,任君选择。

OpenWrt 连接被重置

粗暴的方法

粗暴的方法就是怎么简单怎么来,那什么方法够简单呢,当然是禁用 IPv6 了。

这种方法的优点就是不需要什么复杂的操作就可以解决所有设备的问题,缺点就是 IPv6 网络无法使用,看小伙伴们的取舍,我是不会用这种方法的,因为 IPv6 在 BT 和 PT 还是有很大用处的,

鉴于某些小伙伴不知道如何在 OpenWrt 禁用 IPv6,这里还是要讲一下的。

步骤基于 OpenWrt 18.06.1 使用 PPPoE 拨号

进入 OpenWrt 后台管理界面 → 切换到 [网络] 选项卡 → 编辑 [WAN] 接口 → 切换到 [高级设置] → 将 [获取 IPv6 地址] 更改为 [已禁用] → 保存并应用

OpenWrt 禁用 IPv6

禁用之后,你的路由器应该就没有 IPv6 地址了,问题解决。

优雅的方法

那什么方法才够优雅呢?

前面讲了,如果域名同时解析出 IPv6 和 IPv4 地址的情况下,系统会优先选择 IPv6 进行连接。如果域名没有被解析出 IPv6 地址呢?让部分域名只解析出 IPv4 地址,这样系统就只会连接 IPv4 了。

所以这个优雅的方法就是让路由器的 DNS 只返回某些域名的 IPv4 地址,不返回 IPv6 地址,这个方法复杂一些,如果不嫌麻烦,接着往下看。

正常的 DNS 服务器是肯定会返回 IPv6 地址的,所以要找一个可以只返回 IPv4 地址的 DNS 服务器,那么有没有呢?

肯定是有的,小山找到了一个本地 DNS 服务器软件,叫做:SmartDNS,具体介绍大家可以看这里:https://github.com/pymumu/smartdns

SmartDNS 可以设置多个 DNS 上游服务器,并且支持 UDP、TCP、TLS 三种方式进行 DNS 查询,可以有效的避免 DNS 污染,并且,它还可以设置禁止返回 IPv6 地址,我们可以用它来实现某些域名不返回 IPv6 地址。

首先在你的 OpenWrt 路由器上安装 SmartDNS,ipk 文件可以在这里下载:https://github.com/pymumu/smartdns/releases/latest,Luci 是通用的,核心文件是不通用的,需要安装适合自己路由器 CPU 架构的文件。如何安装 ipk 以及如何区分 CPU 架构,可以看看我之前写的关于 OpenWrt 的教程。

先来说下几种不同的场景:如果你使用的代理软件支持配置防污染 DNS 服务器,将服务器设置为 SmartDNS 即可;如果你使用 ChinaDNS 这些软件,将 SmartDNS 设置为 ChinaDNS 的上游服务器即可;如果你使用的代理软件不支持配置防污染 DNS 服务器,方法见下方。

我先针对前两种使用场景教大家如何配置 SmartDNS

设置 SmartDNS 的上游服务器,推荐使用 Google 和 Cloudflare 的 DNS,8.8.8.8 和 1.1.1.1,查询方式建议使用 TCP 或者 TLS,不建议使用 UDP。

然后切换到 [自定义设置],在最下方加上force-AAAA-SOA yes,代表 IPv6 解析返回 SOA。

最后启用 SmartDNS,将代理软件或 ChinaDNS 的上游 DNS 服务器设置好,就可以愉快的使用了。


下面教大家针对 代理软件不支持配置防污染 DNS 服务器 的情况设置 SmartDNS

方法分为两种:粗暴和优雅

粗暴的方法

粗暴的方法优点是方便,缺点是所有域名解析都不会返回 IPv6 地址,但是 IPv6 网络是可以用的。适用于对用 IPv6 访问网站没有需求,但是经常使用 BT 或 PT 的用户。

设置 SmartDNS 的上游 DNS 服务器,不过这次不止要配置国外的 DNS 服务器,还要配置一个国内的 DNS 服务器以用来快速解析正常域名。国内 DNS 服务器我推荐大家使用运营商分配的 DNS 或者 DNSPod

将 SmartDNS 的重定向改为 [作为 dnsmasq 的上游服务器],这样就可以让 dnamasq 所有解析都通过 SmartDNS 请求,然后返回给客户端。

然后切换到 [自定义设置],在最下方加上force-AAAA-SOA yes,代表 IPv6 解析返回 SOA。

最后启用 SmartDNS,就可以愉快的使用了。

优雅的方法

如果你有用 IPv6 访问正常网站的需求,又不想像上面那样“一刀切”,那么优雅的方法或许适合你,但是也有一些稍微麻烦。

优雅的方法是让 dnsmasq 请求某些域名的时候经过 SmartDNS,请求正常域名的时候不经过 Smart DNS。

要使用这个功能,dnsmasq 必须是完整版,如果你的 dnsmasq 不是完整版,可以安装dnsmasq-full软件包进行解决。

设置 SmartDNS 的上游服务器,推荐使用 Google 和 Cloudflare 的 DNS,8.8.8.8 和 1.1.1.1,查询方式建议使用 TCP 或者 TLS,不建议使用 UDP。

设置 SmartDNS 的端口为 5353

然后切换到 [自定义设置],在最下方加上force-AAAA-SOA yes,代表 IPv6 解析返回 SOA。

最后启用 SmartDNS。

这时候 SmartDNS 可以正常工作,不过我们需要配置一下 dnsmasq,让它将某些域名的解析转发到 SmartDNS。

下载 dnsmasq 配置文件:https://cokebar.github.io/gfwlist2dnsmasq/dnsmasq_gfwlist.conf

如果需要生成最新的 dnsmasq 配置文件,可以使用这个脚本:https://github.com/cokebar/gfwlist2dnsmasq

下载后将 dnsmasq 配置文件上传至路由器的 /etc 目录下

然后进入路由器的管理后台 → 切换到 [网络] 下的 [DHCP/DNS] → [高级设置] → 将 [额外的 SERVERS 文件] 更改为/etc/dnsmasq_gfwlist.conf → 保存并应用

dnsmasq

这样 dnsmasq 在解析某些域名的时候就会通过 SmartDNS 进行解析,而且不会返回 IPv6 地址。

如何测试是否配置成功,可以使用 Linux 下的 dig 命令,OpenWrt 可以安装bind-dig软件包。

执行dig www.google.com aaaa +short,如果没有返回任何结果,则代表配置成功。


以上就是如何解决在 OpenWrt 使用代理的情况下,遇到“连接被重置”的解决方法。如果你有不懂的地方,可以加入 QQ 群进行询问。

微信公众号二维码

微信扫描二维码关注我们

小山

一个什么都不会但要装作很厉害的人

文章评论

  • A.Z

    chrome最新版本tab muting up解决了吗(enable-tab-audio-muting),请研究一下google source code/api帮大家出谋划策

    2019年03月13日
    • 小山

      什么?,清描述清楚。

      2019年03月13日