ip route rule 路由策略 高级路由 捆绑 网桥

http://lwfs.net/2005/11/28/10/css

#!/bin/bash

    IP0=
    IP1=
    GW0=
    GW1=
    NET0=
    NET1=
    DEV0=eth0
    DEV1=eth1

    # comment the next two line after first run this script.
    echo 200 cernet >>/etc/iproute2/rt_tables
    echo 210 chinanet >>/etc/iproute2/rt_tables

    ip route add ${NET0} dev ${DEV0} src ${IP0} table cernet
    ip route add default via ${GW0} table cernet
    ip route add ${NET1} dev ${DEV1} src ${IP1} table chinanet
    ip route add default via ${GW1} table chinanet
    ip route add ${NET0} dev ${DEV0} src ${IP0}
    ip route add ${NET1} dev ${DEV1} src ${IP1}

    # delete old rule
    ip rule del from ${IP0}
    ip rule del from ${IP1}
    # setup new rule
    ip rule add from ${IP0} table cernet
    ip rule add from ${IP1} table chinanet 



http://jpuyy.com/2014/01/ip-rule-and-ip-route.html

ip rule和 ip route

相对ip route ,ip rule是高级路由,能实现不一样条件路由的转发。html

linux系统维护了路由表,用ip rule show能够查看路由表。node

# ip rule show
0: from all lookup local 
32766: from all lookup main 
32767: from all lookup default

路由表记录在/etc/iproute2/rt_tables文件中,默认里面会用这么几行,在这个文件里添加的路由表即时生效linux

255 local
254 main
253 default
0 unspec

因此自定义一个路由表的时候,序号要在1-252之间,路由选择的优先级也与数字的大小有关,越小的优先级越高,先匹配。
数字后面要规定一个别名,方便使用和辨认。算法

这样路由表的查看可有如下两种方法:shell

ip route list table table_number
ip route list table table_name

如查看默认路由表可用以下命令数据库

ip route list table main
ip route list table 254

路由表添加完以后,接下来就是对路由表的操做,若是我有编程

eth1 配置ip 192.168.1.8/24 路由表 101 mytable1ubuntu

eth2 配置ip  192.168.2.8/24 路由表 102 mytable2数组

不一样段的从不一样的网卡走。

ip route add 192.168.1.0 dev eth1 src 192.168.1.8 table mytable1
ip route add default via 192.168.1.1 table mytable1
ip rule add from 192.168.1.8 table mytable1

ip route add 192.168.2.0 dev eth2 src 192.168.2.8 table mytable2
ip route add default via 192.168.2.1 table mytable2
ip rule add from 192.168.2.8 table mytable2

如今使用ip rule show查看

# ip rule show
 0: from all lookup local
 32764: from 192.168.2.8 lookup mytable2
 32765: from 192.168.1.8 lookup mytable1
 32766: from all lookup main
 32767: from all lookup default

这时要删除rule可以使用

ip rule del prio 32764

ip rule还能够实现更高级的功能,好比根据ip目的地址,包大小来进行转发。

查看route -n flag

The flags

Following is the list of flags and their significance in the routing table :

U : This flag signifies that the route is up
G : This flag signifies that the route is to a gateway. If this flag is not present then we can say that the route is to a directly connected destination
H : This flag signifies that the route is to a host which means that the destination is a complete host address. If this flag is not present then it can be assumed that the route is to a network and destination would be a network address.
D : This flag signifies that this route is created by a redirect.
M : This flag signifies that this route is modified by a redirect.

 
 
http://blog.csdn.net/bytxl/article/details/9850803

策略路由以及使用 ip route , ip rule , iptables 配置策略路由实例

分类: 网络 linux 命令2013-08-09 10:36 560人阅读 评论(0) 收藏 举报
 

目录(?)[+]

 

http://blog.sina.com.cn/s/blog_659b48590100n2q6.html

例:

 

公司内网要求192.168.0.100之内的使用 10.0.0.1 网关上网(电信),其余IP使用 20.0.0.1 (网通)上网。
 
首先要在网关服务器上添加一个默认路由,固然这个指向是绝大多数的IP的出口网关。
 
# ip route add default gw 20.0.0.1
 
以后经过 ip route 添加一个路由表
 
# ip route add table 3 via 10.0.0.1 dev ethX
 (ethX是10.0.0.1所在的网卡,3 是路由表的编号)
 
以后添加 ip  rule 规则
 
# ip rule add fwmark 3  table 3 
(fwmark 3是标记,table 3 是路由表3 上边。 意思就是凡是标记了 3 的数据使用table3 路由表)
 
以后使用iptables给相应的数据打上标记:
 
# iptables -A PREROUTING -t mangle -i eth0 -s 192.168.0.1 -192.168.0.100 -j MARK --set-mark 3
 
由于mangle的处理是优先于 nat 和fiter表的,因此相应数据包到达以后先打上标记,以后再经过ip rule规则。对应的数据包使用相应的路由表进行路由,最后读取路由表信息,将数据包送出网关。

 

-------------------------------------------------------------------------------------------------------------------------------------

 

ip rule 命令

linux 高级路由即基于策略的路由,比传统路由在功能上更强大,使用也更灵活,它不只可以像传统路由同样,根据目的地址来转发数据,并且也可以根据报文大小、应用,协议或ip源地址来选择路由转发路径从而让系统管理员能轻松作到:
一、 管制某台计算机的带宽。
二、 管制通向某台计算机的带宽
三、 帮助你公平地共享带宽
四、 保护你的网络不受DOS的攻击
五、 保护你的Internet不受到你的客户的攻击
六、 把多台服务器虚拟成一台,并进行负载均衡或者提升可用性
七、 限制你的用户访问某些计算机
八、 限制对你的计算机的访问
九、 基于用户账号、MAC地址、源IP地址、端口、QOS《TOS》、时间或者content等进行路由

 

1、高级路由的基础IP ROUTE2

基本命令:

ip link list 显示ip链路状态信息
ip address show 除显示全部网络地址
ip route show 显示主路由表信息
ip neigh show 显示邻居表

linux系统路由表

linux能够自定义从1-252个路由表,
linux系统维护了4个路由表:
0表 系统保留表
 
255  local 本地路由表,存有本地接口地址,广播地址,以及NAT地址。
     local表由系统自动维护,管理员不能操做此表。
254  main 主路由表,传统路由表,ip route若没指定表即操做表254。
     注:平时用route查看的亦是此表设置的路由。
253  default  默认路由表通常存放默认路由。
     注:rt_tables文件中表以数字来区分表,保留最多支持255张表。

路由表的查看可有如下二种方法:
      ip route list table table_number
      ip route list table table_name

路由表序号和表名的对应关系在/etc/iproute2/rt_tables中,可手动编辑。
路由表添加完毕即时生效,下面为实例:
# ip route add default via 192.168.1.1 table 1                       在1表中添加默认路由为192.168.1.1
# ip route add 192.168.0.0/24 via 192.168.1.2                     添加一条到192.168.0.0网段的路由为192.168.1.2
注:各路由表中应当指明默认路由,尽可能不回查路由表。路由添加完毕,便可在路由规则中应用。

高级路由重点之一路由规则 ip rule

进行路由时,根据路由规则来进行匹配,按优先级(pref)从低到高匹配,直到找到合适的规则,因此在应用中配置默认路由是必要的。
ip rule show 显示路由规则。
路由规则的添加:
# ip rule add from 192.168.1.10/32 table 1 pref 100
若是pref值不指定,则将在已有规则最小序号前插入
注:建立完路由规则若需当即生效须执行
#ip route flush cache
刷新路由缓冲。
 
命令格式以下:
        Usage: ip rule [ list | add | del ] SELECTOR ACTION
        SELECTOR := [ from PREFIX ] [ to PREFIX ] [ tos TOS ][ dev STRING ] [ pref NUMBER ]
        ACTION := [ table TABLE_ID ] [ nat ADDRESS ][ prohibit | reject | unreachable ]
                  [ flowid CLASSID ]
        TABLE_ID := [ local | main | default | new | NUMBER ]

    参数解析以下:
        From -- 源地址
        To -- 目的地址(这里是选择规则时使用,查找路由表时也使用)
  Tos -- IP包头的TOS(type of sevice)域Linux高级路由-
  Dev -- 物理接口
     Fwmark -- iptables标签
    采起的动做除了指定路由表外,还能够指定下面的动做:
        Table 指明所使用的表
      Nat 透明网关
   Prohibit 丢弃该包,并发送 COMM.ADM.PROHIITED的ICMP信息 
   Reject 单纯丢弃该包
   Unreachable丢弃该包, 并发送 NET UNREACHABLE的ICMP信息
 
    路由表添加完毕,便可在策略路由表内添加路由。
例:
      #ip route add 192.168.1.0/24 dev eth0 via 192.168.1.66 realm 4
        注:发往子网192.168.1.0/24的数据包经过分类4转发配合tc使用,后文有介绍讲解...
      #ip route add default via 192.168.1.1 table int1
      #ip route add 192.168.1.0/24 via 192.168.1.1 table int2
      #ip route add 172.16.0.2/16 via 172.16.0.1 table int3
         注:各路由表中应当指明默认路由,尽可能不回查路由表.路由添加完毕,便可在路由规则中应用。
    #ip rule sh 显示路由规则 
      0:      from all lookup local 
      32766:  from all lookup main 
      32767:  from all lookup default 
     进行路由时,正是根据路由规则来进行匹配,按优先级(pref后数值)从高到低匹配,直到找到合适的规则.因此在应用中配置默认路由是必要的。
    策略路由通常手工添加路由表,路由表的添加只需编辑rt_tables文件,规定表序号,表名便可。
    ip rule规则添加示例: 
      #ip rule add from 192.168.1.112/32 [tos 0x10] table test2 pref 999 prohibit 
      #ip rule add to 192.168.1.2 pref 1000 table test1 
      #ip rule add from 192.168.1.0/24 pref 1001 table test1 
      #ip rule add [from 0/0] table test1 pref 1003 
      #ip rule add fwmark 1 pref 1002 table test2  
(此句型配合iptables -t mangle应用。如先对数据包做标记:
      #iptables -t mangle -A PREROUTING -p tcp -m multiport --dports 80,8080,20,21 -s 192.168.1.0/24 -j MARK --set-mark 1  )
 
  Linux高级路由需结合iptables才能充分体现其功能的强大,实际工做中的应用多半基于此,固然要熟练掌握Linux高级路由+iptables 还需进一步的增强学习和实践的应用。
 

route 命令

使用 Route 命令行工具查看并编辑计算机的 IP 路由表。Route 命令和语法以下所示:
route [-f] [-p] [Command [Destination] [mask Netmask] [Gateway] [metric Metric]] [if Interface]]
-f 清除全部网关入口的路由表。  
-p 与 add 命令一块儿使用时使路由具备永久性。 
Command 指定您想运行的命令 (Add/Change/Delete/Print)。 
Destination 指定该路由的网络目标。  
mask Netmask 指定与网络目标相关的网络掩码(也被称做子网掩码)。  
Gateway 指定网络目标定义的地址集和子网掩码能够到达的前进或下一跃点 IP 地址。  
metric Metric 为路由指定一个整数成本值标(从 1 至 ArrayArrayArrayArray),当在路由表(与转发的数据包目标地址最匹配)的多个路由中进行选择时能够使用。  
if Interface 为能够访问目标的接口指定接口索引。若要得到一个接口列表和它们相应的接口索引,使用 route print 命令的显示功能。能够使用十进制或十六进制值进行接口索引。 
/?  在命令提示符处显示帮助。  
示例:

使用route 命令添加的路由,机器重启或者网卡重启后路由就失效了,方法:

  //添加到主机的路由

  # route add –host 192.168.168.110 dev eth0

  # route add –host 192.168.168.119 gw 192.168.168.1

  //添加到网络的路由

  # route add –net IP netmask MASK eth0

  # route add –net IP netmask MASK gw IP

  # route add –net IP/24 eth1

  //添加默认网关

  # route add default gw IP

  //删除路由

  # route del –host 192.168.168.110 dev eth0

