用树莓派搭一个弱网模拟网关,让你的应用在2G、高延迟、丢包环境下跑一遍

前言

应用在真实环境里出问题的原因有很多,网络条件差是其中最常见也最难复现的一种。视频会议卡一下、页面加载超时、API 请求失败------这些情况在开发机器上可能一次都没出现过,到用户手里却频繁发生,核心原因就是开发阶段根本没有在弱网环境下测试过。

Facebook 开源的 ATC(Augmented Traffic Control)就是做这件事的工具:它能模拟从 2G 到 4G 的带宽限制、人工注入延迟、制造丢包和乱序,在可控环境下复现各种真实网络状况。配合树莓派搭一个便携式的弱网网关,手机或者电脑连上这个热点,所有流量都会经过 ATC 的控制规则,想要什么网络条件在 Web 面板里点一下就生效,被测设备上不需要装任何客户端。

如果你经常需要测试 App 或者 Web 应用在差网络下的表现,这个组合比买专业设备省成本,配置一次之后每次要用的时候开机就行。

1.介绍Augmented Traffic Control

Augmented Traffic Control(增强型流量控制,简称ATC) 是由Facebook开源的一款网络条件模拟工具,旨在帮助开发者和测试人员在可控环境中复现真实世界的复杂网络状况。

核心功能:精准模拟多样网络环境

ATC能够灵活模拟从高速宽带到极端劣化网络的各种场景,包括常见的移动网络(如 2G、3G、4G、5G)以及高延迟、低带宽或高丢包的受损链路。通过精细调控以下关键网络参数,实现高度逼真的流量仿真:

  • 带宽限制:控制上下行传输速率,模拟网速受限场景;
  • 延迟(Latency):人为引入传输延迟,测试应用实时性表现;
  • 丢包率(Packet Loss):模拟数据包在传输过程中丢失的情况;
  • 数据包损坏(Packet Corruption):注入错误比特,验证协议容错能力;
  • 数据包乱序(Packet Reordering):打乱数据包到达顺序,检验应用对乱序的处理机制。

灵活易用:无需客户端,Web即控

ATC提供直观的Web管理界面,用户可直接在浏览器中动态调整网络策略,实时启用或取消流量整形(Traffic Shaping),无需在被测设备上安装任何代理或客户端软件,极大简化了测试流程。

模块化架构:高可扩展性

ATC采用模块化设计,核心组件包括:

  • atcd:底层流量控制守护进程;
  • django-atc-api:提供 RESTful 接口;
  • django-atc-demo-ui:官方演示 Web 界面;
  • django-atc-profile-storage:支持网络配置模板的存储与复用。

这种解耦架构便于开发者根据实际需求进行功能扩展、集成或定制化开发。

2.开启无线热点

2.1更新系统

确保你的树莓派操作系统是最新的:

shell 复制代码
sudo apt update

2.2安装所需软件包

安装hostapd和dnsmasq:

shell 复制代码
sudo apt install hostapd dnsmasq -y

2.3停止禁用服务

停止并禁用hostapd和dnsmasq:

shell 复制代码
sudo systemctl stop hostapd
shell 复制代码
sudo systemctl stop dnsmasq
shell 复制代码
sudo systemctl disable hostapd
shell 复制代码
sudo systemctl disable dnsmasq

2.4配置wlan0的静态 IP 地址

编辑网络配置文件/etc/dhcpcd.conf:

shell 复制代码
sudo nano /etc/dhcpcd.conf

添加以下内容(假设无线网卡接口是 wlan0,使用ifconfig查找自己的网卡):

shell 复制代码
interface wlan0
static ip_address=192.168.110.1/24
nohook wpa_supplicant

2.5配置dnsmasq

备份原有的dnsmasq配置文件(以防配置错误导致服务启动失败):

shell 复制代码
sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf1

创建一个新的 dnsmasq 配置文件:

shell 复制代码
sudo nano /etc/dnsmasq.conf

添加以下内容:

shell 复制代码
interface=wlan0
dhcp-range=192.168.110.2,192.168.110.100,255.255.255.0,24h

2.6配置hostapd

创建并编辑hostapd配置文件:

shell 复制代码
sudo nano /etc/hostapd/hostapd.conf

添加以下内容:

shell 复制代码
interface=wlan0
driver=nl80211
ssid=haha //自己修改热点名
hw_mode=g
channel=7
ieee80211n=1
wmm_enabled=1
ht_capab=[HT40][SHORT-GI-20][DSSS_CCK-40]
macaddr_acl=0
ignore_broadcast_ssid=0
auth_algs=1
wpa=2
wpa_passphrase=12hdwek //自己修改密码
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP

2.7修改hostapd默认配置

编辑hostapd默认配置文件:

shell 复制代码
sudo nano /etc/default/hostapd

找到并修改以下行,指向你的配置文件:

shell 复制代码
DAEMON_CONF="/etc/hostapd/hostapd.conf"

