皮皮网
皮皮网

【潜艇源码】【java进制转换源码】【java源码 流媒体】htb源码详解

时间:2024-12-23 22:44:58 来源:金源码

1.LaTeX学习笔记II:数学公式与代码排版(附源码)
2.Linux下针对路由功能配置iptables的码详方法详解
3.源代码是什么
4.HTB系列靶机Frolic的渗透测试详解
5.TC的详细使用方法

htb源码详解

LaTeX学习笔记II:数学公式与代码排版(附源码)

       本文旨在深入介绍利用LaTeX进行数学公式与代码排版的方法,为生成高质量科技和数学类文档提供技术支持。码详LaTeX以其卓越的码详排版功能和数学公式处理能力,成为学术和出版领域中的码详首选工具。在前文的码详基础上,本文将着重探讨以下几点:

       1. 插入页码

       在LaTeX文档中插入页码,码详潜艇源码可通过调用`\pagenumbering{ 数字形式}`命令实现。码详此命令后可指定页码的码详显示形式,如阿拉伯数字、码详罗马数字(大小写)、码详拉丁字母(大小写)等。码详

       2. 高亮显示Matlab代码

       为了在LaTeX中高亮显示Matlab代码,码详可借助`mcode`宏包。码详该宏包需要从Matlab论坛下载,码详并集成到CTEX宏包中。码详使用时,应确保文档加载了`mcode`,以实现代码的高亮显示功能。

       由于`lisitings`宏包不支持中文高亮,显示中文代码面临挑战。解决方法较为简单,即避免在Matlab代码中使用中文字符。

       3. 公式输入与排版

       LaTeX提供了多种方式输入数学公式,如使用`amsmath`包中的命令,如`cases`、`sum`等。插入空心字符使用`amsfonts`包中的`mathbb{ R}`命令。矩阵、方程组及求和式的排版可通过`aligned`环境实现,支持多行书写、对齐以及换行。

       公式不标序号可通过在公式环境声明中添加星号“*”实现。对于矩阵的表示,LaTeX提供了丰富的省略符号,如`cdots`、`ddots`、`vdots`等。

       4. 位置

       LaTeX通过`[htbp]`参数控制在文档中的浮动位置。`h`表示当前位置,`t`表示顶部,`b`表示底部,`p`表示浮动页。一般情况下,`[htb]`组合更为常用,确保文档布局美观。

       正确使用这些参数,结合`float`宏包的`[H]`选项,可以灵活控制的显示位置,满足不同布局需求。如果遇到位置问题,应合理调整参数组合,以达到最佳排版效果。

       本文提供了LaTeX中数学公式与代码排版的实用技巧,旨在帮助用户高效地生成高质量文档。通过掌握上述方法,用户能够更加便捷地处理复杂的数学表达和程序代码展示,实现专业化的java进制转换源码文档制作。

