Linux的高级路由和流量控制HOWTO 1 2

合集下载

在Linux终端中进行网络配置和路由设置

在Linux终端中进行网络配置和路由设置

在Linux终端中进行网络配置和路由设置Linux是一种自由和开放源代码的操作系统,广泛应用于服务器和嵌入式系统中。

在Linux终端中进行网络配置和路由设置可以帮助我们建立和管理网络连接,确保网络通信的稳定和安全。

本文将介绍在Linux终端中进行网络配置和路由设置的方法和步骤。

一、网络配置1. 网络接口查询首先,我们需要查询当前系统中的网络接口。

在终端中输入以下命令:```ifconfig```该命令将列出系统中所有的网络接口,包括以太网接口、无线接口和回环接口等。

通过查看接口名称和IP地址等信息,我们可以确定需要配置的网络接口。

2. 配置静态IP地址在Linux中,可以选择使用静态IP地址或者动态获取IP地址(DHCP)。

如果需要手动配置静态IP地址,可以按照以下步骤进行:首先,打开网络接口的配置文件。

以编辑器打开该文件,并添加以下内容(以eth0为例):sudo vi /etc/network/interfaces```接着,在文件中添加以下内容:```auto eth0iface eth0 inet staticaddress 192.168.0.100netmask 255.255.255.0gateway 192.168.0.1dns-nameservers 8.8.8.8 8.8.4.4```其中,address为所需的静态IP地址,netmask为子网掩码,gateway为默认网关,dns-nameservers为DNS服务器地址。

配置完成后,保存并退出文件。

3. 配置动态IP地址(DHCP)如果需要使用动态获取IP地址的方式,可以进行如下配置:首先,同样需要打开网络接口的配置文件,并添加以下内容(以eth0为例):sudo vi /etc/network/interfaces```接着,在文件中添加以下内容:```auto eth0iface eth0 inet dhcp```配置完成后,保存并退出文件。

Linux命令高级技巧掌握route命令配置和管理网络路由

Linux命令高级技巧掌握route命令配置和管理网络路由

Linux命令高级技巧掌握route命令配置和管理网络路由Linux命令高级技巧:掌握route命令配置和管理网络路由Linux操作系统是开源的,广泛应用于服务器和嵌入式设备中。

作为一名Linux系统管理员或网络工程师,熟练掌握各种命令技巧对于管理和维护网络是至关重要的。

本文将重点介绍Linux命令中的一个高级技巧——route命令的配置和管理,帮助读者更好地掌握网络路由的设置。

一、什么是Linux路由在计算机网络中,路由是指将数据包从源主机发送到目标主机的过程。

当数据包在网络中传输时,需要经过多个网络节点,这些节点之间的连接通过路由器进行转发。

Linux操作系统提供了route命令,用于配置和管理网络路由。

二、route命令基本语法route命令的基本语法如下:route [选项] [目标网络] [命令]常用的选项有:- add:添加路由表项- del:删除路由表项- netmask:设置网络掩码- gateway:设置网关- metric:设置路由的优先级三、配置网络路由1. 查看当前路由表在操作系统中,可以通过以下命令查看当前路由表:```$ route -n```该命令将显示所有当前配置的路由表项,包括目标网络、网关和掩码等信息。

2. 添加路由表项使用route命令可以通过以下语法添加路由表项:```$ route add -net 目标网络 netmask 子网掩码 gw 网关```其中,目标网络是要添加路由的目标网络地址,子网掩码是目标网络的掩码地址,网关是下一跃点的IP地址。

例如,假设要添加目标网络192.168.0.0/24,网关为192.168.1.1,使用以下命令:```$ route add -net 192.168.0.0 netmask 255.255.255.0 gw 192.168.1.1```3. 删除路由表项使用route命令可以通过以下语法删除路由表项:```$ route del -net 目标网络 netmask 子网掩码 gw 网关```例如,要删除目标网络192.168.0.0/24,网关为192.168.1.1的路由表项,可以使用以下命令:```$ route del -net 192.168.0.0 netmask 255.255.255.0 gw 192.168.1.1```四、管理网络路由1. 设置默认网关默认网关是指当主机需要发送数据包到其他网络时使用的网关。

Linux命令高级技巧使用route命令进行路由配置与管理

Linux命令高级技巧使用route命令进行路由配置与管理

Linux命令高级技巧使用route命令进行路由配置与管理Linux命令高级技巧:使用route命令进行路由配置与管理在Linux操作系统中,route命令是一个非常实用且强大的命令,可用于配置和管理网络路由。

本文将介绍如何使用route命令进行路由配置和管理的高级技巧。

以下是具体内容:一、route命令概述route命令用于显示、添加、删除和修改系统的IP路由表。

通过操作路由表,可以实现网络数据的传输与转发。

下面是route命令的基本语法:$route [选项] [命令] [目标IP]二、显示系统的路由表要查看当前系统的IP路由表,可以使用route命令的“-n”选项。

具体语法如下:$route -n该命令将显示系统的路由表,包括目标网络、网关、子网掩码、路由标志等信息。

三、添加静态路由使用route命令添加静态路由可以实现定制化的网络路由配置。

具体的命令格式如下:$route add -net 目标网络地址 netmask 子网掩码 gw 网关其中,“目标网络地址”是要添加的目标网络的IP地址,“子网掩码”是目标网络的子网掩码,“网关”是数据包要通过的下一跳网关。

四、删除静态路由要删除已添加的静态路由,可以使用route命令的“del”子命令。

具体的命令格式如下:$route del -net 目标网络地址 netmask 子网掩码该命令将删除对应的路由表项,使数据包在传输时不再通过该路由。

五、修改静态路由如果需要修改已存在的静态路由,可以先通过“del”子命令删除原有的路由表项,然后再使用“add”子命令添加新的路由。

具体的命令格式如下:$route del -net 目标网络地址 netmask 子网掩码$route add -net 目标网络地址 netmask 子网掩码 gw 网关六、设置默认网关默认网关是指当数据包的目标网络不在系统的路由表中时,数据包将会通过默认网关进行转发。

要设置默认网关,可以使用route命令的“add default”子命令。

Linux命令技巧使用iptables进行高级网络包过滤和流量控制

Linux命令技巧使用iptables进行高级网络包过滤和流量控制

Linux命令技巧使用iptables进行高级网络包过滤和流量控制在Linux系统中,iptables是一个非常实用的工具,可以通过它进行高级网络包过滤和流量控制。

在本文中,我们将探讨如何使用iptables 命令来实现这些功能。

一、iptables简介iptables是Linux系统中的一个防火墙工具,它可以监控网络流量并根据用户定义的规则来过滤流量。

通过iptables,我们可以实现灵活的流量控制和网络包过滤。

使用iptables命令,可以创建规则集,以控制进出网络的数据包。

二、iptables基本概念1. 表(Table):iptables规则被组织成表的形式,每个表都包含一组规则链。

2. 链(Chain):链由一系列规则组成,用于决定对网络包的处理方式。

3. 规则(Rule):规则是iptables的基本组成单元,包含匹配规则和目标动作。

4. 目标动作(Target):目标动作指定匹配规则成功后的动作,如接受、拒绝或重定向。

三、iptables命令示例1. 查看iptables规则:```iptables -L```该命令将显示当前系统中的iptables规则。

2. 添加一条规则:```iptables -A INPUT -s 192.168.0.1 -j ACCEPT```该命令将添加一条输入规则,允许来自IP地址为192.168.0.1的主机的数据包通过。

3. 删除一条规则:```iptables -D INPUT -s 192.168.0.1 -j ACCEPT```该命令将删除之前添加的输入规则。

4. 清空iptables规则:```iptables -F```该命令将清空所有的iptables规则。

四、iptables实际应用1. 高级网络包过滤:iptables可以通过设置规则来过滤特定类型的网络包。

例如,我们可以通过以下命令来禁止从指定IP地址(192.168.0.1)进行SSH连接:```iptables -A INPUT -s 192.168.0.1 -p tcp --dport 22 -j DROP```该命令将禁止来自192.168.0.1的主机通过SSH连接。

Linux命令高级技巧使用iptables进行网络流量控制

Linux命令高级技巧使用iptables进行网络流量控制

Linux命令高级技巧使用iptables进行网络流量控制在Linux操作系统中,iptables是一种强大的工具,用于管理网络流量以及进行网络流量控制。

使用iptables可以实现各种复杂的网络配置和管理任务,如防火墙设置、端口转发、网络地址转换(NAT)等。

本文将介绍一些使用iptables进行网络流量控制的高级技巧。

一、iptables简介iptables是一个内核模块,它是基于Netfilter框架的用户空间工具集,用于管理Linux内核中的数据包过滤规则。

iptables通过匹配数据包的源、目的地址、端口等关键字段,来决定对数据包的处理方式,可以允许、拒绝、重定向或修改数据包。

二、iptables基本用法在开始讲解高级技巧之前,我们先给出一些iptables的基本用法,以便更好地理解后续的内容。

1. 添加规则使用iptables命令添加规则的语法如下:```shelliptables -A <CHAIN> <MATCH_CONDITION> -j <ACTION>```其中,`<CHAIN>`表示规则链,如INPUT、FORWARD、OUTPUT 等;`<MATCH_CONDITION>`表示匹配条件,如源地址、目的地址、端口等;`<ACTION>`表示对匹配的数据包的处理方式,如ACCEPT、DROP、REJECT等。

例如,要允许来自192.168.1.100的主机访问本地的SSH服务(端口22),可以使用以下命令添加规则:```shelliptables -A INPUT -s 192.168.1.100 -p tcp --dport 22 -j ACCEPT```2. 查看规则使用iptables命令查看规则的语法如下:```shelliptables -L```这会列出iptables中的所有规则,包括链的名称、规则的编号以及匹配条件和动作等信息。

使用Linux终端进行网络配置和管理

使用Linux终端进行网络配置和管理

使用Linux终端进行网络配置和管理在如今的数字化时代,网络已经成为我们生活中不可或缺的一部分。

无论是个人使用还是企业运营,网络都扮演着重要的角色。

为了确保网络连接的稳定和安全,我们需要正确地配置和管理网络。

而在Linux操作系统中,我们可以使用终端来进行网络配置和管理的任务。

本文将介绍如何使用Linux终端来进行网络配置和管理。