2.8启用ip转发

编辑 /etc/sysctl.conf,启用IP转发:

shell 复制代码
sudo nano /etc/sysctl.conf

添加以下行:

shell 复制代码
net.ipv4.ip_forward=1

使更改生效:

shell 复制代码
sudo sysctl -p

2.9设置NAT

使用iptables配置 NAT:

shell 复制代码
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

保存 iptables 规则:

shell 复制代码
sudo mkdir -p /etc/iptables
shell 复制代码
sudo sh -c "iptables-save > /etc/iptables/rules.v4"

2.10启动并启用服务

启动并启用hostapd和dnsmasq服务:

shell 复制代码
sudo systemctl unmask hostapd
sudo systemctl unmask dnsmasq
sudo systemctl start hostapd
sudo systemctl start dnsmasq
sudo systemctl enable hostapd
sudo systemctl enable dnsmasq

检查服务状态:

shell 复制代码
sudo systemctl status hostapd
sudo systemctl status dnsmasq

2.11验证是否成功

输入命令,查看wlan0是否出现IP,出现即为成功配置:

shell 复制代码
ifconfig

手机和电脑也出现了热点信息,连接即可(网速是很快的哦~如果很慢就是配置过程出错啦)

3.配置ATC

3.1安装python2.7和virtualenv,创建atc虚拟环境

安装python2.7和virtualenv:

shell 复制代码
sudo apt install virtualenv python2.7 -y

使用Python 2.7解释器创建一个名为 atc 的独立 Python 虚拟环境:

shell 复制代码
virtualenv -p /usr/bin/python2.7 atc
shell 复制代码
cd atc/bin

创建atc虚拟环境:

shell 复制代码
source activate

3.2安装atc

切换到atc目录下:

shell 复制代码
cd ~/atc

安装atc:

shell 复制代码
pip2 install atc_thrift atcd django-atc-api django-atc-demo-ui django-atc-profile-storage

用于创建一个新的 Django 项目,项目名称为 atcui:

shell 复制代码
django-admin startproject atcui

3.3配置django

配置settings.py,在 INSTALLED_APPS 中添加 ATC 的应用:

shell 复制代码
sudo nano atcui/atcui/settings.py

添加如下:

shell 复制代码
ALLOWED_HOSTS = ['*']   //'*'表示允许所有地址
INSTALLED_APPS = (
    ...
    'rest_framework',
    'atc_api',
    'bootstrap_themes',
    'django_static_jquery',
    'atc_demo_ui',
    'atc_profile_storage',
)

配置 django 路由:

shell 复制代码
sudo nano atcui/atcui/urls.py

添加如下:

shell 复制代码
from django.views.generic.base import RedirectView
from django.conf.urls import include
urlpatterns = [
    ...
    url(r'^api/v1/', include('atc_api.urls')),
    url(r'^atc_demo_ui/', include('atc_demo_ui.urls')),
    url(r'^api/v1/profiles/',include('atc_profile_storage.urls')),
    url(r'^$', RedirectView.as_view(url='/atc_demo_ui/', permanent=False)),
]

更新django的数据库:

shell 复制代码
bin/python atcui/manage.py migrate

3.4运行 ATC

启动 ATC 的核心流量控制服务atcd:

shell 复制代码
nohup sudo bin/atcd --atcd-wan eth0 --atcd-lan wlan0 --atcd-dont-drop-packets &

启动ATC的Web管理界面:

shell 复制代码
nohup bin/python atcui/manage.py runserver 0.0.0.0:8000 &

4.添加 facebook 的默认网络配置

克隆Augmented Traffic Control(ATC)项目的源代码到本地:

shell 复制代码
git clone https://github.com/facebookarchive/augmented-traffic-control.git

运行当前目录下的restore-profiles.sh脚本,并传入参数192.168.110.1:8000,用于将预定义的网络配置文件恢复到指定 ATC Web API 地址:

shell 复制代码
cd ~/atc/augmented-traffic-control/utils
shell 复制代码
./restore-profiles.sh 192.168.110.1:8000

5.打开ATC网页

使用的设备(手机电脑均可)连接前面设置好的热点"haha",然后打开网页:192.168.110.1:8000

可以看到成功打开:

输入想要造成弱网的设备Address和Token,就可以操控对应设备啦!(不设置就是操控本机)

还有很多对应的参数可以设置:

我想要验证的是丢包率,所以给这个参数设置为"10",丢包率即为10%

点击Update Shaping即可。