Linux下针对路由功能配置iptables的方法详解

       作为公司上网的路由器需要实现的功能有nat地址转换、dhcp、dns缓存、流量控制、应用程序控制,nat地址转换通过iptables可以直 接实现,dhcp服务需要安装dhcpd,dns缓存功能需要使用bind,流量控制可以使用tc,应用程序控制:例如对qq的封锁可以使用 netfilter-layer7-v2.+-protocols---.tar.gz来实现

       1、网络规划

        操作系统是centos5.8

       2、安装dhcpd

       代码如下:

       yum install dhcp-3.0.5-.el5

       vim /etc/dhcp/dhcpd.conf

       ddns-update-style interim;

       ignore client-updates;

       subnet .0.0.0 netmask ...0 {

       option routers .0.0.1;

       option subnet-mask ...0;

       option domain-name-servers .0.0.1;

       range dynamic-bootp .0.0. .0.0.;

       default-lease-time ;

       max-lease-time ;

       }

        3、安装bind,实现dns缓存

       代码如下:

       yum install bind.i bind-libs.i bind-utils.i

       vim /etc/named.conf

       options {

       directory "/var/named";

       allow-recursion { .0.0.0/; };

       recursion yes;

       forward first; #将所有请求都进行转发

       forwarders { ...; }; #定义转发服务器地址

       };

       zone "." IN {

       type hint;

       file "named.ca";

       };

       zone "localhost" IN {

       type master;

       file "named.localhost";

       allow-transfer { none; };

       };

       zone "0.0..in-addr.arpa" IN {

       type master;

       file "named.loopback";

       allow-transfer { none; };

       };

       创建根域文件,默认有

       代码如下:

       dig -t NS . /var/named/named.ca

       chown :named /var/named/named.ca

       创建本地正向解析文件,默认有

       代码如下:

       vim /var/named/named.localhost

       $TTL 1D

       @ IN SOA @ rname.invalid. (

       0 ; serial

       1D ; refresh

       1H ; retry

       1W ; expire

       3H ) ; minimum

       NS @

       A .0.0.1

       chown :named /var/named/named.localhost

       创建本地反向解析文件,默认有

       代码如下:

       vim /var/named/named.loopback

       $TTL 1D

       @ IN SOA @ rname.invalid. (

       0 ; serial

       1D ; refresh

       1H ; retry

       1W ; expire

       3H ) ; minimum

       NS @

       A .0.0.1

       PTR localhost.

       chown :named /var/named/named.loopback

       检查主配置文件

       代码如下:

       named-checkconf

       检查根区域配置文件

       代码如下:

       named-checkzone “.” /var/named/named.ca

       检查区域文件

       代码如下:

       named-checkzone “localhost” /var/named/named.localhost

       启动服务

       代码如下:

       service named start

       4、重新编译编译内核和iptables以支持应用层过滤

       由于实行防火墙功能的是netfilter内核模块,所以需要重新编译内核,需要下载新的内核源码,并使用netfilter-layer7-v2.作为内核的补丁一起编译到内核中。而控制netfiler的是iptables工具,因此iptables也必须重新编译安装,最后再安装应用程序过滤特征码库-protocols--.tar.gz

       1、给内核打补丁,并重新编译内核

       2、给iptables源码打补丁,并重新编译iptables

       3、安装proto

       备份iptables脚本和配置文件

       代码如下:

       cp /etc/rc.d/init.d/iptables /root/iptables.sysv

       cp /etc/sysconfig/iptables-config /root/iptables-config

       2.6内核下载地址

       /l7-filter/

       iptables源码下载地址

       /l7-filter/

       代码如下:

       xz -d linux-2.6...tar.xz

       tar -xvf linux-2.6...tar.gz -C /usr/src #新的内核源码,用于重新编译

       tar -zxvf netfilter-layer7-v2..tar.gz -C /usr/src #内核补丁和iptables补丁 ,只支持到2.6.

       #进入解压目录并创建软连接

       pcd /usr/src

       ln -sv linux-2.6.. linux

       #进入内核目录

       pcd /usr/src/linux

       #为当前内核打补丁

       ppatch -p1 ../netfilter-layer7-v2./kernel-2.6.-2.6.-layer7-2..path

       #为了方便编译内核将系统上的内核配置文件复制过来

       pcp /boot/config-2.6.-.el5 /usr/src/linux/.config

       编译内核

       代码如下:

       make menuconfig

       Networking support - Networking Options - Network packet filtering framework - Core Netfilter Configuration

       Netfilter connection tracking support

       "lawyer7" match support

       "string" match support

       "time" match support

       "iprange" match support

       "connlimit" match support

       "state" match support

       "conntrack" connection match support

       "mac" address match support

       "multiport" Multiple port match support

       Networking support - Networign options - Network packet filtering framework - IP:Netfiltr Configuration

       IPv4 connection tracking support (required for NAT)

       Full NAT

       MASQUERADE target support

       NETMAP target support

       REDIRECT target support

       在Networking support中选择 Networking options

       查找Network packet filtering framework(Netfilter)–Core Netfiler Configrationg–Netfilter connection tracking support(NEW),”layer7″ match support(NEW),”time” match support(NEW),”iprange”

       查找IP:Netfilter Configuration–IPv4 connection tracking support,Full NAT(NEW)

       代码如下:

       make

       make modules_install

       make install

       重启操作系统选择新内核登录

       卸载旧的iptables

       代码如下:

       rpm -e iptables-1.3.5-9.1.el5 iptables-ipv6-1.3.5-9.1.el5 iptstate-1.4-2.el5 --nodeps

       安装新的iptables,以支持新的netfiler模块

       代码如下:

       tar -jsvf iptables-1.4.6.tar.bz2 -C /usr/src

       cd /usr/src/netfilter-layer7-v2.

       cd iptables-1.4.3forward-for-kernel-2.6.forward

       cp * /usr/src/iptables-1.4.6/extensions/

       cd /usr/src/iptables-1.4.6/

       ./configure --prefix=/usr --with-ksource=/usr/src/linux

       make

       make install

       查看安装后的iptables的文件

       代码如下:

       ls /usr/sbin |grep iptables

       ls /usr/libexec/xtables

       复制之前备份的配置文件和脚本

       代码如下:

       cp /root/iptables-config /etc/sysconfig/

       cp /root/iptables.sysv /etc/rc.d/init.d/iptables

       修改脚本中iptables的路径

       代码如下:

       vim /etc/rc.d/init.d/iptables

       :.,$s@/sbin/$IPTABLES@/usr/sbin/$IPTABLES@g

       让iptables服务开机自动启动

       代码如下:

       chkconfig --add iptables

       修改iptables 配置文件

       将/etc/sysconfig/iptables-config中的

       IPTABLES_MODULES=”ip_conntrack_netbios_ns” 注释掉

       安装协议特征码

       代码如下:

       tar xvf -protocols--.tar.gz

       make install

       完成后在/etc/l7-protocols会生成文件

       支持的协议/etc/l7-protocols/protocols

       添加iptables策略,运行内部网络上网,禁止qq和视频

       代码如下:

       iptables -t nat -A POSTROUTING -s .0.0.0/ -j SNAT --to-soure ..6.

       iptables -A FORWARD -m layer7 --l7proto qq -j DROP

       iptables -A FORWARD -m layer7 --l7proto /w.gif?q=%D4%B4%B4%FA%C2%EB&"+sQ+"path="+p+"&t="+new Date().getTime(); return true}

       function al_c(A){ while(A.tagName!="TABLE")A=A.parentNode;return A.getAttribute("id")}

       //--></script></head>

       <body onload="document.f1.reset();" link="#CDC">

       <table width="%" height="" align="center" cellpadding="0" cellspacing="0">

       <form name=f1 action="/s">

       <tr valign=middle>

       <td width="%" valign="top" style="padding-left:8px;width:px;" nowrap>

       <a href="/"><img src="/img/logo-yy.gif" border="0" width="" height="" alt="到百度首页"></a>

       </td>

       <td>   </td>

       <td width="%" valign="top">

       <div class="Tit">

       <a href="/ns?cl=2&rn=&tn=news&word=%D4%B4%B4%FA%C2%EB" onmousedown="return c({ 'fm':'tab','tab':'news'})">新闻</a>   <span class="fB">网页</span>   <a href="/f?kw=%D4%B4%B4%FA%C2%EB" onmousedown="return c({ 'fm':'tab','tab':'tieba'})">贴吧</a>   <a href="/q?ct=&pn=0&tn=ikaslist&rn=&word=%D4%B4%B4%FA%C2%EB&fr=wwwt" onmousedown="return c({ 'fm':'tab','tab':'zhidao'})">知道</a>   <a href="/m?tn=baidump3&ct=&lm=-1&word=%D4%B4%B4%FA%C2%EB" onmousedown="return c({ 'fm':'tab','tab':'mp3'})">MP3</a>   <a href="/i?tn=baiduimage&ct=&lm=-1&cl=2&word=%D4%B4%B4%FA%C2%EB" onmousedown="return c({ 'fm':'tab','tab':'pic'})"></a>   <a href="/v?ct=&rn=&pn=0&db=0&s=&word=%D4%B4%B4%FA%C2%EB" onmousedown="return c({ 'fm':'tab','tab':'video'})">视频</a>   <a href="/s?lm=0&si=&rn=&ie=gb&ct=&wd=%D4%B4%B4%FA%C2%EB&tn=baidu" target="_blank" onmousedown="return c({ 'fm':'tab','tab':'dict'})">词典</a>   <!--bds<a href="$bdDSURL$">硬盘</a>  -->

       </div>