添加一条路由(发往192.168.62这个网段的所有要通过网关192.168.1.1:
  route add -net 192.168.62.0 netmask 255.255.255.0 gw 192.168.1.1

  删除一条路由
  route del -net 192.168.122.0 netmask 255.255.255.0
  删除的时候不用写网关。


若要显示 IP 路由表的所有内容,请键入:
# route print

Kernel IP routing table

  Destination Gateway Genmask Flags Metric Ref Use Iface

  10.147.9.0 * 255.255.255.0 U 1 0 0 eth0

  192.168.1.0 * 255.255.255.0 U 2 0 0 wlan0

  192.168.122.0 * 255.255.255.0 U 0 0 0 virbr0

  link-local * 255.255.0.0 U 1000 0 0 eth0

  192.168.0.0 192.168.1.1 255.255.0.0 UG 0 0 0 wlan0

  default 10.147.9.1 0.0.0.0 UG 0 0 0 eth0

  root@Ubuntu:~#

  结果是自上而下, 就是说, 哪条在前面, 哪条就有优先, 前面都没有, 就用最后一条default。


若要显示以 10. 起始的 IP 路由表中的路由,请键入:
route print 10.*
若要添加带有 1Array2.168.12.1 默认网关地址的默认路由,请键入:
route add 0.0.0.0 mask 0.0.0.0 1Array2.168.12.1
若要向带有 255.255.0.0 子网掩码和 10.27.0.1 下一跃点地址的 10.41.0.0 目标中添加一个路由,请键入:
route add 10.41.0.0 mask 255.255.0.0 10.27.0.1
若要向带有 255.255.0.0 子网掩码和 10.27.0.1 下一跃点地址的 10.41.0.0 目标中添加一个永久路由,请键入:
route -p add 10.41.0.0 mask 255.255.0.0 10.27.0.1
若要向带有 255.255.0.0 子网掩码、10.27.0.1 下一跃点地址且其成本值标为 7 的 10.41.0.0 目标中添加一个路由,请键入:
route add 10.41.0.0 mask 255.255.0.0 10.27.0.1 metric 7
若要向带有 255.255.0.0 子网掩码、10.27.0.1 下一跃点地址且使用 0x3 接口索引的 10.41.0.0 目标中添加一个路由,请键入:
route add 10.41.0.0 mask 255.255.0.0 10.27.0.1 if 0x3
若要删除到带有 255.255.0.0 子网掩码的 10.41.0.0 目标的路由,请键入:
route delete 10.41.0.0 mask 255.255.0.0
若要删除以 10. 起始的 IP 路由表中的全部路由,请键入:
route delete 10.*
若要将带有 10.41.0.0 目标和 255.255.0.0 子网掩码的下一跃点地址从 10.27.0.1 修改成 10.27.0.25,请键入:
route change 10.41.0.0 mask 255.255.0.0 10.27.0.25

ip命令的语法

  ip命令的用法以下:
  ip [OPTIONS] OBJECT [COMMAND [ARGUMENTS]]
  4.1 ip link set--改变设备的属性. 缩写:set、s
  示例1:up/down 起动/关闭设备。
  # ip link set dev eth0 up
  这个等于传统的 # ifconfig eth0 up(down)
  示例2:改变设备传输队列的长度。
  参数:txqueuelen NUMBER或者txqlen NUMBER
  # ip link set dev eth0 txqueuelen 100
  示例3:改变网络设备MTU(最大传输单元)的值。
  # ip link set dev eth0 mtu 1500
  示例4: 修改网络设备的MAC地址。
  参数: address LLADDRESS
  # ip link set dev eth0 address 00:01:4f:00:15:f1
  4.2 ip link show--显示设备属性. 缩写:show、list、lst、sh、ls、l
  -s选项出现两次或者更屡次,ip会输出更为详细的错误信息统计。
  示例:
  # ip -s -s link ls eth0
  eth0: mtu 1500 qdisc cbq qlen 100
  link/ether 00:a0:cc:66:18:78 brd ff:ff:ff:ff:ff:ff
  RX: bytes packets errors dropped overrun mcast
  2449949362 2786187 0 0 0 0
  RX errors: length crc fifo missed
  0 0 0 0 0
  TX: bytes packets errors dropped carrier collsns
  178558497 1783946 332 0 332 35172
  TX errors: aborted fifo window heartbeat
  0 0 0 332
  这个命令等于传统的 ifconfig eth0
  5.1 ip address add--添加一个新的协议地址. 缩写:add、a
  示例1:为每一个地址设置一个字符串做为标签。为了和Linux-2.0的网络别名兼容,这个字符串必须以设备名开头,接着一个冒号,
  # ip addr add local 192.168.4.1/28 brd + label eth0:1 dev eth0
  示例2: 在以太网接口eth0上增长一个地址192.168.20.0,掩码长度为24位(155.155.155.0),标准广播地址,标签为eth0:Alias:
  # ip addr add 192.168.4.2/24 brd + dev eth1 label eth1:1
  这个命令等于传统的: ifconfig eth1:1 192.168.4.2
  5.2 ip address delete--删除一个协议地址. 缩写:delete、del、d
  # ip addr del 192.168.4.1/24 brd + dev eth0 label eth0:Alias1
  5.3 ip address show--显示协议地址. 缩写:show、list、lst、sh、ls、l
  # ip addr ls eth0
  5.4.ip address flush--清除协议地址. 缩写:flush、f
  示例1 : 删除属于私网10.0.0.0/8的全部地址:
  # ip -s -s a f to 10/8
  示例2 : 取消全部以太网卡的IP地址
  # ip -4 addr flush label "eth0"
  6. ip neighbour--neighbour/arp表管理命令
  缩写 neighbour、neighbor、neigh、n
  命令 add、change、replace、delete、fulsh、show(或者list)
  6.1 ip neighbour add -- 添加一个新的邻接条目
  ip neighbour change--修改一个现有的条目
  ip neighbour replace--替换一个已有的条目
  缩写:add、a;change、chg;replace、repl
  示例1: 在设备eth0上,为地址10.0.0.3添加一个permanent ARP条目:
  # ip neigh add 10.0.0.3 lladdr 0:0:0:0:0:1 dev eth0 nud perm
  示例2:把状态改成reachable
  # ip neigh chg 10.0.0.3 dev eth0 nud reachable
  6.2.ip neighbour delete--删除一个邻接条目
  示例1:删除设备eth0上的一个ARP条目10.0.0.3
  # ip neigh del 10.0.0.3 dev eth0
  6.3.ip neighbour show--显示网络邻居的信息. 缩写:show、list、sh、ls
  示例1: # ip -s n ls 193.233.7.254
  193.233.7.254. dev eth0 lladdr 00:00:0c:76:3f:85 ref 5 used 12/13/20 nud reachable
  6.4.ip neighbour flush--清除邻接条目. 缩写:flush、f
  示例1: (-s 能够显示详细信息)
  # ip -s -s n f 193.233.7.254
  7. 路由表管理
  7.1.缩写 route、ro、r
  7.2.路由表
  从Linux-2.2开始,内核把路由概括到许多路由表中,这些表都进行了编号,编号数字的范围是1到255。另外,
  为了方便,还能够在/etc/iproute2/rt_tables中为路由表命名。
  默认状况下,全部的路由都会被插入到表main(编号254)中。在进行路由查询时,内核只使用路由表main。
  7.3.ip route add -- 添加新路由
  ip route change -- 修改路由
  ip route replace -- 替换已有的路由
  缩写:add、a;change、chg;replace、repl
  示例1: 设置到网络10.0.0/24的路由通过网关193.233.7.65
  # ip route add 10.0.0/24 via 193.233.7.65
  示例2: 修改到网络10.0.0/24的直接路由,使其通过设备dummy
  # ip route chg 10.0.0/24 dev dummy
  示例3: 实现链路负载平衡.加入缺省多路径路由,让ppp0和ppp1分担负载(注意:scope值并不是必需,它只不过是告诉内核,
  这个路由要通过网关而不是直连的。实际上,若是你知道远程端点的地址,使用via参数来设置就更好了)。
  # ip route add default scope global nexthop dev ppp0 nexthop dev ppp1
  # ip route replace default scope global nexthop dev ppp0 nexthop dev ppp1
  示例4: 设置NAT路由。在转发来自192.203.80.144的数据包以前,先进行网络地址转换,把这个地址转换为193.233.7.83
  # ip route add nat 192.203.80.142 via 193.233.7.83
  示例5: 实现数据包级负载平衡,容许把数据包随机从多个路由发出。weight 能够设置权重.
  # ip route replace default equalize nexthop via 211.139.218.145 dev eth0 weight 1 nexthop via 211.139.218.145 dev eth1 weight 1
  7.4.ip route delete-- 删除路由
  缩写:delete、del、d
  示例1:删除上一节命令加入的多路径路由
  # ip route del default scope global nexthop dev ppp0 nexthop dev ppp1
  7.5.ip route show -- 列出路由
  缩写:show、list、sh、ls、l
  示例1: 计算使用gated/bgp协议的路由个数
  # ip route ls proto gated/bgp |wc
  1413 9891 79010
  示例2: 计算路由缓存里面的条数,因为被缓存路由的属性可能大于一行,以此须要使用-o选项
  # ip -o route ls cloned |wc
  159 2543 18707
  示例3: 列出路由表TABLEID里面的路由。缺省设置是table main。TABLEID或者是一个真正的路由表ID或者是/etc/iproute2/rt_tables文件定义的字符串,
  或者是如下的特殊值:
  all -- 列出全部表的路由;
  cache -- 列出路由缓存的内容。
  ip ro ls 193.233.7.82 tab cache
  示例4: 列出某个路由表的内容
  # ip route ls table fddi153
  示例5: 列出默认路由表的内容
  # ip route ls
  这个命令等于传统的: route
  7.6.ip route flush -- 擦除路由表
  示例1: 删除路由表main中的全部网关路由(示例:在路由监控程序挂掉以后):
  # ip -4 ro flush scope global type unicast
  示例2:清除全部被克隆出来的IPv6路由:
  # ip -6 -s -s ro flush cache
  示例3: 在gated程序挂掉以后,清除全部的BGP路由:
  # ip -s ro f proto gated/bgp
  示例4: 清除全部ipv4路由cache
  # ip route flush cache
  *** IPv4 routing cache is flushed.
  7.7 ip route get -- 得到单个路由 .缩写:get、g
  使用这个命令能够得到到达目的地址的一个路由以及它的确切内容。
  ip route get命令和ip route show命令执行的操做是不一样的。ip route show命令只是显示现有的路由,而ip route get命令在必要时会派生出新的路由。
  示例1: 搜索到193.233.7.82的路由
  # ip route get 193.233.7.82
  193.233.7.82 dev eth0 src 193.233.7.65 realms inr.ac cache mtu 1500 rtt 300
  示例2: 搜索目的地址是193.233.7.82,来自193.233.7.82,从eth0设备到达的路由(这条命令会产生一条很是有意思的路由,这是一条到193.233.7.82的回环路由)
  # ip r g 193.233.7.82 from 193.233.7.82 iif eth0
  193.233.7.82 from 193.233.7.82 dev eth0 src 193.233.7.65 realms inr.ac/inr.ac
  cache 
 mtu 1500 rtt 300 iif eth0
  8. ip route -- 路由策略数据库管理命令
  命令
  add、delete、show(或者list)
  注意:策略路由(policy routing)不等于路由策略(rouing policy)。
  在某些状况下,咱们不仅是须要经过数据包的目的地址决定路由,可能还须要经过其余一些域:源地址、IP协议、传输层端口甚至数据包的负载。
  这就叫作:策略路由(policy routing)。
  8.1. ip rule add -- 插入新的规则
  ip rule delete -- 删除规则
  缩写:add、a;delete、del、d
  示例1: 经过路由表inr.ruhep路由来自源地址为192.203.80/24的数据包
  ip ru add from 192.203.80/24 table inr.ruhep prio 220
  示例2:把源地址为193.233.7.83的数据报的源地址转换为192.203.80.144,并经过表1进行路由
  ip ru add from 193.233.7.83 nat 192.203.80.144 table 1 prio 320
  示例3:删除无用的缺省规则
  ip ru del prio 32767
  8.2. ip rule show -- 列出路由规则
  缩写:show、list、sh、ls、l
  示例1: # ip ru ls
  0: from all lookup local
  32762: from 192.168.4.89 lookup fddi153
  32764: from 192.168.4.88 lookup fddi153
  32766: from all lookup main
  32767: from all lookup 253
  9. ip maddress -- 多播地址管理
  缩写:show、list、sh、ls、l
  9.1.ip maddress show -- 列出多播地址
  示例1: # ip maddr ls dummy
  9.2. ip maddress add -- 加入多播地址
  ip maddress delete -- 删除多播地址
  缩写:add、a;delete、del、d
  使用这两个命令,咱们能够添加/删除在网络接口上监听的链路层多播地址。这个命令只能管理链路层地址。
  示例1: 增长 # ip maddr add 33:33:00:00:00:01 dev dummy
  示例2: 查看 # ip -O maddr ls dummy
  2: dummy
  link 33:33:00:00:00:01 users 2 static
  link 01:00:5e:00:00:01
  示例3: 删除 # ip maddr del 33:33:00:00:00:01 dev dummy
  10.ip mroute -- 多播路由缓存管理
  10.1. ip mroute show -- 列出多播路由缓存条目
  缩写:show、list、sh、ls、l
  示例1:查看 # ip mroute ls
  (193.232.127.6, 224.0.1.39) Iif: unresolved
  (193.232.244.34, 224.0.1.40) Iif: unresolved
  (193.233.7.65, 224.66.66.66) Iif: eth0 Oifs: pimreg
  示例2:查看 # ip -s mr ls 224.66/16
  (193.233.7.65, 224.66.66.66) Iif: eth0 Oifs: pimreg
  9383 packets, 300256 bytes
  11. ip tunnel -- 通道配置
  缩写
  tunnel、tunl
  11.1.ip tunnel add -- 添加新的通道
  ip tunnel change -- 修改现有的通道
  ip tunnel delete -- 删除一个通道
  缩写:add、a;change、chg;delete、del、d
  示例1:创建一个点对点通道,最大TTL是32
  # ip tunnel add Cisco mode sit remote 192.31.7.104 local 192.203.80.1 ttl 32
  11.2.ip tunnel show -- 列出现有的通道
  缩写:show、list、sh、ls、l
  示例1: # ip -s tunl ls Cisco
  12. ip monitor和rtmon -- 状态监视
  ip命令能够用于连续地监视设备、地址和路由的状态。这个命令选项的格式有点不一样,命令选项的名字叫作monitor,接着是操做对象:
  ip monitor [ file FILE ] [ all | OBJECT-LIST ]
  示例1: # rtmon file /var/log/rtmon.log
  示例2: # ip monitor file /var/log/rtmon.log r

 

 
 

转自:http://www.unixnotes.net/ip-rule.html?replytocom=25

相关资料:


http://www.cppblog.com/isware/archive/2011/06/01/147825.html

 
 
http://www.aliyun.com/zixun/content/3_12_519324.html

Linux的高级路由和流量控制:介绍iproute2

发布时间:2014-12-19 更新时间:2014-12-26 来源:网络 

做者:水笔思思

 
关键词: Linux 流量控制 iproute2 高级路由

 

但愿这篇文档能对你更好地理解Linxs2.2/2.4的路由有所帮助和启发。不被大多数使用者所知道的是,你所使用工具,其实可以完成至关规模工做。好比route 和ifconfig,实际上暗中调用了很是强大的iproute 2的底层基本功能。

Linux能为你作什么

一个小列表:

• 管制某台计算机的带宽
• 管制通向某台计算机的带宽
• 帮助你公平地共享带宽
• 保护你的网络不受DoS攻击
• 保护Internet不受到你的客户的攻击
• 把多台服务器虚拟成一台,进行http://www.aliyun.com/zixun/aggregation/13996.html">负载均衡或者提升可用性
• 限制对你的计算机的访问
• 限制你的用户访问某些主机
• 基于用户帐号(没错!)、MAC地址、源IP地址、端口、服务类型、时间或者内容等条件进行路由。

如今,很多人都没有用到这些高级功能。这有不少缘由。好比提供的文档过于冗长并且不容易上手,并且流量控制甚至根本就没有归档。

1 为何使用 iproute2?

如今,绝大多数 Linux 发行版和绝大多数 UNIX都使用古老的arp, ifconfig和route命令。虽然这些工具可以工做,但它们在Linux2.2和更高版本的内核上显得有一些落伍。好比,如今GRE隧道已经成为了路由的一个主要概念,但却不能经过上述工具来配置。
使用了iproute2,隧道的配置与其余部分彻底集成了

2.2 和更高版本的Linux 内核包含了一个通过完全从新设计的网络子系统。这些新的代码让Linux在操做系统的竞争中取得了功能和性能上的优点。实际上,Linux新的路由、过滤和分类代码,从功能和性能上都不弱于现有的那些专业的路由器、防火墙和流量整形产品。

随着新的网络概念的提出,人们在现有操做系统的现有体系上修修补补来实现他们。这种执拗的行为致使了网络代码中充斥着怪异的行为,这有点像人类的语言。过去,Linux模仿了SunOS的许多处理方式,并不理想。

这个新的体系则有可能比以往任何一个版本的Linux都更善于清晰地进行功能表达。

2 iproute2 概览

Linux有一个成熟的带宽供给系统,称为Traffic Control(流量控制)。这个系统支持各类方式进行分类、排序、共享和限制出入流量。

咱们将从 iproute2 各类可能性的一个简要概览开始。

3 先决条件

你应该确认已经安装了用户级配置工具。这个包的名字在RedHat和Debian中都叫做“iproute”,也能够在这个地方找到:

ftp://ftp.inr.ac.ru/ip-routing/iproute2-2.2.4-now-ss??????.tar.gz

你也能够试试在这里(ftp://ftp.inr.ac.ru/ip-routing/iproute2-current.tar.gz)找找最新版本。

iproute 的某些部分须要你打开一些特定的内核选项。应该指出的是,RedHat6.2及其之前的全部发行版中所带的缺省内核都不带有流量控制所须要的绝大多数功能。

而RedHat 7.2在缺省状况下能知足全部要求。

另外,确认一下你的内核支持netlink ,Iproute2须要它.

 

 

 

本站全部文章所有来源于互联网,版权归属于原做者。本站全部转载文章言论不表明本站观点,如是侵犯了原做者的权利请发邮件联系站长(yanjing@alibaba-inc.com),咱们收到后当即删除。

 

 

http://man.chinaunix.net/linux/lfs/LFS-6.1.1/chapter06/iproute2.html

6.32. IPRoute2-2.6.11-050330

IPRoute2 包含了基本的和高级的基于 IPv4 网络的程序。

预计编译时间: 0.1 SBU
所需磁盘空间: 4.3 MB
安装依赖于: GCC, Glibc, Make, Linux-Headers, Sed

6.32.1. 安装 IPRoute2

这个程序包中的二进制文件 arpd 依赖于 Berkeley DB 。由于 arpd 对于一个基本 Linux 系统基本上没有用处,因此咱们要使用下面的补丁去除对 Berkeley DB 的依赖。若是你须要使用 arpd 你能够参考 BLFS-Book 中的这个页面来了解如何编译与安装 Berkeley DB :http://www.linuxfromscratch.org/blfs/view/svn/server/databases.html#db 。

sed -i '/^TARGETS/s@arpd@@g' misc/Makefile

为编译 IPRoute2 作准备:

./configure

编译软件包:

make SBINDIR=/sbin

make 选项的含义:

SBINDIR=/sbin

确保将 IPRoute2 包中的二进制文件安装到 /sbin 目录中以符合 FHS 标准,由于一些 IPRoute2 二进制文件将会被 LFS-Bootscripts 使用。

安装软件包:

make SBINDIR=/sbin install

6.32.2. IPRoute2 的内容

安装的程序: ctstat (连接到 lnstat), ifcfg, ifstat, ip, lnstat, nstat, routef, routel, rtacct, rtmon, rtpr, rtstat (连接到 lnstat), ss, tc

简要描述

ctstat

链接状态工具

ifcfg

ip 命令的shell脚本包装

ifstat

显示网络接口的统计信息,包括接口发送和接收到的包数量。

ip

主可执行程序,它包含如下几个功能:

ip link [device] 查看和修改设备状态

ip addr 查看地址的特性,添加新地址、删除旧地址。

ip neighbor 查看邻居的特性,添加新邻居、删除旧邻居。

ip rule 查看和修改路由规则

ip route 查看路由表和修改路由表规则

ip tunnel 查看和修改 IP 隧道及其特性

ip maddr 查看和修改多播地址及其特性

ip mroute 设置、修改、删除多播路由

ip monitor 不间断的监视设备状态、地址、路由

lnstat

提供 Linux 网络统计信息,用于替代旧的 rtstat 程序。

nstat

显示网络统计信息

routef

ip route 的一个组件,用于刷新路由表。

routel

ip route 的一个组件,用于列出路由表。

rtacct

显示 /proc/net/rt_acct 文件的内容

rtmon

路由监视工具

rtpr

将 ip -o 的输出转换为可读的格式

rtstat

路由状态工具

ss

相似于 netstat 命令,显示活动的链接。

tc

流量控制,用于实现服务质量(QOS)和服务级别(COS):

tc qdisc 创建排队规则

tc class 创建基于级别的队列调度

tc estimator 估算网络流量

tc filter 设置 QOS/COS 包过滤器

tc policy 设置 QOS/COS 规则

 

 

 

 

http://blog.csdn.net/dog250/article/details/6685633

 

Linux路由应用-使用策略路由实现访问控制

2011-08-14 10:51 5239人阅读 评论(2) 收藏 举报
 

目录(?)[+]

 

引:

通常而言,访问控制并非路由模块完成的,而是防火墙的职责,若是你使用Linux的,这是iptables的职责。然而有时候,特别是在策略不少的状况下,使用iptables会极大下降网络性能,这是Netfilter的filter表的本质决定的,具体的优化参见《 Linux的Netfilter框架深度思考-对比Cisco的ACL》。
     Linux有一个很实用的特性能够在某些情形下代替iptables,从而实现访问控制。本文给出一个方法,说明如何使用策略路由来控制数据访问的入口网卡,具体来说就是:只有经过特定的网卡才能访问机器上的某一个地址。具体来说,Linux服务器有以下配置:
eth0:192.168.1.1/24
eth1:192.168.2.1/24
eth2:172.16.1.1/24
lo:127.0.0.1
只能经过eth0访问192.168.1.1这个地址,而不能经过eth1或者eth2访问,甚至本机都不能访问192.168.1.1。
     可是在探讨如何作以前,首先要明白一些理论知识,这样才能知其然且知其因此然。

1.完成这个需求必需要明白的背景知识

1.1.Linux路由查找流程

全部的路由器设计都要遵循如下规则:
IF 目的地址配置在本机
    THEN 本机接收
ELSE
    查找路由表并在找到路由的状况下转发
END

固然Linux也不能例外,可是Linux并无将这这两种状况进行区分,而是使用“多张路由表”将两者统一了起来。在Linux中,内置了三张路由表:
local,main,default,其中local路由表的优先级最高,而且不能被替换,在有数据包进来的时候,首先无条件的查找local路由表,若是找到了路由,则数据包就是发往本机的,若是找不到,则接着在其它的路由表中进行查找。使用ip route ls table local命令能够看到local表的内容,好比机器的eth0网卡上配有192.168.0.7,则在local表中会有以下的路由:
local 192.168.0.7 dev eth0  proto kernel  scope host  src 192.168.0.7 
值得注意的是,local表中的路由是能够删除的。路由的src项指的是当数据包从本机发出时,在local表中找到了源地址的路由,首选的源ip地址
     在local表和main表之间,能够插入251张策略路由表,所以若是有策略路由表的话,若是local表中没有找到路由,则会查找策略路由表。
     总结一下本节的内容,Linux内置了三张路由表,其中local路由表优先级最高且不可替换,它完成“IF 目的地址配置在本机 THEN 本机接收”这个逻辑,在local表以后,能够配置多张策略路由表,策略路由的知识本文不谈,可是基本就是根据源地址,目的地址,出接口,入接口等元素来决定数据包在路由前是否进入该张策略路由表,本质上是一种过滤行为(然则结果是能够缓存的,其要点就在于此!)。

1.2.bind地址/no-bind地址

有一个问题,那就是若是一个数据包从本机发出,如何肯定其源地址,这个问题若是搞不明白,就可能面临不少奇怪的现象而没法解释,在这个问题上,TCP和UDP的行为是不一样的,TCP比较简单,由于一个TCP链接是四元素决定的(源IP地址,目的IP地址,源端口,目的端口),所以在创建链接后,源/目的IP地址是肯定的。对于UDP而言,状况就复杂了,下节详述。可是无论什么协议,在API接口层次上,一个socket分为bind地址的和不bind地址的。
     若是是bind地址,那么源地址就是bind的那个地址,若是没有bind,那么源地址在路由以后根据路由的结果肯定。这就意味着,策略路由的from关键字将没法匹配到全部没有bind地址的应用程序从本地发出的包-缘由是策略路由匹配是在路由前作的,而此时尚未源IP地址。
     想明白协议栈如何这么设计,仍是要从IP路由的本质以及传输层语义来分析。IP路由的职责就是能将IP数据报送到目的地,在路由以后选择源IP地址能够使返回的IP数据报在彻底逆向路径上返回。考虑传输层的语义,对于TCP而言,其源地址的肯定性是TCP作的,而不是IP层作的,这一点必定要清楚。对于不bind地址的状况,应用程序在数据包到达网络层以前不须要考虑网络层协议头的内容,这个工做彻底有网络层的IP路由模块来完成,应用程序只须要指出目的IP便可,彻底由协议栈负责网络层协议头的添加。
     想明白协议栈如何实现这个逻辑,最好的办法是看Linux的源代码,方法是跟踪一个数据包发送的全过程源码,具体看ip_route_output_slow。

1.3.UDP踢皮球

讨论TCP的文章不少,TCP也有不少复杂的特性值得去深究,然而UDP也不是吃素的,有一种现象就是UDP链接会踢皮球,最终用TCPDUMP抓取的数据包结果会让人焦头烂额。其实只要明白1.2节的内容,本节的内容就很简单了。
     UDP无链接,不可靠,只负责将数据尽力而为传到目的主机,它对源和目的IP地址的管理很松散,UDP数据流(更确切的并不能称为数据流)是单包的。在两端都没有显式bind到具体的IP地址的状况下,最终的数据包能够使用任意的本机地址,关键看路由的结果。数据到达对端以后,若是对端也没有显示bind到具体的IP地址,那么回复包的源地址也可能再也不是初始包的目的地址。咱们仍是用实例来讲明吧,先看网络拓扑:


路由配置以下:
host1:default 192.168.0.2
host2:default 172.16.0.2

host1上运行一个UDP服务器,绑到0.0.0.0这个地址,也就是不绑定地址,host2向host1 192.168.1.1的UDP端口8888发送数据,抓包发现其源地址是172.16.0.1,目的地址是192.168.1.1,而返回包却抓不到了,意外抓取到一个源地址是192.168.0.1,目的地址是172.16.0.1的数据包。这是正常的,由于数据包到达host1时,查找返回路由时,会查到下一跳192.168.0.2,进而根据这个下一跳选择同一网段的192.168.0.1这个地址,此时若是添加一条路由:172.16.0.1 gw 192.168.1.2,那么就会看到返回数据包源地址为192.168.1.1了。
     还有更奇怪的现象,那就是,初始时从host2向host1发送数据,源和目的分别是172.16.0.1和192.168.1.1,但是后来,在没有断开UDP客户端和服务器的状况下(host2更改了路由),源和目的分别成了172.16.1.1和192.168.0.1,这也是正常的,由于UDP原本就是无链接的,在不bind地址的状况下,关键是根据路由来选择源地址,选择源地址原则是:优先选择路由结果接口上和下一跳地址为同一网段的第一个primary地址,不然选择其它网卡上的primary地址,在选择过程当中,有三个scope会影响选择结果,一个是下一跳地址scope,它表示该地址到达本地的“距离”,另外一个是路由scope,它表示到达该路由的“距离”,还有一个是本地地址的scope,它限制了该地址的使用范围,路由模块保证下一跳的scope要小于路由的scope-背后的思想就是下一跳必定距离目的地比本机更近,而选择的本地地址的scope必须小于等于给定的scope(做为一个参数存在)。
     UDP踢皮球有一个后果就是会影响Netfilter的ip_conntrack,咱们知道,ip_conntrack是基于五元素来跟踪链接的,UDP的混乱状况可能使一个UDP数据流被跟踪好几回,从而使得后续的NAT规则(若是有的话)很复杂,NAT配置必须考虑到皮球的每个方向,不然就会漏掉原本应该被NAT的数据包。
     总之,网络是很复杂的,千万不要以为就是配置几个IP地址以及几条路由那么简单的事。

1.4.路由前对本机出发数据包的源地址的检查

若是是本机发出数据包,最终要进入路由模块的ip_route_output_slow函数来查找路由,该函数对bind地址的源地址进行了检查,它保证到该本地地址的路由必须在local路由表中被找到。
  1. static int ip_route_output_slow(...)  
  2. {  
  3.     if (oldflp->fl4_src) {  
  4.         ...  
  5.         if (!(oldflp->flags & FLOWI_FLAG_ANYSRC)) {  
  6.             /* It is equivalent to inet_addr_type(saddr) == RTN_LOCAL */  
  7.             dev_out = ip_dev_find(net, oldflp->fl4_src);  
  8.             if (dev_out == NULL)  
  9.                 goto out;  
  10.             ...  
  11.         }  
  12.     }  
  13. }  


ip_dev_find的实现中,有如下逻辑:
  1. local_table = fib_get_table(net, RT_TABLE_LOCAL);  
  2.     if (!local_table || local_table->tb_lookup(local_table, &fl, &res))  
  3.         return NULL;  


这意味着本机出发的数据包的源地址若是有的话,必需要在local表中找到一条local路由,不然则返回EINVAL错误。然而能够取消这一限制,具体见1.6节。总而言之,FLOWI_FLAG_ANYSRC这个标志是基于socket,经过setsockopt能够设置socket,使与之相关的oldflp的flags中有FLOWI_FLAG_ANYSRC标志。

1.5.Linux的IP地址属于主机而不属于网卡

在Linux中,不要觉得IP地址是属于网卡的,它是属于主机的,实际上就算是UNIX或者其它的OS,IP地址都不该该是网卡的,IP地址是三层概念,网卡是二层设备。不少人都认为IP地址是属于网卡的是由于在Linux中配置IP地址时都要给定一个网卡参数,好比ip address add dev ethX XXX/YY。
     IP地址是属于主机的,这就意味着,只要IP数据报到达本机,没有常规的方式使用路由限制该IP数据报不到达本地应用程序(local表是无条件最早被查询的,除非在local表中将该地址对应的local路由删除)。在procfs中使用sysctl能经过配置网卡参数达到限制数据包的目的吗?好比什么“关闭eth0的forwarding,这样数据包就不能从eth0 forward到eth2了”,根本不是那回事。

1.6.取消本地地址必须存在于local路由表的限制

2.6.27以上内核的socket选项IP_TRANSPARENT能够影响本机出发数据包路由查找时的源地址检测,具体作法是在应用程序中使用下列代码段:
int value = 1;
setsockopt(fd, SOL_IP, IP_TRANSPARENT, &value, sizeof(value));
设置后,服务器回包的源地址再也不限制在local表内,而是能够使用任何地址,包括非本机地址,这个技术通常用于透明代理。所以能够用这一特性来利用策略路由表完成本应该由防火墙完成的功能,不损耗性能。这样能够作到在local表中将eth0上的local路由删除,将该local路由加到策略路由中,本地应用程序将不能访问配置在eth0上地址。
     在2.6.27以前,协议栈在添加源地址(或者用户指定了侦听地址)时,要确保local路由表中拥有该地址,不然会报错,而咱们就是想把该地址的本机local路由移出local表,所以此功能不可实现。在2.6.27以后,增长了FLOWI_FLAG_ANYSRC标志,能够经过设置该标志作到限制的取消,具体作法有两种,一种是全局的,那就是将ip_route_output_slow中的if (!(oldflp->flags & FLOWI_FLAG_ANYSRC))判断取消掉,改成if (0);第二种改法是基于socket的,实际上FLOWI_FLAG_ANYSRC是基于单个socket设置的。完成此功能的前提:
1).内核编译了CONFIG_IP_MULTIPLE_TABLES
2).修改管理服务程序,为其socket增长IP_TRANSPARENT选项