一、检查网络连接在进行网络配置和管理之前,首先需要检查已有的网络连接。

使用以下命令可以查看当前系统上的网络连接状态:```$ ifconfig```该命令将显示所有当前已经激活的网络接口,包括以太网、无线网络和回环接口。

通过查看这些接口的信息,我们可以判断当前网络连接的状态以及是否存在任何问题。

二、设置IP地址如果需要配置一个静态IP地址,可以使用以下命令:```$ sudo ifconfig eth0 192.168.0.100 netmask 255.255.255.0```这个命令将会给以太网接口eth0设置一个静态IP地址为192.168.0.100,子网掩码为255.255.255.0。

使用这个命令,我们可以手动设置网络连接的IP地址和子网掩码,确保网络连接的准确性和稳定性。

三、配置网络路由网络路由是决定网络数据包传输的路径和方式的重要组成部分。

在Linux中,我们可以使用一些命令来配置网络路由。

以下是一些常用的命令示例:1. 查看当前的路由表信息:```$ netstat -nr```这个命令会显示当前系统上的路由表信息,包括目标网络、网关和接口等。

通过查看路由表信息,我们可以了解当前系统上的路由配置情况。

2. 添加默认路由:```$ sudo route add default gw 192.168.0.1```该命令将会添加一个默认路由,将所有目标网络设置为网关192.168.0.1。

通过添加默认路由,我们可以确保系统能够正确地传输数据包。

四、设置DNS服务器DNS(Domain Name System)服务器用于将域名转换为对应的IP 地址。

Linux 高级流量控制

Linux 高级流量控制

Linux 高级流量控制本篇主要讲用TC 对Linux 进行高级流量控制通过大量实践结合TC 流控HOWTO 文档整理而得如果你对Linux 流控感兴趣,如果你需要搭建高性能的Linux 网关, 本文将会使你受益颇多。

注:至少具备Linux OS 的中级水平知识,熟悉TCP/IP, Linux 网卡工作原理,以及配置Linux 网关的经验,将有助于对本文的理解。

本文参考文档:Tc 流控HOWTO 文档/HOWTO/html_single/Traffic-Control-HOWTO/Linux TC 流量控制工具/view/f02078db50e2524de5187e45.html回页首一 . Linux 流控简介Linux 流控的意义:有效的控制Linux 网卡进出流量, 了解网卡工作原理, 搭建高性能的Linux 网关, 对Linux 高级系统流控有进一步的认识。

Linux 流量控制方法:控发不控收, 所以只能对产生瓶颈网卡处的发包速率进行控制, 而网络瓶颈分析亦为Linux 网络流控的第一步 .Linux 流量控制过程分二种:1. 队列控制即QOS, 瓶颈处的发送队列的规则控制,常见的有SFQPRIO2. 流量控制即带宽控制, 队列的排队整形,一般为TBF HTBLinux 流量控制算法分二种:3. 无类算法用于树叶级无分支的队列,例如:SFQ4. 分类算法用于多分支的队列,例如:PRIO TBF HTBLinux 流控实现工具TC:Linux 下流量控制工具, 从Linux2.2 版开始已并入内核,功能非常强大,详见参考文档。

回页首二 . 以下文章将以二种算法的不同流控分别介绍:1. 无类算法SFQa. 队列控制的无类算法SFQSFQ(Stochastic Fairness Queueing 随机公平队列) 是公平队列算法家族中的一个简单实现 . 它的精确性不如其它的方法, 但实现了高度的公平, 需要的计算量亦很少 .SFQ 算法主要针对一个TCP 会话或者UDP 流 . 流量被分成相当多数量的FIFO 队列中, 每个队列对应一个会话 . 数据按照简单轮转的方式发送, 每个会话都按顺序得到发送机会 . 这种方式非常公平, 保证了每一个会话都不会没其它会话所淹没 .SFQ 之所以被称为"随机", 是因为它并不是真的为每一个会话创建一个队列, 而是使用一个散列算法, 把所有的会话映射到有限的几个队列中去 . 因为使用了散列, 所以可能多个会话分配在同一个队列里, 从而需要共享发包的机会, 也就是共享带宽 . 为了不让这种效应太明显,SFQ 会频繁地改变散列算法, 以便把这种效应控制在几秒钟之内( 时间由参数设定).注:SFQ 只会发生在数据发生拥堵, 产生等待队列的网卡上 .. 出口网卡若无等待队列,SFQ 亦不起作用 ...清单 1. 在网卡上建立SFQ#tc qdisc add dev eth0 root handle 1: sfqSFQ 参数有 perturb( 重新调整算法间隔 ) quantum 基本上不需要手工调整 :handle 1: 规定算法编号 .. 可以不用设置由系统指定 ..#tc qdisc sh dev eth0 显示算法#tc qd del dev eth0 root 删除注 : 默认 eht0 支持 TOSSFQ 队列一般用在树叶级, 配合其它流量整形算法一并使用……b. 流量控制的无类算法TBF令牌桶过滤器(TBF) 是一个简单的队列规定: 只允许以不超过事先设定的速率到来的数据包通过, 但可能允许短暂突发流量朝过设定值 .TBF 很精确, 对于网络和处理器的影响都很小, 实现是针对数据的字节数进行的, 而不是针对数据包进行, 常用于网关限速 .TBF 的实现在于一个缓冲器( 桶), 不断地被一些叫做"令牌"的虚拟数据以特定速率填充着 . (token rate). 桶最重要的参数就是它的大小, 也就是它能够存储令牌的数量 . 每个到来的令牌从数据队列中收集一个数据包, 然后从桶中被删除 . 这个算法关联到两个流上——令牌流和数据流, 于是我们得到 3 种情景:A. 数据流以等于令牌流的速率到达TBF. 这种情况下, 每个到来的数据包都能对应一个令牌, 然后无延迟地通过队列 .B. 数据流以小于令牌流的速度到达TBF. 通过队列的数据包只消耗了一部分令牌, 剩下的令牌会在桶里积累下来, 直到桶被装满 . 剩下的令牌可以在需要以高于令牌流速率发送数据流的时候消耗掉, 这种情况下会发生突发传输 .C. 数据流以大于令牌流的速率到达TBF. 这意味着桶里的令牌很快就会被耗尽 . 导致TBF 中断一段时间, 称为"越限". 如果数据包持续到来, 将发生丢包 . 此种情况最重要, 因为它可以用来对数据通过过滤器的速率进行整形 . 令牌的积累可以导致越限的数据进行短时间的突发传输而不必丢包, 但是持续越限的话会导致传输延迟直至丢包 .清单 2. 在网卡建立TBF#tc qd add dev eth1 root handle 1: tbf rate 256kbit burst 10000 latency 50ms 速率 256kbit 突发传输 10k 最大延迟 50ms#tc -s qd sh dev eth1 统计#tc qd del dev eth1 root 删除rate 限制的传输速率用位来计算latency 确定了一个包在TBF 中等待传输的最长等待时间 .burst 桶的大小, 以字节计 . 指定了最多可以有多少个令牌能够即刻被使用 . 注: 管理的带宽越大, 需要的缓冲器就越大 . 在Intel 体系上,10 兆bit/s 的速率需要至少10k 字节的缓冲区才能达到期望的速率 . 缓冲区太小导致潜在的丢包 .c. 无类算法除这二种队列以外, 另有pfifo_fast( 网卡出口默认根队列规定) 经常使用的也就是SFQ/TBF ……这二种用法如下:单纯地降低出口速率, 使用令牌桶过滤器 . 调整桶的配置后可用于控制很高的带宽 .链路已经塞满, 保证不会有某一个会话独占出口带宽, 使用随机公平队列 . 当然最要的还是工作中得来的经验, 就其应用方面只要能满足需求即可 .. 要做到灵活应用还得大量的实践 ..2. 分类算法—— PRIO/CBQ/HTB分类算法主要作用是可以对多种数据流区别对待 . 一旦数据包进入一个分类的队列规定, 它就得被送到某一个类中分类, 对数据包进行分类的工具是过滤器 . 过滤器会返回一个决定, 队列规定就根据这个决定把数据包送入相应的类进行排队 . 每个子类都可以再次使用它们的过滤器进行进一步的分类 . 直到不需要进一步分类时, 数据包才进入该类包含的队列规定排队 . 除了能够包含其它队列规定之外, 绝大多数分类的队列规定能够流量整形注: 过滤器对数据包进行分类的工具, 是从队列规定内部调用的, 而不是从别处 .( 用在分叉的分支上)列规定家族: 根, 句柄, 兄弟和父辈每块网卡都有一个出口"根队列规定", 缺省情况下是前面提到的pfifo_fast 队列规定 . 每个队列规定都指定一个句柄, 以便以后的配置语句能够引用这个队列规定 . 除了出口队列规定之外, 每块网卡还有一个入口, 以便policies 进入的数据流 .队列规定的句柄有两个部分: 一个主号码和一个次号码 . 习惯上把根队列规定称为"1:", 等价于"1:0". 队列规定的次号码永远是0. 类的主号码必须与它们父辈的主号码一致 .数据包如何出队并交给硬件当内核决定把一个数据包发给网卡的时候, 根队列规定1: 会得到一个出队请求, 然后把它传给1:1, 然后依次传给10:,12: 和13:( 子类自定义), 然后试图从它们中进行dequeue() 操作 . 也就是说, 内核需要遍历整颗树, 换句话说, 类及其兄弟仅仅与其"父队列规定"进行交谈, 而不会与网卡进行交谈 . 只有根队列规定才能由内核进行出队操作! 更进一步, 任何类的出队操作都不会比它们的父类更快 . 我们可以把SFQ 作为一个子类, 放到一个可以进行流量整形的父类中, 从而能够同时得到SFQ 的调度功能和其父类的流量整形功能 .a. 队列控制的分类算法PRIOPRIO 分类优先算法( 从左至右优先发包), 队列规定并不进行整形, 它仅仅根据你配置的过滤器把流量进一步细分 . 你可以认为PRIO 队列规定是pfifo_fast 的一种衍生物, 区别在每个频道都是一个单独的类, 而非简单的FIFO.当数据包进入PRIO 队列规定后, 将根据你给定的过滤器设置选择一个类 . 缺省情况下有三个类, 这些类仅包含纯FIFO 队列规定而没有更多的内部结构 . 你可以把它们替换成你需要的任何队列规定 . 每当有一个数据包需要出队时, 首先处理:1 类 . 只有当标号更小的类中没有需要处理的包时, 才会标号大的类 .PRIO 配置范例示意图:大批量数据使用30:, 交互数据使用20: 或10:.清单 3. 在网卡建立PRIO分类的一示例图:2. HTB 分层令牌桶网卡工作示例图:3. ADSL 上网流量限控脚本ADSL 带宽是下行3200Kbit, 上行只有320Kbit 网卡工作示例图:。