HTB系列靶机Frolic的渗透测试详解

       Hack The Box 平台上提供了多种靶机,从简单到复杂,旨在提升渗透测试技能和黑盒测试能力。这些靶机模拟了真实世界场景,适合不同层次的挑战。今天,我们将详细介绍如何通过靶机 Frolic 的渗透测试。

       首先,使用 nmap 扫描靶机开放的端口和服务。结果显示 SSH(端口 )、SMB(端口 和 )以及 HTTP(端口 )。

       针对 SMB 服务,我们尝试使用 smbmap 查看共享文件。发现了两个共享目录,但没有访问权限。

       接着,我们通过 nc 工具快速检测了端口 是否开放。结果显示该端口是开启的。随后,访问了该端口,发现了一个简单的欢迎页面,底部包含 “forlic.htb:” 的信息。

       尝试登陆页面时,java源码 流媒体我们注意到需要账户密码。尽管使用常见默认账户和密码尝试登陆,但均失败。当使用 admin:password 登录时,页面陷入卡顿状态,且系统实施了等待时间限制,禁止暴力破解。

       为了突破限制,我们使用 gobuster 爆破网站目录,成功发现了 /backup、/dev、/test 和 /admin 等目录。在 /backup 中,我们找到了 password.txt 和 user.txt 文件,分别包含了账号密码:admin: imnothuman。

       尝试登陆刚刚发现的 Node-RED 页面时,发现无法登陆。我们转而访问 /admin 页面,发现提示剩余尝试次数。通过 Burp Suite 工具抓包发现,未接收到任何反馈信息。检查源代码的 JS 代码,发现了一种编码技巧。复制这段编码到谷歌搜索后,我们访问了作为提示的 URL,并通过解码找到一个 ZIP 文件。

       解压 ZIP 文件后,需要密码,我们使用 zip2john 工具将其转换为密码 HASH,然后使用 john 工具破解,得到了密码:password。再次解压文件,内容疑似 进制格式。转换后,我们发现是一个需要解密的文本,通过谷歌搜索找到对应解码网站,解密后得到 idkwhatispass。

       经过多次尝试,我们总共得到了两组密码。我们发现可能还有未被探索的网页,其密码可能属于未被发现的页面。基于此,我们继续使用 gobuster 工具进行进一步的扫描和爆破,最终找到了 /dev 下的 /backup 目录。

       访问此目录并使用刚刚得到的密码尝试登陆。正确的账号密码是 admin: idkwhatispass。接着,我们尝试利用 playsms 的已知漏洞进行攻击。使用 1.4 版本的远程代码执行漏洞,通过 searchsploit-x Path 查找相应的漏洞说明并手动利用。也可以使用 Metasploit 框架中集成的工具进行攻击。

       成功后,我们获得了 user flag。接下来是提权操作,我们使用 LinEnum 工具检查可利用的提升权限点。使用 Python 的jslint在线检测源码 SimpleHTTPServer 模块将 LinEnum 上传到靶机执行,然后在 shell 中运行。我们注意到带有 SUID 权限的文件,可以通过输入特定内容触发溢出攻击,进而获得 root 权限。

       我们使用 gdb 进行调试,通过插件 pEDA 安装,调试工具帮助我们定位错误位置和计算地址偏移量。通过一系列操作,我们最终获得了 /bin/sh 的地址,并整合系统调用函数 system() 和 exit() 的地址,构建了 payload,成功获取了 root 权限。

       Ms 安全实验室专注于网络安全知识的普及和培训,已出版多本专业书籍,如《Web 安全攻防:渗透测试实战指南》、《内网安全攻防:渗透测试实战指南》等。团队定期在公众号分享技术干货,旨在提供实用的渗透测试实战指南。

