我使用 AT&T 的蜂窝互联网连接。每个人都连接到 Wi-Fi 接入点,我将 Raspberry Pi 连接到该接入点作为 DNS/DCHP/网关服务器。
在我的 Pi 上,我使用 dnsmasq 为每个设备(如果在列表中)分配一个静态 IP 地址。然后我使用 iptables 为每个设备设置规则(计算带宽,如果超出则限制)这是两个设备的示例。
Chain FORWARD (policy ACCEPT)
target prot opt source destination
usb-w all -- 0.0.0.0/0 192.168.1.3
usb-w all -- 192.168.1.3 0.0.0.0/0 MAC 00:11:22:33:44:55
tab all -- 0.0.0.0/0 192.168.1.4
tab all -- 192.168.1.4 0.0.0.0/0 MAC 66:77:88:99:AA:BB
Local all -- 0.0.0.0/0 0.0.0.0/0
Chain Local (2 references)
target prot opt source destination
ACCEPT all -- 192.168.1.0/24 192.168.1.0/24
REJECT all -- 192.168.1.0/24 0.0.0.0 reject-with icmp-port-unreachable
Chain usb-w (2 references)
target prot opt source destination
Local all -- 0.0.0.0/0 0.0.0.0/0
Chain tab (2 references)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/
在 PHP 脚本中,我记录用户表的字节数并将其清零。如果设备超出了预设上限,则用户表将更改为本地表。它一直有效好的一阵子。
两个月前,我们开始讨论 AT&T 的上限很多。在故障排除阶段,我发现,例如,我记录了 10GB 的使用量,但 AT&T 和他们的互联网设备显示我用了 20GB。
与他们通完电话后(他们说是我),我进行了下载测试。我从 Debian 的站点下载了文件 debian-live-8.4.0-i386-cinnamon-desktop.iso,直接连接到 AT&T 设备,然后再次连接到 pi。我发现我的 Pi 使用了两倍的数据。
那么我该如何解决这个问题?超额收费很昂贵,这个月的账单超过了 600 美元。
答案1
在我看来,你的规则没有什么明显的错误。我本来想以评论的形式发布,但它太长了。
我会采用不同的方法来解决这个问题 - 尝试在连接到手机的 NIC 上使用 wireshark。
关闭所有使用网络的设备,然后从单个数据包开始发送/接收。我建议使用 Linux 上的 -s 标志对设置的有效负载进行 ping;我不记得 Windows 标志了。发送一个已知数据包,接收数据包,然后检查您的脚本和 wireshark 以查找差异。如果有任何差异,您将能够在 wireshark 中看到您是否正在传输 2x、接收 2x 或您的 php 脚本有问题。如果需要,将传输大小增加到更大但已知的值。如果需要,请从 ping 切换到 ftp 或 http,因为问题可能与协议有关。例如,ICMP 和 UDP 是无连接的,而 TCP 不是 - TCP 可以在协议级别请求重新传输,其他两个则不会(UDP 可以,但在应用程序级别)
除非手机本身在重新传输时出现问题,否则 Wireshark 应该会给出“正确”答案。您可能在手机上安装了数据测量工具,请在测试之前重置该工具,看看它是否开始与您的 wireshark 和 php 计数明显不同。
基本上,我建议您确认这是一个真正的问题,并在深入进行低级调试之前开始描述问题。实际上,这可能是 iptables 的问题,但我不会从那里开始。完成这些测试后,尝试在没有自定义 iptables 规则的情况下再次运行它们,并检查行为是否有变化。
如果您收集这些数据,那么答案很可能会自行出现,但如果没有,则会发布结果。
如果结果是手机问题,您可以进行环回测试(将某些内容传输到外部服务器并将其重定向回给您),但设置起来会有点麻烦。