2.具体操做

为了很简单的几步操做,前面啰里啰嗦说了那么多,实际上作技术原本就应该这样,必须挖掘深层次的原理,不然就只能算个IT工人。
配置:
eth0:192.168.0.1/24
eth1:172.16.0.1/24
eth2:10.0.0.1/24
lo:127.0.0.1

2.1.限制从其它网卡接口访问特定网卡接口上配置的IP地址(这个说法不许确,具体见1.5节)对应的服务

2.1.1.添加一个策略路由表

echo "100 my" >> /etc/iproute2/rt_tables
这样能够在local和main表之间增长一个路由表my,内核路由模块的查找顺序是:local->my->main...

2.1.2.增长一条策略

ip rule add from 192.168.0.1 table my

2.1.3.在策略路由表中增长全部从eth0出去的路由

ip route add 12.34.0.0/16 via 192.168.0.2 dev eth0 table my
ip route add ... table my
...
ip route add default dev eth0 table my

全部匹配到my这个策略路由表的数据包,将从上述的路由项中查询结果。注意,最后一条默认路由是必需要的,且必定要从eth0出去,不然根据Linux策略路由查找原则,若是在my表中没有找到路由的话,仍是会继续往下进行的,所谓的策略路由表只是一个优先级问题,而不是强制的查找约束。

2.1.4.结论和问题

经过以上的配置,全部从eth0进来的数据包才能安全返回,不然,好比从eth1进来一个访问192.168.0.1的数据包,因为它只有从eth1返回才能够(不考虑多径路由),然而返回包的源地址倒是192.168.0.1(对应的服务无论是TCP的仍是UDP必须显式bind到192.168.0.1这个地址,不然对于UDP就会有踢皮球的现象),这样路由查找就会进入my表(对于踢皮球的状况,就可能不进入my表),然则my表中没有一个从eth1出去的路由,且该包起码会匹配到my表的默认路由,数据包所以没法返回。
     如今考虑一下一个问题,若是是bind到192.168.0.1这个地址的服务主动访问外部,是否是也必定要从eth0出去呢?答案是确定的,由于它bind了一个明确的地址,而源地址是该地址的数据包必定会匹配到my,最终起码会匹配到my的默认路由...

2.1.5.进一步的问题

如今已经实现了不能从除eth0以外的其它接口进入访问bind到eth0上地址的服务,然而若是但愿作到连本地都不能访问该服务,那才是名副其实的“除eth0以外的...都不能...”,无疑本地出发的访问192.168.0.1的数据包确定不是从eth0进入的。
     有一个办法能够解决这个问题,那就是禁用掉lo,由于在Linux中,全部从本地到本地的包都会被定向掉lo,禁掉lo后,全部本地到本地的包就都没法到达目的地。可是这种方法并很差,管不着人家就把人家关起来,非真的猛士!下一节咱们就看看怎么作到本地不能访问本地eth0上的192.168.0.1这个地址,作到名副其实的“只有eth0进入的数据包才能访问”

2.2.限制本地访问本地bind到eth0上192.168.0.1这个地址的服务

想理解这个配置原理,还要回顾一下1.4节和1.6节,当理解了这两节以后,这里的配置就手到擒来了

2.2.0.前提:两种方式

之一:直接将内核中的检查取消掉,见1.6节
之二:改写bind到192.168.0.1地址服务程序,为其socket增长IP_TRANSPARENT选项,

2.2.1.添加一个新路由表

echo “100  my_rule” >> /etc/iproute2/rt_tables

2.2.2.增长一条策略:从eth0到来的数据包,开放my_rule路由表

ip rule add iif eth0 table my_rule
全部从eth0进来的数据包,查找my_rule表中的路由

2.2.3.为新增策略增长190.7 local路由

ip route add local 192.168.0.1/32 dev lo table my_rule
因为到达本地的数据包要想成功到达,必需要找到一条local路由(类型对便可,无需非要在local表),所以在my_rule中增长一条到达192.168.0.1的local路由

2.2.4.删除原有的local表中的192.168.0.1路由

ip route del local 192.168.0.1/32 table local
因为2.2.0中的两种前提,对源地址的检测已经取消了,到达源地址的路由如今没有必要非要在local表中了,所以即便删除了local中到达192.168.0.1的路由,也无所谓,返回包会直接使用源地址192.168.0.1而不被检查。

2.2.5.结论和问题

2.2.1-2.2.4的结果就是:访问192.168.0.1的数据包从eth0而来,查找my_rule表,找到,对于返回包,因为IP_TRANSPARENT取消了限制,能够正常返回;对于从非eth0到来的访问192.168.0.1的包,因为192.168.0.1的local路由已然被删,my_rule因为只匹配入口为eth0的数据包于是不对其开放,将没法访问。
     这个配置在2.1节的基础上作了加强,然而因为要修改bind到192.168.0.1地址的服务程序,对于既有的闭源程序的相似的访问控制将没有用武之地(这些程序没有源码,不能修改)。

3.总的结论

