Linux IP 命令详细介绍
2018-01-10 16:09:36 阿炯

如今很多系统管理员依然通过组合使用诸如ifconfig、route、arp和netstat等命令行工具(统称为net-tools)来配置网络功能,解决网络故障。net-tools起源于BSD的TCP/IP工具箱,后来成为老版本Linux内核中配置网络功能的工具。但自2001年起,Linux社区已经对其停止维护。同时,一些Linux发行版比如Arch Linux和CentOS/RHEL 7则已经完全抛弃了net-tools,只支持iproute2。

作为网络配置工具的一份子,iproute2是linux下管理控制TCP/IP网络和流量控制的新一代工具包,旨在替代老派的工具链net-tools,即大家比较熟悉的ifconfig、arp、route、netstat等命令。net-tools通过procfs(/proc)和ioctl系统调用去访问和改变内核网络配置,而iproute2则通过netlink套接字接口与内核通讯。抛开性能而言,net-tools的用法给人的感觉是比较乱,而iproute2的用户接口相对net-tools来说相对来说,更加直观。比如各种网络资源(如link、IP地址、路由和隧道等)均使用合适的对象抽象去定义,使得用户可使用一致的语法去管理不同的对象。更重要的是,到目前为止,iproute2仍处在持续开发中。

所以,net-tools和iproute2都需要去学习掌握了。如果你仍在使用net-tools,而且尤其需要跟上新版Linux内核中的最新最重要的网络特性的话,那么是时候转到iproute2的阵营了,原因就在于使用iproute2可以做很多net-tools无法做到的事情。

对于那些想要转到使用iproute2的用户,有必要了解下面有关net-tools和iproute2的众多对比,iproute2的核心命令是ip。linux的ip命令和ifconfig类似,但前者功能更强大,并旨在取代后者。使用ip命令,只需一个命令,你就能很轻松地执行一些网络管理任务。ifconfig是net-tools中已被废弃使用的一个命令,许多年前就已经没有维护了。iproute2套件里提供了许多增强功能的命令,ip命令即是其中之一。


如果只想快速找到ip系列命令的用法,可点击这里到文章的后部。




首先先了解传统的网络配置命令:

即时生效(重启后失效): ifconfig eth0 192.168.1.102 netmask 255.255.255.0  //添加IP地址
route add default gw 192.168.1.1   //添加网关
启动生效: vim /etc/sysconfig/network-scripts/ifcfg-eth0
 IPADDR=192.168.1.102  //添加IP地址
 NETMASK=255.255.255.0 //掩码
 GATEWAY=192.168.1.1 //添加网关

注:BOOTPROTO只有在static(静态)模式下才可以使用设置的IP信息,修改dns vim /etc/resolv.conf 修改后可即时生效,启动同样有效。加入'nameserver= w.x.y.z'最多可有三个,作为上一个失败后的候选。

修改host name,即时生效: hostname freeoa
启动生效: vim /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=zh.freeoa.net



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.iproute2

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 ifconfig eth0 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 这个命令等于传统的 ifconfig eth0

5.0 ip address

5.1 ip address add-添加一个新的协议地址. 缩写:add、a

ip addr add ip_address/net_prefix brd + devinterface

net_prefix隐含指定了子网掩码,brd +表明是标准的广播地址。需要了解的一点是,通过ip addr可以非常容易地给一块网卡添加多个地址,ifconfig同样可以,是通过叫做“IP别名”的方式做到的。

示例1:为每个地址设置一个字符串作为标签。为了和Linux-2.0的网络别名兼容,这个字符串必须以设备名开头,接着一个冒号,ip addr add local 192.168.4.1/28 brd + label eth0:1 dev eth0 等价于 ifconfig eth0:5 192.168.4.1/28,或就直接绑在网卡上不用另起别名:ip addr add local 192.168.4.1/28 dev eth0

示例2:在以太网接口eth0上增加一个地址192.168.20.0,掩码长度为24位(255.255.255.0),标准广播地址,标签为 eth0:Alias: ip addr add 192.168.4.2/24 brd + dev eth1 label eth1:1 这个命令等于传统的:ifconfig eth1:1 192.168.4.2/24

5.2 ip address delete-删除一个协议地址. 缩写:delete、del、d ip addr del 192.168.4.1/24 brd + dev eth0 label eth0:Alias

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"

删除网络设备的IP地址
使用net-tools:
貌似没有什么好办法:ifconfig eth0 0
就IP地址的移除而言,除了给接口分配全0地址外,net-tools没有提供任何合适的方法来移除网络接口的IPv4地址。

使用iproute2:ip addr del ip_address/net_prefix dev interface

