iptables 是包过滤软件,包过滤的顺序以下:php
每个包都会匹配 rule 策略,而每个 rule 策略会有一个 action,触发了其中一个 rule 就不会触发另一个 rule,但若是要触发的 rule 放在最后面,那么能够想象,包过滤的效率就会大大下降,因此设计策略的时候要尽可能将经常使用的策略放在最前面,策略的顺序能够经过不断的调整 -A 和 -I 策略,甚至还有 return 的动做,设计 iptables 的人真的很厉害。html
这是 iptables 内部的 table 表和 chain 链,能够理解为 iptables 是一个大网,table 就是小网,里面的 chain 就是他的网线,当数据包通过这个小网的时候必然会触碰这些网线,这样“看不顺眼”的数据包就会被拦住。鸟哥的图画的真好。这里须要理解的是数据包的流行会分 2 个地方,就是进入本机或者不进入本机,进入本机的包就会走 input 的 chain 链,不进入本机的包就会去 FORWARD,什么是进入或者不进入呢?linux
举个例子就是这是一台路由器服务器,服务器上面假设了 web 服务器,而后这个路由器负责的内部网络还有一台数据库服务器,不过这台服务器是独立于路由器的另一台机器,不过上网也是要通过路由器,那么一个外网用户访问这个 web 服务器和访问数据库服务器的行为就是进入本机和不进入本机的行为,由于 web 服务器是跟路由器在同一台机器上的,因此要进入本机,由于数据库服务器是另一台机器上的,因此不进入本机。解释得好渣,仍是看鸟哥吧。鸟哥乃神人。回归主题,看下图的结构,能够看出若是咱们要在 iptables 上操刀的话能够在任何表上操刀,例如能够在 PREROUTING,FORWARD,POSTROUTING
表上作限速是彻底没有问题的,前提是要注意不能冲突,每一个表都有各自的做用。因此通常来讲,要写 iptables 策略的时候都要跟着这个图来笔画一下,这样才能知道有没有写错。web
filter (過濾器):主要跟進入 Linux 本機的封包有關,這個是預設的 table 喔! INPUT:主要與想要進入我們 Linux 本機的封包有關; OUTPUT:主要與我們 Linux 本機所要送出的封包有關; FORWARD:這個咚咚與 Linux 本機比較沒有關係, 他能够『轉遞封包』到後端的電腦中,與下列 nat table 相關性較高。 nat (位址轉換):是 Network Address Translation 的縮寫, 這個表格主要在進行來源與目的之 IP 或 port 的轉換,與 Linux 本機較無關,主要與 Linux 主機後的區域網路內電腦較有相關。 PREROUTING:在進行路由判斷以前所要進行的規則(DNAT/REDIRECT) POSTROUTING:在進行路由判斷之後所要進行的規則(SNAT/MASQUERADE) OUTPUT:與發送出去的封包有關 mangle (破壞者):這個表格主要是與特殊的封包的路由旗標有關, 早期僅有 PREROUTING 及 OUTPUT 鏈,不過從 kernel 2.4.18 之後加入了 INPUT 及 FORWARD 鏈。 由於這個表格與特殊旗標相關性較高,因此像咱們這種單純的環境當中,較少使用 mangle 這個表格。
Table (表名) | Explanation (注释) |
---|---|
nat | nat 表的主要用处是网络地址转换,即 Network Address Translation,缩写为 NAT。作过 NAT 操做的数据包的地址就被改变了,固然这种改变是根据咱们的规则进行的。属于一个流的包只会通过这个表一次。若是第一个包被容许作 NAT 或 Masqueraded,那么余下的包都会自 动地被作相同的操做。也就是说,余下的包不会再经过这个表,一个一个的被 NAT,而是自动地完成。这就 是咱们为何不该该在这个表中作任何过滤的主要缘由,对这一点,后面会有更加详细的讨论。PREROUTING 链的做用是在包刚刚到达防火墙时改变它的目的地址,若是须要的话。 OUTPUT 链改变本地产生的包的目的地址。POSTROUTING 链在包就要离开防火墙以前改变其源地址。 |
mangle | 这个表主要用来 mangle 数据包。咱们能够改变不一样的包及包 头的内容,好比 TTL,TOS 或 MARK。 注意 MARK 并无真正地改动数据包,它只是在内核空间为包设了一个标记。防火墙 内的其余的规则或程序(如 tc)可使用这种标记对包进行过滤或高级路由。这个表有五个内建的链: PREROUTING,POSTROUTING, OUTPUT,INPUT 和 FORWARD 。PREROUTING 在包进入防火墙以后、路由判断以前改变 包, POSTROUTING 是在全部路由判断以后。 OUTPUT 在肯定包的目的以前更改数据包。INPUT 在包被路由到本地 以后,但在用户空间的程序看到它以前改变包。FORWARD 在最初的路由判 断以后、最后一次更改包的目的以前mangle包。注意,mangle 表不能作任何 NAT,它只是改变数据包的 TTL,TOS 或 MARK,而不是其源目地址。NAT 是在nat 表中操做的。 |
filter | filter 表是专门过滤包 的,内建三个链,能够毫无问题地对包进行 DROP、LOG、ACCEPT 和 REJECT 等操做。FORWARD 链过滤全部不是本地产生的而且目的地不是本地(所谓本地就是防火墙了)的包,而 INPUT 偏偏针对那些目的地是本地的包。OUTPUT 是用来过滤全部本地生成的包的 |
什么是数据包:其实就是只 ip 数据包和 tcp 数据包算法
包(Packet)是 TCP/IP 协议通讯传输中的数据单位,通常也称“数据包”。有人说,局域网中传输的不是“帧”(Frame)吗?没错,可是 TCP/IP 协议是工做在 OSI 模型第三层(网络层)、第四层(传输层)上的,而帧是工做在第二层(数据链路层)。上一层的内容由下一层的内容来传输,因此在局域网中,“包”是包含在“帧”里的。数据库
举例来讲 tcp 包的包头含有如下这些信息(等等):服务器
信息 | 解释 | iptables 关键字 |
---|---|---|
源 IP 地址 | 发送包的 IP 地址。 | src |
目的 IP 地址 | 接收包的 IP 地址。 | dst |
源端口 | 源系统上的链接的端口。 | sport |
目的端口 | 目的系统上的链接的端口。 | dport |
TC--Traffic Control网络
TC 是 linux 中的流量控制模块,利用队列规定创建起数据包队列,并定义了队列中数据包的发送方式,从而实现对流量的控制。关键字:队列系统,包接收和传输。架构
Traffic control is the name given to the sets of queuing systems and mechanisms by which packets are received and transmitted on a router. This includes deciding which (and whether) packets to accept at what rate on the input of an interface and determining which packets to transmit in what order at what rate on the output of an interface.less
这里是官方翻译:http://my.oschina.net/guol/blog/82453?p=1
原版:http://www.tldp.org/HOWTO/Traffic-Control-HOWTO/
在我使用的过程当中,对于他的理解是有一些加深了:
tc 主要是以 mark 的形式来匹配,因此使用的时候 mark 标记须要注意不要冲突,mark 标记是 iptables 里面提到的一个东西:
6.5.5. MARK target
用来设置 mark 值,这个值只能在本地的 mangle 表里使用,不能用在其余任何地方,就更不用说路由器或 另外一台机子了。由于 mark 比较特殊,它不是包自己的一部分,而是在包穿越计算机的过程当中由内核分配的和它相关联的一个字段。它能够和本地的高级路由功能联用,以使不一样的包能使用不一样的队列要求,等等。如 果你想在传输过程当中也有这种功能,仍是用 TOS target 吧。有关高级路由的更多信息,能够查看 Linux Advanced Routing and Traffic Control HOW-TO。
mark 只能存在于内核之中,不受三界法则影响,因此 mark 值我以为是配置 tc 的特别须要注意的地方,尤为是若是你使用了 wifidog 之类的要玩 mark 的时候。
tc 的类是树架构,有主干和叶这样很分明的区分的,这种层次是很容易理解的,不过文档的解释是至关的难理解,难理解的是怎么作,命令写法简直坑爹。
清除 eth0 全部队列规则
tc qdisc del dev eth0 root 2>/dev/null
定义最顶层(根)队列规则,并指定 default 类别编号,为网络接口 eth1 绑定一个队列,类型为 htb,并指定了一个 handle 句柄 1:0 用于标识它下面的子类,没有标识的会被分配到默认子类 123(默认值只是设置而已,能够不用)
tc qdisc add dev eth0 root handle 1:0 htb default 123
用于为队列建一个主干类,带宽为 100 Mbit,最大速率为 100 Mbit,(这里是 bit,因此实际速度须要除以 8)优先级为 0,htb 的主干类不能互相借用带宽,可是一个父类的全部子类之间能够借用带宽,这里 parent 1:0 是刚才创建的 handle1:0 ,classid 是他的子类,分类号为 1:1,冒号前面是父类号,后面是子类号
tc class add dev eth0 parent 1:0 classid 1:1 htb rate 100Mbit ceil 100Mbit prio 0
为主干类创建第一个叶分类,带宽为 10Mbit,最大速为 10 Mbit,优先级为1,全部叶分类的所有子类优先级低于主干类,以防止重要数据堵塞,主要仍是避免逻辑混乱,10 Mbit 必需要有 96 kbit 的 burst 速度
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 10Mbit ceil 10Mbit prio 1 burst 96kbit
设置调度,sfq 随机公平算法,这里的 parent 是指隶属于以前的子分类,你须要对哪个子分类的条目作队列分配控制就须要在这里写对应的子分类 id 在每一个类下面再附加上另外一个队列规定,随机公平队列(SFQ),不被某个链接不停占用带宽,以保证带宽的平均公平使用:
#SFQ(Stochastic Fairness Queueing,随机公平队列),SFQ的关键词是“会话”(或称做“流”) , #主要针对一个TCP会话或者UDP流。流量被分红至关多数量的FIFO队列中,每一个队列对应一个会话。 #数据按照简单轮转的方式发送, 每一个会话都按顺序获得发送机会。这种方式很是公平,保证了每一 #个会话都不会没其它会话所淹没。SFQ之因此被称为“随机”,是由于它并非真的为每个会话建立 #一个队列,而是使用一个散列算法,把全部的会话映射到有限的几个队列中去。 #参数perturb是多少秒后从新配置一次散列算法。默认为10
tc qdisc add dev eth0 parent 1:11 handle 111:0 sfq perturb 10
设置过滤器 filter,对应以前配置的哪个父类和子类,而后设置控制编号 handle,这里是跟 iptables 的 mark 相对应的,而且多个不一样的filter注意 prio 不要相同。
tc filter add dev eth0 parent 1:0 protocol ip prio 1 handle 1001 fw classid 1:11
设置 iptables规则,在 mangle 表的 postroutingchain 上配置,源地址是 172.16.1.138
而且目标地址不是 192.168.0.10
,从网卡eth0发出的包进行 mark,mark 号是 1001
iptables -t mangle -A POSTROUTING -s 172.16.1.138/32 ! -d 192.168.0.10 -o eth0 -j MARK --set-xmark 1001
设置 return 是为了加快包检查,return 的顺序是:子链——>父链——>缺省的策略,检查到源地址是 172.16.1.138
而且目标地址不是 192.168.0.10
的包就会跳到 postrouting 层,而后会继续检查其余这层的 chain,这样不用每一个包都要检查一次这条 chain 的内容了,加快了一倍的速度
iptables -t mangle -A POSTROUTING -o eth0 -s 172.16.1.138 ! -d 192.168.0.10 -j RETURN
tc qdisc del dev p3p1 root 2>/dev/null tc qdisc add dev p3p1 root handle 1:0 htb default 123 tc class add dev p3p1 parent 1:0 classid 1:1 htb rate 100Mbit ceil 100Mbit prio 0 tc class add dev p3p1 parent 1:1 classid 1:11 htb rate 10Mbit ceil 10Mbit prio 1 tc qdisc add dev p3p1 parent 1:11 handle 111:0 sfq perturb 10 tc filter add dev p3p1 parent 1:0 protocol ip prio 1 handle 1000 fw classid 1:11
这里用 I 的是 insert 一条配置,这样排序会放在前面,由于 iptables 是按顺序匹配的,而且为了跟 wifidog 的策略避免冲突
iptables -t mangle -I POSTROUTING -o p3p1 -d 172.16.1.138 ! -s 192.168.0.10 -j MARK --set-mark 1000 iptables -t mangle -I POSTROUTING -o p3p1 -d 172.16.1.138 ! -s 192.168.0.10 -j RETURN
EOF完
引用:
原文出处:http://www.godblessyuan.com/2015/01/18/iptables_tc_bandwidth_limiting/