树莓派+ATC搭建强大的弱网模拟环境
在RTC服务的开发中,我们需要测试服务在各种网络环境下的可用性,以保证用户在复杂环境下的通信体验。因此需要搭建测试环境模拟wifi/3g/4g,以及各种延迟,丢包,乱序的网络条件,验证服务在这些环境下的数据和主观体验。
对于终端来说,iOS相对方便一些,可以直接在系统设置中设定弱网模拟条件; Android相对来说就比较麻烦了,公开的方案基本上都是在win / linux下启用wifi热点供终端连接,然后再启动相应的弱网模拟工具(NEWT / ATC)等。这种方案在单人测试时表现较好,但是开发组里面每个参与测试的人都需要搭建自己的环境,不够通用。最好是能有一台专用的设备来提供模拟弱网的wifi热点,终端设备只要连接并设定自己的网络模拟参数就能进行弱网测试。
今天我们就来搭建一个便携,通用,面向开发组公开的弱网模拟测试环境,所需的硬件设备是树莓派一台,网线一根(用来连接树莓派的有线网口和交换机/路由器)。我这里用的是树莓派3B。(吃灰多年的设备终于派上用场了)。
注:如果你的树莓派跟我一样吃灰很长时间的话,请写入最新的树莓派镜像,否则后面安装软件包的时候会出现各种奇怪问题。(浪费一下午时间的血泪经验)
先来看看网络连接的拓扑图

开启树莓派无线热点,提供无线接入能力,并通过有线网口链接到WAN
注:如果是最新的树莓派镜像,网口命名规则改变为mac地址相关,我们需要运行raspi-config来将命名规则更改为旧的命名方式,方便我们下面配置
1.首先安装hostapd和dnsmasq,让树莓派可以开启wifi热点,提供dhcp服务。(最好把软件源指向国内服务器,加快安装速度)
$ sudo apt install hostapd dnsmasq
2.配置wlan0 内网IP,编辑/etc/dhcpcd.conf文件,在最后添加如下内容,将树莓派无线网卡ip地址设定为10.1.0.1
interface wlan0 static ip_address=10.1.0.1/24 nohook wpa_supplicant
3.设置无线内网dhcp分配地址范围,编辑/etc/dnsmasq.conf文件,在最后添加如下内容,将dhcp分配地址范围设定为10.1.0.2~10.1.0.255,24小时有效期
interface=wlan0 dhcp-range=10.1.0.2,10.1.0.255,255.255.255.0,24h
4.设置树莓派无线热点ssid,账号密码等信息。编辑/etc/hostapd/hostpad.conf,添加如下内容:
interface=wlan0 driver=nl80211 ssid=mypi1 #无线热点ssid hw_mode=g channel=7 wmm_enabled=0 macaddr_acl=0 auth_algs=1 ignore_broadcast_ssid=0 wpa=2 wpa_passphrase=shumeipai #无线热点密码 wpa_key_mgmt=WPA-PSK wpa_pairwise=TKIP rsn_pairwise=CCMP
5.配置转发规则,设置路由转发连接到WAN
编辑/etc/sysctl.conf,移除net.ipv4.ip_forward=1 前面的注释
# Uncomment the next line to enable packet forwarding for IPv4 net.ipv4.ip_forward=1
更新iptables转发规则并保存
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"
编辑/etc/rc.local,重启后自动加载转发规则
iptables-restore < /etc/iptables.ipv4.nat
6.重启服务,用手机连接mypi1热点,测试是否能正常上网
sudo service hostapd restart sudo service dnsmasq restart
安装ATC,开启弱网模拟测试功能
Augmented Traffic Control(ATC) 是Facebook开源的一款网络测试模拟工具,可以让连接到测试平台的终端通过网页自由设定上下行丢包,延迟,乱序,限速等网络参数,并保存为预设配置。工具本身也预设了一些典型模拟参数如3G 4G 等。
首先是安装依赖包并开启Django project:
pip install atc_thrift atcd django-atc-api django-atc-demo-ui django-atc-profile-storage django-admin startproject atcui cd atcui
编辑atcui/settings.py,启用ATC:
INSTALLED_APPS = ( ... # Django ATC API 'rest_framework', 'atc_api', # Django ATC Demo UI 'bootstrap_themes', 'django_static_jquery', 'atc_demo_ui', # Django ATC Profile Storage 'atc_profile_storage', )
编辑atcui/urls.py,启用ATC 路由:
... ... from django.views.generic.base import RedirectView from django.conf.urls import include urlpatterns = [ ... # Django ATC API url(r'^api/v1/', include('atc_api.urls')), # Django ATC Demo UI url(r'^atc_demo_ui/', include('atc_demo_ui.urls')), # Django ATC profile storage url(r'^api/v1/profiles/', include('atc_profile_storage.urls')), url(r'^$', RedirectView.as_view(url='/atc_demo_ui/', permanent=False)), ]
更新Django DB:
python manage.py migrate
运行atcd,设置要模拟弱网的lan为wlan0 (默认是eth1):
sudo -E atcd --atcd-lan wlan0
编辑settings.py,设置允许通过10.1.0.1访问atcui
ALLOWED_HOSTS = ['10.1.0.1']
启动ATC UI网页
python manage.py runserver 0.0.0.0:8000
启动之后,终端连接上树莓派热点,然后访问10.1.0.1:8000(之前设置的树莓派内网地址)来设置自己的弱网模拟参数,进行弱网功能测试。
