如何搭建一个网络损伤环境

 

准备工作

  • 主机 - Linux 系统, 内核版本高于 2.6.
  • 双网卡 - 除原有板载网卡外, 额外需要一块 pci-e 网卡.
  • 路由器 - 支持桥接模式.
  • 系统模块和软件 - iproute2, iptables, sch_netem, dhcpd

安装Linux系统

  • 安装ubuntu(通过U盘安装)
  • 每次重新启动 按F12 ,进入bios,选择ubuntu选项
  • 安装openssh-server(ssh)
 sudo apt-get install openssh-server
  • 安装vim、git、python3、myzsh、pip、vscode等常见工具

配置环境

  • enp2s0 有线连接上级路由器, dhcp 获取 ip 地址
  • enp5s0 有线连接下级路由器 WAN口. 路由器设置为桥接模式关 dhcp 功能.
  • 打开 ip forward 功能
sudo vi /etc/sysctl.conf

# 修改 ip_forward=1为如下内容:
net.ipv4.ip_forward=1

# 使生效
$ sudo sysctl -p
  • 用 iptables 进行NAT转发
# 安装 iptables-persistent 包
$ sudo apt install iptables-persistent
 
 
# 设置 iptables NAT 转发
$ sudo iptables -F
$ sudo iptables -P INPUT ACCEPT
$ sudo iptables -P FORWARD ACCEPT
$ sudo iptables -t nat -A POSTROUTING -o enp2s0 -j MASQUERADE
 
 
# 保存iptables的设置
$ sudo iptables-save | sudo tee /etc/iptables/rules.v4
  • 启用 ifb 模块用于网损整形
$ sudo vim /etc/modules 

# 在文件的最后一行添加:ifb

注意:启用 ifb 的时候有一个 bug,导致 numifbs 不起作用,详情点击:https://bugs.launchpad.net/ubuntu/+source/kmod/+bug/1543183

$ sudo vim /etc/network/interfaces

auto lo
iface lo inet loopback
 
auto enp5s0
iface enp5s0 inet static
    address 192.168.5.1
    netmask 255.255.255.0
    broadcast 192.168.5.255
    gateway 192.168.5.2
  • 添加下面内容,使ifb0自动激活。
auto ifb0
iface ifb0 inet manual
    up ifconfig $IFACE up
  • 设置DHCP服务
# 安装相关的软件包
$ sudo apt install dhcpd
$ sudo apt install isc-dhcp-server
# 编辑文件,配置udhcpd服务
$ sudo vim /etc/dhcp/dhcpd.conf
将下面的内容:

 #subnet 10.254.239.0 netmask 255.255.255.224 {
 #  range 10.254.239.10 10.254.239.20;
 #  option routers rtr-239-0-1.example.org, rtr-239-0-2.example.org;
 #}

修改为:

 subnet 192.168.5.0 netmask 255.255.255.0 {
   range 192.168.5.100 192.168.5.199;
   option routers 192.168.5.1;
   option domain-name-servers 114.114.114.114;
 }
$ sudo vim /etc/default/isc-dhcp-server 

将下面的内容:
INTERFACESv4=""

修改为:
INTERFACESv4="enp5s0"
  • 启动DHCP服务
# 启动DHCP服务
$ systemctl enable isc-dhcp-server

执行到当前位置,基础的环境搭建完成。

  • 添加开机启动的脚本:
  • 进入 /etc/systemd/system/目录
  • 在该目录下创建.service文件,例如start.service vim start.service,进入该文件,并添加以下内容:
[Unit]
Description=FRP Client Daemon
After=network.target
Wants=network.target

[Service]
Type=simple
ExecStart=/home/yhx/Desktop/start.sh(添加脚本的路径)
Restart=always
RestartSec=20s
User=nobody

[Install]
WantedBy=multi-user.target
  • 重启ubuntu系统

Tcconfig 搭建和使用

  • 项目主页: https://github.com/stephenyin/tcconfig
  • 项目文档: https://tcconfig.rtfd.io/

安装deb

  • 下载deb 0.23.3版本:
https://github.com/stephenyin/tcconfig/releases/download/v0.23.3/tcconfig_0.23.3_amd64.deb
  • 这里需要注意的是,安装路径是当前目录下的,所以如果是不同系统的话,可能需要用到Filellza工具,链接如下:
https://filezilla-project.org/
  • 安装deb文件
$ sudo dpkg -i ./tcconfig_0.23.3_amd64.deb
  • 安装完成后测试是否安装成功
$ tcset --version
tcset 0.23.3

使用方法

  • 设置带宽高达100kbps的限制
tcset eth0 --rate 100Kbps
  • 设置100毫秒的网络延迟
tcset eth0 --delay 100ms
  • 设置在10秒的网络延迟
tcset eth0 --delay 10sec
  • 设置0.5分钟(30秒)的网络延迟
tcset eth0 --delay 0.5min
  • 例如设置0.1%的丢包率
tcset eth0 --loss 0.1%
  • 查看 enp2s0 网卡上当前已设置好的网损设置
$ tcshow enp2s0
  • 删除 enp2s0 网卡上的所有网损设置
$ tcdel enp2s0 --all
  • 将配置重定向到tcconfig.json文件
tcshow eth0 eth1 > tcconfig.json
  • 从配置文件(tcconfig.json)还原
tcset tcconfig.json --import-setting
  • 综合用法
# 限制 IP 源地址为 192.168.5.101 的设备发送到目的端口 5201 的上行带宽 500kbps + 上行丢包 30% + 上行延迟 100ms
$ tcset enp2s0 --rate 500kbps --loss 30 --delay 100ms --delay-distro 0ms --direction incoming --src-network 192.168.5.101 --port 5201
 
# 查看 enp2s0 网卡上当前已设置好的网损设置
$ tcshow enp2s0
{
    "enp2s0": {
        "outgoing": {
            "dst-network=192.168.5.101/32, protocol=ip": {
            "filter_id": "800::800",
            "rate": "1G"
            }
        },
        "incoming": {
            "src-network=192.168.5.101/32, dst-port=5201, protocol=ip": {
            "filter_id": "800::800",
            "delay": "100.0ms",
            "loss": 30,
            "rate": "500K"
            }
        }
    }
}
 
# 删除 enp2s0 网卡上的所有网损设置
$ tcdel enp2s0 --all
  • 其他用法可参考项目文档: https://tcconfig.rtfd.io/

 

你可能感兴趣的:(如何搭建一个网络损伤环境)