此外iproute2提供了ip addr flush可以一次性删除一个网络设备的所有地址:ip addr flush dev eth0

默认的,这条命令会删除IPv4和IPv6的地址,如果想分别删除,可以通过分别指定-4和-6选项。

显示网络接口的IPv6地址
net-tools:  ifconfig eth1
iproute2:  ip -6 addr show dev eth1

移除网络设备的IPv6地址
net-tools: ifconfig eth1 inet6 del 2002:0db5:0:f102::1/64
iproute2: ip -6 addr del 2002:0db5:0:f102::1/64 dev eth1

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 -- 替换一个已有的条目

添加或删除静态ARP项
net-tools:
arp -s 192.168.1.100 00:0c:29:c0:5a:ef
arp -d 192.168.1.100

iproute2:
ip neigh add 192.168.1.100 lladdr 00:0c:29:c0:5a:ef dev eth0
ip neigh del 192.168.1.100 dev eth0

缩写: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

6.3.show-显示网络邻居的信息(等同于arp -an)。缩写:show、list、sh、ls
示例1: ip -s n ls
10.1.0.107 dev eth1 lladdr 64:cc:00:69:3d:67 used 82546/82606/5138 probes 0 STALE
172.18.0.2 dev eth0 lladdr 0a:00:11:00:00:13 ref 1 used 42/0/23 probes 1 REACHABLE

ip neighbour
10.1.0.159 dev eth1 lladdr a0:3b:e3:ce:ae:6a STALE
10.1.0.118 dev eth1 lladdr 20:ab:37:26:56:f6 STALE

6.4.ip neighbour flush-清除邻接条目。缩写:flush、f
示例1: (-s 可以显示详细信息) ip -s -s n f 10.1.0.150
10.1.0.150 dev eth1 lladdr 00:90:9e:9a:a8:b4 used 86044/75058/71527 probes 0 STALE
*** Round 1, deleting 1 entries ***
*** Flush is complete after 1 round ***

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

ip route add default via 192.168.1.2 dev eth0
ip route replace default via 192.168.1.2 dev eth0

示例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
ip route get 10.1.0.1
10.1.0.1 dev eth1  src 10.1.0.53
    cache


ip [option] [动作] [命令]

参数:
option :设定的参数,主要有:
 -s :显示出该设备的统计数据(statistics),例如总接受封包数等

动作:就是是可以针对哪些网络参数进行动作,包括有:
 link :关于设备 (device) 的相关设定,包括 MTU, MAC 地址等等
 addr/address :关于额外的 IP 设定,例如多 IP 的实现等等
 route :与路由有关的相关设定

由上面的语法我们可以知道, ip 除了可以设定一些基本的网络参数之外,还能够进行额外的 IP 设定, 包括多 IP 的实现,真是太完美了!下面我们就分三个部分 (link, addr, route) 来介绍这个 ip 命令。

---------------
关于设备(device) 的设定: ip link

ip link 可以设定与设备 (device) 有关的相关设定,包括 MTU 以及该网络设备的 MAC 等等, 当然也可以启动 (up) 或关闭 (down) 某个网络设备。整个语法是这样的:
# ip [-s] link show <== 单纯的查阅该设备相关的信息
# ip link set [device] [动作与参数]

参数:
show:仅显示出这个设备的相关内容,如果加上 -s 会显示更多统计数据;
set :可以开始设定项目, device 指的是 eth0, eth1 等等设备代号;

动作与参数:包括以下动作:
   up|down:启动 (up) 或关闭 (down) 某个设备,其他参数使用预设的以太网参数;
   address:如果这个设备可以更改 MAC ,用这个参数修改;
   name:给予这个设备一个特殊的名字;
   mtu:设置最大传输单元。

示例一:显示出所有的设备信息
# ip link show
1: lo: <LOOPBACK,UP,10000> mtu 16436 qdisc noqueue
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,10000> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:50:fc:22:9a:cb brd ff:ff:ff:ff:ff:ff

# ip -s link show eth0

使用 ip link show 可以显示出整个设备的硬件相关信息,如上所示,包括 MAC地址、MTU等等,lo 及 sit0 都是主机内部自行设定的。 而如果加上 -s 的参数后,则这个网卡的相关统计信息就会被列出来,包括接收 (RX) 及传送 (TX) 的封包数量等等,详细的内容与 ifconfig 所输出的结果相同。还有类似指令:ip -4 addr show scope global

示例二:启动、关闭与设定设备的相关信息

# ip link set eth0 up
# 启动eth0这个设备;

# ip link set eth0 down
# 关闭eth0这个设备;