本文给出了一种使用路由进行访问控制的方式,对于规则比较简单,且访问控制都在第三层的场景中,路由的方式要比用防火墙更好,不会影响性能。然而本文的讨论彻底是基于Linux的,对于非Linux的系统,好比Cisco,可能人家的ACL防火墙实现得比较高效,比iptables配置的更好,也就不须要用路由的方式进行访问控制了,就算对于Linux自己,nf-HiPAC对filter表作了优化以后,路由的方式进行访问控制的优点也减小了。

     总之,Linux网络或者说网络自己是一个超级复杂的系统,不一样的实现对于配置方式的选型影响巨大,然而有一个问题,好比像Windows这样的系统,你还不知道它的网络协议栈实现的内幕,那么它的配置确定也就比较固定,那就是Microsoft的建议配置。
     实际上,因为增长了策略路由表,查表的过程也是遍历,而且根据策略路由表的match一个一个比较,这个过程和filter表的查询过程几乎是同样的,则策略路由的优点体如今何方?实际上,路由和filter有一个区别,那就是路由是能够缓存的,而filter则是每包匹配的,有一种基于状态的防火墙能够“缓存”过滤结果,可是因为须要维护链接状态,这笔开销也是不可小觑的。路由缓存是彻底独立的,路由彻底缓存在一个hash表当中。
     可是,若是路由缓存hash表的冲突链表过长(缓存太大了),或者hash算法太菜,在配置大量策略路由和配置iptables之间权衡的话,后者也不是老是处于劣势,孰是孰非,只有具体状况具体分析,只有分析了具体的性能数据才能有结论,不然只是纸上谈兵一纸空文。

4.两篇文档

linux-source/Documentation/networking/tproxy.txt
linux-source/Documentation/networking/policy-routing.txt
 
 
http://linux.sheup.com/linux/38/linux23335.htm

懂得网络配置命令是通常技术人员必备的技术,通过一段时间的研究和学习,总结了一些经常使用的命令和示例以便往后查阅.
传统的在1--3点,ip高级路由命令在4--12点,二者部分能够通用,并达到一样的目的,但ip的功能更强大,能够实现更多的配置目的。
首先,先了解传统的网络配置命令:
1. 使用ifconfig命令配置并查看网络接口状况
示例1: 配置eth0的IP,同时激活设备:
# ifconfig eth0 192.168.4.1 netmask 255.255.255.0 up
示例2: 配置eth0别名设备 eth0:1 的IP,并添加路由
# ifconfig eth0:1 192.168.4.2
# route add –host 192.168.4.2 dev eth0:1
示例3:激活(禁用)设备
# ifconfig eth0:1 up(down)
示例4:查看全部(指定)网络接口配置
# ifconfig (eth0)
2. 使用route 命令配置路由表
示例1:添加到主机路由
# route add –host 192.168.4.2 dev eth0:1
# route add –host 192.168.4.1 gw 192.168.4.250
示例2:添加到网络的路由
# route add –net IP netmask MASK eth0
# route add –net IP netmask MASK gw IP
# route add –net IP/24 eth1
示例3:添加默认网关
# route add default gw IP
示例4:删除路由
# route del –host 192.168.4.1 dev eth0:1
示例5:查看路由信息
# route 或 route -n (-n 表示不解析名字,列出速度会比route 快)
3.ARP 管理命令
示例1:查看ARP缓存
# arp
示例2: 添加
# arp –s IP MAC
示例3: 删除
# arp –d IP
4. ip是iproute2软件包里面的一个强大的网络配置工具,它可以替代一些传统的网络管理工具。例如:ifconfig、route等,
上面的示例彻底能够用下面的ip命令实现,并且ip命令能够实现更多的功能.下面介绍一些示例:
4.0 ip命令的语法
ip [OPTIONS] OBJECT [COMMAND [ARGUMENTS]]
4.1 ip link set--改变设备的属性. 缩写:set、s
示例1:up/down 起动/关闭设备。
# ip link set dev eth0 up
这个等于传统的 # ifconfig eth0 up(down)
示例2:改变设备传输队列的长度。
参数:txqueuelen NUMBER或者txqlen NUMBER
# ip link set dev eth0 txqueuelen 100
示例3:改变网络设备MTU(最大传输单元)的值。
# ip link set dev eth0 mtu 1500
示例4: 修改网络设备的MAC地址。
参数: address LLADDRESS
# ip link set dev eth0 address 00:01:4f:00:15:f1
4.2 ip link show--显示设备属性. 缩写:show、list、lst、sh、ls、l
-s选项出现两次或者更屡次,ip会输出更为详细的错误信息统计。
示例:
# ip -s -s link ls eth0 eth0: mtu 1500 qdisc cbq qlen 100 link/ether 00:a0:cc:66:18:78 brd ff:ff:ff:ff:ff:ff RX: bytes packets errors dropped overrun mcast 2449949362 2786187 0 0 0 0 RX errors: length crc frame fifo missed 0 0 0 0 0 TX: bytes packets errors dropped carrier collsns 178558497 1783946 332 0 332 35172 TX errors: aborted fifo window heartbeat 0 0 0 332 这个命令等于传统的 ifconfig eth0 5.1 ip address add--添加一个新的协议地址. 缩写:add、a
示例1:为每一个地址设置一个字符串做为标签。为了和Linux-2.0的网络别名兼容,这个字符串必须以设备名开头,接着一个冒号,
# ip addr add local 192.168.4.1/28 brd + label eth0:1 dev eth0
示例2: 在以太网接口eth0上增长一个地址192.168.20.0,掩码长度为24位(155.155.155.0),标准广播地址,标签为eth0:Alias:
# ip addr add 192.168.4.2/24 brd + dev eth1 label eth1:1
这个命令等于传统的: ifconfig eth1:1 192.168.4.2
5.2 ip address delete--删除一个协议地址. 缩写:delete、del、d
# ip addr del 192.168.4.1/24 brd + dev eth0 label eth0:Alias1
5.3 ip address show--显示协议地址. 缩写:show、list、lst、sh、ls、l
# ip addr ls eth0
5.4.ip address flush--清除协议地址. 缩写:flush、f
示例1 : 删除属于私网10.0.0.0/8的全部地址:
# ip -s -s a f to 10/8
示例2 : 取消全部以太网卡的IP地址
# ip -4 addr flush label "eth0"
6. ip neighbour--neighbour/arp表管理命令
缩写 neighbour、neighbor、neigh、n
命令 add、change、replace、delete、fulsh、show(或者list)
6.1 ip neighbour add -- 添加一个新的邻接条目
ip neighbour change--修改一个现有的条目
ip neighbour replace--替换一个已有的条目
缩写:add、a;change、chg;replace、repl
示例1: 在设备eth0上,为地址10.0.0.3添加一个permanent ARP条目:
# ip neigh add 10.0.0.3 lladdr 0:0:0:0:0:1 dev eth0 nud perm
示例2:把状态改成reachable
# ip neigh chg 10.0.0.3 dev eth0 nud reachable
6.2.ip neighbour delete--删除一个邻接条目
示例1:删除设备eth0上的一个ARP条目10.0.0.3
# ip neigh del 10.0.0.3 dev eth0
6.3.ip neighbour show--显示网络邻居的信息. 缩写:show、list、sh、ls
示例1: # ip -s n ls 193.233.7.254
193.233.7.254. dev eth0 lladdr 00:00:0c:76:3f:85 ref 5 used 12/13/20 nud reachable
6.4.ip neighbour flush--清除邻接条目. 缩写:flush、f
示例1: (-s 能够显示详细信息)
# ip -s -s n f 193.233.7.254
7. 路由表管理
7.1.缩写 route、ro、r
7.5.路由表
从Linux-2.2开始,内核把路由概括到许多路由表中,这些表都进行了编号,编号数字的范围是1到255。另外,
为了方便,还能够在/etc/iproute2/rt_tables中为路由表命名。
默认状况下,全部的路由都会被插入到表main(编号254)中。在进行路由查询时,内核只使用路由表main。
7.6.ip route add -- 添加新路由
ip route change -- 修改路由
ip route replace -- 替换已有的路由
缩写:add、a;change、chg;replace、repl
示例1: 设置到网络10.0.0/24的路由通过网关193.233.7.65
# ip route add 10.0.0/24 via 193.233.7.65
示例2: 修改到网络10.0.0/24的直接路由,使其通过设备dummy
# ip route chg 10.0.0/24 dev dummy
示例3: 实现链路负载平衡.加入缺省多路径路由,让ppp0和ppp1分担负载(注意:scope值并不是必需,它只不过是告诉内核,这个路由要通过网关而不是直连的。实际上,若是你知道远程端点的地址,使用via参数来设置就更好了)。
# ip route add default scope global nexthop dev ppp0 nexthop dev ppp1
# ip route replace default scope global nexthop dev ppp0 nexthop dev ppp1
示例4: 设置NAT路由。在转发来自192.203.80.144的数据包以前,先进行网络地址转换,把这个地址转换为193.233.7.83
# ip route add nat 192.203.80.142 via 193.233.7.83
示例5: 实现数据包级负载平衡,容许把数据包随机从多个路由发出。weight 能够设置权重.
# ip route replace default equalize nexthop via 211.139.218.145 dev eth0 weight 1 nexthop via 211.139.218.145 dev eth1 weight 1
7.7.ip route delete-- 删除路由
缩写:delete、del、d
示例1:删除上一节命令加入的多路径路由
# ip route del default scope global nexthop dev ppp0 nexthop dev ppp1
7.8.ip route show -- 列出路由
缩写:show、list、sh、ls、l
示例1: 计算使用gated/bgp协议的路由个数
# ip route ls proto gated/bgp |wc
1413 9891 79010
示例2: 计算路由缓存里面的条数,因为被缓存路由的属性可能大于一行,以此须要使用-o选项
# ip -o route ls cloned |wc
159 2543 18707
示例3: 列出路由表TABLEID里面的路由。缺省设置是table main。TABLEID或者是一个真正的路由表ID或者是/etc/iproute2/rt_tables文件定义的字符串,
或者是如下的特殊值:
all -- 列出全部表的路由;
cache -- 列出路由缓存的内容。
ip ro ls 193.233.7.82 tab cache
示例4: 列出某个路由表的内容
# ip route ls table fddi153
示例5: 列出默认路由表的内容
# ip route ls
这个命令等于传统的: route
7.9.ip route flush -- 擦除路由表
示例1: 删除路由表main中的全部网关路由(示例:在路由监控程序挂掉以后):
# ip -4 ro flush scope global type unicast
示例2:清除全部被克隆出来的IPv6路由:
# ip -6 -s -s ro flush cache
示例3: 在gated程序挂掉以后,清除全部的BGP路由:
# ip -s ro f proto gated/bgp
示例4: 清除全部ipv4路由cache
# ip route flush cache
*** IPv4 routing cache is flushed.
7.10 ip route get -- 得到单个路由 .缩写:get、g
使用这个命令能够得到到达目的地址的一个路由以及它的确切内容。
ip route get命令和ip route show命令执行的操做是不一样的。ip route show命令只是显示现有的路由,而ip route get命令在必要时会派生出新的路由。
示例1: 搜索到193.233.7.82的路由
# ip route get 193.233.7.82
193.233.7.82 dev eth0 src 193.233.7.65 realms inr.ac cache mtu 1500 rtt 300
示例2: 搜索目的地址是193.233.7.82,来自193.233.7.82,从eth0设备到达的路由(这条命令会产生一条很是有意思的路由,这是一条到193.233.7.82的回环路由)
# ip r g 193.233.7.82 from 193.233.7.82 iif eth0
193.233.7.82 from 193.233.7.82 dev eth0 src 193.233.7.65 realms inr.ac/inr.ac
cache ; mtu 1500 rtt 300 iif eth0
8. ip route -- 路由策略数据库管理命令
命令  add、delete、show(或者list)
注意:策略路由(policy routing)不等于路由策略(rouing policy)。
在某些状况下,咱们不仅是须要经过数据包的目的地址决定路由,可能还须要经过其余一些域:源地址、IP协议、传输层端口甚至数据包的负载。
这就叫作:策略路由(policy routing)。
8.5. ip rule add -- 插入新的规则
ip rule delete -- 删除规则
缩写:add、a;delete、del、d
示例1: 经过路由表inr.ruhep路由来自源地址为192.203.80/24的数据包
ip ru add from 192.203.80/24 table inr.ruhep prio 220
示例2:把源地址为193.233.7.83的数据报的源地址转换为192.203.80.144,并经过表1进行路由
ip ru add from 193.233.7.83 nat 192.203.80.144 table 1 prio 320
示例3:删除无用的缺省规则
ip ru del prio 32767
8.7. ip rule show -- 列出路由规则
缩写:show、list、sh、ls、l
示例1: # ip ru ls
0: from all lookup local
32762: from 192.168.4.89 lookup fddi153
32764: from 192.168.4.88 lookup fddi153
32766: from all lookup main
32767: from all lookup 253
9. ip maddress -- 多播地址管理
缩写:show、list、sh、ls、l
9.3.ip maddress show -- 列出多播地址
示例1: # ip maddr ls dummy
9.4. ip maddress add -- 加入多播地址
ip maddress delete -- 删除多播地址
缩写:add、a;delete、del、d
使用这两个命令,咱们能够添加/删除在网络接口上监听的链路层多播地址。这个命令只能管理链路层地址。
示例1: 增长 # ip maddr add 33:33:00:00:00:01 dev dummy
示例2: 查看 # ip -O maddr ls dummy
2: dummy
link 33:33:00:00:00:01 users 2 static
link 01:00:5e:00:00:01
示例3: 删除 # ip maddr del 33:33:00:00:00:01 dev dummy
10.ip mroute -- 多播路由缓存管理
10.4. ip mroute show -- 列出多播路由缓存条目
缩写:show、list、sh、ls、l
示例1:查看 # ip mroute ls
(193.232.127.6, 224.0.1.39) Iif: unresolved
(193.232.244.34, 224.0.1.40) Iif: unresolved
(193.233.7.65, 224.66.66.66) Iif: eth0 Oifs: pimreg
示例2:查看 # ip -s mr ls 224.66/16
(193.233.7.65, 224.66.66.66) Iif: eth0 Oifs: pimreg
9383 packets, 300256 bytes
11. ip tunnel -- 通道配置
缩写 tunnel、tunl
11.4.ip tunnel add -- 添加新的通道
ip tunnel change -- 修改现有的通道
ip tunnel delete -- 删除一个通道
缩写:add、a;change、chg;delete、del、d
示例1:创建一个点对点通道,最大TTL是32
# ip tunnel add Cisco mode sit remote 192.31.7.104 local 192.203.80.1 ttl 32
11.4.ip tunnel show -- 列出现有的通道
缩写:show、list、sh、ls、l
示例1: # ip -s tunl ls Cisco
12. ip monitor和rtmon -- 状态监视
ip命令能够用于连续地监视设备、地址和路由的状态。这个命令选项的格式有点不一样,命令选项的名字叫作monitor,接着是操做对象:
ip monitor [ file FILE ] [ all | OBJECT-LIST ]
示例1: # rtmon file /var/log/rtmon.log
示例2: # ip monitor file /var/log/rtmon.log r

 

 

http://zhoulifa.bokee.com/6192551.html

高级网络工具iproute 

做者:  周立发2007-03-29 18:52分类: 默认分类标签:

 

IPRoute 的内容

安装的程序: ctstat (连接到 lnstat), ifcfg, ifstat, ip, lnstat, nstat, routef, routel, rtacct, rtmon, rtpr, rtstat (连接到 lnstat), ss, tc

简要描述

ctstat

链接状态工具

ifcfg

ip 命令的shell脚本包装

ifstat

显示网络接口的统计信息,包括接口发送和接收到的包数量。

ip

主可执行程序,它包含如下几个功能:

ip link [device] 查看和修改设备状态

ip addr 查看地址的特性,添加新地址、删除旧地址。

ip neighbor 查看邻居的特性,添加新邻居、删除旧邻居。

ip rule 查看和修改路由规则

ip route 查看路由表和修改路由表规则

ip tunnel 查看和修改 IP 隧道及其特性

ip maddr 查看和修改多播地址及其特性

ip mroute 设置、修改、删除多播路由

ip monitor 不间断的监视设备状态、地址、路由

lnstat

提供 Linux 网络统计信息,用于替代旧的 rtstat 程序。

nstat

显示网络统计信息

routef

ip route 的一个组件,用于刷新路由表。

routel

ip route 的一个组件,用于列出路由表。

rtacct

显示 /proc/net/rt_acct 文件的内容

rtmon

路由监视工具

rtpr

将 ip -o 的输出转换为可读的格式

rtstat

路由状态工具

ss

相似于 netstat 命令,显示活动的链接。

tc

流量控制,用于实现服务质量(QOS)和服务级别(COS):

tc qdisc 创建排队规则

tc class 创建基于级别的队列调度

tc estimator 估算网络流量

tc filter 设置 QOS/COS 包过滤器

tc policy 设置 QOS/COS 规则

 

其中ss命令用法以下:

 

