我当地的住房互联网提供商刚刚改变了它的政策,他们似乎阻止路由器工作1。
我的设置(已经工作了一年):
[ISP router (in the residence, out of my reach)] -- My DD-WRT router -- PC
-- : RJ45 cable connection
Run Code Online (Sandbox Code Playgroud)
截至目前,它停止工作。经过一些测试,这是我发现的:
我想了解 ISP 是否有可能以这种方式阻止连接,以及是否有办法避免它2。
1 这一变化显然是为了防止人们同时使用多个设备。这是一个从未宣布过的任意规则。他们只能做到这一点,因为他们垄断了我的学生宿舍。
2 我不认为这是未经授权的,因为我从未签署任何 ToS 或必须接受任何 EULA。我搬进来的那天,我插上了我的路由器,从那时起它就一直在工作。我付房租,我的住所付给ISP,因此垄断。
我在其标准网关配置上使用 DD-WRT。这似乎是一个一对多的 NAT,因为这个网站说:
要禁用 NAT 并仍然拥有路由/防火墙,您可以将操作模式更改为“路由器”而不是“网关”(位于高级路由中)
而这个DD-WRT的维基页面解释了如何配置一个一对一NAT,因此我的默认配置应该是一个一对多的NAT。
这样对吗?如果已经是这种情况,我的 ISP 是否能够以某种方式检测我是否使用了直接连接?我认为将来自路由器的数据包的 TTL 手动设置为 1 会产生这种效果,但我不确定。
编辑:也许我误解了它,但 TTL 可能是罪魁祸首。这是结果ping 8.8.8.8:
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=1 time=12.3 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=1 time=3.52 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=1 time=21.1 ms
Run Code Online (Sandbox Code Playgroud)
请注意 TTL 字段始终为 1。
然而,我以前从未注意过这一点。这可能是正常的吗?否则,我可以告诉DD-WRT增加它吗?
事实证明,确实是 TTL 导致了问题!这是一个常见问题解答风格的答案,希望对其他人更广泛有用。
如果你的情况和我的一样,路由器过去(现在)工作得很好。问题是我的 ISP 刚刚实施了TTL throttling。
TTL 节流包括将IP 数据包的 TTL(生存时间)设置为 1,以防止使用路由器:来自 WAN(互联网)的所有数据包在到达 PC 之前都被丢弃(因为它们的 TTL 变为 0) .
当使用直接电缆连接时(应该可以正常工作),尝试 ping 任何服务器,最好通过 IP 来避免 DNS 问题。谷歌的公共DNS服务器好记,所以我经常这样做:
ping 8.8.8.8
Run Code Online (Sandbox Code Playgroud)
结果将包含一个字段ttl(或TTL在 Windows 上):
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=1 time=12.3 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=1 time=3.52 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=1 time=21.1 ms
Run Code Online (Sandbox Code Playgroud)
在这个例子中,TTL 正好是 1。在实践中,如果没有 TTL 限制,这种情况发生的几率几乎为零。ttl=1是您的 TTL 受到限制的指标。
您需要配置您的路由器,以便它修改传入数据包的 TTL,将其增加到更高的值(例如 64),以便数据包在到达连接到您的路由器的设备之前不会被丢弃。
不幸的是,具体细节将取决于每个路由器/固件。我在我的路由器中安装了 DD-WRT,所以我使用iptables规则来配置它。
经过各种尝试,我最终成功定义了一个对我有用的规则,但每个固件版本可能都不同!在找到一种有效的组合之前,您可能需要尝试多种组合。
以下是我添加到 DD-WRT 启动脚本中的命令:
iptables -v -t mangle -A OUTPUT -j TTL --ttl-set 60
iptables -v -t mangle -A PREROUTING -j TTL --ttl-set 63
Run Code Online (Sandbox Code Playgroud)
他们几乎肯定在某种程度上是错误的,但重要的部分是:
-v获取详细输出;将指示不正确的命令;-n(对于数字,即 IP 输出);尽管在 DD-WRT 的 Iptables 页面中被提及,但我的 DD-WRT 版本中似乎不存在此选项,从而导致无提示错误。我只是通过$?在命令后回显来注意到它,结果是 255 而不是 0。删除这个选项允许我看到错误消息;ping命令在 PC 上的控制台上运行,同时iptables在另一个控制台上尝试命令。默认情况下,我的路由器以 回复ttl=64,但是当我得到一个有效的规则时,我可以立即看到 ping 返回新值(因此在我的示例中我没有使用 64)在使用OUTPUT链时(否则,它不是实际互联网连接所必需的);PREROUTING,有人提到INPUT。我不确定其中的区别,但PREROUTING似乎对我来说效果更好。不幸的是,这仍然不理想:每隔一小时左右,我的连接似乎就会重置,因此我必须手动更新 iptables 规则。
注意:我对 几乎一无所知iptables,因此欢迎提出更好的规则建议(我将相应地测试和更新它们)。
如果您使用 Windows/Mac 计算机作为路由器(例如使用您的 PC/笔记本电脑与其他设备共享您的 Internet 连接),则 Connectify 等软件(根据他们的网站,从 7.1 版开始)也可以绕过 TTL 限制。
Connectify 调用此设置避免酒店/NAT 限制。默认情况下它处于活动状态,这可以解释为什么没有那么多人在 Internet 上抱怨 TTL 节流:Windows 用户最终主要使用 Connectify,而没有询问它为什么起作用。然而,这可以解释为什么 Windows 的标准 Internet 连接共享可能无法开箱即用。
最后一点...
可能不会,特别是如果你的 ISP,像我的一样,(1) 已经进行了带宽限制,(2) 引入了 TTL 限制但从未宣布过,并且 (3) 显然只对欺骗用户感兴趣,而不是改进服务。人为地删除标准功能并通过“欺骗”(伪造 TTL是欺骗),只收取两倍的费用将其放回原处,这是一个非常卑鄙的举动。