TC的详细使用方法

       给你个TC中文MAN,参考参考,也可以去我的BLOG看看,最近我也在学,

       名字

        tc - 显示/维护流量控制设置

       摘要

       tc qdisc [ add | change | replace | link ] dev DEV [ parent qdisc-id | root ] [ handle qdisc-id ] qdisc [ qdisc specific parameters ]

       tc class [ add | change | replace ] dev DEV parent qdisc-id [ classid class-id ] qdisc [ qdisc specific parameters ]

       tc filter [ add | change | replace ] dev DEV [ parent qdisc-id | root ] protocol protocol prio priority filtertype [ filtertype specific parameters ] flowid flow-id

       tc [-s | -d ] qdisc show [ dev DEV ]

       tc [-s | -d ] class show dev DEV tc filter show dev DEV

       简介

       Tc用于Linux内核的流量控制。流量控制包括以下几种方式:

       SHAPING(限制)

       当流量被限制,它的传输速率就被控制在某个值以下。限制值可以大大小于有效带宽,这样可以平滑突发数据流量,使网络更为稳定。shaping(限制)只适用于向外的流量。

       SCHEDULING(调度)

       通过调度数据包的传输,可以在带宽范围内,按照优先级分配带宽。SCHEDULING(调度)也只适于向外的流量。

       POLICING(策略)

       SHAPING用于处理向外的流量,而POLICIING(策略)用于处理接收到的数据。

       DROPPING(丢弃)

       如果流量超过某个设定的带宽,就丢弃数据包,不管是向内还是向外。

       流量的处理由三种对象控制,它们是:qdisc(排队规则)、class(类别)和filter(过滤器)。

       QDISC(排队嬖?

       QDisc(排队规则)是queueing discipline的简写,它是理解流量控制(traffic control)的基础。无论何时,内核如果需要通过某个网络接口发送数据包,它都需要按照为这个接口配置的qdisc(排队规则)把数据包加入队列。然后,内核会尽可能多地从qdisc里面取出数据包,把它们交给网络适配器驱动模块。

       最简单的QDisc是pfifo它不对进入的数据包做任何的处理,数据包采用先入先出的方式通过队列。不过,它会保存网络接口一时无法处理的数据包。

       CLASS(类)

       某些QDisc(排队规则)可以包含一些类别,不同的类别中可以包含更深入的QDisc(排队规则),通过这些细分的南京好运麻将源码QDisc还可以为进入的队列的数据包排队。通过设置各种类别数据包的离队次序,QDisc可以为设置网络数据流量的优先级。

       FILTER(过滤器)

       filter(过滤器)用于为数据包分类,决定它们按照何种QDisc进入队列。无论何时数据包进入一个划分子类的类别中,都需要进行分类。分类的方法可以有多种,使用fileter(过滤器)就是其中之一。使用filter(过滤器)分类时,内核会调用附属于这个类(class)的所有过滤器,直到返回一个判决。如果没有判决返回,就作进一步的处理,而处理方式和QDISC有关。

       需要注意的是,filter(过滤器)是在QDisc内部,它们不能作为主体。

       CLASSLESS QDisc(不可分类QDisc)

       无类别QDISC包括:

       [p|b]fifo

       使用最简单的qdisc,纯粹的先进先出。只有一个参数:limit,用来设置队列的长度,pfifo是以数据包的个数为单位;bfifo是以字节数为单位。

       pfifo_fast

       在编译内核时,如果打开了高级路由器(Advanced Router)编译选项,pfifo_fast就是系统的标准QDISC。它的队列包括三个波段(band)。在每个波段里面,使用先进先出规则。而三个波段(band)的优先级也不相同,band 0的优先级最高,band 2的最低。如果band里面有数据包,系统就不会处理band 1里面的数据包,band 1和band 2之间也是一样。数据包是按照服务类型(Type of Service,TOS)被分配多三个波段(band)里面的。

       red

       red是Random Early Detection(随机早期探测)的简写。如果使用这种QDISC,当带宽的占用接近于规定的带宽时,系统会随机地丢弃一些数据包。它非常适合高带宽应用。

       sfq

       sfq是Stochastic Fairness Queueing的简写。它按照会话(session--对应于每个TCP连接或者UDP流)为流量进行排序,然后循环发送每个会话的数据包。

       tbf

       tbf是Token Bucket Filter的简写,适合于把流速降低到某个值。

       不可分类QDisc的配置

       如果没有可分类QDisc,不可分类QDisc只能附属于设备的根。它们的用法如下:

       tc qdisc add dev DEV root QDISC QDISC-PARAMETERS

       要删除一个不可分类QDisc,需要使用如下命令:

       tc qdisc del dev DEV root

       一个网络接口上如果没有设置QDisc,pfifo_fast就作为缺省的QDisc。

       CLASSFUL QDISC(分类QDisc)

       可分类的QDisc包括:

       CBQ

       CBQ是Class Based Queueing(基于类别排队)的缩写。它实现了一个丰富的连接共享类别结构,既有限制(shaping)带宽的能力,也具有带宽优先级管理的能力。带宽限制是通过计算连接的空闲时间完成的。空闲时间的计算标准是数据包离队事件的频率和下层连接(数据链路层)的带宽。

       HTB

       HTB是Hierarchy Token Bucket的缩写。通过在实践基础上的改进,它实现了一个丰富的连接共享类别体系。使用HTB可以很容易地保证每个类别的带宽,虽然它也允许特定的类可以突破带宽上限,占用别的类的带宽。HTB可以通过TBF(Token Bucket Filter)实现带宽限制,也能够划分类别的优先级。

       PRIO

       PRIO QDisc不能限制带宽,因为属于不同类别的数据包是顺序离队的。使用PRIO QDisc可以很容易对流量进行优先级管理,只有属于高优先级类别的数据包全部发送完毕,才会发送属于低优先级类别的数据包。为了方便管理,需要使用iptables或者ipchains处理数据包的服务类型(Type Of Service,ToS)。

       操作原理

       类(Class)组成一个树,每个类都只有一个父类,而一个类可以有多个子类。某些QDisc(例如:CBQ和HTB)允许在运行时动态添加类,而其它的QDisc(例如:PRIO)不允许动态建立类。

       允许动态添加类的QDisc可以有零个或者多个子类,由它们为数据包排队。

       此外,每个类都有一个叶子QDisc,默认情况下,这个叶子QDisc使用pfifo的方式排队,我们也可以使用其它类型的QDisc代替这个默认的QDisc。而且,这个叶子叶子QDisc有可以分类,不过每个子类只能有一个叶子QDisc。

       当一个数据包进入一个分类QDisc,它会被归入某个子类。我们可以使用以下三种方式为数据包归类,不过不是所有的QDisc都能够使用这三种方式。

       tc过滤器(tc filter)

       如果过滤器附属于一个类,相关的指令就会对它们进行查询。过滤器能够匹配数据包头所有的域,也可以匹配由ipchains或者iptables做的标记。

       服务类型(Type of Service)

       某些QDisc有基于服务类型(Type of Service,ToS)的内置的规则为数据包分类。

       skb->priority

       用户空间的应用程序可以使用SO_PRIORITY选项在skb->priority域设置一个类的ID。

       树的每个节点都可以有自己的过滤器,但是高层的过滤器也可以直接用于其子类。

       如果数据包没有被成功归类,就会被排到这个类的叶子QDisc的队中。相关细节在各个QDisc的手册页中。

       命名规则

       所有的QDisc、类和过滤器都有ID。ID可以手工设置,也可以有内核自动分配。

       ID由一个主序列号和一个从序列号组成,两个数字用一个冒号分开。

       QDISC

       一个QDisc会被分配一个主序列号,叫做句柄(handle),然后把从序列号作为类的命名空间。句柄采用象:一样的表达方式。习惯上,需要为有子类的QDisc显式地分配一个句柄。

       类(CLASS)

       在同一个QDisc里面的类分享这个QDisc的主序列号,但是每个类都有自己的从序列号,叫做类识别符(classid)。类识别符只与父QDisc有关,和父类无关。类的命名习惯和QDisc的相同。

       过滤器(FILTER)

       过滤器的ID有三部分,只有在对过滤器进行散列组织才会用到。详情请参考tc-filters手册页。

       单位

       tc命令的所有参数都可以使用浮点数,可能会涉及到以下计数单位。

       带宽或者流速单位:

       kbps

       千字节/秒

       mbps

       兆字节/秒

       kbit

       KBits/秒

       mbit

       MBits/秒

       bps或者一个无单位数字

       字节数/秒

       数据的数量单位:

       kb或者k

       千字节

       mb或者m

       兆字节

       mbit

       兆bit

       kbit

       千bit

       b或者一个无单位数字

       字节数

       时间的计量单位:

       s、sec或者secs

       秒

       ms、msec或者msecs

       分钟

       us、usec、usecs或者一个无单位数字

       微秒

       TC命令

       tc可以使用以下命令对QDisc、类和过滤器进行操作:

       add

       在一个节点里加入一个QDisc、类或者过滤器。添加时,需要传递一个祖先作为参数,传递参数时既可以使用ID也可以直接传递设备的根。如果要建立一个QDisc或者过滤器,可以使用句柄(handle)来命名;如果要建立一个类,可以使用类识别符(classid)来命名。

       remove

       删除有某个句柄(handle)指定的QDisc,根QDisc(root)也可以删除。被删除QDisc上的所有子类以及附属于各个类的过滤器都会被自动删除。

       change

       以替代的方式修改某些条目。除了句柄(handle)和祖先不能修改以外,change命令的语法和add命令相同。换句话说,change命令不能一定节点的位置。

       replace

       对一个现有节点进行近于原子操作的删除/添加。如果节点不存在,这个命令就会建立节点。

       link

       只适用于DQisc,替代一个现有的节点。

       历史

       tc由Alexey N. Kuznetsov编写,从Linux 2.2版开始并入Linux内核。

       SEE ALSO

       tc-cbq(8)、tc-htb(8)、tc-sfq(8)、tc-red(8)、tc-tbf(8)、tc-pfifo(8)、tc-bfifo(8)、tc-pfifo_fast(8)、tc-filters(8)

       Linux从kernel 2.1.开始支持QOS,不过,需要重新编译内核。运行make config时将EXPERIMENTAL _OPTIONS设置成y,并且将Class Based Queueing (CBQ), Token Bucket Flow, Traffic Shapers 设置为 y ,运行 make dep; make clean; make bzilo,生成新的内核。

        在Linux操作系统中流量控制器(TC)主要是在输出端口处建立一个队列进行流量控制,控制的方式是基于路由,亦即基于目的IP地址或目的子网的网络号的流量控制。流量控制器TC,其基本的功能模块为队列、分类和过滤器。Linux内核中支持的队列有,Class Based Queue ,Token Bucket Flow ,CSZ ,First In First Out ,Priority ,TEQL ,SFQ ,ATM ,RED。这里我们讨论的队列与分类都是基于CBQ(Class Based Queue)的,而过滤器是基于路由(Route)的。

        配置和使用流量控制器TC,主要分以下几个方面:分别为建立队列、建立分类、建立过滤器和建立路由,另外还需要对现有的队列、分类、过滤器和路由进行监视。

        其基本使用步骤为:

        1) 针对网络物理设备(如以太网卡eth0)绑定一个CBQ队列;

        2) 在该队列上建立分类;

        3) 为每一分类建立一个基于路由的过滤器;

        4) 最后与过滤器相配合,建立特定的路由表。

        先假设一个简单的环境

        流量控制器上的以太网卡(eth0) 的IP地址为..1.,在其上建立一个CBQ队列。假设包的平均大小为字节,包间隔发送单元的大小为8字节,可接收冲突的发送最长包数目为字节。

        假如有三种类型的流量需要控制:

        1) 是发往主机1的,其IP地址为..1.。其流量带宽控制在8Mbit,优先级为2;

        2) 是发往主机2的,其IP地址为..1.。其流量带宽控制在1Mbit,优先级为1;

        3) 是发往子网1的,其子网号为..1.0,子网掩码为...0。流量带宽控制在1Mbit,优先级为6。

        1. 建立队列

        一般情况下,针对一个网卡只需建立一个队列。

        将一个cbq队列绑定到网络物理设备eth0上,其编号为1:0;网络物理设备eth0的实际带宽为 Mbit,包的平均大小为字节;包间隔发送单元的大小为8字节,最小传输包大小为字节。

        ?tc qdisc add dev eth0 root handle 1: cbq bandwidth Mbit avpkt cell 8 mpu

        2. 建立分类

        分类建立在队列之上。一般情况下,针对一个队列需建立一个根分类,然后再在其上建立子分类。对于分类,按其分类的编号顺序起作用,编号小的优先;一旦符合某个分类匹配规则,通过该分类发送数据包,则其后的分类不再起作用。

        1) 创建根分类1:1;分配带宽为Mbit,优先级别为8。

        ?tc class add dev eth0 parent 1:0 classid 1:1 cbq bandwidth Mbit rate Mbit maxburst allot prio 8 avpkt cell 8 weight 1Mbit

        该队列的最大可用带宽为Mbit,实际分配的带宽为Mbit,可接收冲突的发送最长包数目为字节;最大传输单元加MAC头的大小为字节,优先级别为8,包的平均大小为字节,包间隔发送单元的大小为8字节,相应于实际带宽的加权速率为1Mbit。

        2)创建分类1:2,其父分类为1:1,分配带宽为8Mbit,优先级别为2。

        ?tc class add dev eth0 parent 1:1 classid 1:2 cbq bandwidth Mbit rate 8Mbit maxburst allot prio 2 avpkt cell 8 weight Kbit split 1:0 bounded

        该队列的最大可用带宽为Mbit,实际分配的带宽为 8Mbit,可接收冲突的发送最长包数目为字节;最大传输单元加MAC头的大小为字节,优先级别为1,包的平均大小为字节,包间隔发送单元的大小为8字节,相应于实际带宽的加权速率为Kbit,分类的分离点为1:0,且不可借用未使用带宽。

        3)创建分类1:3,其父分类为1:1,分配带宽为1Mbit,优先级别为1。

        ?tc class add dev eth0 parent 1:1 classid 1:3 cbq bandwidth Mbit rate 1Mbit maxburst allot prio 1 avpkt cell 8 weight Kbit split 1:0

        该队列的最大可用带宽为Mbit,实际分配的带宽为 1Mbit,可接收冲突的发送最长包数目为字节;最大传输单元加MAC头的大小为字节,优先级别为2,包的平均大小为字节,包间隔发送单元的大小为8字节,相应于实际带宽的加权速率为Kbit,分类的分离点为1:0。

        4)创建分类1:4,其父分类为1:1,分配带宽为1Mbit,优先级别为6。

        ?tc class add dev eth0 parent 1:1 classid 1:4 cbq bandwidth Mbit rate 1Mbit maxburst allot prio 6 avpkt cell 8 weight Kbit split 1:0

        该队列的最大可用带宽为Mbit,实际分配的带宽为 Kbit,可接收冲突的发送最长包数目为字节;最大传输单元加MAC头的大小为字节,优先级别为1,包的平均大小为字节,包间隔发送单元的大小为8字节,相应于实际带宽的加权速率为Kbit,分类的分离点为1:0。

        3. 建立过滤器

        过滤器主要服务于分类。一般只需针对根分类提供一个过滤器,然后为每个子分类提供路由映射。

        1) 应用路由分类器到cbq队列的根,父分类编号为1:0;过滤协议为ip,优先级别为,过滤器为基于路由表。

        ?tc filter add dev eth0 parent 1:0 protocol ip prio route

        2) 建立路由映射分类1:2, 1:3, 1:4

        ?tc filter add dev eth0 parent 1:0 protocol ip prio route to 2 flowid 1:2

        ?tc filter add dev eth0 parent 1:0 protocol ip prio route to 3 flowid 1:3

        ?tc filter add dev eth0 parent 1:0 protocol ip prio route to 4 flowid 1:4

        4.建立路由

        该路由是与前面所建立的路由映射一一对应。

        1) 发往主机..1.的数据包通过分类2转发(分类2的速率8Mbit)

        ?ip route add ..1. dev eth0 via ..1. realm 2

        2) 发往主机..1.的数据包通过分类3转发(分类3的速率1Mbit)

        ?ip route add ..1. dev eth0 via ..1. realm 3

        3)发往子网..1.0/的数据包通过分类4转发(分类4的速率1Mbit)

        ?ip route add ..1.0/ dev eth0 via ..1. realm 4

        注:一般对于流量控制器所直接连接的网段建议使用IP主机地址流量控制限制,不要使用子网流量控制限制。如一定需要对直连子网使用子网流量控制限制,则在建立该子网的路由映射前,需将原先由系统建立的路由删除,才可完成相应步骤。

        5. 监视

        主要包括对现有队列、分类、过滤器和路由的状况进行监视。

        1)显示队列的状况

        简单显示指定设备(这里为eth0)的队列状况