Usage: ss [ OPTIONS ]
       ss [ OPTIONS ] [ FILTER ]
   -h, --help           this message
   -V, --version        output version information
   -n, --numeric        don't resolve service names
   -r, --resolve       resolve host names
   -a, --all            display all sockets
   -l, --listening      display listening sockets
   -o, --options       show timer information
   -e, --extended      show detailed socket information
   -m, --memory        show socket memory usage
   -p, --processes      show process using socket
   -i, --info           show internal TCP information
   -s, --summary        show socket usage summary

   -4, --ipv4          display only IP version 4 sockets
   -6, --ipv6          display only IP version 6 sockets
   -0, --packet display PACKET sockets
   -t, --tcp            display only TCP sockets
   -u, --udp            display only UDP sockets
   -d, --dccp           display only DCCP sockets
   -w, --raw            display only RAW sockets
   -x, --unix           display only Unix domain sockets
   -f, --family=FAMILY display sockets of type FAMILY

   -A, --query=QUERY
       QUERY := {all|inet|tcp|udp|raw|unix|packet|netlink}[,QUERY]

   -F, --filter=FILE   read filter information from FILE
       FILTER := [ state TCP-STATE ] [ EXPRESSION ]

 
 
 
 
 
http://m.oschina.net/blog/3046

Linux高级路由---策略路由/捆绑/网桥

企图穿越 发布于 5年前,共有 0 条评论

1.策略路由 
    基于策略的路由比传统路由在功能上更强大,使用更灵活,它使网络管理员不只可以根据目的地址并且可以根据报文大小、应用或IP源地址来选择转发路 径...         
    #/etc/iproute2/rt_tables 此文件存有linux 系统路由表默认表有255 254 253三张表 
      255  local 本地路由表 存有本地接口地址,广播地址,已及NAT地址. 
           local表由系统自动维护..管理员不能操做此表... 
      254  main 主路由表 传统路由表,ip route若没指定表亦操做表254.通常存全部的路由.. 
           注:平时用ip ro sh查看的亦是此表设置的路由. 
      253  default  默认路由表通常存放默认路由... 
           注:rt_tables文件中表以数字来区分表0保留最多支持255张表 
    路由表的查看可有如下二种方法: 
      #ip route list table table_number

      #ip route list table table_name
    路由表添加完毕,便可在策略路由表内添加路由例:
      #ip route add 192.168.1.0/24 dev eth0 via 192.168.1.66 realm 4
        注:发往子网192.168.1.0/24的数据包经过分类4转发配合tc使用,后文有介绍讲解...
      #ip route add default via 192.168.1.1 table int1
      #ip route add 192.168.1.0/24 via 192.168.1.1 table int2
      #ip route add 172.16.0.2/16 via 172.16.0.1 table int3
        注:各路由表中应当指明默认路由,尽可能不回查路由表.路由添加完毕,便可在路由规则中应用.. 
    #ip rule sh 显示路由规则 
      0:      from all lookup local 
      32766:  from all lookup main 
      32767:  from all lookup default 
    进行路由时,正是根据路由规则来进行匹配,按优先级(pref后数值)从高到低匹配,直到找到合适的规则.因此在应用中配置默认路由是必要的..     
    策略路由通常手工添加路由表,路由表的添加只需编辑rt_tables文件,规定表序号,表名便可.. 
    ip rule规则添加示例: 
      #ip rule add from 192.168.1.112/32 [tos 0x10] table test2 pref 999 prohibit 
      #ip rule add to 192.168.1.2 pref 1000 table test1 
      #ip rule add from 192.168.1.0/24 pref 1001 table test1 
      #ip rule add [from 0/0] table test1 pref 1003 
      #ip rule add fwmark 1 pref 1002 table test2  此句型配合iptables -t mangle应用.如先对数据
  包做标记:
      #iptables -t mangle -A PREROUTING -p tcp -m multiport
                             --dports 80,8080,20,21 -s 192.168.1.0/24 -j MARK --set-mark 1    
        注:建立完路由规则若需当即生效须执行#ip route flush cache;刷新路由缓冲 
    可参数解析以下: 
        From -- 源地址 
        To -- 目的地址(这里是选择规则时使用,查找路由表时也使用) 
    Tos -- IP包头的TOS(type of sevice)域 
    Dev -- 物理接口 
     Fwmark -- 防火墙参数 
    采起的动做除了指定路由表外,还能够指定下面的动做: 
        Table 指明所使用的表 
       Nat 透明网关
    Prohibit 丢弃该包,并发送 COMM.ADM.PROHIITED的ICMP信息 
    Reject 单纯丢弃该包 
    Unreachable丢弃该包, 并发送 NET UNREACHABLE的ICMP信息 
    具体格式以下: 
        Usage: ip rule [ list | add | del ] SELECTOR ACTION 
        SELECTOR := [ from PREFIX ] [ to PREFIX ] [ tos TOS ][ dev STRING ] [ pref NUMBER ] 
        ACTION := [ table TABLE_ID ] [ nat ADDRESS ][ prohibit | reject | unreachable ] 
                  [ flowid CLASSID ] 
        TABLE_ID := [ local | main | default | new | NUMBER ]
 
  2.网卡捆绑(网关linux+多网卡)
    #modprobe bonding mod=1 miimon=200 primary=eth1 建立bond0,模式为1,主网卡eth1..
    #ip addr add dev bond$ 10.0.0.1/24 设置bond0的IP
    #ifenslave bond0 eth1 eth2 添加绑定的dev
      注:mode=0 轮转均衡(默认模式),此模式MAC频繁切换致使交换机负载大..
         mode=1 主备模式 用primary指定网卡
         mode=4 经常使用 802.3ad模式,动态链路采集模式.此模式要求SWITCH捆绑..
         miimon=ms 每隔多少毫秒查询链路是否有效.
      其它参数如:
         arp_interval=ms
         arp_ip_target=*.*.*.*
 
    另外一种网卡捆绑固化方式:
      #vi /etc/modules.conf 加入如下行
      alias bond0 bonding
        系统在启动时加载bonding模块,对外虚拟网络接口设备为 bond0..
      #cd /etc/sysconfig/network-scripts
      #vi ifcfg-bond0
        DEVICE=bond0 
        IPADDR=11.0.0.1 
        NETMASK=255.0.0.0 
        NETWORK=192.168.1.0 
        BROADCAST=192.168.1.255 
        ONBOOT=yes 
        BOOTPROTO=none 
        USERCTL=no
      #vi ifcfg-eth0  
        DEVICE=eth0 
        USERCTL=no 
        ONBOOT=yes 
        MASTER=bond0 
        SLAVE=yes 
        BOOTPROTO=none
      #vi ifcfg-eth1 
        DEVICE=eth0 
        USERCTL=no 
        ONBOOT=yes 
        MASTER=bond0 
        SLAVE=yes 
        BOOTPROTO=none
     #/etc/init.d/network restart 重启网络服务验证网卡的配置信息备份网卡被加上了NOARP标记
     #cat /proc/net/bond0/info 查看bond信息
 
  3.网桥(Linux+多网卡)
    配置工具 brctl  http://bridge.sourceforge.net/  源码包名:bridge-utils-*形式
    安装第一步:autoconf 后类同于源码包安装..
    例.linu+二网卡eth0 eth1 配置成网桥
      配置前去除加入网桥的eth0 eth1的IP
      #ifconfig eth0/eth1 down
      #ifconfig eth0/eth1 0.0.0.0 up
      #brctl addbr br0
      #brctl addif br0 eth0 eth1
      #ip li set dev br0 up
      #brctl showmacs br0 显示网桥MAC 
    撤网桥:
      #ip li set dev br0 down
      #brctl delif br0 eth0 eth1
      #brctl delbr br0
    网桥接口处亦可进行流量控制,无Ip的linux网桥可有效防护外界的功击,对linux网桥机的总控安全性高...
 
    贴上一篇网桥应用实例,此实例是网桥的一种扩张应用...
      脚本名:start_bridge.sh
      #!/bin/sh
      brctl addbr net1 
      brctl addif net1 eth0 
      ifconfig eth0 down 
      ifconfig eth0 0.0.0.0 up 
      ifconfig net1 192.168.5.1 up 
      #ip ro del 192.168.1.0/24 dev eth1  proto kernel  scope link  src 192.168.1.28
      ip ro del 192.168.1.0/24 
      #route add -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.5.2
      ip route add default via 192.168.5.2 
      echo "1" > /proc/sys/net/ipv4/ip_forward
 
  Linux高级路由需结合iptables才能充分体现其功能的强大,实际工做中的应用多半基于此,固然要熟练掌握Linux高级路由+iptables 还需进一步的增强学习和实践的应用...
#################################################################################################################################

传统路由器在网络和需求变得复杂时将没法知足须要,而一种基于策略的路由给了咱们更好的选择。本文给出一个Linux下的配置实例,它在2.4G奔 腾4处理器、256M内存的计算机上运行经过,并在160多台电脑的网络环境下运转正常。

 

基于策略的路由比传统路由更强大,使用更灵活,它使网络管理者不只可以根据目的地址并且可以根据报文大小、应用或IP源地址来选择转发路 径。在现实的网络应用中,这种选择的自由性仍是很须要的。而Linux从2.1版本的内核开始就实现了对策略路由的支持,下面就介绍一个配置实例,以期对 读者有所帮助。

 

实例背景

 

如图所示,两个内部网经过远端路由器1与因特网相联,经过远端路由器2与上级网相联, Linux服务器作策略路由器,内有4块网卡。IP地址的分配状况如表所示。

 

在应用需求方面,内网1容许经过远端路由器1(172.22.254.254)链接因特网,但只容许Http协议、FTP协议常常性经过, 其余协议分时间段开放(这样作是为了不员工在上班时间打网络游戏和聊天),例如在上班时间(7:30~16:30)封闭,在下班时间 (16:30~7:30)和周6、日全天开放。并且,内网1无权访问内网2及上级网,但能够访问内网2上的服务器。而容许内网2访问外网,上级网则只能访 问内网2上的192.168.1.2服务器。而防火墙主要用来阻止外网主动访问内网,防止网络攻击。

 

实现过程

 

这里咱们选择Red Hat Enterprise Linux WS 3操做系统,其内核版本是2.4.21,对策略路由已经有了很好的支持,下面的配置也以此为基础。

 

1.设置IP地址

 

首先,执行以下命令:

ifconfig eth0 10.89.9.1 netmask 255.255.255.0

ifconfig eth1 192.168.1.1 netmask 255.255.255.0

ifconfig eth2 172.22.254.14 netmask 255.255.255.0

ifconfig eth3 10.140.133.14 netmask 255.255.255.0

为了让计算机启动时自动设置IP地址,还须要分别修改/etc/sysconfig/network-scripts/下的四个文 件:ifcfg-eth0、ifcfg-eth一、ifcfg-eth二、ifcfg-eth3,将ONBOOT属性设为yes,即 “ONBOOT=yes”,文件格式以下:

# Intel Corp.82545EM Gigabit Ethernet Controller (Copper)

DEVICE=eth0

BOOTPROTO=none

HWADDR=00:0c:76:20:54:71

ONBOOT=yes

TYPE=Ethernet

USERCTL=yes

PEERDNS=no

NETMASK=255.255.255.0

IPADDR=10.89.9.1

 

若是你不喜欢命令行模式,也能够在图形模式下进行以上操做:主菜单→系统设置→网络,设好IP地址并激活,而且选中“当计算机启动时激活设 备”选项。

 

2.打开转发功能

 

执行命令“echo “1” > /proc/sys/net/ipv4/ip_forward”,或者在/etc/sysconfig/network文件中添加 “FORWARD_IPV4=yes”。

 

3.建立路由表

 

编辑 /etc/iproute2/rt_tables 文件,执行以下命令。在这里新添加了4个路由表,分别为int1 、int二、int三、int4。

# reserved values

#255 local

#254 main

#253 default

#0 unspec

# local

#1 inr.ruhep

1 int1

2 int2

3 int3

4 int4

 

4.添加路由

 

执行以下命令:

ip route add default via 10.89.9.1 table int1

ip route add default via 192.168.1.1 table int2

ip route add default via 172.22.254.254 table int3

ip route add 192.168.0.0/16 via 10.140.133.254 table int4

ip route add default via 172.22.254.254 table int4

这里在int4路由表中添加了两条路由,当进入到该路由表以后,要到192.168.0.0/16的数据包则路由到 10.140.133.254,其余数据包则路由到172.22.254.254。

5.标记(MARK)特殊包

 

执行以下两条命令:

iptables -t mangle -A PREROUTING -p tcp -m multiport --dports 80,8080,20,21 -s 10.89.9.0/24 -j MARK --set-mark 1

iptables -t mangle -A PREROUTING -p udp --dport 53 -s 10.89.9.0/24 -j MARK --set-mark 2

这两条命令是未来自10.89.9.0/24的目的端口是80、8080、20或21的数据包和UDP端口是53的数据包分别标记为1或 2,而后就能够针对这些标记过的数据包制定相应的规则了。(对外发出的DNS请求用的是UDP 53端口)

为了实现防火墙的功能,只容许已经创建联机的数据包进入内网,就要把进入两个内网的已经创建联机的数据包进行标记。执行以下命令:

iptables -t mangle -A PREROUTING -p ALL -d 10.89.9.0/24 -m state --state ESTABLISHED,RELATED -j MARK --set-mark 3

iptables -t mangle -A PREROUTING -p ALL -d 192.168.1.0/24 -m state --state ESTABLISHED,RELATED -j MARK --set-mark 4

 

6.建立路由规则

执行以下命令:

ip rule add from 192.168.1.0/24 pref 11 table int4

ip rule add to 192.168.1.2 pref 21 table int2

ip rule add fwmark 4 pref 31 table int2

ip rule add fwmark 1 pref 41 table int3

ip rule add fwmark 2 pref 42 table int3

ip rule add fwmark 3 pref 51 table int1

接着执行命令“ip route flush cache”,刷新路由缓冲,让以上的这些命令马上生效,不然须要等上一段时间。

7.实现分时间段控制

如果按照以上的配置,内网1的用户只能上网浏览网页和下载,为了对其余功能实现分时间段开放,须要作如下工做:

首先编辑命令脚本文件ropen (开放)和rclose (限制)。执行命令“vi /bin/ropen”,ropen文件内容以下:

/sbin/ip rule add from 10.89.9.0/24 pref 40 table int3

/sbin/ip route flush cache

执行命令“vi /bin/rclose”,rclose文件内容以下:

/sbin/ip rule del from 10.89.9.0/24 pref 40

/sbin/ip route flush cache

若是不习惯命令行方式,也能够在图形界面下生成这两个文件,生成文件以后,须要增长可执行属性方可执行:分别执行命令“chmod +x ropen”和“chmod +x rclose”。

接着,利用crontab命令实现自动运行。这里须要编辑一个文本文件,格式以下:

minute hour dayofmonth monthofyear dayofweek “命令”

其中每部分名称及取值范围是:minute表明分钟,取值范围是00~59;hour表明小时,取值范围是 00~23;dayofmonth表明某天,取值范围是01~31;monthofyear表明月份,取值范围是01~12;dayofweek表明星 期,取值范围是01~07。若须要忽略其中某一部分就用星号(*)代替。例如,文件名设为mycron,内容可编辑以下:

 

30 07 * * 01,02,03,04,05 "/bin/ropen"

30 16 * * 01,02,03,04,05 "/bin/rclose"

最后执行crontab命令,将所编辑的文件mycron装载并启动,命令为“crontab mycron”。

 
 
http://rhcss.blog.51cto.com/672018/133812
linux 高级路由及流量控制总结
2009-02-28 22:40:27
版权声明:原创做品,如需转载,请与做者联系。不然将追究法律责任。
看了这么多天的关于流量控制的资料后,如今大脑里仍是很乱,理不清晰,只好将目前所可以理理的暂时总结一下。
在Linux系统中,有一个很是重要的路由的包文件-----iproute,其中包含了两个最重要的工具ip和tc。
iproute的程序站点为: http://www.linuxfoundation.org/en/Net:Iproute2
iproute的文档站点为: http://lartc.org/
ip命令主要用于配置接口,ARP,tunnel(隧道)以及策略路由等等。
tc命令主要用于配置流量控制和策略管理,二者能够单独使用,也能够相互结合使用。
2、ip命令的使用
root@router:~# ip help
Usage: ip [ OPTIONS ] OBJECT { COMMAND | help }
where OBJECT := { link | addr | route | rule | neigh | tunnel |
maddr | mroute | monitor | xfrm }
OPTIONS := { -V[ersion] | -s[tatistics] | -r[esolve] |
-f[amily] { inet | inet6 | ipx | dnet | link } | -o[neline] }
 
ip link 命令主要用于显示网络配置信息,ip link set 主要用于配置网络信息。
例:显示当前接口配置信息。
route@linux#  ip  link  list
 
ip addr 命令用于配置IP地址信息,其可以使用ip addr add为网络设备添加主或从IP地址,ip addr show用于显示每一个网络设备的IP地址,ip addr del用于删除接口的IP地址,能够经过不一样的命令清空相关的IP地址信息,例如:ip addr flush dynamic能够删除全部经过动态路由协议加入至linux内核中的路由条目。
例:显示IP地址信息。
route@linux# ip  address  show
 
