本文记录如何利用Facebook ATC使用搭建一个弱网环境,与前一篇Dash net(网速控制,可变)类似,但是这个弱网环境不能动态变化,相比DASH_NET好处在可以连接多个设备,分别控制网速
为了更方便的配置环境,写了一个python脚本,建议阅读完本文后参考脚本进行配置.
工具简介
ATC是FaceBook开源的移动网络测试工具Augmented Traffic Control(ATC),能够方便的让我们模拟各种网络环境进行测试。
ATC有两个最吸引人的特点:
在手机上通过Web界面就可以随时切换不同的网络环境。
多个手机可以连接到同一个WIFI下,相互之间模拟的网络环境各不影响。
只要搜索facebook ATC就可以找到很多关于ATC环境搭建的文章,比如说FaceBook ATC 弱网测试工具环境搭建,我总结了一下,主要分以下几个步骤:
1.安装hostap。hostap的主要作用是将无线网卡作为一个分享的热点。
2.安装isc-dhcp-server。这是一个dhcp服务器,连上热点的手机通过dhcp服务器获取ip,进而才能通过网关上网。
3.设置NAT转发。简单来说就是把一个可以上网的网卡流量转发到分享热点的网络。
4.安装ATC。这是控制网速的主要部件,具体原理我了解的也不是很深。
5.安装python web服务器。这是供用户设置网速的界面,我想ATC用python web原因可能是python操作系统的东西更擅长些,虽然python在web方面没有什么优势。
搭建步骤
本文搭建环境,联想thinkcertre 8300t(只有一个有线网卡的台式机)装有ubuntu16.04LTS,tplink wr886n(路由器可以不一样,只有要支持交换机模式(ap模式)就可以),一个有线的usb网口(用来连接电脑和路由器)
使用路由器代替无线网卡
因为这里想用路由器来代替主机的无线网卡,所以第一步不需要去配置,也可以不用安装hostap。
整个环境配置过程基本都需要root权限,可以通过命令sudo su切换到root用户,但是在这里个人建议不要这样,在命令前加sudo来执行就行了。
(1,2,3,4步骤是为了使路由器像主机的无线网卡那样使用)
1.将路由器设置成交换机模式,不同路由器设置方式不一样
1)wr886n只要在设置里面把dhcp功能关闭就行,现在就已经是交换机模式了
2)更改路由器lan口的ip地址,使其不为网关地址,在lan口设置中,lan口ip设置改为手动,ip我改的是192.168.1.10(一般网关地址会设置成192.168.1.1),子网掩码为255.255.255.0
3)用usb网口连接电脑与路由器,网线连接的是路由器的lan口(注意不能连wan口)
4)连上后执行ifconfig,可以查看电脑是否连上路由器
我的输出有eno1,enx00e04c360211,lo(eno1是主机已有的网络接口,enx00e04c360211是usb接口,lo不用管)
2.安装dhcp
sudo apt-get install isc-dhcp-server(这一步要将与路由器连接的网线断开,保证电脑能正常联网下载安装)
此时执行sudo dhcpd,如果输出了命令详解则说明安装成功
像我的会报can't open /var/lib/dhcp/dhcpd.leases for append,这种错误
我google了一下,说是16.04中dhcp的bug,说是修复了,但是我的没有
执行ls -l /var/lib/dhcp/dhcpd.leases
如果没有该文件就新建该文件,如果有看看权限,需要是可写的,关机后启动可能有没有权限了,需要从这步开始检查
执行chmod 777 /var/lib/dhcp/dhcpd.leases
更改完权限执行sudo dhcpd
,应该没有报错了
3.执行下面命令查看本机DNS,后续配置需要使用
sudo nmcli dev show | grep IP4
在输出中,IP4.DNS后面的是DNS地址
4.配置dhcpd
dhcpd的配置文件是/etc/dhcp/dhcpd.conf
在终端执行
1)sudo vim /etc/dhcp/dhcpd.conf
在文件最后输入以下内容:subnet 192.168.1.0 netmask 255.255.255.0 { range 192.168.1.2 192.168.1.10; option routers 192.168.1.1; option domain-name-servers 10.210.97.123,10.210.97.21;#这里就是填看看查看的DNS地址,我有多个,所以我都写上了,用逗号隔开 }
注意:在subnet里定义的网段要与网卡IP所处网段一致(这个网卡指的是usb那个连接路由器的接口),而这个网卡ip我们后面会进行设置(将其设置成192.168.1.1,即当作网关使用)
2)sudo vim /etc/default/isc-dhcp-server
将文件的INTERFACES=""行改为INTERFACES="enx00e04c360211"
看注释,这行意思就是,写出dhcp server要进行ip分配的网口,这里就是连接usb的那个网口
5.设置enx00e04c360211(usb接口的ip)
sudo ifconfig enx00e04c360211 192.168.1.1 netmask 255.255.255.0
6.启动dhcp-server
执行下面命令(我电脑没有dhcp-server文件夹,我自己新建了一个,然后执行的下面命令)
sudo touch /var/run/dhcp-server/dhcpd.pid
sudo chmod 777 /var/run/dhcp-server/dhcpd.pid
sudo dhcpd enx00e04c360211 -pf /var/run/dhcp-server/dhcpd.pid
然后执行sudo netstat -uap
当显示在program name列显示dhcp时表示dhcp服务安装配置启动成功
7.IP转发
网上有两种方法
- 执行sudo bash -c "echo 1 >/proc/sys/net/ipv4/ip_forward"
- 在文件/etc/sysctl.conf中,取消这一行的注释:
net.ipv4.ip_forward= 1
然后执行使之立即生效
sudo sysctl -p
我两种方式都执行了
8.设置NAT(eno1为连接internet的网卡,enx00e04c360211为usb网卡用于连接路由器)
sudo iptables -F
sudo iptables -X
sudo iptables -t nat -A POSTROUTING -o eno1 -j MASQUERADE
sudo iptables -A FORWARD -i eno1 -o enx00e04c360211 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i enx00e04c360211 -o eno1 -j ACCEPT
到这里路由的NAT功能已经被启用,我们将刚才配置的iptables保存下来以便于下次使用:
sudo bash -c "iptables-save > /etc/iptables.ipv4.nat"
编辑
/etc/network/interfaces
然后在最后加上下面这行以使每次启动都自动加载iptables配置:
up iptables-restore < /etc/iptables.ipv4.nat
安装atc
- atc的git地址https://github.com/facebook/augmented-traffic-control
- atc的官方文档http://facebook.github.io/augmented-traffic-control/docs/install.html
- git中的readme与官方安装文档的区别是官方文档是在python的一个沙箱里安装的(虚拟环境)
- 注意atc支持python2.7和django1.10,务必对应这两个版本
- 首先使用git clone https://github.com/facebook/augmented-traffic-control.git拉取仓库代码
- sudo apt-get install python-pip(因为ubuntu16.04自带的是python2.7,所以不用另外安装python了)
- 复制git的安装方法sudo pip install atc_thrift atcd django-atc-api django-atc-demo-ui django-atc-profile-storage
- 但是这样安装django的版本不一定是1.10的,(python -m django --version,查看安装的版本)
1)要执行sudo pip uninstall django卸载之前安装的django
2)然后执行sudo pip install django==1.10,安装1.10版本的django - cd进入拉下来的atc仓库
- django-admin startproject atcui
- cd atcui
- 修改atcui/settings.py文件,在INSTALLED_APPS中添加下列代码
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文件,添加如下代码
...
...
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)),
]
- sudo atcd --atcd-wan eth0 --atcd-lan eth1 --atcd-dont-drop-packets(其中eth0代表电脑的输入网卡名,eth1代表输出网卡名)
- python manage.py runserver 0.0.0.0:8000
*到这步手机连上wifi,网页打开192.168.1.1:8000就可以控制调节网速了 - 执行utils/restore-profiles.sh localhost:8000在网页中有fb提前设置好的一些例子
运行完atc后,会将之前的配置存储在/var/lib/atcd.db文件里