tc qdisc ls dev eth0

       qdisc cbq 1: rate Mbit (bounded,isolated) prio no-transmit

       详细显示指定设备(这里为eth0)的队列状况

tc -s qdisc ls dev eth0

       qdisc cbq 1: rate Mbit (bounded,isolated) prio no-transmit

       Sent bytes pkts (dropped 0, overlimits 0)

       borrowed 0 overactions 0 avgidle undertime 0

       这里主要显示了通过该队列发送了个数据包,数据流量为个字节,丢弃的包数目为0,超过速率限制的包数目为0。

        2)显示分类的状况

        简单显示指定设备(这里为eth0)的分类状况

tc class ls dev eth0

       class cbq 1: root rate Mbit (bounded,isolated) prio no-transmit

       class cbq 1:1 parent 1: rate Mbit prio no-transmit #no-transmit表示优先级为8

       class cbq 1:2 parent 1:1 rate 8Mbit prio 2

       class cbq 1:3 parent 1:1 rate 1Mbit prio 1

       class cbq 1:4 parent 1:1 rate 1Mbit prio 6

       详细显示指定设备(这里为eth0)的分类状况

tc -s class ls dev eth0

       class cbq 1: root rate Mbit (bounded,isolated) prio no-transmit

       Sent bytes pkts (dropped 0, overlimits 0)

       borrowed 0 overactions 0 avgidle undertime 0

       class cbq 1:1 parent 1: rate Mbit prio no-transmit

       Sent bytes pkts (dropped 0, overlimits 0)

       borrowed overactions 0 avgidle undertime 0

       class cbq 1:2 parent 1:1 rate 8Mbit prio 2

       Sent bytes pkts (dropped 0, overlimits 0)

       borrowed 0 overactions 0 avgidle undertime 0

       class cbq 1:3 parent 1:1 rate 1Mbit prio 1

       Sent 0 bytes 0 pkts (dropped 0, overlimits 0)

       borrowed 0 overactions 0 avgidle undertime 0

       class cbq 1:4 parent 1:1 rate 1Mbit prio 6

       Sent bytes pkts (dropped 0, overlimits 0)

       borrowed overactions 0 avgidle undertime 0

       这里主要显示了通过不同分类发送的数据包,数据流量,丢弃的包数目,超过速率限制的包数目等等。其中根分类(class cbq 1:0)的状况应与队列的状况类似。

        例如,分类class cbq 1:4发送了个数据包,数据流量为个字节,丢弃的包数目为0,超过速率限制的包数目为0。

        显示过滤器的状况

