只有直接连接有效,但不能通过路由器


5

我当地的住房互联网提供商刚改变了它的政策,他们似乎阻止了路由器工作1

我的设置(已经工作了一年):

[ISP router (in the residence, out of my reach)] -- My DD-WRT router -- PC

-- : RJ45 cable connection

截至目前,它已停止工作。经过一些测试,这是我发现的:

  • 路由器 - PC连接似乎没问题(我可以通过SSH访问其Web界面)
  • Router-ISP连接似乎没问题(通过SSH连接到我的路由器,我可以ping 8.8.8.8/8.8.4.4)
  • PC-Router-ISP连接不起作用(甚至不能ping 8.8.8.8/8.8.4.4)

我想了解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

请注意,TTL字段始终为1。

但是,我之前从未关注过这个问题。这可能是正常的吗?否则,我可以告诉DD-WRT增加吗?


你在路由器上配置了什么类型的NAT(如果你有的话)?一对一还是一对多?对于一对多NAT,路由器后面的所有内容都不应对您的提供商可见,因为所有源IP地址都会立即更改为路由器的公共IP地址。对于提供商,它应该看起来只有一个设备连接。
VL-80

我必须检查它,因为DD-WRT的NAT/QoS选项卡仅列出端口转发设置。安装DD-WRT之后,我认为我不必更改默认设置,因此我认为没有配置NAT,或者我的路由器已经对所有内容进行了NAT处理。如果我应该激活NAT,我应该选择一对一还是一对多?
anol 2015年

2
核实。路由器后面没有NAT配置的设备不会被外界“隐藏” - 我的意思是这些设备的连接将具有其原始设备的源地址。如果是这种情况,那么您的提供商可以发现它并阻止此类连接。您应该启用一对多 NAT。
VL-80

请原谅无知,但我希望DD-WRT路由默认情况下已经进行了一对多NAT,因为它创建了一个子网,我的PC有一个192.168。* IP,我必须手动转发任何端口到我局域网中的设备。我将编辑以添加有关我发现的内容的详细信息
anol 2015年

1
@anol,检查这个答案。到达路由器的TTL 1数据包将停在那里 - 不会被转发。还有这篇文章。如果您的路由器允许您更改TTL,请尝试增加传入数据包的TTL。这样,数据包应该能够到达路由器后面的主机。如果它不起作用 - 我们将不得不根据第二篇文章解决问题。
VL-80

Answers:


5

事实证明,确实是导致问题的TTL!这是一个常见问题解答风格的答案,希望对其他人更有用。

为什么我的连接只能通过直接电缆工作,而不能通过路由器工作?我的路由器工作不正常吗?

如果你的情况和我一样,那么路由器就可以正常工作了。问题是我的ISP刚刚实施了TTL限制

什么是TTL限制?

TTL限制包括将IP数据包的TTL(生存时间)设置为1,以防止使用路由器:来自WAN(Internet)的所有数据包在到达PC之前都被丢弃(因为它们的TTL变为0) 。

如何检测TTL限制?

当使用直接电缆(应该正常工作)连接时,尝试ping任何服务器,最好是通过IP来避免DNS问题。谷歌的公共DNS服务器很容易记住,所以我经常这样做:

ping 8.8.8.8

结果将包含一个字段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

在这个例子中,TTL正好是1.在没有TTL限制的情况下,实际发生这种情况的几率几乎为零。ttl=1是您的TTL受到限制的指标

如何规避TTL限制?

您需要配置路由器,以便它可以修改传入数据包的TTL,将其增加到更高的值(例如,64),以便在到达连接到路由器的设备之前不会丢弃数据包。

不幸的是,具体细节将取决于每个路由器/固件。我的路由器安装了DD-WRT,因此我使用iptables规则来配置它。

经过各种尝试,我最终成功地定义了一个适合我的规则,但每个固件版本可能都不同!在找到有效的组合之前,您可能需要尝试几种组合。

有关配置DD-WRT iptables以取消TTL限制的一般提示

  • 如果可以,请使用SSH命令行连接到路由器。它更快,它为您提供有关错误命令的反馈;
  • 您可能必须了解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

它们在某种程度上几乎肯定是错误的,但重要的部分是:

  • 总是-v用来获得详细的输出; 将指出不正确的命令;
  • 避免使用-n(对于数字,即IP输出); 尽管在DD-WRT的Iptables页面中提到过,但我的DD-WRT版本中似乎不存在此选项,导致出现无提示错误。我只是通过$?命令后回显注意到它,结果是255而不是0.删除此选项允许我看到错误消息;
  • 为了在PC上没有可用的Internet连接进行快速测试,您可以ping在控制台上运行PC上的iptables命令,同时在另一个控制台上尝试命令。默认情况下,我的路由器正在回复ttl=64,但是当我得到一个有效的规则时,我可以在使用OUTPUT链时立即看到ping返回新值(因此为什么我没有在我的例子中使用64)(否则,它不是实际的互联网连接所必需的);
  • 有人提到连锁店PREROUTING,其他人提到INPUT。我不确定区别,但PREROUTING似乎对我来说效果更好。

不幸的是,这仍然不理想:每隔一小时左右,我的连接似乎被重置,所以我必须手动更新iptables规则。

注意:我几乎不知道任何事情iptables,所以欢迎任何有关更好规则的建议(我会相应地测试和更新它们)。

Windows / Mac互联网共享

如果您使用Windows / Mac计算机作为路由器(例如,使用您的PC /笔记本电脑与其他设备共享您的Internet连接),诸如Connectify之类的软件(根据其网站的 7.1版本)也可以绕过TTL限制。

Connectify将此设置称为避免酒店/ NAT限制。它默认是活动的,这可以解释为什么没有那么多人抱怨互联网上的TTL限制:Windows用户最终主要使用Connectify,而没有问为什么它有效。然而,这将解释为什么Windows的标准Internet连接共享可能无法开箱即用。

并最后说明......

我应该对避免TTL限制感到不舒服吗?

可能不是,特别是如果你的ISP,像我的,(1)已经进行了带宽限制,(2)引入了TTL限制而没有宣布它,并且(3)显然只对欺骗其用户感兴趣,而不是改善服务。删除的标准功能人为和“作弊”(伪造TTL 欺骗),只有两倍收取把它放回去,是一种非常卑鄙的举动。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.