# ip link set eth0 mtu 1000
# 更改 MTU为1000 bytes,单位就是 bytes 。

更新网卡的 MTU 使用 ifconfig 也可以实现。如果是要更改『网卡代号、 MAC 地址的信息』的话,那可就得使用 ip了,设定前需要先关闭该网卡,否则会不成功。 如下所示:

示例三:修改网卡代号、MAC 等参数

# ip link set eth0 name freeoa
SIOCSIFNAME: Device or resource busy

# 因为该设备目前是启动的,所以不能这样做设定。你应该要这样做:
# ip link set eth0 down       <==关闭设备
# ip link set eth0 name freeoa <==重新设定
# ip link show                <==查看信息

2. freeoa: <BROADCAST,MILTICASE> mtu 900 qdisc pfifo_fast qlen 1000
    link/ehter 00:33:d0:13:c3:46 brd ff:ff:ff:ff:ff:ff

# ip link set freeoa name eth0 <==设备改回来
# ip link set eth0 address aa:aa:aa:aa:aa:aa
# ip link show eth0

如果网卡支持MAC更改的话,那么上面这个命令就可以更改你的网卡MAC了。

在这个设备的硬件相关信息设定,上面包括 MTU, MAC 以及传输的模式等等,都可以在这里设定。有趣的是那个 address 的项目,那个项目后面接的可是MAC地址而不是IP地址很容易搞错。

---------------
关于额外 IP 的设定: ip address

如果说 ip link 是与 OSI 七层模型的第二层数据链路层有关的话,那么 ip address (ip addr) 就是与第三层网络层有关的了。主要是在设定与 IP 有关的各项参数,包括 netmask, broadcast 等等。

# ip address show   <==查看IP参数
# ip address [add|del] [IP参数] [dev 设备名] [相关参数]

参数:
show  :单纯的显示出设备的 IP 信息;
add|del :进行相关参数的增加 (add) 或删除 (del) 设定,主要有:
IP 参数 :主要就是网域的设定,例如 192.168.100.100/24 之类的设定;
dev :这个 IP 参数所要设定的设备,例如 eth0, eth1 等等;

相关参数:如下所示:
broadcast:设定广播位址,如果设定值是 + 表示让系统自动计算;
label    :该设备的别名,例如eth0:0;
scope    :这个设备的领域,通常是以下几个大类:
    global :允许来自所有来源的连线;
    site   :仅支持IPv6 ,仅允许本主机的连接;
    link   :仅允许本设备自我连接;
    host   :仅允许本主机内部的连接;

所以当然是使用 global 了,默认也是 global。

示例一:显示出所有设备的 IP 参数:
# ip address show

下面我们进一步来新增虚拟的网络设备:
示例二:新增一个设备,名称假设为 eth0:freeoa

# ip address add 192.168.50.50/24 broadcast + dev eth0 label eth0:freeoa

# ip address show eth0
    inet 192.168.50.50/24 brd 192.168.50.255 scope global eth0:freeoa

看上面的输出多出了一行,增加了新的设备,名称是 eth0:freeoa,至于那个 broadcast + 也可以写成 broadcast 192.168.50.255 。

# ifconfig
eth0:vbir Link encap:Ethernet HWaddr 00:40:D0:13:C3:46

示例三:将刚刚的设备删除
# ip address del 192.168.50.50/24 dev eth0

删除比较简单。

---------------
关于路由的设定: ip route

这个项目就是路由的查看与设定。事实上ip route 的功能几乎与 route 这个命令一样,但它还可以进行额外的参数设置,例如 MTU 的规划等等,相当的不错。

# ip route show <==单纯的显示出路由的设定
# ip route [add|del] [IP或网域] [via gateway] [dev 设备]

参数:
show :单纯的显示出路由表,也可以使用 list ;
add|del :增加 (add) 或删除 (del) 路由;
    IP或网域:可使用 192.168.50.0/24 之类的网域或者是单纯的 IP ;
    via:从那个 gateway 出去,不一定需要;
    dev:由那个设备连出去,需要;
    mtu:可以额外的设定 MTU 的数值;

示例一:显示出目前的路由资料
# ip route show
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.2
169.254.0.0/16 dev eth1 scope link
default via 192.168.1.254 dev eth1

如上表所示,最简单的功能就是显示出目前的路由信息,其实跟 route 这个命令相同。必须注意的几点:
proto:此路由的路由协定,主要有 redirect, kernel, boot, static, ra 等, 其中 kernel 指的是直接由核心判断自动设定。
scope:路由的范围,主要是 link ,是与本设备有关的直接连接。

再来看一下如何进行路由的增加与删除。

