概述
可以简单的将iptables理解为虚拟的防火墙,可以完成对封包的过滤、重定向和网络地址的重定向等等功能。tc主要是对流量进行一些的控制。打个比方的话tc就像建立一些限速规则,而iptables可以去选择要使用哪些规则。本次练习要求
1. Ubuntu里搭建一个FTP Server
2. 通过iptables和tc限制某个PC往FTP Server里传文件的速度为20Mbps,读文件的速度为10Mbps
一、建立ftp服务器
1、安装vsftpd
sudo apt-get install vsftpd
安装完成后可以用vsftpd -version查看安装的版本号
2、新建一个文件夹用于FTP的工作目录,在该目录下在新建两个目录一个upload一个download,将这两个目录的权限改成可读可写可操作。
3、新建FTP用户并设置密码以及工作目录
sudo useradd -d /home/peanut/ftp 123
passwd 123 设置密码 123
4、修改配置文件
sudo vim /etc/vsftpd.conf
设置属性值
anonymous_enable=NO #禁止匿名访问
local_enable=YES
write_enable =YES
local_root=/home/peanut/ftp
保存返回
5、启动vsftpd服务
sudo service vsftpd start
在cmd中输入ftp 172.21.43.2
输入账号123密码123登陆
在cmd中下载文件用get + 文件名 上传用put + 文件名
二、利用TC+IPTABLE进行限速
编写一个shell脚本
#! /bin/bash
#清除之前链以及表上建立的规则
sudo tc qdisc del dev eth0 root 1>/dev/null
sudo tc qdisc del dev ifb0 root 1>/dev/null
sudo tc qdisc del dev eth0 ingress
sudo iptables -t mangle -F
#TC设置的第一步先在网卡eht0上配置一个队列(有htb,cbq两种类型,这里选择了htb)
sudo tc qdisc add dev eth0 root handle 1: htb
#设置一个class他的父类是1: 他的id是1:2。速度上限跟下限都设置成1.25m
sudo tc class add dev eth0 parent 1: classid 1:2 htb rate 1.25mbps ceil 1.25mbps
#给这个设置一个标号为2,优先级为1
sudo tc filter add dev eth0 parent 1: prio 1 protocol ip handle 2 fw flowid 1:2
#用iptables给他打上mark,.3是window的ip.2是虚拟机的ip
sudo iptables -t mangle -A POSTROUTING -s 172.21.43.2 -d 172.21.43.3 -j MARK --set-mark 2 #download
sudo iptables -t mangle -A POSTROUTING -s 172.21.43.2 -d 172.21.43.3 -j RETURN
#对网卡输入口(ingress)进行限速
sudo tc qdisc add dev eth0 ingress
#将发给eth0的进行重定向,发给ifb0,然后对ifb0的输出进行限速
sudo tc filter add dev eth0 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0
sudo tc qdisc add dev ifb0 root handle 1: htb
sudo tc class add dev ifb0 parent 1: classid 1:1 htb rate 2.5mbps ceil 2.5mbps
sudo tc filter add dev ifb0 parent 1: prio 1 protocol ip u32 match ip dst 172.21.43.2 flowid 1:1
三、小结
刚开始对上传和下载进行了同样的tc限速,发现只有下载是有效果的,上传并没有作用。后来查阅资料后发现,tc只能对从网卡出去的数据流进行限速,不能对他接收的进行限速。通过查阅资料得知,可以新建一个虚拟网卡,数据流先流向虚拟网卡,在从虚拟网卡中流出,在流出的时候就利用tc进行限速。另外经过实践,速度并不能完全达到设置的值,网络的波动也会产生不小的影响。