ip neighbor用于管理neighbor/arp表,下列的一些命令将会被用到:add, change, replace, delete, and flush。
例:显示ARP缓存信息以及删除ARP缓存信息。
route@linux# ip neigh  show
route@linux# ip neigh  delete  10.10.10.1  dev eth0
 
ip tunnel命令用于管理隧道链接,隧道协议有gre,ipip,sit等,在后面的章节中将会介绍如何创建IP 隧道的实例。
 
ip route命令是一个很是重要并最常使用的命令,它几乎能够在内核路由表上执行任何操做,主要的命令有:add, change, replace, delete, show, flush, and get routes
例:显示IP路由表。
route@linux# ip  route show
 
ip monitor:监控路由, rtmon:监控地址, rtacct:实时监控网络设备。
 
关于IP命令的详细使用请参考: http://www.policyrouting.org/iproute2.doc.html#ss9.1.1
 
此外,在iproute2中最重要的功能就是经过ip rule和ip route来实现linux的策略路由功能。
 
3、策略路由的实现
在实现策略路由的内核上必须支持IP: advanced router"  和 "IP: policy routing"  两项
 
实现方法:在Linux中能够设置多张路由表,并为不一样的表设置不一样的出口(即网关),当内核在实现路由选择时,可让其平均的经过几张路由表将数据发送出去或者将不一样的数据经过不一样的路由表发送出去。
 
默认状况下,Linux内核自带了三张路由表,能够经过 route@linux# ip rule list进行查看,三张表分另为local对就编号为0,main对应编号为32766,default对应编号为32766,用户在正常建立建立条目时若是没有指定加入哪个表时,数据统统加入至main表,因此当用户使用route  -n看到的信息所有来自于main表中。
例:显示当前内核的路由表。
kuznet@amber~ $ ip rule list
0 from all lookup local
32766 from all lookup main
32767 from all lookup default
 
用户能够经过 ip route list table 表名 的方法来查看表中的具体路由条目,以下所示:
router@linux#  ip route list table main
................................................
 
/etc/iproute2/rt_tables 文件用于保存表名和编号的对应关系。这里须要添加T1和T2两个表,编号为200和300,具体操做以下:
echo 200 T1 >> /etc/iproute2/rt_tables
echo 300 T2 >> /etc/iproute2/rt_tables  
 
接下来,使用ip rule add命令来建立具体的表,并能够在表中添加源地址或目标地址等参数。以下实例,建立表T1和T2。
例: route@linux# ip rule add from 1.1.1.1 table T1
        route@linux# ip rule add from 192.203.80.0/24 table T1
        route@linux# ip rule add to 192.203.80.0/24 table T2
        route@linux# ip rule add  table T2
上述内容表示这些源地址/目的地址/全部地址将应用于T1/T2表中的路由规则。
 
在使用ip rule add建立表时,能够指定的参数有:type TYPE (default),from PREFIX,to PREFIX,iif NAME,tos TOS or dsfield TOS,fwmark MARK,priority PREFERENCE,table TABLEID,realms FROM/TO,nat ADDRESS。
 
 
最后,建立具体的路由条目至指定的表中(默认为main表),以下所示:
route@linux# ip route add default via 192.168.0.1 dev eth0 table T1
route@linux# ip route add default via 192.168.1.1 dev eth1 table T2
 
 
4、策略路由配置实例
 
实验拓扑以下:
 
一、建立两个表,分别为dianxin,wangtong,编辑为300和400.
route@linux#echo  300  dianxin  >>/etc/iproute/rt_tables
route@linux# echo  400  wangtong  >>/etc/iproute/rt_tables
route@linux#ip rule add from $IP1 table dianxing
route@linux#ip rule add from $IP2 table wangtong
 
二、添加相关路由至两个表中。
 
三、实现负载均衡。
 
策略路由总结:
一、添加路由表,编号至系统中。
二、添加具体的路由条目并指向用户自定义的路由表中(如默认路由)。
三、添加具体的规则至路由表中,如什么样的源地址以及对应的优先级。
四、在路由表中经过nexthop参数实现负载均衡,或者能够为数据打mask,而后设置标记1的数据从哪一个表走,标记2的数据从哪一个表。
 
Linux下网通、电信、教育多出口策略路由配置详解
1、处理流量分割的问题;2、解决双线负载均衡的问题。原文以下:
一、流量分割
首先是如何保证:回应来自某一个ISP的数据包时,仍然使用相同的ISP。
让咱们先定义一些符号。令第一块网卡的名字叫eth1,而第二块网卡叫作eth2;而后设置网卡1的IP地址为221.200.0.2(CNC分配网址),网卡2 的IP地址为58.56.0.2(CTC分配网址);ISP1(联通)网关地址为221.200.0.1,ISP2(电信)网关地址为58.56.0.1;最后,ISP1(联通)的网络地址为211.200.0.0/30,ISP2(电信)的网络地址为58.56.0.0/30。
额外建立两个路由表,T1 和T2 ,加入到/etc//iproute2/rt_tables中。而后以下设置两个路由表中的路由:
ip route add 211.200.0.0/30 dev eth1 src 221.200.0.2 table T1
ip route add default via 221.200.0.1 table T1
 
ip route add 58.56.0.0/30 dev eth2 src 58.56.0.2 table T2
ip route add default via 58.56.0.1 table T2
没什么大不了的,不过是创建了通向该网关的一台路由,并使之成为默认网关,分别负责一个单独的上行流,而且为这两个ISP都做这样的配置。要指出的是,那条网络路由是必要条件,由于它能让咱们找到那个子网内的主机,也包括上述的那台网关。
下一步,咱们设置“main”路由表,把包经过网卡直接路由到与网卡相连的局域网上不失为一个好办法。要注意“src”参数,他们可以保证选择正确的出口IP地址。
ip route add 211.200.0.0/30 dev eth1 src 221.200.0.2 table main
 
ip route add 58.56.0.0/30 dev eth2 src 58.56.0.2 table main
而后,设置你的缺省路由:
ip route add default via 221.200.0.1
接着,设置路由规则。这实际上在选择用什么路由表进行路由。你须要确认当你从一个给定接口路由出数据包时,是否已经有了相应的源地址:你须要保证的就是若是你已经有了相应的源地址,就应该把数据包从相应的网卡路由出去:
ip rule add from 221.200.0.2 table T1
ip rule add from 58.56.0.2 table T2
以上命令保证了全部的回应数据都会从他们来的那块网卡原路返回。
如今,完成了很是基本的配置。这将对于全部运行在路由器上的全部进程起做用,实现IP假装后,对本地局域网也将起做用。若是不进行假装,那么你要么拥有两个ISP的地址空间,要么你想对两个ISP中的一个进行假装。不管哪一种状况,你都要添加规则,基于发包的主机在局域网内的IP地址,选择从哪一个ISP路由出去。
二、负载均衡
第二个问题就是如何对经过两个ISP流出的数据进行负责均衡。若是你已经成功地实现了流量分割。这件事不难。
与选择两个ISP中的一个做为缺省路由不一样,此次是设置缺省路由为多线路路由。在缺省内核中,这会均衡两个ISP的路由。像下面这样作(基于前面的流量分割实验):
ip route add default scope global nexthop via 221.200.0.1 dev eth1 weight 30 \
nexthop via 58.56.0.1 dev eth2 weight 70 (注意:与上面为同一行命令)
这样能够均衡两个ISP的路由。经过调整“weight”参数咱们能够指定其中的一个ISP的优先权高于另外一个。(具体:线路1的流量约占30%,线路1占70%)
应该指出,因为均衡是基于路由进行的,而路由是通过缓冲的,因此这样的均衡并非100%精确。也就是说,对于一个常常访问的站点,老是会使用同一个ISP。
中国的现状这样设置是有缺陷的:由于网通和电信等的线路在沟通上存在问题,就是说从网通线路访问电信的网址不如直接从电信访问快,从电信访问网通也是如此。所以对于拥有不一样种线路的路由器咱们须要作基于目标地址的策略路由,同种线路的能够作上面的策略路由。若是你拥有多个ISP且某个ISP有多条线路,则能够把负载均衡与基于目标的策略路由结合起来。
 
作这样的策略路由来自于《QEL4.1 网吧版》,其相关说明部分以下:
 
从QEL4.1 版本开始,咱们增长了多线路策略路由的功能。用户只须要简单地填写几个配置文件便可完成。
策略路由功能由qlcm 程序实现。这个程序在QEL4.0 上为1.0,包含了内核智能优化、抗DDOS、SYN 洪水攻击等功能。在4.1 版上,qlcm 版本为2.0,增长了arp 绑定,多线路策略路由功能。
qlcm 服务是QEL 服务器的核心服务,您能够restart qlcm 服务,但在任何状况下您都不该该中止它。关闭它会形成没法预料的后果,好比出现大量丢包,某些服务中止等。这样的故障不在咱们技术支持的范围内。
qlcm 2.0 支持最大8 路外网线路,根据用户定义的配置文件自动判断工做模式,能够为每一个外网出口单独定义路由表,也能够实现实现多条线路的负载均衡(即多链路带宽捆绑)。通常的硬件路由器只能支持23路外网线路,并且价格不菲。硬件路由器使用嵌入式CPU 和少许内存,处理性能有限,在处理过多路由时会超出处理能力。而使用PC作路由则不受此限制。
QEL4.1 内核最大能够支持到255 路外线,咱们随时能够修改qlcm,支持32 路或者更多的外线。
 
咱们再来看一个具体例子的实现:
 
3.咱们有三条固定IP 线路,一条是eth0(电信),网关为202.102.14.1,一条eth1(网通),网关为60.12.5.1,一条是教育网线路,网关为125.216.44.1,将etho(电信线路)做为默认网关,访问网通的数据走eth1,访问教育网的走eth2,
配置以下:
wan1.conf:
interface=eth0
gateway=202.102.14.1
defaultgw=yes
wan2.conf:
interface=eth1
gateway= 60.12.5.1
routefile=/etc/quick/IP_CNC.list
wan3.conf:
interface=eth2
gateway=125.216.44.1
routefile=/etc/quick/IP_EDU.list
这样就OK 了。新建一个IP_EDU.list 文本文件,其中定义了教育网的IP 段。
在这样的环境下,defaultgw=yes 只设定在某个网卡接口上。当访问已定义的路由时,走指定的网卡出去,不然走默认网关。
 
routefile= 后面填该线路对应的路由表文件。在安装时咱们已经为您默认安装了两个文件:IP_CNC.list 和IP_CTC.list,这两个文件都在/etc/quick 目录下,其中IP_CNC.list 文件是网通路由表文件,IP_CTC.list 为电信路由表文件。
这两个文件的格式也很简单,每行一个IP 段,示例以下:
58.16.0.0/16
58.17.0.0/17
58.17.128.0/17
 
qlcm只能运行在《QEL4.1 网吧版》上,若是移植到其它Linux下会由于版本的不一样而形成系统的崩溃。在不想更换系统的前提下,咱们能够本身用IP命令来实现qlcm的功能模拟。
咱们仍然以文章开始的实例来进行说明基于目的的策略路由设置。
一、首先创建通向不一样ISP的路由表
ip route add 211.200.0.0/30 dev eth1 src 221.200.0.2 table 50
ip route add default via 221.200.0.1 table 50
 
ip route add 58.56.0.0/30 dev eth2 src 58.56.0.2 table 51
ip route add default via 58.56.0.1 table 51
没什么可说的,与前面相同,只是仅用数字表示路由表。
二、针对咱们要访问的目标地址,选择不一样的路由表,进行路由
由于有大量的网络地址须要设置不一样的规则,采用命令模式不便于修改,因此作了一个简单的脚本文件,配置文件与qlcm采用相同的结构。
 
关于策略路由的详细使用,能够参考书籍: Policy Routing Using Linux
 

本文出自 “RHCSS系统安全架构师” 博客,转载请与做者联系!

 
 
http://xjsunjie.blog.51cto.com/999372/1583522
iproute2 策略路由与流量控制笔记
2014-11-27 22:48:47

-- 前提知识: --
若是须要使用策略路由需确认编译内核时配置中带有IP:advanced route和IP:policy routing

iproute匹配条件:from源地址,to目的地址,Tos域,Dev物理接口,Fwmark防火墙标记  这些作为匹配条件

iproute动做:能够以table指明所用的表,nat网络地址转换,prohibit丢弃并发送icmp信息,reject单纯丢弃,unreachable丢弃并发送icmp信息.

ip rule首先程序从优先级高到低扫描全部的规则,若是规则匹配,处理该规则的动做。若是是普通的路由寻址或者是nat地址转换的换,首先从规则获得路由表,而后对该路由表进行操做。这样RPDB(routing policy database)终于清晰的显现出来了。
 
iproute相关的内核编译选项:CONFIG_IP_ADVANCED_ROUTER=y CONFIG_IP_MULTIPLE_TABLES=y CONFIG_IP_ROUTE_FWMARK=y

/etc/iproute2/rt_tables 保存规则的名字与数字的关联

iptables -A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu 容许调整tcp syn包里的MSS域,用于控制链接包的最大长度。一些防火墙或主机会很不适当的过滤掉type 三、code 4(须要分片)的icmp包。目前发行的linux的内核从2.4.7开始已经包含了这个补丁。

IMQ 中介队列设备
被打了特定标记的数据包在netfilter的NF_IP_PRE_ROUTING和NF_IP_POST_ROUTING两个钩子函数处被拦截,并被送到一个队列规定中,该队列规定附加到一个IMQ设备上。能够实现对入口流量整形,并且能够把网卡当成一个个的类来看待而进行全局整形设置。

--应用案例1 --

经过iptables与iproute2协同实现根据 应用 的策略路由
实现要点: iptables根据端口将服务类的数据包打上标示,iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 100 (用这些标记咱们能够作带宽限制和基于请求的分类)
根据状况作nat iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE 
而后设置路由策略ip rule add fwmark 100 table 100  

-- 应用案例2 --

普通双ISP的设置 外网接口$IF1 IF1接口地址$IP1 ISP1网关地址$P1 ISP1的网络地址P1_NET
#分别指定两条默认网关负责单独的上行流
ip route add $P1_NET dev $IF1 src $IP1 table T1 源地址为IP1且目的为ISP1网段从IF1接口发出(必需的,它可以让咱们找到该子网内的主机及本网关) 将这条路由加入表T1
ip route add default via $P1 table T1
ip route add $P2_NET dev $IF2 src $IP2 table T2 源地址为IP2且目的为ISP2网段从IF2接口发出((必需的,它可以让咱们找到该子网内的主机及本网关) 将这条路由加入表T2
ip route add default via $P2 table T2

#也加入到main路由表
ip route add $P1_NET dev $IF1 src $IP1
ip route add $P2_NET dev $IF2 src $IP2
  main缺省走ISP1
ip route add default via $P1

#设置路由规则
ip rule add from $IP1 table T1
ip rule add from $IP2 table T2
#设置负载均衡
ip route add default scope global nexthop via $P1 dev $IF1 weight 1 \
nexthop via $P2 dev $IF2 weight 1

均衡是基于路由进行的,而路由是通过缓冲的,因此这样的均衡并非100%精确.

-- 应用案例3 --
 TC带宽管理的主要实现步骤 主要是在输出端口处创建一个队列进行流量控制,控制的方式是基于路由,亦即基于目的IP地址或目的子网的网络号的流量控制。
1 编译内核时注意事项
如下实例:发往A主机8M带宽 发往B主机1M带宽 发往C主机1M带宽
2  1) 针对网络物理设备(如以太网卡eth0)绑定一个CBQ队列;
 tc qdisc add dev eth0 root handle 1: cbq bandwidth 10Mbit avpkt 1000 cell 8 mpu 64 
  2) 在该队列上创建分类;
 tc class add dev eth0 parent 1:0 classid 1:1 cbq bandwidth 10Mbit rate 10Mbit maxburst 20 allot \ 1514 prio 8 avpkt 1000 cell 8 weight 1Mbit 
 tc class add dev eth0 parent 1:1 classid 1:2 cbq bandwidth 10Mbit rate 8Mbit maxburst 20 allot \ 1514 prio 2 avpkt 1000 cell 8 weight 800Kbit split 1:0 bounded 
 tc class add dev eth0 parent 1:1 classid 1:3 cbq bandwidth 10Mbit rate 1Mbit maxburst 20 allot \ 1514 prio 1 avpkt 1000 cell 8 weight 100Kbit split 1:0
 tc class add dev eth0 parent 1:1 classid 1:4 cbq bandwidth 10Mbit rate 1Mbit maxburst 20 allot \ 1514 prio 6 avpkt 1000 cell 8 weight 100Kbit split 1:0 
  3) 为每一分类创建一个基于路由的过滤器;