示例二:增加路由,主要是本机直接可沟通的网域
# ip route add 192.168.5.0/24 dev eth0

针对本机直接沟通的网域设定好路由,不需要透过外部的路由器
# ip route show
192.168.5.0/24 dev eth0 scope link
....以下省略....

示例三:增加可以通往外部的路由,需透过 router
# ip route add 192.168.10.0/24 via 192.168.5.100 dev eth0
# ip route show
192.168.5.0/24 dev eth0 scope link
....其他省略....
192.168.10.0/24 via 192.168.5.100 dev eth0

看仔细,因为我有 192.168.5.0/24 的路由存在 (与我的网卡直接相关),所以才可以将 192.168.10.0/24 的路由丢给 192.168.5.100,由那台主机来帮忙传递,与之前提到的 route 命令是一样的限制。

示例四:增加预设路由
# ip route add default via 192.168.1.2 dev eth0
# 那个 192.168.1.2 就是我的预设路由器(gateway);记住,只要一个预设路由就OK了。

示例五:删除路由
# ip route del 192.168.10.0/24
# ip route del 192.168.5.0/24

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

高级路由即基于策略的路由比传统路由在功能上更强大,使用也更灵活,它不仅能够根据目的地址来转发路径而且也能够根据报文大小、应用或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个路由表,系统维护了4个路由表:
0#表 系统保留表
253#表 defulte table 没特别指定的默认路由都放在改表
254#表 main table 没指明路由表的所有路由放在该表
255#表 locale table 保存本地接口地址,广播地址、NAT地址 由系统维护,用户不得更改

路由表的查看可有以下二种方法:
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 在一号表中添加默认路由为192.168.1.1
ip route add 192.168.0.0/24 via 192.168.1.2 table 1 在一号表中添加一条到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 刷新路由缓冲
可参数解析如下:
  From -- 源地址
  To -- 目的地址(这里是选择规则时使用,查找路由表时也使用)
    Tos -- IP包头的TOS(type of sevice)域Linux高级路由-
    Dev -- 物理接口
    Fwmark -- iptables标签
  采取的动作除了指定路由表外,还可以指定下面的动作:
  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 ]

策略性路由

策略性是指对于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开发的。这里简单介绍策略性路由的配置方法,详细的使用方法请参考Alexey Kuznetsov写的 ip-cfref文档。策略性路由的配置主要包括接口地址的配置、路由的配置、规则的配置。

基于策略的路由比传统路由在功能上更强大,使用更灵活,它使网络管理员不仅能够根据目的地址而且能够根据报文大小、应用或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 rule list
0: from all lookup local
32766: from all lookup main
32767: from all lookup default

规则0,它是优先级别最高的规则,规则规定,所有的包,都必须首先使用local表(254)进行路由。本规则不能被更改和删除。
规则32766,规定所有的包,使用表main进行路由。本规则可以被更改和删除。
规则32767,规定所有的包,使用表default进行路由。本规则可以被更改和删除。

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

策略性路由的应用

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

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

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

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

路由表的查看可有以下两种方法:
#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;刷新路由缓冲。
 
