iproute

1052 查看

iproute基本介绍

iproute是用于linux下网络配置工具,该工具包包含以下组件

# rpm -ql  iproute | grep bin
/sbin/cbq         #流量控制
/sbin/ifcfg           #网络地址配置管理
/sbin/ip          #网络配置命令
/sbin/rtmon           #rtmon listens on netlink socket and monitors routing table changes.
/sbin/tc          #进行流量控制的命令
/usr/sbin/arpd        #收集arp信息保存到本地cache daemon
/usr/sbin/lnstat  #网络统计信息
/usr/sbin/nstat       #显示网络统计信息
/usr/sbin/rtacct  #查看数据包流量状态
【nstat and rtacct are simple tools to monitor kernel snmp counters and network interface statistics.】
/usr/sbin/ss      #类似netstat命令,显示活动连接

iproute的中心是ip这个命令,类似arpifconfigroute命令虽然这些工具能够工作,但是在Linux2.2和更高版本的内核上就有点out了。

ip基本使用方法

# ip --help
Usage: ip [ OPTIONS ] OBJECT { COMMAND | help }
       ip [ -force ] -batch filename
where  OBJECT := { link | addr | addrlabel | route | rule | neigh | ntable |
                   tunnel | maddr | mroute | mrule | monitor | xfrm }
       OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] |
                    -f[amily] { inet | inet6 | ipx | dnet | link } |
                    -o[neline] | -t[imestamp] | -b[atch] [filename] |
                    -rc[vbuf] [size]}

OBJECT

  • link 指网络设备,通过此对象命令,我们可以查看及更改网络设备的属性。
  • addr 地址管理
  • neigh arp表管理
  • route 路由管理
  • rule 路由策略
  • maddr 多址广播地址
  • mroute 多播路由缓存管理
  • tunnel 通道管理
# ip -V      #打印iproute信息
ip utility, iproute2-ss091226

显示链路信息

# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
    link/ether 00:0c:29:3b:9c:6f brd ff:ff:ff:ff:ff:ff
# ip link show dev eth0
2: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
    link/ether 00:0c:29:3b:9c:6f brd ff:ff:ff:ff:ff:ff

显示IP地址

# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
    link/ether 00:0c:29:3b:9c:6f brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.10/24 brd 192.168.0.255 scope global eth0

显示路由ip route [类似route -n]

# ip route | column -t
192.168.0.0/24  dev  eth1          scope  link
10.2.0.0/16     dev  eth2          proto  kernel  scope  link  src  10.2.0.111
default         via  10.2.255.254  dev    eth2
# ip route del 192.168.0.0/24 dev eth1
# ip route add 192.168.0.0/24 dev eth1
# ip route del via 10.2.255.254  //删除默认路由
# ip route add via 10.2.255.254  //增加默认路由
# ip route add 192.168.1.0/24 via 192.168.0.1  //增加静态路由,192.168.0.1为下一跳地址
# ip route del 192.168.1.0/24 via 192.168.0.1  //删除静态路由

显示arp信息ip neigh [可以取代arp -n],删除则是ip neigh del IP地址 dev 设备名

路由策略数据库

如果你有一个大规模的路由器,需要同时满足不同用户对于路由的不通需求,路由策略数据库可以帮你通过多路由表技术来实现。当内核需要做出路由选择时,它会找出应该参考哪一张路由表。除了ip外,route也可以修改main和local表。

默认规则

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

上面列出了规则的优先顺序。ip route命令默认显示的就是main表。ip route show table all显示所有规则中的表

# ip route list table local
broadcast 192.168.0.255 dev eth0  proto kernel  scope link  src 192.168.0.10
broadcast 10.2.0.0 dev eth1  proto kernel  scope link  src 10.2.0.217
broadcast 127.255.255.255 dev lo  proto kernel  scope link  src 127.0.0.1
... ...

default表为空

例 简单策略路由添加 [引用自Linux高级路由中文HOWTO]

让我们再来一个真实的例子。我有两个Cable Modem,连接到了一个 Linux的NAT (“伪装”) 路由器上。这里的室友们向我付费使用Internet。假如我其中的一个室友因为只想访问 hotmail 而希望少付一些钱。对我来说这没有问题,他们肯定只能使用那个比较次的Cable Modem。

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

local 表:

[ahu@home ahu]$ ip route list table local
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
local 10.0.0.1 dev eth0 proto kernel scope host src 10.0.0.1
broadcast 10.0.0.0 dev eth0 proto kernel scope link src 10.0.0.1
local 212.64.94.251 dev ppp0 proto kernel scope host src 212.64.94.251
broadcast 10.255.255.255 dev eth0 proto kernel scope link src 10.0.0.1
broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1
local 212.64.78.148 dev ppp2 proto kernel scope host src 212.64.78.148
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1

让我们看看“main”路由表:

[ahu@home ahu]$ ip route list table main
195.96.98.253 dev ppp2 proto kernel scope link src 212.64.78.148
212.64.94.1 dev ppp0 proto kernel scope link src 212.64.94.251
10.0.0.0/8 dev eth0 proto kernel scope link src 10.0.0.1
127.0.0.0/8 dev lo scope link
default via 212.64.94.1 dev ppp0

我们现在为我们的朋友创建了一个叫做“John”的规则。其实我们完全可以使用纯数字表示规则,但是不方便。我们可以向/etc/iproute2/rt_tables文件中添加数字与名字的关联:

# echo 200 John >> /etc/iproute2/rt_tables
# ip rule add from 10.0.0.10 table John
# ip rule
0:    from all lookup local 
32765:  from 10.0.0.10 lookup John
32766:    from all lookup main
32767:    from all lookup default

现在,剩下的事情就是为 John 的路由表创建路由项了。别忘了刷新路由缓存:

# ip route add default via 195.96.98.253 dev ppp2 table John
# ip route flush cache

总结主要是以下几步:

echo 200 John >> /etc/iproute2/rt_tables #方便表示,把规则名字和数字对应加入到/etc/iproute2/rt_tables文件
ip rule add from 10.0.0.10 table John #新增规则
ip route add default via 195.96.98.253 dev ppp2 table John #规则中添加路由表
ip route flush cache #刷新路由表