tc filter add dev eth0 parent 1:0 protocol ip prio 100 route
tc filter add dev eth0 parent 1:0 protocol ip prio 100 route to 2 flowid 1:2 
tc filter add dev eth0 parent 1:0 protocol ip prio 100 route to 3 flowid 1:3 
tc filter add dev eth0 parent 1:0 protocol ip prio 100 route to 4 flowid 1:4 
  4) 最后与过滤器相配合,创建特定的路由表。
ip route add 192.168.1.24 dev eth0 via 192.168.1.66 realm 2 
ip route add 192.168.1.30 dev eth0 via 192.168.1.66 realm 3
ip route add 192.168.1.0/24 dev eth0 via 192.168.1.66 realm 4 
3 应用,监控

--关于负载平衡--
关于负载平衡 CONFIG_IP_ROUTE_MULTIPATH内核选项将把全部这些路径(缺省路由)等同看待,而后再根据/usr/src/linux /Documentation/Configure.help来选择其特定的方式。Ip route命令的equalize选项,会让Linux内核基于IP地址平衡外部链接。对于一个特定的IP地址,内核会选择一个接口用于传输流出的数据包,而后内核会为该IP地址在路由缓冲中建一个记录。这样,其它到达的有相同IP地址的数据包就会使用同一个接口,直到该记录从路由缓冲中删除。咱们能够使用ip route list cache命令来查看路由缓冲。


经过DNS循环来实现的服务的负载平衡
各类不一样的服务(DNS、SMTP、HTTP、LDAP、SSH等) 能够经过DNS循环来实现。
循环复用DNS还有太多的限制(DNS缓存,忽略TTL值,修改后的刷新时间,不能意识到服务器的可用性),只能算是一种勉强可接受的负载平衡方案

--相关命令 --
ip link list 显示链路
ip address show 显示IP地址 对于PPP0接口还会告诉咱们链路另外一端的地址
ip route show 输出结果之一default via x.x.x.x dev x

ip neigh show 查看缓存的ARP表
ip neigh delete x.x.x.x dev x

--TC流量控制:--
咱们只能对发送数据进行整形
默认整形方式是Pfifo_fast队列规定。特色为先进先出。只看数据包的TOS字节节来判断应该放到哪一个频道(优先).通常的应用程序会如何设置他们的TOS值。
HTB分层的令牌桶 
HTB 能够保障提供给每一个类带宽的数量是它所需求的最小需求或者等于分配给它的数量.当一个类须要的带宽少于分配的带宽时,剩余的带宽被分配给其余须要服务的类. 

SFQ随机公平队列 
简单轮转。使用一个散列算法,把全部的会话映射到有限的几个队列中去。(只有当你的出口网卡确实已经挤满了的时候,SFQ才会起做用)
 
(若是你并不但愿进行流量整形,只是想看看你的网卡是否有比较高的负载而须要使用队列,可以使用pfifo队列。它缺少内部频道可是能够统计backlog)

--HTB应用案例4--
1)
tc qdisc add dev eth0 root handle 1: htb default 12 
2)
tc class add dev eth0 parent 1: classid 1:1 htb rate 100kbps ceil 100kbps
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 30kbps ceil 100kbps
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 10kbps ceil 100kbps
tc class add dev eth0 parent 1:1 classid 1:12 htb rate 60kbps ceil 100kbps 
3)为队列规定分配子类, 若是没有指定缺省是pfifo
tc qdisc add dev eth0 parent 1:10 handle 20: pfifo limit 5
tc qdisc add dev eth0 parent 1:11 handle 30: pfifo limit 5
tc qdisc add dev eth0 parent 1:12 handle 40: sfq perturb 10 
1:12队列的类不定义时,即全部不匹配其它类规则的数据包。

--流量分析与故障诊断--
tc -s -d qdisc show dev eth0 队列状态
tc -s class show dev eth0 类状态
tc filter show dev eth0 过滤器状态

 
 
http://xjsunjie.blog.51cto.com/999372/1575090
linux策略路由iproute2
2014-11-10 17:17:20

策略性路由

  策略性是指对于IP包的路由是以网络管理员根据须要定下的一些策略为主要依据进行路由的。例如咱们能够有这样的策略:“全部来直自网A的包,选择X路径;其余选择Y路径”,或者是“全部TOS为A的包选择路径F;其余选者路径K”。
  Cisco 的网络操做系统 (Cisco IOS) 从11.0开始就采用新的策略性路由机制。而Linux是在内核2.1开始采用策略性路由机制的。策略性路由机制与传统的路由算法相比主要是引入了多路由表以及规则的概念。

多路由表(multiple Routing Tables)

  传统的路由算法是仅使用一张路由表的。可是在有些情形底下,咱们是须要使用多路由表的。例如一个子网经过一个路由器与外界相连,路由器与外界有两条线路相连,其中一条的速度比较快,一条的速度比较慢。对于子网内的大多数用户来讲对速度并无特殊的要求,因此可让他们用比较慢的路由;可是子网内有一些特殊的用户倒是对速度的要求比较苛刻,因此他们须要使用速度比较快的路由。若是使用一张路由表上述要求是没法实现的,而若是根据源地址或其它参数,对不一样的用户使用不一样的路由表,这样就能够大大提升路由器的性能。

规则(rule)

  规则是策略性的关键性的新的概念。咱们能够用天然语言这样描述规则,例如我门能够指定这样的规则:
  规则一:“全部来自192.16.152.24的IP包,使用路由表10, 本规则的优先级别是1500”
  规则二:“全部的包,使用路由表253,本规则的优先级别是32767”

  咱们能够看到,规则包含3个要素:
  什么样的包,将应用本规则(所谓的SELECTOR,多是filter更能反映其做用);
  符合本规则的包将对其采起什么动做(ACTION),例如用那个表;
  本规则的优先级别。优先级别越高的规则越先匹配(数值越小优先级别越高)。

策略性路由的配置方法

  传统的linux下配置路由的工具是route,而实现策略性路由配置的工具是iproute2工具包。这个软件包是由Alexey Kuznetsov开发的,软件包所在的主要网址为ftp://ftp.inr.ac.ru/ip-routing/。
这里简单介绍策略性路由的配置方法,以便能更好理解第二部分的内容。详细的使用方法请参考Alexey Kuznetsov写的 ip-cfref文档。策略性路由的配置主要包括接口地址的配置、路由的配置、规则的配置。

接口地址的配置IP Addr

对于接口的配置能够用下面的命令进行:
 

Usage: ip addr [ add | del ] IFADDR dev STRING


  例如:

router># ip addr add 192.168.0.1/24 broadcast 192.168.0.255 label eth0 dev eth0


  上面表示,给接口eth0赋予地址192.168.0.1 掩码是255.255.255.0(24表明掩码中1的个数),广播地址是192.168.0.255

 

路由的配置IP Route

  Linux最多能够支持255张路由表,其中有3张表是内置的:
  表255 本地路由表(Local table) 本地接口地址,广播地址,已及NAT地址都放在这个表。该路由表由系统自动维护,管理员不能直接修改。
  表254 主路由表(Main table) 若是没有指明路由所属的表,全部的路由都默认都放在这个表里,通常来讲,旧的路由工具(如route)所添加的路由都会加到这个表。通常是普通的路由。
  表253 默认路由表 (Default table) 通常来讲默认的路由都放在这张表,可是若是特别指明放的也能够是全部的网关路由。
  表 0 保留

  路由配置命令的格式以下:
 

Usage: ip route list SELECTOR
ip route { change | del | add | append | replace | monitor } ROUTE


  若是想查看路由表的内容,能够经过命令:

  ip route list table table_number


  对于路由的操做包括change、del、add 、append 、replace 、 monitor这些。例如添加路由能够用:

router># ip route add 0/0 via 192.168.0.4 table main
router># ip route add 192.168.3.0/24 via 192.168.0.3 table 1


  第一条命令是向主路由表(main table)即表254添加一条路由,路由的内容是设置192.168.0.4成为网关。
  第二条命令表明向路由表1添加一条路由,子网192.168.3.0(子网掩码是255.255.255.0)的网关是192.168.0.3。

 

  在多路由表的路由体系里,全部的路由的操做,例如网路由表添加路由,或者在路由表里寻找特定的路由,须要指明要操做的路由表,全部没有指明路由表,默认是对主路由表(表254)进行操做。而在单表体系里,路由的操做是不用指明路由表的。

规则的配置IP Rule

  在Linux里,总共能够定义 个优先级的规则,一个优先级别只能有一条规则,即理论上总共能够有 条规则。其中有3个规则是默认的。命令用法以下:
 