在实际开发与测试工作中,弱网环境的复现往往受限于物理位置和网络条件。通过将Facebook ATC 部署在树莓派上作为局域网弱网网关,并配合 Cpolar内网穿透,我们能轻松突破这些限制:

  • 当你在家或咖啡馆远程办公时,只需用手机连接树莓派创建的Wi-Fi热点,再通过Cpolar生成的公网链接打开ATC控制面板,即可实时模拟2G、高延迟或丢包场景,调试App在弱网下的加载逻辑、超时处理或降级策略;
  • 团队协作时,无需每人搭建一套环境,所有人共用同一台ATC设备,产品经理、测试、前端均可通过同一个Cpolar链接访问并切换网络预设,确保测试条件一致;
  • 向远程同事演示问题也变得极其简单------只需分享Cpolar链接,对方就能亲眼看到"为什么用户在地铁里打不开页面",甚至亲手调整参数复现问题,大幅提升沟通效率。

这种"ATC + Cpolar"组合,以极低的成本实现了专业级的远程弱网测试能力,真正让网络质量可控、可测、可共享。

接下来跟我一起部署cpolar吧!

6.安装cpolar实现随时随地搭建弱网环境

cpolar 可以将你本地电脑中的服务(如 SSH、Web、数据库)映射到公网。即使你在家里或外出时,也可以通过公网地址连接回本地运行的开发环境。

❤️以下是安装cpolar步骤:

使用一键脚本安装命令:

shell 复制代码
sudo curl https://get.cpolar.sh | sh

安装完成后,执行下方命令查看cpolar服务状态:(如图所示即为正常启动)

shell 复制代码
sudo systemctl status cpolar

Cpolar安装和成功启动服务后,在浏览器上输入虚拟机主机IP加9200端口即:【http://ip:9200】访问Cpolar管理界面,使用Cpolar官网注册的账号登录,登录后即可看到cpolar web 配置界面,接下来在web 界面配置即可:

7.配置公网地址

登录cpolar web UI管理界面后,点击左侧仪表盘的隧道管理------创建隧道:

  • 隧道名称:可自定义,本例使用了:atc,注意不要与已有的隧道名称重复

  • 协议:http

  • 本地地址:8000

  • 域名类型:随机域名

  • 地区:选择China Top

    点击创建:

创建成功后,打开左侧在线隧道列表,可以看到刚刚通过创建隧道生成了公网地址,接下来就可以在其他电脑或者移动端设备(异地)上,使用地址访问。

访问成功。

8.保留固定公网地址

使用cpolar为其配置二级子域名,该地址为固定地址,不会随机变化。

点击左侧的预留,选择保留二级子域名,地区选择china top,然后设置一个二级子域名名称,我这里演示使用的是atcc,大家可以自定义。填写备注信息,点击保留。

登录cpolar web UI管理界面,点击左侧仪表盘的隧道管理------隧道列表,找到所要配置的隧道atc,点击右侧的编辑

修改隧道信息,将保留成功的二级子域名配置到隧道中

  • 域名类型:选择二级子域名
  • Sub Domain:填写保留成功的二级子域名
  • 地区: China Top

点击更新

更新完成后,打开在线隧道列表,此时可以看到随机的公网地址已经发生变化,地址名称也变成了保留和固定的二级子域名名称。

最后,我们使用固定的公网地址在任意设备的浏览器中访问,可以看到成功访问本地部署的页面,这样一个永久不会变化的二级子域名公网网址即设置好了。

这样,我们就可以在有需要时立刻打造弱网环境啦!

总结

ATC 配合树莓派这套方案,核心价值是把"弱网测试"这件事变得可重复、可控、不需要依赖第三方测试平台。树莓派作为网关跑在局域网里,任何连上来的设备都被 ATC 管理,不需要在被测设备上装东西,也不需要昂贵的专业网络测试仪器。

cpolar 在这里打通的是远程访问的通道------不在同一个局域网、甚至不在家的时候,通过穿透的地址打开 ATC 控制面板,远程调整网络参数,团队其他人也能通过同一个链接访问同一套测试环境,测试条件是共享的,不是各自搭一套。

整体来说这套方案适合有持续弱网测试需求的人群,对于偶尔测一次的情况,意义相对有限;但如果这个需求是真实存在的,这套组合的成本和复杂度都算低的。

相关推荐
流年如夢2 小时前
类和对象(上)
android·java·开发语言
kyle~2 小时前
查找---插值查找(二分查找的改进版本)
开发语言·c++
高翔·权衡之境2 小时前
主题7:缓存与队列——速度不匹配的通用解
开发语言·人工智能·物联网·缓存·信息与通信·信号处理
:1212 小时前
java面试
java·开发语言·面试
lsx2024062 小时前
Ruby 注释
开发语言
Hunter_pcx3 小时前
ubuntu:内存假泄漏
linux·运维·服务器·开发语言·c++·人工智能·ubuntu
三品吉他手会点灯3 小时前
C语言学习笔记 - 36.数据类型 - 为什么需要输出控制符
c语言·开发语言·笔记·学习
吃好睡好便好3 小时前
在Matlab中绘制非默认峰值图
开发语言·学习·算法·matlab
qq_401700413 小时前
Qt如何 发送带结构体数据的信号
开发语言·qt