Linux下的网络流量控制和负载均衡技巧

Linux下的网络流量控制和负载均衡技巧

Linux下的网络流量控制和负载均衡技巧随着互联网的发展,网络流量的控制和负载均衡在现代计算机网络中变得越来越重要。

在Linux操作系统下,我们可以利用一些技巧来实现网络流量的控制和负载均衡,从而提高网络的性能和稳定性。

一、流量控制技巧1. 网络流量监控在Linux中,我们可以使用一些工具来监控网络流量,例如iftop、ntop和vnStat等。

这些工具可以帮助我们实时监控网络中的流量情况,了解网络使用的情况,以便做出相应的调整。

2. 限制带宽为了控制网络中的流量,我们可以使用Linux的qdisc和class来实现带宽的限制。

通过设置合适的带宽限制,可以避免某些应用程序或用户占用过多的带宽,保证网络的公平性和稳定性。

3. 软件防火墙Linux中的iptables工具可以用于实现网络流量的策略型防火墙。

我们可以根据需要,对进出网络的流量进行限制,以实现网络流量的控制和安全性的提升。

二、负载均衡技巧1. 负载均衡算法在Linux中,可以选择多种负载均衡算法来实现负载均衡,例如轮询、加权轮询、最小连接和哈希等。

根据实际情况选择合适的负载均衡算法,可以将流量均匀地分配给不同的服务器,提高系统的处理能力和响应速度。

2. 使用代理服务器通过使用代理服务器,我们可以将进入系统的流量分发到多个后端服务器上。

不仅可以提高系统的性能,还可以实现负载均衡和故障恢复的功能。

常用的代理服务器有Squid和Nginx等。

3. 软件负载均衡器在Linux中,我们可以使用一些软件负载均衡器来实现流量的均衡分配,如LVS(Linux Virtual Server)和HAProxy等。

这些软件负载均衡器可以根据实际需求,对流量进行智能地调度和分发,提高系统的可用性和性能。

三、其他技巧1. 网络优化通过一些网络优化技巧,可以提高Linux系统的网络性能。

比如优化TCP/IP协议栈、调整网络缓冲区大小、使用适当的网络设备驱动程序等。

linux高级路由和流量控制

linux高级路由和流量控制

