准备工作
- 主机 - 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 搭建和使用
安装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/