网卡捆绑(网关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/bonding/bond0 查看bond信息
 
网桥(Linux+多网卡)

配置工具 brctl http://bridge.sourceforge.net/ ,源码包名:bridge-utils-*形式。
安装第一步:autoconf 后类同于源码包安装。

示例:linux+二网卡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 还需进一步的加强学习和实践的应用。

------------------------------
iproute2 ip 命令速查

ip地址管理

1.显示ip地址
ip a
ip address show
ip addr show dev eth0
ip a sh eth0

2.增加删除地址
ip address add 192.0.2.1/24 dev eth0
ip addr del 192.0.2.2/24 dev eth0

3.显示接口统计
ip -s link ls eth0

网卡和链路配置

4.显示链路
ip link show
ip link sh eth0

4.修改接口状态
ip link set eth0 up
ip link s gre01 down

路由表管理

5.显示路由表
ip route
ip ro show dev gre01

6.增加新路由
ip route add 10.2.2.128/27 dev gre01

7.增加默认路由
ip route add default via 192.168.1.1

8.修改默认路由
ip route chg default via 192.168.1.2

9.删除默认路由
ip route del default

隧道配置

10.增加删除GRE隧道
ip tunnel add gre01 mode gre local 10.1.1.1 remote 20.2.2.1 ttl 255
ip tunnel del gre01

11.IPIP隧道
ip tunl a ipip01 mode ipip local 10.1.1.1 remote 20.2.2.1 ttl 255

12.显示隧道
ip tunnel show

13.显示隧道统计
ip -s tunl ls gre01

邻居和arp表管理

13.查看arp表
ip neigh show

14.手工增加删除arp项
ip neighbor add 10.2.2.2 dev eth0
ip neigh del 10.2.2.1 dev eth0

15.socket统计

显示当前监听:ss -l
显示当前监听的进程:ss -p

#常用命令
ip link show #显示链路
ip addr show #显示地址(或ifconfig)
ip route show #显示路由(route -n)
ip neigh show #显示arp表(ping 192.168.95.50,如果主机在同一局域网内,直接加到arp表)
ip neigh delete 192.168.95.50 dev eth0 #删除arp条目,条目仍然存在状态为stale,下次通信需要确认
ip rule show #显示缺省规则
ip route del default dev eth0 #删除接口路由
ip route show table local #查看本地静态路由
ip route show table main #查看直连路由

#添加静态路由
ip route add 10.0.0.0/24 via 192.168.92.129
ip route add 10.10.10.10 via 192.168.92.129
ip route add 172.31.100.0/24 dev eno167
ip route add 172.32.0.2 dev eno167

#查看路由表
ip route show table main

#删除
ip route del 10.0.0.0/24
ip route del 10.10.10.10
ip route del 172.31.100.0/24
ip route del 172.32.0.2

#再次查看路由表
ip route show table main
ip route show table local

#添加网卡别名
ip addr add 192.168.0.11/24 dev eno167

#查看下网卡,别名没有产生,而是直接继承
ip addr show eno167
 
#添加网卡别名并添加标记label
ip addr add 192.168.1.2 label eno167:0 dev eno167

#查看下,多了eno167:0
ip addr show eno167
ip addr add 192.168.55.191/24 label eth0:1 dev eth0
ip addr show

分系列统计用法

ip link 系列

ip [-s] link show # 查看默认信息
ip link show eth0
ip link show up

ip link show up # 查看启用的端口
ip link show lo # 查看某一端口
ip link set 接口 [up|down] [multicast on|off] # 开启或关闭接口
ip link set [dev] eth0 up


ip address系列(可简写成 ip addr,或者ip a)

ip address
ip addr show

ip addr add dev 接口 ip地址/掩码 [ ladel 别名 ]
ip addr del dev 接口 ip地址 [ ladel 别名 ]
ip addr flush dev 接口 [ ladel 别名 ] # 清空接口地址配置信息,清除所有ip地址

示例
# ip addr add dev eth0 192.168.100.21/24 label eth0:0
# ip addr del dev em1 192.168.100.21/24


ip route系列

ip route show
ip route add x.x.x.x/24 via  网关地址  [dev 接口]
ip route del x.x.x.x/24
ip route flush  [dev 接口]  [via PREFIX] # 清空路由表所有路由条目,慎用   

示例
# ip route add 172.16.0.0/24 via 192.168.100.1
# ip route del 172.16.0.0/24
# ip route flush dev eth0
# ip route default via 172.16.0.1 # 添加网关,即默认路由


设定Routing

Show/manipulate routing
Show/manipulate devices
Policy routing
Tunnels

The syntax is pretty simple:
ip route add {NETWORK/MASK} via {GATEWAYIP}
ip route add {NETWORK/MASK} dev {DEVICE}
ip route add default {NETWORK/MASK} dev {DEVICE}
ip route add default {NETWORK/MASK} via {GATEWAYIP}

# ip route show
OR
# ip route list
OR
# ip r

Sent all packets to the local network 192.168.1.0 directly through the device eth0:
# ip route add 192.168.1.0/24 dev eth0

OR route traffic via 192.168.2.254 gateway for 192.168.2.0/24 network:
# ip route add 192.168.2.0/24 via 192.168.2.254 dev eth0

设置默认路由
# ip route add default via 192.168.1.254

Delete route from table
# ip route delete 192.168.1.0/24 dev eth0

Delete default route:
# ip route add default via 192.168.1.254 dev eth0


修改MTU值(Change MTU Size)

ifconfig ${Interface} mtu ${SIZE} up
ifconfig eth1 mtu 9000 up

编辑配置文件实现
CentOS:/etc/sysconfig/network-scripts/ifcfg-eth0,Add MTU, settings:
...
MTU="9000"

Debian:/etc/network/interfaces
...
mtu 9000

保存后重启网络

ip link set eth0 mtu 9000
ip link set eth0 up
ip link set mtu 1420 up dev wg0

pinging with a specific MTU:
ping -s [MTU-28] -M do [ip-address]

Remember to substract 28 from the set MTU giving space for headers. If packets are dropped or messages about fragmentation is recieved, lower MTU size further.