导航

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

Posted on 2018-11-22 16:55  ricks  阅读(2673)  评论(0编辑  收藏  举报

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

    #!/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是高级路由,能实现不同条件路由的转发。

linux系统维护了路由表,用ip rule show可以查看路由表。

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

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

255 local
254 main
253 default
0 unspec

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

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

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 mytable1

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 命令
 

目录(?)[+]

 

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源地址来选择路由转发路径从而让系统管理员能轻松做到:
1、 管制某台计算机的带宽。
2、 管制通向某台计算机的带宽
3、 帮助你公平地共享带宽
4、 保护你的网络不受DOS的攻击
5、 保护你的Internet不受到你的客户的攻击
6、 把多台服务器虚拟成一台,并进行负载均衡或者提高可用性
7、 限制你的用户访问某些计算机
8、 限制对你的计算机的访问
9、 基于用户帐号、MAC地址、源IP地址、端口、QOS《TOS》、时间或者content等进行路由

 

一、高级路由的基础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路由应用-使用策略路由实现访问控制

 

目录(?)[+]

 

引:

一般而言,访问控制并不是路由模块完成的,而是防火墙的职责,如果你使用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)和周六、日全天开放。而且,内网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-eth1、ifcfg-eth2、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 、int2、int3、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://lartc.org/
ip命令主要用于配置接口,ARP,tunnel(隧道)以及策略路由等等。
tc命令主要用于配置流量控制和策略管理,两者可以单独使用,也可以相互结合使用。
二、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的策略路由功能。
 
三、策略路由的实现
在实现策略路由的内核上必须支持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
 
 
四、策略路由配置实例
 
实验拓扑如下:
 
1、创建两个表,分别为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
 
2、添加相关路由至两个表中。
 
3、实现负载均衡。
 
策略路由总结:
1、添加路由表,编号至系统中。
2、添加具体的路由条目并指向用户自定义的路由表中(如默认路由)。
3、添加具体的规则至路由表中,如什么样的源地址以及对应的优先级。
4、在路由表中通过nexthop参数实现负载均衡,或者可以为数据打mask,然后设置标记1的数据从哪个表走,标记2的数据从哪个表。
 
Linux下网通、电信、教育多出口策略路由配置详解
一、处理流量分割的问题;二、解决双线负载均衡的问题。原文如下:
1、流量分割
首先是如何保证:回应来自某一个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路由出去。
2、负载均衡
第二个问题就是如何对通过两个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的功能模拟。
我们仍然以文章开始的实例来进行说明基于目的的策略路由设置。
1、首先建立通向不同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
没什么可说的,与前面相同,只是仅用数字表示路由表。
2、针对我们要访问的目标地址,选择不同的路由表,进行路由
因为有大量的网络地址需要设置不同的规则,采用命令模式不便于修改,所以做了一个简单的脚本文件,配置文件与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 3、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策略路由代码的主要部分是对路由表的操作。对于路由表的操作,物理操作是直观的和易于理解的。对于表的操作不外乎就是添加、删除、更新等的操作。还有一种操作,是所谓的语义操作,语义操作主要是指诸如计算下一条的地址,把节点转换为路由项,寻找指定信息的路由等。

  1、物理操作(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


  2、语义操作(semantics operation):
  语义操作并不涉及路由表整体框架的理解,而且,函数名也是不言自明的,所以请大家参考fib_semantics.c。

 

  3、接口(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

 

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

fib_disable_ip 567
fib_inetaddr_event 575
fib_netdev_event


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

fib_magic 417
fib_add_ifaddr 459
fib_del_ifaddr 498

 

Rule

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

  2、系统定义规则:
  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
一、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  <—所有网卡公用一个网关

思路:是为两个网卡建立独立的路由表,他们有自己的网关
1、额外添加两个路由表
# 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

2、设定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

3、设定默认路由
作用:给自己主动发数据包的时候选择一个默认的网关

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

# ip route add default via 3.3.3.1
4、设定路由规则,保证数据包从原网卡回去
# 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

路由器的配置:
 1、打开路由转发
 2、配置IP

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

B:
1、把客户端的默认网关设置为2.2.2.1 ,模拟电信线路
2、ping 4.4.4.2 <–Server网通线路的IP
3、捉包
在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客户端
 
 

1、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地址控制实例

 

一、背景描述

 

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,是内网用户的网关。

 

二、需求分析

 

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

但由于工作需要,部分用户应该有访问图中“专用网络”的权限。

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

 

另外一点,所有人应该可以访问FTP服务器,这个服务器的IP是192.168.10.96

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

 

三、解决方案

 

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

ip route

ip rule

arp

 

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

 

1、绑定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来定义;

 

 

2、创建特殊路由表(手中创建)

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

 

3、向NET10路由中添加它自己的默认路由。

代码:

 

ip route add default via 192.168.10.1 table NET10

 

 

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

 

4、创建特殊路由规则

 

用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了)

 

5、让所有人可以访问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

 

6、防止其他人篡改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

 

7、为了安全,建立防火墙,修改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可以省去,不过笔者喜欢写着,意义更明确。