ATC介绍
https://github.com/facebookarchive/augmented-traffic-control
ATC是一个基于TC的端到端网络数据转发拥塞项目。
通过利用TC模拟在两个网卡之间的数据延时、丢包、抖动等网络模型。
python-django是一个框架,用于atc交互用的。
树莓派介绍
树莓派就是一个嵌入式linux设备,装好系统就是一台五脏俱全的pc主机,就是性能差了点,最新版本的raspiberry 4B 最高配置可选4GB内存的,性能据说是pi3b+的3倍。对比路由器,其性能还是强很多的。
树莓派硬件接口介绍
最新的pi4B 有一个千兆网口,一个type-c电源接口,两个4k级别的hdmi口,一个音频输出口,两个usb3.0口,两个usb2.0口,一组24pin的gpio口,有很强的拓展性,还有一个连接相机的csi口,无线连接方面,高性能蓝牙,双频wifi。整体来说树莓派4B对比3B升级挺多的,也挺值得买的。
网络拓扑图介绍
有两种搭建模式,如果想用树莓派发射热点并使用wifi接入,可以只用一根网线连接。
第二种模式是通过在树莓派增加一个USB网卡,随后用有线USB网卡连接路由器,路由器当作交换机使用,拓展树莓派的网口和wifi,测试树莓派的wifi性能没有路由器好。所以这种设置模式比较适合距离wifi较远的使用场景。
一图胜千言,这个图要仔细看,认真看!!
AP热点模式ATC搭建教程
第一步,进入系统中设置本地lcoal为china,不然热点频段不符合国内要求,其他设备连接的时候会出现断联的情况。
随后按照以下教程安装一键热点开启脚本
#全部使用root权限
#将代码copy到本地,安装 全部使用root权限
git clone https://github.com/oblique/create_ap
cd create_ap
make install
#安装依赖的库
apt-get install util-linux procps hostapd iproute2 iw haveged dnsmasq
#执行命令
#创建WiFi热点(GitHub上有多种方式创建,可以查找自己需要的那种)
sudo create_ap wlan0 eth0 热点名 密码
#开机启动
将 'sudo create_ap wlan0 eth0 热点名 密码 & ' 添加到/etc/rc.local文档中,即可开机启动
安装ATC脚本
去 https://github.com/facebookarchive/augmented-traffic-control 官网根据官网安装和配置,在配置settings.py文件时增加ALLOWED_HOSTS修改 ,允许所有ip使用ATC。
ALLOWED_HOSTS = ['*']
随后就是创建启动脚本:(脚本路径和名字: /home/pi/atcui/autoShell.py )
sudo nano /home/pi/atcui/autoShell.py
#写入以下内容
# coding: UTF-8
import sys
import time
reload(sys)
sys.setdefaultencoding('utf8')
import subprocess
import os
import commands
#os.system('cmd1 && cmd2')
startAP = "sudo create_ap wlan0 eth0 pi33 12345678 &"
runAtcServer = "sudo python /home/pi/atcui/manage.py runserver 0.0.0.0:8000"
startAtcInit = "sudo atcd --atcd-wan eth0 --atcd-lan wlan0"
subprocess.Popen(startAP, shell=True)
time.sleep(10)
subprocess.Popen(runAtcServer, shell=True)
time.sleep(10)
subprocess.Popen(startAtcInit, shell=True)
#subprocess.call(cmd,shell=True)
设定自启动,在etc/rc.local文件添加
python /home/pi/atcui/autoShell.py &
随后愉快地重启: sudo reboot
重启后,连接wifi,进入192.168.12.1:8000 网址后就可以看到熟悉的atc页面了。
路由桥接模式ATC搭建教程
把树莓派和路由器的wan口用有线连接在一起,路由器关闭dhcp服务器功能。树莓派通过自带的网口和外网连接。
首先,将目前已经安裝的软件都先更新到最新。
sudo apt update
sudo apt upgrade
安装对应的软件dnsmasq,用于解析dns
sudo apt install dnsmasq -y
停用对eth1 (usb有线网卡) 的DHCP客户端ip分配,设定固定ip。
sudo nano /etc/dhcpcd.conf
#编辑dhcpd.conf文件,在最后输入下文,随后保存,eth1是你作为lan口(usb网卡)的网卡名称,可以在ifconfig命令中查看
#这里采用的ip段192.168.7.xxx不要和你的wan口ip相同,防止发生冲突。
interface eth1
static ip_address=192.168.7.1/24
static routers=192.168.7.1
static domain_name_servers=8.8.8.8
设置dns
sudo nano /etc/dnsmasq.conf
# 设定dns内容,在此文件中输入下文,随后保存,eth1是网卡名称,dhcp-range是设定可用ip范围,一般是除了网口ip(上文设置的static routers)以外, .2到.253都设置为可分配ip,24h是指此ip刷新周期为24小时。
interface=eth1
domain-needed
bogus-priv
dhcp-range=192.168.7.2,192.168.7.253,24h
设定IP转发策略,用于wan口和lan口不同网卡不同网段之间的数据转发。
sudo nano /etc/sysctl.conf
net.ipv4.ip_forward=1
#开启ipv4转发功能
#退出文件并保存
#持续输入以下命令用于IP转发:
sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
#随后保存上述指令并设为开机自动运行
sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"
sudo nano /etc/rc.local
#在开机自启动文件rc.local中写入以下命令:
sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
iptables-restore < /etc/iptables.ipv4.nat
随后又到了喜闻乐见的重启环节:
sudo reboot
重启后设备连接到usb网卡上就可以自动获取ip,并可以正常上网了。如果重启后不能正常上网,请排查问题后再往下走。
随后是按照ATC,步骤和注意事项已经在上一个模式中给出,这里就不重复了,但是在编写rc.local文件时,启动atc的脚本要最后再运行,且脚本autoShell.py 要修改成下面这样子,就是删除AP开启指令。
# coding: UTF-8
import sys
import time
reload(sys)
sys.setdefaultencoding('utf8')
import subprocess
import os
import commands
#os.system('cmd1 && cmd2')
#startAP = "sudo create_ap wlan0 eth0 pi33 12345678 &"
runAtcServer = "sudo python /home/pi/atcui/manage.py runserver 0.0.0.0:8000"
startAtcInit = "sudo atcd --atcd-wan eth0 --atcd-lan eth1"
#subprocess.Popen(startAP, shell=True)
time.sleep(10)
subprocess.Popen(runAtcServer, shell=True)
time.sleep(10)
subprocess.Popen(startAtcInit, shell=True)
#subprocess.call(cmd,shell=True)
设置完atc重启后,连接路由器lan口或者连接路由器wifi,进入192.168.7.1:8000 网址后就可以看到熟悉的atc页面了。