Linux的高级路由和流量控制HOWTO 目录第1章贡献1第2章简介22.1. 除外责任与许可22.2. 预备知识22.3. LINUX能为你做什么32.4. 内务声明32.5. 访问,CVS和提交更新42.6. 邮件列表42.7. 本文档的布局4第3章介绍IPROUTE2 63.1 为什么使用IPROUTE2 63.2 IPROUTE2 概览63.3 先决条件63.4 浏览你的当前配置73.4.1. 让ip显示我们的链路73.4.2. 让ip显示我们的IP 地址73.4.3. 让ip显示路由83.5. ARP 9第4章规则——路由策略数据库114.1. 简单的源策略路由114.2. 多重上连ISP的路由124.2.1. 流量分割134.2.2. 负载均衡14第5章GRE 和其他隧道155.1. 关于隧道的几点注释155.2. IP-IN-IP 隧道155.3. GRE 隧道1645.3.1. IPv4隧道165.3.2. IPv6隧道185.4. 用户级隧道18第6章用CISCO和6BONE实现IPV6隧道196.1. IPV6隧道19第7章IPSEC:INTERNET上安全的IP 227.1. 从手动密钥管理开始227.2. 自动密钥管理257.2.1. 理论267.2.2. 举例267.2.3. 使用X.509证书进行自动密钥管理297.3. IPSEC隧道327.4. 其它IPSEC软件337.5. IPSEC与其它系统的互操作337.5.1. Windows 33第8章多播路由34第9章带宽管理的队列规定369.1. 解释队列和队列规定369.2. 简单的无类队列规定379.2.1. pfifo_fast 379.2.2. 令牌桶过滤器(TBF) 399.2.3. 随机公平队列(SFQ) 419.3. 关于什么时候用哪种队列的建议429.4. 术语439.5. 分类的队列规定459.5.1. 分类的队列规定及其类中的数据流向459.5.2. 队列规定家族:根,句柄,兄弟和父辈459.5.3. PRIO队列规定469.5.4. 著名的CBQ队列规定489.5.5. HTB(Hierarchical Token Bucket, 分层的令牌桶) 5459.6. 使用过滤器对数据包进行分类559.6.1. 过滤器的一些简单范例569.6.2. 常用到的过滤命令一览579.7. IMQ(INTERMEDIATE QUEUEING DEVICE,中介队列设备) 58 9.7.1. 配置范例58第10章多网卡的负载均衡6010.1. 告诫6110.2. 其它可能性61第11章NETFILTER和IPROUTE——给数据包作标记62第12章对包进行分类的高级过滤器6412.1. U32分类器6512.1.1. U32选择器6512.1.2. 普通选择器6612.1.3. 特殊选择器6712.2. 路由分类器6712.3. 管制分类器6812.3.1. 管制的方式6812.3.2. 越限动作6912.3.3. 范例7012.4. 当过滤器很多时如何使用散列表70第13章内核网络参数7213.1. 反向路径过滤7213.2. 深层设置7313.2.1. ipv4一般设置7313.2.2. 网卡的分别设置7813.2.3. 邻居策略7913.2.4. 路由设置80第14章不经常使用的高级队列规定8214.1. BFIFO/PFIFO 8214.1.1. 参数与使用82614.2. CLARK-SHENKER-ZHANG算法(CSZ) 8214.3. DSMARK 8314.3.1. 介绍8314.3.2. Dsmark与什么相关? 8314.3.3. Differentiated Services指导8414.3.4. 使用Dsmark 8414.3.5. SCH_DSMARK如何工作8414.3.6. TC_INDEX过滤器8514.4. 入口队列规定8714.4.1. 参数与使用8714.5. RED(RANDOM EARLY DETECTION,随机提前检测) 8714.6. GRED(GENERIC RANDOM EARLY DETECTION,一般的随机提前检测) 88 14.7. VC/ATM模拟8914.8. WRR(WEIGHTED ROUND ROBIN,加权轮转) 89第15章方便菜谱9015.1. 用不同的SLA运行多个网站. 9015.2. 防护SYN洪水攻击9015.3. 为防止DDOS而对ICMP限速9115.4. 为交互流量设置优先权9215.5. 使用NETFILTER,IPROUTE2和SQUID实现WEB透明代理9315.5.1. 实现之后的数据流图9615.6. 与PMTU发现有关的"基于路由的MTU设置" 9615.6.1. 解决方案9715.7. 与PMTU发现有关的MSS箝位(给ADSL,CABLE,PPPOE和PPTP用户) 98 15.8. 终极的流量控制:低延迟,高速上/下载9815.8.1. 为什么缺省设置不让人满意9915.8.2. 实际的脚本(CBQ) 10015.8.3. 实际的脚本(HTB) 10215.9. 为单个主机或子网限速10315.10. 一个完全NAT和QOS的范例104715.10.1. 开始优化那不多的带宽10415.10.2. 对数据包分类10615.10.3. 改进设置10715.10.4. 让上面的设置开机时自动执行108第16章构建网桥以及用ARP代理构建伪网桥10916.1. 桥接与IPTABLES的关系10916.2. 桥接与流量整形10916.3. 用ARP代理实现伪网桥10916.3.1. ARP和ARP代理11016.3.2. 实现110第17章动态路由——OSPF和BGP 112 17.1. 用ZEBRA设置OSPF 11217.1.1. 必要条件11317.1.2. 配置Zebra 11317.1.3. 运行Zebra 115第18章其它可能性117第19章进一步学习119第20章鸣谢1208第1章贡献本文档的成形得益于很多人的贡献,我希望能够回报他们.列出其中几个:Rusty RussellAlexey N. Kuznetsov来自Google的一些好心人Casema Internet的工作人员第2章简介欢迎,亲爱的读者.希望这篇文档能对你更好地理解Linxs2.2/2.4的路由有所帮助和启发.不被大多数使用者所知道的是,你所使用工具,其实能够完成相当规模工作.比如route和ifconfig,实际上暗中调用了非常强大的iproute 2的底层基本功能. 我希望这个HOWTO能够象Rusty Russell的作品那样通俗易懂. 你可以随时给HOWTO工作组发电子邮件来找到我们.但是如果您的问题并不直接与这个HOWTO文档相关,请首先考虑发给邮件列表(参考相关章节).我们可不是免费的帮助平台,但我们经常会在邮件列表上回答问题. 在钻研这个HOWTO之前,如果您想做的只是一点简单的流量整形,不妨直接去看看其它可能性这一章里面的CBQ.init.2.1. 除外责任与许可这个文档依着对公众有利用价值的目的而发布,但不提供任何担保,即使是在经销或者使用在特定场合时的潜在担保. 简单地说,如果您的STM-64骨干网瘫痪,并向您尊敬的客户们散布黄色图片,对不起,那绝对不关我的事.Copyright (c) 2002 所有:bert hubert,Gregory Maxwell,Martijn van Oosterhout,Remco van Mook,Paul B. Schroeder等等.这份材料可以在遵从Open Publication License, v1.0(或更新版)各项条款的前提下发布.Open Publication License的最新版可以在/openpub/ 得到. 请随意复制并发布(出售或者赠送)本文档,格式不限.只是请求将纠正和/或注解转发给文档的维护者. 还希望如果你出版本HOWTO的硬拷贝,请给作者们发一份以备复习之用.2.2. 预备知识就像标题所暗示的,这是一个"高级"HOWTO.虽然它不是终极的航天科技,但还是要求一定的基础知识. 这里是一些可能对你有帮助的参考文献:Rusty Russell的networking-concepts-HOWTO 非常精彩的介绍,解释了什么是网络以及一个网络如何与其它网络互联.Linux Networking-HOWTO (以前叫做Net-3 HOWTO) 好东西,虽然非常冗长.它讲授的内容就是你连接到Internet所需的的配置内容.应该在/usr/doc/HOWTO/NET3-4-HOWTO.txt中,也可以在线阅读.2.3. Linux能为你做什么一个小列表:管制某台计算机的带宽管制通向某台计算机的带宽帮助你公平地共享带宽保护你的网络不受DoS攻击保护Internet不受到你的客户的攻击把多台服务器虚拟成一台,进行负载均衡或者提高可用性限制对你的计算机的访问限制你的用户访问某些主机基于用户账号(没错!),MAC地址,源IP地址,端口,服务类型,时间或者内容等条件进行路由.现在,很多人都没有用到这些高级功能.这有很多原因.比如提供的文档过于冗长而且不容易上手,而且流量控制甚至根本就没有归档.2.4. 内务声明关于这个文档有些事情要指出.当我写完这个文档的绝大部分的时候,我真的不希望它永远就是那个样子.我是一个坚信开放源代码的人,所以我希望你能够给我发回反馈,更新,补丁等等.所以你应该尽可以告知我你的手稿或者指出一些,哪怕是无关紧要的错误,不必犹豫.如果我的英语有些晦涩,请原谅那不是我的母语,尽可以给我建议. 如果你认为自己更有资格维护某个章节,或者认为自己可以写作并维护一个新的章节,请您一定不要客气.这个HOWTO的SGML可以通过CVS得到,我估计肯定有很多人还在为它出力. 作为请求援助,你会在文档中发现很多"求助"的字样.我们永远欢迎您的补丁!无论您在哪里发现"求助",都应该明白您正在踏入一个未知的领域.这并不是说在别的地方就没有错误,但您应该倍加小心.如果您确认了某些事情,请您一定通知我们,以便我们能够把"求助"的标记去掉.关于这个HOWTO,I will take some liberties along the road. For example, I postulatea 10Mbit Internet connection, while I know full well that those are not very common.2.5. 访问,CVS和提交更新本HOWTO的规范位置在这里. 我们现在向全球开放了匿名CVS访问.从各个角度来说这都是一件好事.你可以轻松地升级到本HOWTO的最新版本,而且提交补丁也不再成为问题. 另外的好处是,这可以让作者在源码上独立地继续工作.$ export CVSROOT=:pserver:anon@outpost.ds9a.nl:/var/cvsroot$ cvs loginCVS password: [enter 'cvs' (without 's)]$ cvs co 2.4routingcvs server: Updating 2.4routingU 2.4routing/lartc.db如果您做了修改并希望投稿,运行:cvs -z3 diff -uBb然后把输出用电子邮件发给,我们就可以很轻松地把它集成进去了.谢谢!请确认你修改的是.db文件,其它文件都是通过它生成的. 提供了一个Makefile帮助您生成postscript,dvi,pdf,html和纯文本格式的文件.你可能需要安装docbook,docboot-utils,ghostscript和tetex等等支持软件才能生成各种格式的文本. 注意,不要更改2.4routing.sgml!那里面有旧版本的HOWTO.正确的文件是lartc.db.2.6. 邮件列表作者已经开始收到关于这个HOWTO越来越多的邮件了.为了把大家的兴趣条理化,已经决定启动一个邮件列表,让大家在那里互相探讨有关高级路由和流量控制的话题.你可以在这里进行订阅. 需要指出的是,作者们对于列表中没有问及的问题不可能及时回答.我们愿意让列表的归档成为一个知识库.如果你有问题,请搜索归档,然后在post到邮件列表里.2.7. 本文档的布局我们几乎马上就要做一些有趣的实验,也就意味着最开始部分的基本概念解释并不完整或者不完善,请您不必管它,后面会一点点说清楚.路由和包过滤是完全不同的概念.关于过滤的问题,Rusty的文档说得很清楚,你可以在这里找到:Rusty出色的不可靠指南我们则将致力于netfilter与iproute2相结合后能做什么.第3章介绍iproute23.1 为什么使用iproute2现在,绝大多数Linux 发行版和绝大多数UNIX都使用古老的arp, ifconfig和route命令.虽然这些工具能够工作,但它们在Linux2.2和更高版本的内核上显得有一些落伍.比如,现在GRE隧道已经成为了路由的一个主要概念,但却不能通过上述工具来配置. 使用了iproute2,隧道的配置与其他部分完全集成了. 2.2 和更高版本的Linux 内核包含了一个经过彻底重新设计的网络子系统.这些新的代码让Linux在操作系统的竞争中取得了功能和性能上的优势.实际上,Linux新的路由,过滤和分类代码,从功能和性能上都不弱于现有的那些专业的路由器,防火墙和流量整形产品.随着新的网络概念的提出,人们在现有操作系统的现有体系上修修补补来实现他们.这种固执的行为导致了网络代码中充斥着怪异的行为,这有点像人类的语言.过去,Linux模仿了SunOS的许多处理方式,并不理想. 这个新的体系则有可能比以往任何一个版本的Linux都更善于清晰地进行功能表达.3.2 iproute2 概览Linux有一个成熟的带宽供给系统,称为Traffic Control(流量控制).这个系统支持各种方式进行分类,排序,共享和限制出入流量. 我们将从iproute2 各种可能性的一个简要概览开始.3.3 先决条件你应该确认已经安装了用户级配置工具.这个包的名字在RedHat和Debian中都叫作"iproute",也可以在这个地方找到: ftp://ftp.inr.ac.ru/ip-routing/iproute2-2.2.4-now-ss .tar.gz你也可以试试在这里找找最新版本.iproute 的某些部分需要你打开一些特定的内核选项.应该指出的是,RedHat6.2及其以前的所有发行版中所带的缺省内核都不带有流量控制所需要的绝大多数功能.而RedHat 7.2在缺省情况下能满足所有要求.另外,确认一下你的内核支持netlink ,Iproute2需要它.3.4 浏览你的当前配置这听上去确实让人惊喜:iproute2已经配置好了!当前的ifconfig和route命令已经正在使用新的系统调用,但通常使用了缺省参数(真无聊). 新的工具ip成为中心,我们会让它来显示我们的网卡配置.3.4.1. 让ip显示我们的链路[ahu@home ahu]$ ip link list1: lo: mtu 3924 qdisc noqueuelink/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:002: dummy: mtu 1500 qdisc nooplink/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff3: eth0: mtu 1400 qdisc pfifo_fast qlen 100link/ether 48:54:e8:2a:47:16 brd ff:ff:ff:ff:ff:ff4: eth1: mtu 1500 qdisc pfifo_fast qlen 100link/ether 00:e0:4c:39:24:78 brd ff:ff:ff:ff:ff:ff3764: ppp0: mtu 1492 qdisc pfifo_fast qlen 10link/ppp你的结果可能有所区别,但上述显示了我家里NAT路由器的情况.我将只解释输出中并非全部直接相关的部分.因为并不是所有部分都与我们的话题有关,所以我只会解释输出的一部分. 我们首先看到了loopback 接口. While your computer may function somewhat without one, I'd advise against it. MTU (最大传输单元)尺寸为3924 字节,并且不应该参与队列.这是因为loopback 接口完全是内核想象出来的,并不存在的接口. 现在我们跳过这个无关的接口,它应该并不实际存在于你的机器上.然后就是两个物理网络接口,一个接在我的cable modem 上,另一个接到我家里的以太网端上.再下面,我们看见了一个ppp0 接口. 应该指出,我们没有看到IP 地址.iproute 切断了"链路"和"IP 地址"两个概念的直接联系.当使用IP 别名的时候,IP地址的概念显得更加不相关了. 尽管如此,还是显示出了标识以太网卡硬件的MAC 地址.3.4.2. 让ip显示我们的IP 地址[ahu@home ahu]$ ip address show (ifconfig)1: lo: mtu 3924 qdisc noqueuelink/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 brd 127.255.255.255 scope host lo2: dummy: mtu 1500 qdisc nooplink/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff3: eth0: mtu 1400 qdisc pfifo_fast qlen 100link/ether 48:54:e8:2a:47:16 brd ff:ff:ff:ff:ff:ffinet 10.0.0.1/8 brd 10.255.255.255 scope global eth04: eth1: mtu 1500 qdisc pfifo_fast qlen 100link/ether 00:e0:4c:39:24:78 brd ff:ff:ff:ff:ff:ff3764: ppp0: mtu 1492 qdisc pfifo_fast qlen 10link/pppinet 212.64.94.251 peer 212.64.94.1/32 scope global ppp0这里包含了更多信息.显示了我们所有的地址,以及这些地址属于哪些网卡."inet"表示Internet (IPv4).还有很多其它的地址类型,但现在还没有涉及到. 让我们先就近看看eth0.上面说它与IP地址10.0.0.1/8相关联.这是什么意思呢?"/8"表示IP地址表示网络地址的位数.因为一共是32个bit,所以我们的这个网络有了24 bit的主机空间.10.0.0.1 的开始8bit是10.0.0.0,也就是我们的网络地址,我们的子网掩码是255.0.0.0. 其它的bit直接连接在这个网卡上,所以10.250.3.13可以直接通过eth0联络到,就象10.0.0.1一样.对于ppp0,仍是相同的概念,虽然数字看上去有所不同.它的地址是212.64.94.251,不带子网掩码.这意味着这是一个点到点的连接,而且除了212.64.94.251之外的地址是对端的.当然,还有很多信息.它还告诉我们这个链路的另一端只有一个地址:212.64.94.1./32意思是说没有表示网络的bit.掌握这些概念是绝对重要的.如果有问题,不妨先参考以下这个HOWTO文件开头曾经提到的那些文档. 你应该注意到了"qdisc",它是基于对列规范的一个概念.它在后面会变得很重要.3.4.3. 让ip显示路由好的,现在我们已经知道如何找到10.x.y.z了,然后我们就可以到达212.64.94.1.但这还不够,我们还得说明如何找到全世界.可以通过我们的ppp连接找到Internet,212.64.94.1愿意把我们的数据包发给全世界,并把回应的数据包传回给我们.[ahu@home ahu]$ ip route show (netstat –rn 或者ip route ls)212.64.94.1 dev ppp0 proto kernel scope link src 212.64.94.25110.0.0.0/8 dev eth0 proto kernel scope link src 10.0.0.1127.0.0.0/8 dev lo scope linkdefault via 212.64.94.1 dev ppp0字面的意思相当清楚.前4行的输出明确地说明了ip address show的意思,最后一行说明了世界的其它部分可以通过我们的缺省网关212.64.94.1找到.我们通过"via"这个词断定这是一个网关,我们要把数据包交给它.这就是我们要留心的问题下面列出以前route 命令的输出作为参考:[ahu@home ahu]$ route -n (netstat –rn)Kernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Iface212.64.94.1 0.0.0.0 255.255.255.255 UH 0 0 0 ppp010.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 eth0127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo0.0.0.0 212.64.94.1 0.0.0.0 UG 0 0 0 ppp03.5. ARPARP 是由RFC 826 所描述的"地址解析协议".ARP是网络上的计算机在局域网中用来解析另一台机器的硬件地址/位置的时候使用的.互联网上的机器一般都是通过机器名解析成IP地址来互相找到的.这就能够解决网络能够与网络通讯.但是,仅仅依靠IP地址,却无法得到一台计算机在一个网络中的物理位置.这时候就需要ARP.让我们举一个非常简单的例子.假定我有一个网络,里面有几台机器.其中的两台在我的子网上,一台叫foo,IP地址是10.0.0.1,另一台叫bar,IP地址是10.0.0.2.现在,foo想ping一下bar看看是不是正常,但是呢,foo只知道bar的IP地址,却并不知道bar的硬件(MAC)地址.所以foo在ping bar之前就会先发出ARP询问.这个ARP询问就像在喊:"Bar(10.0.0.2)!你在哪里(你的MAC地址是多少)?!" 结果这个广播域中的每台机器都能听到foo的喊话,但是只有bar(10.0.0.2)会回应.Bar会直接给foo发送一个ARP回应,告诉它"Foo (10.0.0.1),我的Mac地址是00:60:94:E9:08:12".经过这种简单的交谈,机器就能够在局域网中定位它要通话的对象.Foo会一直使用这个结果,直到它的ARP缓冲忘掉这个结果(在Unix系统上通常是15分钟之后).现在我们来看一看具体的工作过程.你可以这样察看你的ARP表(缓冲):[root@espa041 /home/src/iputils]# ip neigh show (注释arp –a)9.3.76.42 dev eth0 lladdr 00:60:08:3f:e9:f9 nud reachable9.3.76.1 dev eth0 lladdr 00:06:29:21:73:c8 nud reachable你可以看到,我的机器espa041 (9.3.76.41) 知道如何找到espa042 (9.3.76.42) 和espagate (9.3.76.1).现在让我们往缓冲中添加另一台机器.[root@espa041 /home/paulsch/.gnome-desktop]# ping -c 1 espa043PING (9.3.76.43) from 9.3.76.41 : 56(84) bytes of data.64 bytes from 9.3.76.43: icmp_seq=0 ttl=255 time=0.9 ms--- ping statistics ---1 packets transmitted, 1 packets received, 0% packet lossround-trip min/avg/max = 0.9/0.9/0.9 ms[root@espa041 /home/src/iputils]# ip neigh show9.3.76.43 dev eth0 lladdr 00:06:29:21:80:20 nud reachable9.3.76.42 dev eth0 lladdr 00:60:08:3f:e9:f9 nud reachable9.3.76.1 dev eth0 lladdr 00:06:29:21:73:c8 nud reachable由于espa041试图联络espa043,espa043的硬件地址已经添加到ARP缓冲里了.所以直到espa043的记录失效以前(也就是两个机器间长时间没有通讯),espa041 知道如何找到espa043,也就不必频繁地进行ARP询问了.现在让我们来删除espa043 的ARP缓冲:[root@espa041 /home/src/iputils]# ip neigh delete 9.3.76.43 dev eth0[root@espa041 /home/src/iputils]# ip neigh show9.3.76.43 dev eth0 nud failed9.3.76.42 dev eth0 lladdr 00:60:08:3f:e9:f9 nud reachable9.3.76.1 dev eth0 lladdr 00:06:29:21:73:c8 nud stale现在espa041 已经忘记了espa043 的MAC地址,如果下次它要与espa043 通讯,需要再次发送ARP 询问.你在espagate (9.3.76.1) 上也会发现以上输出已经变成了"stale"状态.这意味着MAC地址仍然是在册,但是接下来第一次通讯的时候需要确认一下.第4章规则——路由策略数据库如果你有一个大规模的路由器,你可能不得不同时满足不同用户对于路由的不同需求.路由策略数据库可以帮助你通过多路由表技术来实现. 如果你想使用这个特性,请确认你的内核配置中带有"IP: advanced router" 和"IP: policy routing" 两项. 当内核需要做出路由选择时,它会找出应该参考哪一张路由表.除了"ip" 命令之外,以前的"route" 命令也能修改main 和local 表.缺省规则:[ahu@home ahu]$ ip rule list0:from all lookup local32766:from all lookup main32767:from all lookup default上面列出了规则的优先顺序.我们看到,所有的规则都应用到了所有的包上("from all").我们前面已经看到了"main" 表,就是"ip route ls"命令的输出,但是"local"和"default"是初次见到. 如果我们想做点有趣的事情,就可以生成一些指向不同路由表的规则,取代系统中的路由规则.对于内核如何处理一个IP包匹配多个规则的精确意义,请参见Alexey关于ip-cref文档.4.1. 简单的源策略路由让我们再来一个真实的例子.我有两个Cable Modem,连接到了一个Linux的NAT ("伪装") 路由器上.这里的室友们向我付费使用Internet.假如我其中的一个室友因为只想访问hotmail 而希望少付一些钱.对我来说这没有问题, 他们肯定只能使用那个比较次的Cable Modem. 那个比较快的cable modem 的IP地址是212.64.94.251, PPP 链路,对端IP是212.64.94.1.而那个比较慢的cable modem 的IP 地址是212.64.78.148,对端是195.96.98.253.local 表:[ahu@home ahu]$ ip route list table local11/etc/iproute2/rt_tables# ip rule add from 10.0.0.10 table John# ip rule ls0:from all lookup local32765:from 10.0.0.10 lookup John32766:from all lookup main32767:from all lookup default现在,剩下的事情就是为John 的路由表创建路由项了.别忘了刷新路由缓存:# ip route add default via 195.96.98.253 dev ppp2 table John# ip route flush cache这样就做好了.至于如何在ip-up 阶段实现就留给读者自己去研究吧.4.2. 多重上连ISP的路由下图是很常见的配置,同一个局域网(甚至是同一台计算机)通过两个ISP连接到互联网上.________+------------+ /| | |+-------------+ ISP 1 +-------__ | | | /12___/ \_ +------+-------+ +------------+ |_/ \__ | if1 | // \ | | || 局域网-----+ Linux 路由器| | 国际互联网\_ __/ | | |\__ __/ | if2 | \\___/ +------+-------+ +------------+ || | | \+-------------+ ISP 2 +-------| | |+------------+ \________这种情况下通常会出现两个问题.4.2.1. 流量分割首先是如何保证:回应来自某一个ISP的数据包时,仍然使用相同的ISP.让我们先定义一些符号. 令第一块网卡(上图的if1)的名字叫$IF1,而第二块网卡叫做$IF2 .然后设置$IF1 的IP地址为$IP1,$IF2 的IP地址为$IP2.并且,令ISP1 的网关地址为$P1,ISP2 的网关地址为$P2.最后,令$P1的网络地址为$P1_NET ,令$P2的网络地址为$P2_NET. 额外创建两个路由表, T1 和T2. 加入到/etc/iproute2/rt_tables 中.然后如下设置两个路由表中的路由:ip route add $P1_NET dev $IF1 src $IP1 table T1ip route add default via $P1 table T1ip route add $P2_NET dev $IF2 src $IP2 table T2ip route add default via $P2 table T2没什么大不了的,不过是建立了通向该网关的一条路由,并使之成为默认网关,分别负责一个单独的上行流,并且为这两个ISP都作这样的配置.要指出的是,那条网络路由是必要条件,因为它能够让我们找到那个子网内的主机,也包括上述那台网关.下一步,我们设置"main"路由表.把包通过网卡直接路由到与网卡相连的局域网上不失为一个好办法.要注意"src" 参数,他们能够保证选择正确的出口IP地址.ip route add $P1_NET dev $IF1 src $IP1ip route add $P2_NET dev $IF2 src $IP2然后,设置你的缺省路由:ip route add default via $P1接着,设置路由规则.这实际上在选择用什么路由表进行路由.你需要确认当你从一个给定接口路由出数据包时,是否已经有了相应的源地址:你需要保证的就是如果你已经有了相应的源地址,就应该把数据包从相应的网卡路由出去:ip rule add from $IP1 table T1ip rule add from $IP2 table T2以上命令保证了所有的回应数据都会从他们来的那块网卡原路返回. 现在,完成了非常基本的配置.这将对于所有运行在路由器上所有的进程起作用,实现IP伪装以后,对本地局域网也将起作用.如果不进行伪装,那么你要么拥有两个ISP的地址空间,要么你想对两个ISP中的一个进行伪装.无论哪种情况,你都要添加规则,基于发包的主机在局域网内的IP地址,选择从哪个ISP路由出去.4.2.2. 负载均衡第二个问题是如何对于通过两个ISP流出的数据进行负载均衡.如果你已经成功地实现了流量分割,这件事并不难. 与选择两个ISP中的一个作为缺省路由不同,这次是设置缺省路由为多路路由.在缺省内核中,这会均衡两个ISP的路由.象下面这样做(基于前面的流量分割实验):ip route add default scope global nexthop via $P1 dev $IF1 weight 1 \ nexthop via $P2 dev $IF2 weight 1这样就可以均衡两个ISP的路由.通过调整"weight"参数我们可以指定其中一个ISP的优先权高于另一个. 应该指出,由于均衡是基于路由进行的,而路由是经过缓冲的,所以这样的均衡并不是100%精确.也就是说,对于一个经常访问的站点,总是会使用同一个ISP. 进而,如果你对此不满意,你可能需要参考以下Julian Anastasov的内核补丁: /~julian/#routes Julian的路由补丁会弥补上述缺陷.第5章GRE 和其他隧道Linux有3种隧道.它们是: IP-in-IP 隧道, GRE 隧道和非内核隧道(如PPTP).5.1. 关于隧道的几点注释隧道可以用于实现很多非常不一般而有趣的功能.但如果你的配置有问题,却也会发生可怕的错误.除非你确切地知道你在做什么,否则不要把缺省路由指向一个隧道设备.而且,隧道会增加协议开销,因为它需要一个额外的IP包头.一般应该是每个包增加20个字节,所以如果一个网络的MTU是1500字节的话,使用隧道技术后,实际的IP包长度最长只能有1480字节了.这倒不是什么原则性的问题,但如果你想使用隧道技术构建一个比较大规模的网络的话,最好仔细研究一下关于IP包的分片和汇聚的知识.哦,还有,挖一个隧道最好的方法当然是同时从两头挖.5.2. IP-in-IP 隧道这种隧道在Linux上已经实现很长一段时间了.需要两个内核模块:ipip.o 和new_tunnel.o.比如说你有3个网络:内部网A和B,中间网C(比如说:Internet).A网络的情况:网络地址10.0.1.0子网掩码255.255.255.0路由器10.0.1.1路由器在C网络上的地址是172.16.17.18.B网络的情况:网络地址10.0.2.0子网掩码255.255.255.0路由器10.0.2.1路由器在C网络上的IP地址是172.19.20.21.已知C网络已经连通,我们假定它会将所有的数据包从A传到B,反之亦然.而且你可以随便使用Internet. 这就是你要做的:首先,确认模块是否加载:insmod ipip.oinsmod new_tunnel.o然后,在A网络的路由器上输入:ifconfig tunl0 10.0.1.1 pointopoint 172.19.20.21route add -net 10.0.2.0 netmask 255.255.255.0 dev tunl0并且在B网络的路由器上输入:ifconfig tunl0 10.0.2.1 pointopoint 172.16.17.18route add -net 10.0.1.0 netmask 255.255.255.0 dev tunl0如果你想中止隧道,输入:ifconfig tunl0 down简单之极!但是你不能通过IP-in-IP隧道转发广播或者IPv6数据包.你只是连接了两个一般情况下无法直接通讯的IPv4网络而已.至于兼容性,这部分代码已经有很长一段历史了,它的兼容性可以上溯到1.3版的内核.据我所知,Linux的IP-in-IP 隧道不能与其他操作系统或路由器互相通讯.它很简单,也很有效.需要它的时候尽管使用,否则就使用GRE.5.3. GRE 隧道GRE是最初由CISCO开发出来的隧道协议,能够做一些IP-in-IP隧道做不到的事情.比如,你可以使用GRE隧道传输多播数据包和IPv6数据包.在Linux下,你需要ip_gre.o模块.5.3.1. IPv4隧道让我们先来做一做IPv4隧道:比如说你有3个网络:内部网A和B,中间网C(比如说:Internet).A网络的情况:网络地址10.0.1.0子网掩码255.255.255.0路由器10.0.1.1路由器在C网络上的地址是172.16.17.18.我们称之为neta.B网络的情况:网络地址10.0.2.0子网掩码255.255.255.0路由器10.0.2.1路由器在C网络上的IP地址是172.19.20.21.我们称之为netb.已知C网络已经连通,我们假定它会将所有的数据包从A传到B,反之亦然.至于原因,我们不考虑.在A网络的路由器上,输入:ip tunnel add netb mode gre remote 172.19.20.21 local 172.16.17.18 ttl 255ip link set netb upip addr add 10.0.1.1 dev netbip route add 10.0.2.0/24 dev netb让我们稍微讨论一下.第1行,我们添加了一个隧道设备,并且称之为netb(为了能够表示出这个隧道通向哪里).并且表示要使用GRE协议(mode gre),对端地址是172.19.20.21(另一端的路由器),我们的隧道数据包发源于172.16.17.18(以便当你的路由器在C网络中拥有多个地址的时候,你可以指定哪一个应用于隧道) 并且包的TTL字段应设置为255(ttl 255).第2行,启用该隧道.第3行,我们给这个新生的网卡配置了一个IP:10.0.1.1.对于小网络来说足够了,但如果你网络中的隧道多得象无证运营的小煤窑一样,你可能就要考虑给你的隧道规划一个单独的IP地址范围(在本例中,你可以使用10.0.3.0).第4行,我们为B网络设置了一条路由让我们再看看B网络的路由器.ip tunnel add neta mode gre remote 172.16.17.18 local 172.19.20.21 ttl 255ip link set neta upip addr add 10.0.2.1 dev netaip route add 10.0.1.0/24 dev neta如果你想从A路由器中停止隧道,输入:ip link set netb downip tunnel del netb当然,你可以把netb换成neta,在B路由器上操作.5.3.2. IPv6隧道关于IPv6地址,请参看第6章第1节.这就开始吧. 我们假设你有如下的IPv6网络,你想把它连接到6bone或者一个朋友那里.Network 3ffe:406:5:1:5:a:2:1/96。

提速指南Linux命令行中的高级网络优化技巧

提速指南Linux命令行中的高级网络优化技巧

提速指南Linux命令行中的高级网络优化技巧提速指南:Linux命令行中的高级网络优化技巧在日常工作中,我们经常使用Linux命令行进行网络操作。

为了提高网络传输速度和优化网络性能,本文将介绍一些在Linux命令行中使用的高级网络优化技巧。

一、网络连接优化1. 使用更快的DNS服务器DNS服务器的选择对网络连接速度有重要影响。

可以使用以下命令将系统默认的DNS服务器更改为更快的公共DNS服务器:```sudo echo "nameserver 8.8.8.8" > /etc/resolv.confsudo echo "nameserver 8.8.4.4" >> /etc/resolv.conf```这里的8.8.8.8和8.8.4.4分别是Google的公共DNS服务器IP地址。

2. 调整MTU值MTU(Maximum Transmission Unit)是指网络传输的最大数据包大小。

通过调整MTU值,可以在一定程度上提高网络传输速度。

可以使用以下命令来设置MTU值:```sudo ifconfig eth0 mtu 1500```这里的eth0是网络接口的名称,1500是MTU值。

根据网络环境的不同,可以调整MTU值的大小。

二、网络性能分析1. 使用ping命令测试网络延迟通过ping命令可以测试网络连接的延迟。

可以使用以下命令测试与目标IP地址之间的延迟:```ping 192.168.0.1```这里的192.168.0.1是目标IP地址。

2. 使用netstat命令查看网络连接状态netstat命令可以查看当前系统的网络连接状态。

可以使用以下命令查看所有的网络连接信息:```netstat -a```此命令将显示所有TCP和UDP协议的网络连接信息。

三、带宽优化1. 使用wget命令加速下载wget命令是Linux中常用的下载工具。

Linux系统下的网络配置与优化

Linux系统下的网络配置与优化

Linux系统下的网络配置与优化在今天的信息时代,网络已经成为人们生活和工作的基础设施之一。

而对于IT行业的从业者而言,网络的稳定性和速度也成为了评判一款产品是否优秀的标准之一。

在Linux系统下,正确的网络配置和优化不仅可以让网络更加稳定和快速,还能提高工作效率和用户体验。

本文将探讨Linux系统下的网络配置和优化,包括IP地址的配置、网络嗅探、路由和QoS等方面。

IP地址的配置在Linux系统下,IP地址的配置可以通过修改网络配置文件来实现。

网络配置文件主要保存在/etc/sysconfig/network-scripts/目录下。

在该目录下,每个网卡对应着一个配置文件,比如eth0对应着ifcfg-eth0文件。

可以通过修改该文件来修改网卡对应的IP地址、子网掩码、网关等参数。

除此之外,Linux系统也提供了命令行工具来设置IP地址。

其中,最基本的命令是ifconfig。

通过该命令可以查看目前网络接口的状态,包括MAC地址、IP地址、子网掩码、广播地址等信息。

而通过ifconfig命令也可以修改IP地址等参数,比如ifconfig eth0 192.168.1.100可以将eth0的IP地址设置为192.168.1.100。

网络嗅探网络嗅探是指在网络中捕获和分析数据包的过程。

在Linux系统中,最常用的嗅探工具是tcpdump和wireshark。

Tcpdump是控制台下的命令行工具,可以在命令行中直接使用。

比如tcpdump -i eth0可以捕获以太网卡eth0接口的数据包,并将其打印出来。

而通过tcpdump命令的各种选项,如-f、-s、-c等,还可以控制不同的嗅探行为。

而wireshark则是一款图形化嗅探工具。

它能够以图形化的方式展现捕获的数据包,并提供强大的过滤和分析功能。

wireshark可以捕获所有经过主机网卡的数据包,无论它们是进入还是离开。

路由路由是网络中连接不同子网的核心设备之一。

Linux命令技巧实现高级网络配置和路由

Linux命令技巧实现高级网络配置和路由

Linux命令技巧实现高级网络配置和路由Linux操作系统是一种开源的Unix-like操作系统,广泛应用于服务器端、嵌入式设备以及个人电脑等领域。

它以其高度的稳定性、安全性和灵活性而备受青睐。

在网络配置和路由方面,Linux命令提供了丰富的功能和技巧,可以实现高级网络配置和路由操作。

本文将介绍一些常用的Linux命令技巧,帮助读者更好地理解和运用Linux操作系统。

一、网络配置1. ifconfig命令ifconfig命令是Linux系统中用来配置和显示网络设备的命令。

通过ifconfig命令,可以查看当前系统上的网络接口信息,如IP地址、子网掩码、MAC地址等。

示例:```ifconfig eth0```2. ip命令ip命令是Linux操作系统中用来配置网络接口的命令。

它提供了更强大的网络配置功能,可以实现更多网络操作,如设置IP地址、启用和禁用接口等。

示例:ip addr add 192.168.1.100/24 dev eth0```3. route命令route命令用于查看和配置路由表信息。

它可以显示当前系统的路由信息,并可以根据需要添加、删除和修改路由条目。

示例:```route -n```二、高级网络配置1. VLAN配置VLAN是一种将局域网划分成多个虚拟局域网的技术。

在Linux系统中,可以通过VLAN配置在物理网卡上创建多个虚拟网卡,每个虚拟网卡可以属于不同的VLAN,实现不同VLAN之间的隔离通信。

示例:```vconfig add eth0 10ifconfig eth0.10 up2. VPN配置VPN是一种通过公共网络建立安全的远程连接的技术。

在Linux系统中,可以通过配置IPSec和OpenVPN等协议实现VPN功能,实现远程连接和数据加密传输。

示例:```ipsec.conf配置文件示例:conn myvpntype=tunnelleft=192.168.1.100right=203.0.113.1ike=aes256-sha2_256-modp2048esp=aes256-sha2_256```三、路由配置1. 静态路由配置静态路由是通过手动配置路由表来实现的,管理员需要手动添加、删除和修改路由条目。

Linux的流量控制器(TrafficControl)

Linux的流量控制器(TrafficControl)

Linux的流量控制器(TrafficControl)Linux从kernel 2.1.105开始支持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地址为192.168.1.66,在其上建立一个CBQ队列。

假设包的平均大小为1000字节,包间隔发送单元的大小为8字节,可接收冲突的发送最长包数目为20字节。

假如有三种类型的流量需要控制:1) 是发往主机1的,其IP地址为192.168.1.24。

Linux命令高级技巧使用tc进行网络流量控制和限制

Linux命令高级技巧使用tc进行网络流量控制和限制

Linux命令高级技巧使用tc进行网络流量控制和限制Linux命令高级技巧:使用tc进行网络流量控制和限制在Linux操作系统中,网络流量控制和限制是一项重要的技巧,特别是在服务器和网络管理员的工作中。

通过使用tc命令,我们可以实现对网络流量进行细致的控制和限制,以确保网络的稳定性和良好的性能。

本文将介绍如何使用tc命令进行网络流量控制和限制的高级技巧。

一、tc命令简介tc命令是Linux操作系统中的一个非常强大的工具,它是Traffic Control的缩写,用于对网络流量进行控制和限制。

通过tc命令可以实现对网络流量的带宽、延迟、丢包率等参数进行调整,以满足不同网络环境和需求的要求。

二、安装tc命令在大多数Linux发行版中,tc命令已经默认安装,但如果你的系统没有安装tc命令,可以通过包管理工具进行安装。

以Ubuntu为例,可以使用以下命令安装tc命令:```sudo apt-get install iproute2```三、使用tc命令进行网络流量控制1. 查看网络接口信息在使用tc命令进行网络流量控制前,我们首先需要查看系统中的网络接口信息,以确定需要控制和限制的网络接口。

可以使用以下命令查看网络接口信息:```ifconfig```2. 创建新的网络类别通过创建新的网络类别,我们可以对不同的网络流量进行不同的控制和限制。

可以使用以下命令创建新的网络类别:```sudo tc qdisc add dev [网络接口] root [网络类别]```其中,[网络接口]是需要进行控制和限制的网络接口名称,[网络类别]是新创建的网络类别。

3. 设置网络类别的属性对于新创建的网络类别,我们需要设置一些属性,以实现对网络流量的具体控制和限制。

可以使用以下命令设置网络类别的属性:```sudo tc qdisc add dev [网络接口] parent [网络类别] handle [网络句柄] [网络属性]```其中,[网络属性]用于设置带宽、延迟、丢包率等参数,可以根据实际需求进行调整。

Linux 的高级路由和流量控制 HOWTO 说明书

Linux 的高级路由和流量控制 HOWTO 说明书

Martijn van Oosterhout (章节作者) kleptog@
Paul B Schroeder (章节作者) paulsch@
Jasper Spaans (章节作者) jasper@spaans.ds9a.nl
Pedro Larroy (章节作者) piotr%omega.resa.ed
104 106 107 108 109 109 109 109 110 110 112 112 113 113 115 117 119 120
8
第 1 章 贡献
本文档的成形得益于很多人的贡献,我希望能够回报他们。列出其中几个:
• • • •
Rusty Russell Alexey N. Kuznetsov 来自 Google 的一些好心人 Casema Internet 的工作人员
2.3. Linux 能为你做什么
一个小列表:
• • • • • • • • •
Linux 的高级路由和流量控制 HOWTO 中文版
1
Bert Hubert
Netherlabs BV bert.hubert@netherlabs.nl Gregory Maxwell (章节作者) remco%virtu.nl
Remco van Mook (章节作者) remco@virtu.nl
3.2 IPROUTE2 概览 3.3 先决条件 3.4 浏览你的当前配置 3.4.1. 让 ip 显示我们的链路 3.4.2. 让 ip 显示我们的 IP 地址 3.4.3. 让 ip 显示路由 3.5. ARP 第 4 章 规则——路由策略数据库 4.1. 简单的源策略路由 4.2. 多重上连 ISP 的路由 4.2.1. 流量分割 4.2.2. 负载均衡 第 5 章 GRE 和其他隧道 5.1. 关于隧道的几点注释 5.2. IP-IN-IP 隧道 5.3. GRE 隧道

Linux命令高级技巧使用iptables进行流量控制和限制

Linux命令高级技巧使用iptables进行流量控制和限制

Linux命令高级技巧使用iptables进行流量控制和限制Linux命令高级技巧:使用iptables进行流量控制和限制在Linux操作系统中,iptables是一种用于管理网络数据包的工具。

它提供了一种有效的方法来控制和限制网络流量,以保护网络安全和提高网络性能。

本文将介绍如何使用iptables进行流量控制和限制的高级技巧。

1. 什么是iptables?iptables是Linux系统中的一个防火墙工具,它可以在网络层面上控制入站和出站的数据包。

使用iptables,我们可以定义各种规则和策略来过滤、重定向和修改数据包,从而实现对网络流量的控制和限制。

2. 安装和基本配置在开始使用iptables之前,我们需要先安装并配置它。

大多数Linux系统中,iptables已经预先安装好了,通过以下命令可以检查它是否已经安装:```shelliptables --version```如果显示了版本信息,则说明iptables已经安装了。

如果没有安装,可以通过包管理器来安装它,如以下命令:```shellsudo apt-get install iptables```安装完成后,我们可以开始配置iptables。

iptables的配置文件位于`/etc/sysconfig/iptables`(Red Hat系列发行版)或者`/etc/iptables/iptables.rules`(Debian系列发行版)。

可以使用文本编辑器打开配置文件,并根据需要添加或修改规则。

每个规则由一个或多个规则链组成,如输入链(INPUT)、输出链(OUTPUT)和转发链(FORWARD),每个链又由多个规则构成。

3. 流量控制规则使用iptables进行流量控制和限制最常见的场景就是针对特定的IP地址、端口或协议进行限制。

以下是一些常用的流量控制规则的示例:- 允许特定IP地址的访问:```shelliptables -A INPUT -s 192.168.1.100 -j ACCEPT```这个规则允许IP地址为192.168.1.100的主机访问本机。

Linux命令技巧高级网络流量管理和监控

Linux命令技巧高级网络流量管理和监控

Linux命令技巧高级网络流量管理和监控在Linux系统中,网络流量管理和监控是网络管理员必备的技能之一。

通过合理利用Linux命令,可以实现高级网络流量管理和监控,从而提高网络性能和安全性。

本文将介绍一些常用的Linux命令技巧,帮助读者掌握网络流量管理和监控的高级技巧。

一、网络监控1. iftop命令iftop命令可以实时监控网络流量,显示各个网络接口的实时数据。

使用iftop命令可以查看网络接口的流量使用情况,以及连接的源地址和目标地址。

示例如下:```iftop```2. nload命令nload命令可以显示网络接口的实时带宽使用情况。

使用nload命令可以查看网络接口的速度、流量和连接数等信息。

示例如下:```nload eth0```3. tcpdump命令tcpdump命令可以抓取网络数据包并进行分析。

使用tcpdump命令可以监控网络流量,捕获指定接口的数据包,并进行详细分析。

示例如下:```tcpdump -i eth0```二、网络流量管理1. tc命令tc命令是Linux中最常用的网络流量管理命令,用于配置和管理网络接口的带宽、延迟、丢包等参数。

使用tc命令可以实现带宽限制、流量控制和排队管理等功能。

示例如下:```tc qdisc add dev eth0 root tbf rate 1mbit burst 10kb latency 50ms```2. iptables命令iptables命令是Linux中的防火墙配置命令,也可以用于网络流量管理。

使用iptables命令可以实现基于IP地址、端口和协议的流量控制和管理。

示例如下:```iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 80 -j DROPiptables -A OUTPUT -d 192.168.1.0/24 -p tcp --sport 80 -j DROP```3. ifconfig命令ifconfig命令用于配置和管理网络接口的参数,包括IP地址、子网掩码、网关等。

Linux终端中的网络管理和配置

Linux终端中的网络管理和配置

Linux终端中的网络管理和配置Linux操作系统因其稳定性和可定制性而被广泛使用于各种服务器和嵌入式设备中。

在Linux系统中,网络管理和配置是一个重要的任务,它允许用户对网络进行设置、配置和监控。

本文将介绍Linux终端中的网络管理和配置的基本概念和技巧。

一、网络设置1. IP地址设置在Linux中,可以使用命令行工具ifconfig或ip来设置和配置IP地址。

例如,要设置一个网卡的IP地址为192.168.1.100,可以使用以下命令:```bashifconfig eth0 192.168.1.100```或者```baship addr add 192.168.1.100 dev eth0```2. 子网掩码设置子网掩码决定了网络地址和主机地址的界限。

在Linux中,可以使用以下命令设置子网掩码:```bashifconfig eth0 netmask 255.255.255.0```或者```baship addr flush eth0 && ip addr add 192.168.1.100/24 dev eth0```3. 默认网关设置默认网关决定了数据包离开本地网络时应该转发到哪个网关。

在Linux中,可以使用以下命令设置默认网关:```bashroute add default gw 192.168.1.1```或者```baship route add default via 192.168.1.1```二、网络配置1. DNS配置DNS(Domain Name System)用于将域名解析为IP地址。

在Linux 中,可以通过修改/etc/resolv.conf文件来配置DNS服务器。

例如,可以使用以下命令:```bashecho "nameserver 8.8.8.8" >> /etc/resolv.conf```2. 主机名配置主机名是在网络中标识一个特定主机的名称。

Linux命令高级技巧使用iptables命令进行网络流量控制

Linux命令高级技巧使用iptables命令进行网络流量控制

Linux命令高级技巧使用iptables命令进行网络流量控制iptables是Linux系统中最常用的网络过滤工具之一。

它允许系统管理员通过定义规则来控制网络流量的进出。

使用iptables命令可以有效地防止恶意攻击、保护网络安全和进行流量控制。

本文将介绍一些高级技巧,以帮助读者更好地使用iptables命令进行网络流量控制。

一、iptables概述及基本用法iptables是一款由Linux内核提供的,用于配置Linux内核的防火墙的工具。

它可以允许或拒绝数据包通过系统,同时也可以修改数据包的各种属性。

iptables具有很好的灵活性,在网络安全和流量控制中扮演着重要的角色。

基本的iptables命令用法如下:1. 开启或关闭iptables服务systemctl start iptables # 开启iptables服务systemctl stop iptables # 关闭iptables服务2. 清空已有规则iptables -F # 清空过滤规则iptables -X # 清空用户自定义链3. 默认规则设置iptables -P INPUT DROP # 设置INPUT链的默认规则为拒绝iptables -P OUTPUT ACCEPT # 设置OUTPUT链的默认规则为允许二、高级技巧之网络流量控制1. 限制特定IP地址访问iptables -A INPUT -s 192.168.1.2 -j DROP # 拒绝指定IP地址访问2. 限制特定端口的访问iptables -A INPUT -p tcp --dport 22 -j DROP # 拒绝SSH端口访问3. 允许指定IP地址访问特定端口iptables -A INPUT -s 192.168.1.2 -p tcp --dport 80 -j ACCEPT # 允许指定IP地址访问HTTP端口4. 放行特定MAC地址的流量iptables -A INPUT -m mac --mac-source 00:11:22:33:44:55 -j ACCEPT # 允许指定MAC地址的流量通过5. 源地址伪装iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE # 对指定网段的源地址进行伪装6. 限制请求频率iptables -I INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT # 限制HTTP请求频率7. 根据连接状态控制流量iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # 允许已建立或相关的连接通过8. 防止SYN Flood攻击iptables -A INPUT -p tcp --syn -m connlimit --connlimit-above 10 -j DROP # 拒绝连接数超过10个的SYN请求9. 使用IP集合进行流量控制iptables -A INPUT -m set --match-set allowed_ips src -j ACCEPT # 允许IP集合中的地址通过10. 使用日志功能iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH:" # 对SSH连接进行日志记录三、总结本文介绍了Linux系统中使用iptables命令进行网络流量控制的高级技巧。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Linux的高级路由和流量控制HOWTO 1 2Linux的高级路由和流量控制HOWTO(1.2)2010-07-16 14:28第4章规则--路由策略数据库如果你有一个大规模的路由器,你可能不得不同时满足不同用户对于路由的不同需求。

路由策略数据库可以帮助你通过多路由表技术来实现。

如果你想使用这个特性,请确认你的内核配置中带有"IP:advanced router"和"IP:policy routing"两项。

当内核需要做出路由选择时,它会找出应该参考哪一张路由表。

除了"ip"命令之外,以前的"route"命令也能修改main和local表。

缺省规则:[ahu@home ahu]$ip rule list 0:from all lookup local 32766:from all lookup main 32767:from all lookup default上面列出了规则的优先顺序。

我们看到,所有的规则都应用到了所有的包上("from all")。

我们前面已经看到了"main"表,就是"ip route ls"命令的输出,但是"local"和"default"是初次见到。

如果我们想做点有趣的事情,就可以生成一些指向不同路由表的规则,取代系统中的路由规则。

对于内核如何处理一个IP包匹配多个规则的精确意义,请参见Alexey关于ip-cref文档。

4.1.简单的源策略路由让我们再来一个真实的例子。

我有两个Cable Modem,连接到了一个Linux 的NAT("伪装")路由器上。

这里的室友们向我付费使用Internet。

假如我其中的一个室友因为只想访问hotmail而希望少付一些钱。

对我来说这没有问题,他们肯定只能使用那个比较次的Cable Modem。

那个比较快的cable modem的IP地址是212.64.94.251,PPP链路,对端IP是212.64.94.1。

而那个比较慢的cable modem的IP地址是212.64.78.148,对端是195.96.98.253。

local表:[ahu@home ahu]$ip route list table local broadcast127.255.255.255 dev lo proto kernel scope link src 127.0.0.1 local 10.0.0.1 dev eth0 proto kernel scope host src 10.0.0.1 broadcast10.0.0.0 dev eth0 proto kernel scope link src 10.0.0.1 local212.64.94.251 dev ppp0 proto kernel scope host src 212.64.94.251 broadcast 10.255.255.255 dev eth0 proto kernel scope link src10.0.0.1 broadcast 127.0.0.0 dev lo proto kernel scope link src127.0.0.1 local 212.64.78.148 dev ppp2 proto kernel scope host src 212.64.78.148 local 127.0.0.1 dev lo proto kernel scope host src127.0.0.1 local 127.0.0.0/8 dev lo proto kernel scope host src127.0.0.1有很多明显的事实,其实可能还需要进一步说明。

好了,这样就行了。

"default"表为空。

让我们看看"main"路由表:[ahu@home ahu]$ip route list table main 195.96.98.253 dev ppp2 proto kernel scope link src 212.64.78.148 212.64.94.1 dev ppp0 proto kernel scope link src 212.64.94.251 10.0.0.0/8 dev eth0 proto kernel scope link src 10.0.0.1 127.0.0.0/8 dev lo scope link default via 212.64.94.1 dev ppp0我们现在为我们的朋友创建了一个叫做"John"的规则。

其实我们完全可以使用纯数字表示规则,但是不方便。

我们可以向/etc/iproute2/rt_tables文件中添加数字与名字的关联:#echo 200 John/etc/iproute2/rt_tables#ip rule add from 10.0.0.10 table John#ip rule ls 0:from all lookup local 32765:from 10.0.0.10 lookup John 32766:from all lookup main 32767:from all lookup default现在,剩下的事情就是为John的路由表创建路由项了。

别忘了刷新路由缓存:#ip route add default via 195.96.98.253 dev ppp2 table John#ip route flush cache这样就做好了。

至于如何在ip-up阶段实现就留给读者自己去研究吧。

4.2.多重上连ISP的路由下图是很常见的配置,同一个局域网(甚至是同一台计算机)通过两个ISP连接到互联网上。

_+--+/|||+---+ISP 1+---__|||/_/_+--+---++--+|_/__|if1|//||||局域网---+Linux路由器||国际互联网_ __/|||__ __/|if2|_/+--+---++--+||||+---+ISP 2+---|||+--+_这种情况下通常会出现两个问题。

4.2.1.流量分割首先是如何保证:回应来自某一个ISP的数据包时,仍然使用相同的ISP。

让我们先定义一些符号。

令第一块网卡(上图的if1)的名字叫$IF1,而第二块网卡叫做$IF2。

然后设置$IF1的IP地址为$IP1,$IF2的IP地址为$IP2。

并且,令ISP1的网关地址为$P1,ISP2的网关地址为$P2。

最后,令$P1的网络地址为$P1_NET,令$P2的网络地址为$P2_NET。

额外创建两个路由表,T1和T2。

加入到/etc/iproute2/rt_tables中。

然后如下设置两个路由表中的路由:ip route add$P1_NET dev$IF1 src$IP1 table T1 ip route add default via$P1 table T1 ip route add$P2_NET dev$IF2 src$IP2 table T2 ip route add default via$P2 table T2没什么大不了的,不过是建立了通向该网关的一条路由,并使之成为默认网关,分别负责一个单独的上行流,并且为这两个ISP都作这样的配置。

要指出的是,那条网络路由是必要条件,因为它能够让我们找到那个子网内的主机,也包括上述那台网关。

下一步,我们设置"main"路由表。

把包通过网卡直接路由到与网卡相连的局域网上不失为一个好办法。

要注意"src"参数,他们能够保证选择正确的出口IP地址。

ip route add$P1_NET dev$IF1 src$IP1 ip route add$P2_NET dev$IF2src$IP2然后,设置你的缺省路由:ip route add default via$P1接着,设置路由规则。

这实际上在选择用什么路由表进行路由。

你需要确认当你从一个给定接口路由出数据包时,是否已经有了相应的源地址:你需要保证的就是如果你已经有了相应的源地址,就应该把数据包从相应的网卡路由出去:ip rule add from$IP1 table T1 ip rule add from$IP2 table T2以上命令保证了所有的回应数据都会从他们来的那块网卡原路返回。

现在,完成了非常基本的配置。

这将对于所有运行在路由器上所有的进程起作用,实现IP伪装以后,对本地局域网也将起作用。

如果不进行伪装,那么你要么拥有两个ISP的地址空间,要么你想对两个ISP中的一个进行伪装。

无论哪种情况,你都要添加规则,基于发包的主机在局域网内的IP地址,选择从哪个ISP路由出去。

4.2.2.负载均衡第二个问题是如何对于通过两个ISP流出的数据进行负载均衡。

如果你已经成功地实现了流量分割,这件事并不难。

与选择两个ISP中的一个作为缺省路由不同,这次是设置缺省路由为多路路由。

在缺省内核中,这会均衡两个ISP的路由。

象下面这样做(基于前面的流量分割实验):ip route add default scope global nexthop via$P1 dev$IF1 weight 1nexthop via$P2 dev$IF2 weight 1这样就可以均衡两个ISP的路由。

通过调整"weight"参数我们可以指定其中一个ISP的优先权高于另一个。

应该指出,由于均衡是基于路由进行的,而路由是经过缓冲的,所以这样的均衡并不是100%精确。

也就是说,对于一个经常访问的站点,总是会使用同一个ISP。

进而,如果你对此不满意,你可能需要参考以下Julian Anastasov的内核补丁:Julian的路由补丁会弥补上述缺陷。

第5章GRE和其他隧道Linux有3种隧道。

它们是:IP-in-IP隧道、GRE隧道和非内核隧道(如PPTP)。

5.1.关于隧道的几点注释隧道可以用于实现很多非常不一般而有趣的功能。

但如果你的配置有问题,却也会发生可怕的错误。

除非你确切地知道你在做什么,否则不要把缺省路由指向一个隧道设备。

而且,隧道会增加协议开销,因为它需要一个额外的IP包头。

一般应该是每个包增加20个字节,所以如果一个网络的MTU是1500字节的话,使用隧道技术后,实际的IP包长度最长只能有1480字节了。

这倒不是什么原则性的问题,但如果你想使用隧道技术构建一个比较大规模的网络的话,最好仔细研究一下关于IP包的分片和汇聚的知识。

相关文档
最新文档