tc -s filter ls dev eth0

       filter parent 1: protocol ip pref route

       filter parent 1: protocol ip pref route fh 0xffff flowid 1:2 to 2

       filter parent 1: protocol ip pref route fh 0xffff flowid 1:3 to 3

       filter parent 1: protocol ip pref route fh 0xffff flowid 1:4 to 4

       这里flowid 1:2代表分类class cbq 1:2,to 2代表通过路由2发送。

        显示现有路由的状况

ip route

       ..1. dev eth0 scope link

       ..1. via ..1. dev eth0 realm 2

       ... dev ppp0 proto kernel scope link src ...5

       ..1. via ..1. dev eth0 realm 3

       ..1.0/ via ..1. dev eth0 realm 4

       ..1.0/ dev eth0 proto kernel scope link src ..1.

       ..1.0/ via ..1. dev eth0 scope link

       .0.0.0/8 dev lo scope link

       default via ... dev ppp0

       default via ..1. dev eth0

       如上所示,结尾包含有realm的显示行是起作用的路由过滤器。

        6. 维护

        主要包括对队列、分类、过滤器和路由的增添、修改和删除。

        增添动作一般依照"队列->分类->过滤器->路由"的顺序进行;修改动作则没有什么要求;删除则依照"路由->过滤器->分类->队列"的顺序进行。

        1)队列的维护

        一般对于一台流量控制器来说,出厂时针对每个以太网卡均已配置好一个队列了,通常情况下对队列无需进行增添、修改和删除动作了。

        2)分类的维护

        增添

        增添动作通过tc class add命令实现,如前面所示。

        修改

        修改动作通过tc class change命令实现,如下所示:

tc class change dev eth0 parent 1:1 classid 1:2 cbq bandwidth Mbit

       rate 7Mbit maxburst allot prio 2 avpkt cell

       8 weight Kbit split 1:0 bounded

       对于bounded命令应慎用,一旦添加后就进行修改,只可通过删除后再添加来实现。

        删除

        删除动作只在该分类没有工作前才可进行,一旦通过该分类发送过数据,则无法删除它了。因此,需要通过shell文件方式来修改,通过重新启动来完成删除动作。

        3)过滤器的维护

        增添

        增添动作通过tc filter add命令实现,如前面所示。

        修改

        修改动作通过tc filter change命令实现,如下所示:

tc filter change dev eth0 parent 1:0 protocol ip prio route to

        flowid 1:8

       删除

        删除动作通过tc filter del命令实现,如下所示:

tc filter del dev eth0 parent 1:0 protocol ip prio route to

       4)与过滤器一一映射路由的维护

        增添

        增添动作通过ip route add命令实现,如前面所示。

        修改

        修改动作通过ip route change命令实现,如下所示:

ip route change ..1. dev eth0 via ..1. realm 8

       删除

        删除动作通过ip route del命令实现,如下所示:

ip route del ..1. dev eth0 via ..1. realm 8

ip route del ..1.0/ dev eth0 via ..1. realm 4

更多内容请点击【综合】专栏