Usage: ip rule [ list | add | del ] SELECTOR ACTION
SELECTOR := [ from PREFIX ] [ to PREFIX ] [ tos TOS ]
[ dev STRING ] [ pref NUMBER ]
ACTION := [ table TABLE_ID ] [ nat ADDRESS ]
[ prohibit | reject | unreachable ]
[ flowid CLASSID ]
TABLE_ID := [ local | main | default | new | NUMBER


  首先咱们能够看看路由表默认的全部规则:

root@netmonster# ip rule list
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
<code>
  规则0,它是优先级别最高的规则,规则规定,全部的包,都必须首先使用local表(254)进行路由。本规则不能被更改和删除。
  规则32766,规定全部的包,使用表main进行路由。本规则能够被更改和删除。
  规则32767,规定全部的包,使用表default进行路由。本规则能够被更改和删除。

  在默认状况下进行路由时,首先会根据规则0在本地路由表里寻找路由,若是目的地址是本网络,或是广播地址的话,在这里就能够找到合适的路由;若是路由失败,就会匹配下一个不空的规则,在这里只有32766规则,在这里将会在主路由表里寻找路由;若是失败,就会匹配32767规则,即寻找默认路由表。若是失败,路由将失败。重这里能够看出,策略性路由是往前兼容的。

  还能够添加规则:
<code>
router># ip rule add [from 0/0] table 1 pref 32800
router >#ip rule add from 192.168.3.112/32 [tos 0x10] table 2 pref 1500 prohibit


  第一条命令将向规则链增长一条规则,规则匹配的对象是全部的数据包,动做是选用路由表1的路由,这条规则的优先级是32800。
  第二条命令将向规则链增长一条规则,规则匹配的对象是IP为192.168.3.112,tos等于0x10的包,使用路由表2,这条规则的优先级是1500,动做是prohibit。添加之后,咱们能够看看系统规则的变化。

router># ip rule
0: from all lookup local
1500 from 192.168.3.112/32 [tos 0x10] lookup 2
32766: from all lookup main
32767: from all lookup default
32800: from all lookup 1


  上面的规则是以源地址为关键字,做为是否匹配的依据的。除了源地址外,还能够用如下的信息:
  From -- 源地址
  To -- 目的地址(这里是选择规则时使用,查找路由表时也使用)
  Tos -- IP包头的TOS(type of sevice)域
  Dev -- 物理接口
  Fwmark -- 防火墙参数

 

  采起的动做除了指定表,还能够指定下面的动做:
   Table 指明所使用的表
   Nat 透明网关
   Action prohibit 丢弃该包,并发送 COMM.ADM.PROHIITED的ICMP信息
   Reject 单纯丢弃该包
   Unreachable丢弃该包, 并发送 NET UNREACHABLE的ICMP信息

策略性路由的应用

  基于源地址选路( Source-Sensitive Routing)
  若是一个网络经过两条线路接入互联网,一条是比较快的ADSL,另一条是比较慢的普通的调制解调器。这样的话,网络管理员既能够提供无差异的路由服务,也能够根据源地址的不一样,使一些特定的地址使用较快的线路,而普通用户则使用较慢的线路,即基于源址的选路。

  根据服务级别选路(Quality of Service)
  网络管理员能够根据IP报头的服务级别域,对于不一样的服务要求能够分别对待对于传送速率、吞吐量以及可靠性的有不一样要求的数据报根据网络的情况进行不一样的路由。

  节省费用的应用
  网络管理员能够根据通讯的情况,让一些比较大的阵发性通讯使用一些带宽比较高可是比较贵的路径一段短的时间,而后让基本的通讯继续使用原来比较便宜的基本线路。例如,管理员知道,某一台主机与一个特定的地址通讯一般是伴随着大量的阵发性通讯的,那么网络管理员能够安排一些策略,使得这些主机使用特别的路由,这些路由是按需拨号,带宽比较高的线路,通讯完成之后就中止使用,而普通的通讯则不受影响。这样既提升网络的性能,又能节省费用。

  负载平衡(Load Sharing)
  根据网络交通的特征,网络管理员能够在不一样的路径之间分配负荷实现负载平衡。

Linux下策略性路由的实现--RPDB(Routing Policy DataBase)

  在Linux下,策略性路由是由RPDB实现的。对于RPDB的内部机制的理解,能够加深对于策略性路由使用的理解。这里分析的是linux 2.4.18的RPDB实现的细节。主要的实现文件包括:
 

fib_hash.c
fib_rules.c
fib_sematic
fib_frontend.c
route.c


  RDPB主要由多路由表和规则组成。路由表以及对其的操做和其对外的接口是整个RPDB的核心部分。路由表主要由table,zone,node这些主要的数据结构构成。对路由表的操做主要包含物理的操做以及语义的操做。路由表除了向IP层提供路由寻找的接口之外还必须与几个元素提供接口:与用户的接口(即更改路由)、proc的接口、IP层控制接口、以及和硬件的接口(网络接口的改变会致使路由表内容的改变)。处在RDPB的中心的规则,由规则选取表。IP层并不直接使用路由表,而是经过一个路由适配层,路由适配层提供为IP层提供高性能的路由服务。

 

路由表(Fib Table)

  数据结构:
  在整个策略性路由的框架里,路由表是最重要的的数据结构,咱们在上面以及对路由表的概念和结构进行了清楚的说明。Linux里经过下面这些主要的数据结构进行实现的。
 

主要的数据结构 做用 位置
struct fib_table 路由表 ip_fib.h 116
struct fn_hash 路由表的哈希数据 fib_hash.c 104
struct fn_zone zone域 fib_hash.c 85
struct fib_node 路由节点 fib_hash.c 68
struct fib_info 路由信息 ip_fib.h 57
struct fib_result 路由结果 ip_fib.h 86


数据结构之间的主要关系以下。路由表由路由表号以及路由表的操做函数指针还有表数据组成。这里须要注意的是,路由表结构里并不直接定义zone域,而是经过一个数据指针指向fn_hash。只有当zone里有数据才会链接到fn_zone_list里。(如图)
系统的全部的路由表由数组变量*fib_tables[RT_TABLE_MAX+1]维护,其中系统定义RT_TABLE_MAX为254,也就是说系统最大的路由表为255张,全部的路由表的操做都是对这个数组进行的。。同时系统还定义了三长路由表*local_table; *main_table。

 

路由表的操做:

  Linux策略路由代码的主要部分是对路由表的操做。对于路由表的操做,物理操做是直观的和易于理解的。对于表的操做不外乎就是添加、删除、更新等的操做。还有一种操做,是所谓的语义操做,语义操做主要是指诸如计算下一条的地址,把节点转换为路由项,寻找指定信息的路由等。

  一、物理操做(operation):
  路由表的物理操做主要包括以下这些函数:
 

路由标操做 实现函数 位置
新建路由表
删除路由表
搜索路由 fn_hash_lookup fib_hash.c 269
插入路由到路由表 fn_hash_insert fib_hash.c 341
删除路由表的路由 fn_hash_delete
fn_hash_dump
fib_hash.c 433
fib_hash.c 614
更新路由表的路由 fn_hash_flush fib_hash.c 729
显示路由表的路由信息 fn_hash_get_info fib_hash.c 750
选择默认路由 fn_hash_select_default fib_hash.c 842


  二、语义操做(semantics operation):
  语义操做并不涉及路由表总体框架的理解,并且,函数名也是不言自明的,因此请你们参考fib_semantics.c。

 

  三、接口(front end)
  对于路由表接口的理解,关键在于理解那里有

  IP
  首先是路由表于IP层的接口。路由在目前linux的意义上来讲,最主要的仍是IP层的路由,因此和IP层的的接口是最主要的接口。和ip层的衔接主要是向IP层提供寻找路由、路由控制、寻找指定ip的接口。
 

Fil_lookup
ip_rt_ioctl fib_frontend.c 286;" f
ip_dev_find 145


  Inet
  路由表还必须提供配置接口,即用户直接操做路由的接口,例如增长和删除一条路由。固然在策略性路由里,还有规则的添加和删除。

inet_rtm_delroute 351
inet_rtm_newroute 366
inet_check_attr 335


  proc
  在/proc/net/route里显示路由信息。
  fib_get_procinfo

 

  四、网络设备(net dev event)
  路由是和硬件关联的,当网络设备启动或关闭的时候,必须通知路由表的管理程序,更新路由表的信息。
 

fib_disable_ip 567
fib_inetaddr_event 575
fib_netdev_event


  五、内部维护( magic)
  上面咱们提到,本地路由表(local table)的维护是由系统自动进行的。也就是说当用户为硬件设置IP地址等的时候,系统自动在本地路由表里添加本地接口地址以及广播地址。

fib_magic 417
fib_add_ifaddr 459
fib_del_ifaddr 498

 

Rule

  一、数据结构
  规则在fib_rules.c的52行里定义为 struct fib_rule。而RPDB里全部的路由是保存在101行的变量fib_rules里的,注意这个变量很关键,它掌管着全部的规则,规则的添加和删除都是对这个变量进行的。

  二、系统定义规则:
  fib_rules被定义之后被赋予了三条默认的规则:默认规则,本地规则以及主规则。
 

u 本地规则local_rule
94 static struct fib_rule local_rule = {
r_next: &main_rule, /*下一条规则是主规则*/
r_clntref: ATOMIC_INIT(2),
r_table: RT_TABLE_LOCAL, /*指向本地路由表*/
r_action: RTN_UNICAST, /*动做是返回路由*/
};

 

u 主规则main_rule
86 static struct fib_rule main_rule = {
r_next: &default_rule,/*下一条规则是默认规则*/
r_clntref: ATOMIC_INIT(2),
r_preference: 0x7FFE, /*默认规则的优先级32766*/
r_table: RT_TABLE_MAIN, /*指向主路由表*/
r_action: RTN_UNICAST, /*动做是返回路由*/
};

 

u 默认规则default rule
79 static struct fib_rule default_rule = {
r_clntref: ATOMIC_INIT(2),
r_preference: 0x7FFF,/*默认规则的优先级32767*/
r_table: RT_TABLE_DEFAULT,/*指默认路由表*/
r_action: RTN_UNICAST,/*动做是返回路由*/
};


  规则链的链头指向本地规则。

 

RPDB的中心函数fib_lookup

  如今到了讨论RPDB的实现的的中心函数fib_lookup了。RPDB经过提供接口函数fib_lookup,做为寻找路由的入口点,在这里有必要详细讨论这个函数,下面是源代码:
 

310 int fib_lookup(const struct rt_key *key, struct fib_result *res)
311 {
312 int err;
313 struct fib_rule *r, *policy;
314 struct fib_table *tb;
315
316 u32 daddr = key->dst;
317 u32 saddr = key->src;
318
321 read_lock(&fib_rules_lock);
322 for (r = fib_rules; r; r=r->r_next) {/*扫描规则链fib_rules里的每一条规则直到匹配为止*/
323 if (((saddr^r->r_src) & r->r_srcmask) ||
324 ((daddr^r->r_dst) & r->r_dstmask) ||
325 #ifdef CONFIG_IP_ROUTE_TOS
326 (r->r_tos && r->r_tos != key->tos) ||
327 #endif
328 #ifdef CONFIG_IP_ROUTE_FWMARK
329 (r->r_fwmark && r->r_fwmark != key->fwmark) ||
330 #endif
331 (r->r_ifindex && r->r_ifindex != key->iif))
332 continue;/*以上为判断规则是否匹配,若是不匹配则扫描下一条规则,不然继续*/

335 switch (r->r_action) {/*好了,开始处理动做了*/
336 case RTN_UNICAST:/*没有设置动做*/
337 case RTN_NAT: /*动做nat ADDRESS*/
338 policy = r;
339 break;
340 case RTN_UNREACHABLE: /*动做unreachable*/
341 read_unlock(&fib_rules_lock);
342 return -ENETUNREACH;
343 default:
344 case RTN_BLACKHOLE:/* 动做reject */
345 read_unlock(&fib_rules_lock);
346 return -EINVAL;
347 case RTN_PROHIBIT:/* 动做prohibit */
348 read_unlock(&fib_rules_lock);
349 return -EACCES;
350 }
351 /*选择路由表*/
352 if ((tb = fib_get_table(r->r_table)) == NULL)
353 continue;
/*在路由表里寻找指定的路由*/
354 err = tb->tb_lookup(tb, key, res);
355 if (err == 0) {/*命中目标*/
356 res->r = policy;
357 if (policy)
358 atomic_inc(&policy->r_clntref);
359 read_unlock(&fib_rules_lock);
360 return 0;
361 }
362 if (err < 0 && err != -EAGAIN) {/*路由失败*/
363 read_unlock(&fib_rules_lock);
364 return err;
365 }
366 }
368 read_unlock(&fib_rules_lock);
369 return -ENETUNREACH;
370 }


  上面的这段代码的思路是很是的清晰的。首先程序从优先级高到低扫描全部的规则,若是规则匹配,处理该规则的动做。若是是普通的路由寻址或者是nat地址转换的换,首先从规则获得路由表,而后对该路由表进行操做。这样RPDB终于清晰的显现出来了。

 

IP层路由适配(IP route)

  路由表以及规则组成的系统,能够完成路由的管理以及查找的工做,可是为了使得IP层的路由工做更加的高效,linux的路由体系里,route.c里完成大多数IP层与RPDB的适配工做,以及路由缓冲(route cache)的功能。

调用接口

  IP层的路由接口分为发送路由接口以及接收路由接口:

发送路由接口

  IP层在发送数据时若是须要进行路由工做的时候,就会调用ip_route_out函数。这个函数在完成一些键值的简单转换之后,就会调用 ip_route_output_key函数,这个函数首先在缓存里寻找路由,若是失败就会调用 ip_route_output_slow,ip_route_output_slow里调用fib_lookup在路由表里寻找路由,若是命中,首先在缓存里添加这个路由,而后返回结果。
 

ip_route_out route.h
ip_route_output_key route.c 1984;
ip_route_output_slow route.c 1690;"

 

接收路由接口

  IP层接到一个数据包之后,若是须要进行路由,就调用函数ip_route_input,ip_route_input如今缓存里寻找,若是失败则 ip_route_inpu调用ip_route_input_slow, ip_route_input_slow里调用fib_lookup在路由表里寻找路由,若是命中,首先在缓存里添加这个路由,而后返回结果。
 

ip_route_input_slow route.c 1312;" f
ip_route_input route.c 1622;" f

 

cache

  路由缓存保存的是最近使用的路由。当IP在路由表进行路由之后,若是命中就会在路由缓存里增长该路由。同时系统还会定时检查路由缓存里的项目是否失效,若是失效则清除。

 
 
 
http://www.tanpao.com/archives/26

Linux高级路由技术-实现双线服务器

19

背景:两个网卡,两条线路:电信和网通

之前:
         /eth0 3.3.3.2  ——> 3.3.3.1 router1
server
        \eth1 4.4.4.2  ——> 4.4.4.1 router2
 eth0 3.3.3.2 
 eth1 4.4.4.2
 共用一个网关: 3.3.3.1 
 缺点:只能有一个网关,没法智能判断线路来源。

实验拓扑图
 /eth0 —– eth0[Router_1]eth1 —– eth0\
Client                                                                       Server
 \eth1 —– eth0[Router_2]eth1 —– eth1/
Client
 eth0 1.1.1.2  vmnet1
 eth1 2.2.2.2  vmnet2

Router_1
 eth0 1.1.1.1  vmnet1
 eth1 3.3.3.1  vmnet3

Router_2
 eth0 2.2.2.1  vmnet2
 eth1 4.4.4.1  vmnet4

Server
 eth0 3.3.3.2  vmnet3
 eth1 4.4.4.2  vmnet4
须要运行vmware-config.pl增长这些虚拟网卡,类型为hostonly
1、Server配置:
 
# ifconfig eth0 3.3.3.2 netmask 255.255.255.0
# ifconfig eth1 4.4.4.2 netmask 255.255.255.0

设定前路由表
# ip route
4.4.4.0/24 dev eth1  proto kernel  scope link  src 4.4.4.2
3.3.3.0/24 dev eth0  proto kernel  scope link  src 3.3.3.2
10.1.1.0/24 dev eth2  proto kernel  scope link  src 10.1.1.138
169.254.0.0/16 dev eth2  scope link
default via 10.1.1.1 dev eth2  <—全部网卡公用一个网关

思路:是为两个网卡创建独立的路由表,他们有本身的网关
一、额外添加两个路由表
# ip route add 3.3.3.0 dev eth0 src 3.3.3.2  table 1
 <—新建路由条目,关于3.3.3.0网络的,放到一个编号为1的路由表
# ip route add default via 3.3.3.1 table 1
 <—为路由表 1 增长一个默认网关
# ip route list table 1
3.3.3.0 dev eth0  scope link  src 3.3.3.2
default via 3.3.3.1 dev eth0
# ip route add 4.4.4.0 dev eth1 src 4.4.4.2  table 2
# ip route add default via 4.4.4.1 table 2
# ip route list table 2
4.4.4.0 dev eth1  scope link  src 4.4.4.2
default via 4.4.4.1 dev eth1

二、设定main主路由表(ip route 看到的路由表)

# ip route add 3.3.3.0 dev eth0 src 3.3.3.2
# ip route add 4.4.4.0 dev eth1 src 4.4.4.2

三、设定默认路由
做用:给本身主动发数据包的时候选择一个默认的网关

若是原来存在默认网关,而不是你想设定的那个,那么先删除
# ip route del default via 10.1.1.1

# ip route add default via 3.3.3.1
四、设定路由规则,保证数据包从原网卡回去
# ip rule add from 3.3.3.2 table 1
 <— from 指定数据包的源IP
 <— 若是数据包的源IP是3.3.3.2,那么就使用路由表1里路由条目对数据包进行路由

# ip rule add from 4.4.4.2 table 2

路由器的配置:
 一、打开路由转发
 二、配置IP

客户端配置:
 一、配置IP
 二、网关根据实验改变
验证:
A:
一、把客户端的默认网关设置为1.1.1.1 ,模拟电信线路
二、ping 3.3.3.2 <–Server电信线路的IP
三、捉包
在router_1: tcpdump icmp -n -i eth1
在router_2:  tcpdump icmp -n -i eth1

B:
一、把客户端的默认网关设置为2.2.2.1 ,模拟电信线路
二、ping 4.4.4.2 <–Server网通线路的IP
三、捉包
在router_1: tcpdump icmp -n -i eth1
在router_2:  tcpdump icmp -n -i eth1

 
 
http://itoedr.blog.163.com/blog/static/12028429720135237643677/

linux路由工具:iproute2/iptables(路由配置实例)  

2013-06-23 19:07:01|  分类: 路由负载均衡 |  标签:路由方案  linuxk路由技术  |举报|字号 订阅

下载LOFTER客户端
 
 

一、ip route add 和 ip rule add to之间的区别

ip route add 是往main表中增长目的地址路由表项.ip route add*****此处只能以源地址来区分路由;


ip rule add to,往指定表增长目的地址路由表项. 咱们能够建多个表,能够以目标地址区分路由;
ip rule add from,往指定表中增长源地址路由表项 ;

2、Linux下基于路由策略的IP地址控制实例

 

1、背景描述

 

LINUX是一台网关服务器,内有3块网卡。

eth1绑定172.17.0.0/16的IP,该网段IP能够经过172.17.1.1上网。

eth0绑定192.168.10.0/24的IP,该网段IP能够经过192.168.10.1上网。

eth2绑定192.168.1.1,是内网用户的网关。

 

2、需求分析

 

内网用户应该走172.17.1.1这个路由上网。

但因为工做须要,部分用户应该有访问图中“专用网络”的权限。

也就是说,应该走192.168.10.1这个路由。

 

另一点,全部人应该能够访问FTP服务器,这个服务器的IP是192.168.10.96

也就是说,走172.17.1.1路由的人,也应该能访问192.168.10.96,且能够上网。

 

3、解决方案

 

要解决这个问题,用到了一下几个命令,具体使用方法须要另查资料。

ip route

ip rule

arp

 

注:关于ip命令的用法,请查阅ip中文手册。

 

一、绑定IP

ifconfig eth1 172.17.3.x netmask 255.255.0.0

ifconfig eth0 192.168.10.2 netmask 255.255.255.0

ifconfig eth2 192.168.1.1 netmask 255.255.255.0

而后分别修改/etc/sysconfig/network-script/ifcfg-ethx文件,以使计算机启动自动设置IP地址。 

在ubuntu下,使用interfaces来定义;

 

 

二、建立特殊路由表(手中建立)

vi /etc/iproute2/rt_table

代码:

 

#

# reserved values

#

255 local

254 main

253 default

0 unspec

 

200 NET10

#

# local

#

#1 inr.ruhep

 

 

上面那个200 NET10为新添加,自定义编号为200,名字为NET10

 

三、向NET10路由中添加它本身的默认路由。

代码:

 

ip route add default via 192.168.10.1 table NET10

 

 

注意,这个table NET10必定不要忘了写,不然写到了主路由表中。

 

四、建立特殊路由规则

 

用ip rule能够看到计算机当前的路由规则。

引用:

 

0: from all lookup local

32766: from all lookup main

32767: from all lookup default

 

 

能够看到,规则中走了3个路由表,local、main、default

咱们日常用route看到的,实际是路由表main

这些规则是按序号大小顺序走的,一个不一样,则走下一个,知道通路或走完为止。

开始添加咱们本身的路由NET10到路由表中。

代码:

 

ip rule add from 192.168.1.222 pref 10000 table NET10

 

 

这个意思是说,若是来自IP地址为192.168.1.222的访问,则启用NET10的路由表中的路由规则。

而NET10的路由规则是什么呢?上面已经设置了,走的是192.168.10.1的网段。

接下来,使LINUX能够NAT(这里再也不细说HOW TO了)

 

五、让全部人能够访问192.168.10.xx(这个IP不便说出来)

 

由于其他人都走了172.17.1.1这个路由,因此他们是没法访问192.168.10.xx的 。

怎么才能实现呢?再添加个策略就能够了!

代码:

 

ip rule add to 192.168.10.xx pref 10001 table NET10

 

 

这句话的意思是说,全部人,若是目的IP是192.168.10.xx,则临时使用NET10的路由表。

这样作,安全会不会有安全问题呢?路由变了,他们会不会访问到专用网络呢?

不会的,由于路由规则是to 192.168.10.xx,也就是目标是96时,才该路由的,访问别的网站仍是走原来的路由。

若是说访问到专用网络的机器,也就只有10.xx这一台而已。

这里,咱们还能够作一个小技巧,不告诉别人192.168.10.xx的地址,只告诉他们网关192.168.1.1上有这个服务

iptables -t nat -A PREROUTING -d 192.168.1.1/32 --dport 21 -j DNAT --to 192.168.10.xx:21

 

六、防止其余人篡改IP地址而得到特殊权限

 

arp有个静态功能CM,不是C,你们可能知道。

若是给一个IP地址强行绑定一个非他本身的MAC,会怎么样呢?双方会话将会失败!

好,咱们来利用这一点!

 

首先,我写了一个文件iproute.c

代码:

 

#include

#include

main ()

{

int i;

for(i=2;i<255;i++)

printf("192.168.1.%d\t\t00:00:00:00:00:00\n",i);

}

 

 

gcc iproute.c -o iproute

将编译出一个可执行文件

注:不该该包括主机IP地址自己,因此从2循环到254(255是广播)

 

其次,生成一个C的IP地址和全为00的MAC地址。

代码:

 

./iproute > /etc/ethers

 

 

 

再次,修改IP-MAC匹配列表。

vi /etc/ethers

具体怎么该我就不用细说了,相信你们都会。

 

最后,作静态IP-MAC绑定。

arp -f

 

七、为了安全,创建防火墙,修改main路由表

 

默认的路由表应该有192.168.10.0/24和172.17.0.0/16网段的内容,为了安全,能够去掉。

参考实例:

ip route add 58.14.0.0/15 via 192.168.33.1 table cnline

此处会新建路由表cnline;ip route add 58.16.0.0/16 via 192.168.33.1 table cnline

ip route del default #操做的是路由表main; ip route add default via 192.168.33.1 #也给主路由表main加上了cnline相同的网关,单网卡状况,只能如此,多网卡便可出于不一样网卡了,使用ebtables也能够实现相似功能; ip rule add from 192.168.2.6 pref 1000 lookup cnline #表示主机源192.168.2.6的请求都去cnline表的规定路由; ip rule add from 192.168.2.4 pref 1000 lookup cnline ip rule add from 192.168.2.32 pref 1000 lookup cnline ip rule add to 10.10.10.189 pref 1000 lookup cnline      #即去目标地址为10.10.10.189的数据包也在cnline中找出路;其中lookup能够省去,不过笔者喜欢写着,意义更明确。
相关文章
相关标签/搜索