linux ip命令和ifconfig命令

From: http://blog.jobbole.com/97270/

From: https://linux.cn/article-3144-1.html

From: http://chrinux.blog.51cto.com/6466723/1188108

From: http://www.linuxdiyf.com/linux/23935.html

iproute基本介绍:https://segmentfault.com/a/1190000000638244

iproute2 之 ip命令使用教程手册:https://www.iamle.com/archives/1750.html

iproute2 github地址(GitHub上有英文版使用文档):https://github.com/dmbaturin/iproute2-cheatsheet

iproute2 对决 net-tools》(英文原文:Linux TCP/IP networking: net-tools vs. iproute2


net-tools 和 iproute2 对比


        如今很多系统管理员依然通过组合使用诸如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:





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
socket统计
    15.显示当前监听
        ss -l
    15.显示当前监听的进程
        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 eno16777736
    ip route add 172.32.0.2 dev eno16777736

#查看路由表
    [root@localhost ~]# 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

#再次查看路由表
    [root@localhost ~]# ip route show table main
    [root@localhost ~]# ip route show table local

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

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

#查看下,多了eno16777736:0
    ip addr show eno16777736
     
    [root@localhost ~]# ip addr add 192.168.55.191/24 label eth0:1 dev eth0
    [root@localhost ~]# ip addr show

(一)网络接口相关

(1) 查询所有已连接的网络接口(network interface)
使用net-tools:
root@astrol:~# ifconfig -a  
eth0  Link encap:Ethernet  HWaddr 00:0c:29:0d:ce:93  
inet addr:192.168.6.138  Bcast:192.168.6.255  Mask:255.255.255.0  
inet6 addr: fe80::20c:29ff:fe0d:ce93/64 Scope:Link  
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1  
RX packets:202741 errors:1 dropped:3312 overruns:0 frame:0  
TX packets:60730 errors:0 dropped:0 overruns:0 carrier:0  
collisions:0 txqueuelen:1000  
RX bytes:27472662 (27.4 MB)  TX bytes:51025509 (51.0 MB)  
Interrupt:18 Base address:0x2000   
eth0:1Link encap:Ethernet  HWaddr 00:0c:29:0d:ce:93  
inet addr:192.168.6.139  Bcast:192.168.6.255  Mask:255.255.255.0  
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1  
Interrupt:18 Base address:0x2000   
loLink encap:Local Loopback  
inet addr:127.0.0.1  Mask:255.0.0.0  
inet6 addr: ::1/128 Scope:Host  
UP LOOPBACK RUNNING  MTU:65536  Metric:1  
RX packets:5 errors:0 dropped:0 overruns:0 frame:0  
TX packets:5 errors:0 dropped:0 overruns:0 carrier:0  
collisions:0 txqueuelen:0  
RX bytes:512 (512.0 B)  TX bytes:512 (512.0 B)  
ifconfig -a显示的是系统所有的网络接口,不管是激活的还是未激活的。
这里简单对ifconfig的输出做个解释:
第一行:Link encap(连接类型)  HWaddr(网卡的硬件地址,即MAC地址)
第二行:inet addr(网卡的IPv4地址) Bcast(广播地址) Mask(子网掩码)
第三行:inet6 addr(网卡的IPv6地址) 
第四行:UP(代表网卡是激活状态) BROADCAST(支持广播) RUNNING(代表网卡的网线被接上) MULTICAST(支持组播) MTU(最大传输单元) Metric(用于计算路由的成本)
第五、六行: 表示网络启动到现在接收和发送的网络包(packets)数量
第七行:collisions(冲突信息包的数目) txqueuelen(发送队列的大小)
第八行:表示网络启动到现在接收和发送的总字节量(bytes)
HWaddr :网卡的硬件地址,即MAC地址
inet addr:IPv4的IP 地址
Bcast:广播地址
mask:子网掩码
inet6 addr:IPv6地址
MTU:最大传输单元
Metric:用于计算路由的成本
RX:表示网络启动到现在的封包接受情况 (Receive)
packets:表示接包数
errors:表示接包发生错误的数量
dropped:表示丢弃的包数量
overruns:表示接收时因过速而丢失的数据包数
frame:表示发生frame错误而丢失的数据包数
TX:从网络启动到现在传送的情况 (Transmit)
collisions:冲突信息包的数目
txqueuelen:发送队列的大小
RX byte、TX byte:总传送/接受的量
注:由RX和TX可以了解网络是否非常繁忙
注:errors:0 dropped:0 overruns:0 frame:0,都为0 说明网络比较稳定
注:collisions发生太多次表示网络状况不太好
如果只想知道特定网络接口的信息,可以指定具体网络接口名称,例如ifconfig eth0,ifconfig lo
使用iproute2:
root@astrol:~# ip link show  
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default  
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00  
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 1000  
link/ether 00:0c:29:0d:ce:93 brd ff:ff:ff:ff:ff:ff  
同样的,想查看特定网络接口的信息,直接指定网络接口名称即可。
root@astrol:~# ip link show eth0  
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 1000  
link/ether 00:0c:29:0d:ce:93 brd ff:ff:ff:ff:ff:ff  
如果想让输出的结果像ifconfig那样详细,可以增加-s选项:
root@astrol:~# ip -s link show eth0  
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 1000  
link/ether 00:0c:29:0d:ce:93 brd ff:ff:ff:ff:ff:ff  
RX: bytes  packets  errors  dropped overrun mcast  
40288764   244422   1   36510   0  
TX: bytes  packets  errors  dropped carrier collsns  
51239397   621160   0   0   0  
这样,就可以看到网络接口的流量信息了。
如果只想看当前被激活的网络接口,可以在命令后头增加一个up:
root@astrol:~# ip link show up  
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default  
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00  
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 1000  
link/ether 00:0c:29:0d:ce:93 brd ff:ff:ff:ff:ff:ff  
(2)查询网络设备的IP地址
使用net-tools:
root@astrol:~# ifconfig eth0  
使用iproute2:
root@astrol:~# ip addr show dev eth0  
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000  
link/ether 00:0c:29:0d:ce:93 brd ff:ff:ff:ff:ff:ff  
inet 192.168.6.138/24 brd 192.168.6.255 scope global eth0  
valid_lft forever preferred_lft forever  
inet 192.168.6.139/24 brd 192.168.6.255 scope global secondary eth0:1  
valid_lft forever preferred_lft forever  
inet6 fe80::20c:29ff:fe0d:ce93/64 scope link  
valid_lft forever preferred_lft forever  
当不指定网络接口时,ip addr其实是ip addr show的简略写法。
(3)设置网络设备的IP地址
使用net-tools:
root@astrol:~# ifconfig eth0:1 192.168.6.140  
root@astrol:~# ifconfig eth0:1 192.168.6.140 netmask 255.255.255.0  
root@astrol:~# ifconfig eth0:1 192.168.6.140 netmask 255.255.255.0 broadcast 192.168.6.255  
使用iproute2:
root@astrol:~# ip addr add 192.168.6.140/24 brd + dev eth0:1  
这里使用的模版是:ip addr add ip_address/net_prefix brd + devinterface 
net_prefix隐含指定了子网掩码,brd +表明是标准的广播地址。
需要了解的一点是,通过ip addr可以非常容易地给一块网卡添加多个地址,ifconfig同样可以,是通过叫做“IP别名”的方式做到的。
root@astrol:~# ip addr add 192.168.6.140/24 broadcast 192.168.6.255 dev eth0  
root@astrol:~# ip addr add 192.168.6.141/24 broadcast 192.168.6.255 dev eth0  
root@astrol:~# ip addr add 192.168.6.142/24 broadcast 192.168.6.255 dev eth0  
(4)删除网络设备的IP地址
使用net-tools:
貌似没有什么好办法去做:ifconfig eth0 0  。
就IP地址的移除而言,除了给接口分配全0地址外,net-tools没有提供任何合适的方法来移除网络接口的IPv4地址
使用iproute2:
模版:ip addr del ip_address/net_prefix dev interface
root@astrol:~# ip -4 addr show dev eth0  
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000  
inet 192.168.6.138/24 brd 192.168.6.255 scope global eth0  
valid_lft forever preferred_lft forever  
inet 192.168.6.141/24 brd 192.168.6.255 scope global secondary eth0  
valid_lft forever preferred_lft forever  
root@astrol:~# ip addr del 192.168.6.141/24 dev eth0  
root@astrol:~# ip -4 addr show dev eth0  
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000  
inet 192.168.6.138/24 brd 192.168.6.255 scope global eth0  
valid_lft forever preferred_lft forever  
此外,iproute2提供ip addr flush可以一次性删除一个网络设备的所有地址:
root@astrol:~# ip addr flush dev eth0  
默认的,这条命令会删除IPv4和IPv6的地址,如果想分别删除,可以通过分别指定-4和-6选项。
(5)激活或者停用网络接口
使用net-tools:
root@astrol:~# ifconfig eth0 up  
root@astrol:~# ifcofig eth0 dow  
在linux下还可以使用ifup和ifdown来达到同样的目的。
使用iproute2:
root@astrol:~# ip link set eth0 up  
root@astrol:~# ip link set eth0 down  
(6)设置或者改变网络接口的参数(属性)
一个网络接口具体有哪些参数可以供我们去设置呢?输入ip link set eth0,然后按两次TAB键,如下:
可以看到其中的up和down就是用来激活或者停用某个网络接口的。例如,使能或者关闭eth0的多播功能:
使用net-tools:
root@astrol:~# ifconfig eth0 multicast  
root@astrol:~# ifconfig eth0 -multicast  
使用iproute2:
root@astrol:~# ip link set eth0 multicast on  
root@astrol:~# ip link set eth0 multicast off  
通常,调整最大传输单元MTU用的比较多。
使用net-tools:
root@astrol:~# ifconfig eth0 mtu 1400  
root@astrol:~# ip link show eth0  
2: eth0: <BROADCAST,UP,LOWER_UP> mtu 1400 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 1000  
link/ether 00:0c:29:0d:ce:93 brd ff:ff:ff:ff:ff:ff  
使用iproute2:
root@astrol:~# ip link set eth0 mtu 1500  
root@astrol:~# ip link show eth0  
2: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 1000  
link/ether 00:0c:29:0d:ce:93 brd ff:ff:ff:ff:ff:ff  
改变网卡硬件地址,即MAC地址(注意,修改MAC地址前网卡必须先关闭):
使用net-tools:
root@astrol:~# ifconfig eth0 down  
root@astrol:~# ifconfig eth0 hw ether 00:0c:29:0d:ce:95 up  
使用iproute2:
root@astrol:~# ip link set eth0 down  
root@astrol:~# ip link set eth0 address 00:0c:29:0d:ce:95  
root@astrol:~# ip link set eth0 up  
类似的,需要先关闭网卡再设置的属性有name

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


Net tools vs Iproute2

要安装ip,请点击这里下载iproute2套装工具 。不过,大多数Linux发行版已经预装了iproute2工具。

显示所有已连接的网络接口

下面的命令显示出所有可用网络接口的列表(无论接口是否激活)。

使用net-tools:
$ ifconfig -a
使用iproute2:
$ ip link show


激活或停用网络接口

使用这些命令来激活或停用某个指定的网络接口。

使用net-tools:
$ sudo ifconfig eth1 up
$ sudo ifconfig eth1 down
使用iproute2:
$ sudo ip link set down eth1
$ sudo ip link set up eth1


为网络接口分配IPv4地址

使用net-tools:
$ sudo ifconfig eth1 10.0.0.1/24
使用iproute2:
$ sudo ip addr add 10.0.0.1/24 dev eth1

可以使用iproute2给同一个接口分配多个IP地址,ifconfig则无法这么做。使用ifconfig的变通方案是使用IP别名。

使用net-tools配置多IP:
$ sudo ifconfig eth0:1 192.168.10.10 netmask 255.255.255.0 up
$ sudo ifconfig eth0:2 192.168.10.15 netmask 255.255.255.0 up

使用iproute2配置多IP:
$ sudo ip addr add 10.0.0.1/24 broadcast 10.0.0.255 dev eth1
$ sudo ip addr add 10.0.0.2/24 broadcast 10.0.0.255 dev eth1
$ sudo ip addr add 10.0.0.3/24 broadcast 10.0.0.255 dev eth1

查看eth0的IP地址
$sudo ip addr list dev eth0


移除网络接口的IPv4地址

就IP地址的移除而言,除了给接口分配全0地址外,net-tools没有提供任何合适的方法来移除网络接口的IPv4地址。而 iproute2则能很好地完成。

使用net-tools:
$ sudo ifconfig eth1 0
使用iproute2:
$ sudo ip addr del 10.0.0.1/24 dev eth1


显示网络接口的IPv4地址

使用net-tools:
$ ifconfig eth1
使用iproute2:
$ ip addr show dev eth1
如果是网卡绑定了多IP的话,iproute2能显示所有的地址,而net-tools只能显示一个



为网络接口分配IPv6地址

使用这些命令为网络接口添加IPv6地址。net-tools和iproute2都允许用户为一个接口添加多个IPv6地址。

使用net-tools:
$ sudo ifconfig eth1 inet6 add 2002:0db5:0:f102::1/64
$ sudo ifconfig eth1 inet6 add 2003:0db5:0:f102::1/64
使用iproute2:
$ sudo ip -6 addr add 2002:0db5:0:f102::1/64 dev eth1
$ sudo ip -6 addr add 2003:0db5:0:f102::1/64 dev eth1


显示网络接口的IPv6地址

net-tools和iproute2都可以显示出所有已分配的IPv6地址。

使用net-tools:
$ ifconfig eth1
使用iproute2:
$ ip -6 addr show dev eth1

移除网络设备的IPv6地址

使用这些命令可移除接口中不必要的IPv6地址。

使用net-tools:
$ sudo ifconfig eth1 inet6 del 2002:0db5:0:f102::1/64
使用iproute2:
$ sudo ip -6 addr del 2002:0db5:0:f102::1/64 dev eth1

改变网络接口的MAC地址

使用下面的命令可篡改网络接口的MAC地址,请注意在更改MAC地址前,需要停用接口。

使用net-tools:
$ sudo ifconfig eth1 hw ether 08:00:27:75:2a:66
使用iproute2:
$ sudo ip link set dev eth1 address 08:00:27:75:2a:67


查看IP路由表

net-tools中有两个选择来显示内核的IP路由表:route和netstat。在iproute2中,使用命令ip route。

使用net-tools:
$route -n
$ netstat -rn
使用iproute2:
$ ip route show


添加和修改默认路由

这里的命令用来添加或修改内核IP路由表中的默认路由规则。请注意在net-tools中可通过添加新的默认路由、删除旧的默认路由来实现修改默认路由。在iproute2使用ip route命令来代替。

使用net-tools:
$ sudo route add default gw 192.168.1.2 eth0
$ sudo route del default gw 192.168.1.1 eth0
使用iproute2:
$ sudo ip route add default via 192.168.1.2 dev eth0
$ sudo ip route replace default via 192.168.1.2 dev eth0


添加和移除静态路由

使用net-tools:
$ sudo route add default gw 192.168.1.2 eth0
$ sudo route del default gw 192.168.1.1 eth0
使用iproute2:
$ sudo ip route add default via 192.168.1.2 dev eth0
$ sudo ip route replace default via 192.168.1.2 dev eth0


查看套接字统计信息

这里的命令用来查看套接字统计信息(比如活跃或监听状态的TCP/UDP套接字)。

使用net-tools:
$ netstat
$ netstat -l
使用iproute2:
$ ss
$ ss -l



查看ARP表

使用net-tools:
$ arp -an
使用iproute2:
$ ip neigh


添加或删除静态ARP项

使用net-tools:
$ sudo arp -s 192.168.1.100 00:0c:29:c0:5a:ef
$ sudo arp -d 192.168.1.100
使用iproute2:
$ sudo ip neigh add 192.168.1.100 lladdr 00:0c:29:c0:5a:ef dev eth0
$ sudo ip neigh del 192.168.1.100 dev eth0


添加、删除或查看多播地址

使用net-tools:
$ sudo ipmaddr add 33:44:00:00:00:01 dev eth0
$ sudo ipmaddr del 33:44:00:00:00:01 dev eth0
$ ipmaddr show dev eth0
$ netstat -g
使用iproute2:
$ sudo ip maddr add 33:44:00:00:00:01 dev eth0
$ sudo ip maddr del 33:44:00:00:00:01 dev eth0
$ ip maddr list dev eth0



iproute2中ip命令

你也可以使用git命令来下载最新源代码来编译:

$ git clone https://kernel.googlesource.com/pub/scm/linux/kernel/git/shemminger/iproute2.git

iproute2 git clone

iproute2 git clone

设置和删除Ip地址

要给你的机器设置一个IP地址,可以使用下列ip命令:

$ sudo ip addr add 192.168.0.193/24 dev wlan0

请注意IP地址要有一个后缀,比如/24。这种用法用于在无类域内路由选择(CIDR)中来显示所用的子网掩码。在这个例子中,子网掩码是255.255.255.0。

在你按照上述方式设置好IP地址后,需要查看是否已经生效。

$ ip addr show wlan0

set ip address

set ip address

你也可以使用相同的方式来删除IP地址,只需用del代替add。
$ sudo ip addr del 192.168.0.193/24 dev wlan0

delete ip address

delete ip address

列出路由表条目

ip命令的路由对象的参数还可以帮助你查看网络中的路由数据,并设置你的路由表。第一个条目是默认的路由条目,你可以随意改动它。

在这个例子中,有几个路由条目。这个结果显示有几个设备通过不同的网络接口连接起来。它们包括WIFI、以太网和一个点对点连接。

$ ip route show

ip route show

ip route show

假设现在你有一个IP地址,你需要知道路由包从哪里来。可以使用下面的路由选项(译注:列出了路由所使用的接口等):
$ ip route get 10.42.0.47

ip route get

ip route get

更改默认路由

要更改默认路由,使用下面ip命令:

$ sudo ip route add default via 192.168.0.196

default route

default route

显示网络统计数据

使用ip命令还可以显示不同网络接口的统计数据。

ip statistics all interfaces

ip statistics all interfaces

当你需要获取一个特定网络接口的信息时,在网络接口名字后面添加选项ls即可。使用多个选项-s会给你这个特定接口更详细的信息。特别是在排除网络连接故障时,这会非常有用。
$ ip -s -s link ls p2p1

ip link statistics

ip link statistics

ARP条目

地址解析协议(ARP)用于将一个IP地址转换成它对应的物理地址,也就是通常所说的MAC地址。使用ip命令的neigh或者neighbour选项,你可以查看接入你所在的局域网的设备的MAC地址。

$ ip neighbour

ip neighbour

ip neighbour

监控netlink消息

也可以使用ip命令查看netlink消息。monitor选项允许你查看网络设备的状态。比如,所在局域网的一台电脑根据它的状态可以被分类成REACHABLE或者STALE。使用下面的命令:

$ ip monitor all

ip monitor all

ip monitor all

激活和停止网络接口

你可以使用ip命令的up和down选项来激某个特定的接口,就像ifconfig的用法一样。

在这个例子中,当ppp0接口被激活和在它被停止和再次激活之后,你可以看到相应的路由表条目。这个接口可能是wlan0或者eth0。将ppp0更改为你可用的任意接口即可。

$ sudo ip link set ppp0 down
 
$ sudo ip link set ppp0 up

ip link set up and down

ip link set up and down

获取帮助

当你陷入困境,不知道某一个特定的选项怎么用的时候,你可以使用help选项。man页面并不会提供许多关于如何使用ip选项的信息,因此这里就是获取帮助的地方。

比如,想知道关于route选项更多的信息:

$ ip route help

ip route help

ip route help

小结:对于网络管理员们和所有的Linux使用者们,ip命令是必备工具。是时候抛弃ifconfig命令了,特别是当你写脚本时。


net-tools 中 ifconfig 详细解释

许多windows非常熟悉ipconfig命令行工具,它被用来获取网络接口配置信息并对此进行修改。Linux系统拥有一个类似的工具,也就是ifconfig(interfaces config)。通常需以root身份登录或使用sudo以便Linux机器上使用ifconfig工具。依赖于ifconfig命令中使用些选项属性,ifconfig工具不仅可以被用来简单地获取网络接口配置信息,还可以修改这些配置。

1.命令格式:

ifconfig [网络设备] [参数]

2.命令功能:

ifconfig 命令用来查看和配置网络设备。当网络环境发生改变时可通过此命令对网络进行相应的配置

3.命令参数:

up 启动指定网络设备/网卡

down 关闭指定网络设备/网卡该参数可以有效地阻止通过指定接口的IP信息流,如果想永久地关闭一个接口,我们还需要从核心路由表中将该接口的路由信息全部删除。

arp 设置指定网卡是否支持ARP协议

-promisc 设置是否支持网卡的promiscuous模式,如果选择此参数,网卡将接收网络中发给它所有的数据包

-allmulti 设置是否支持多播模式,如果选择此参数,网卡将接收网络中所有的多播数据包

-a 显示全部接口信息

-s 显示摘要信息(类似于 netstat -i)

add 给指定网卡配置IPv6地址

del 删除指定网卡的IPv6地址

<硬件地址> 配置网卡最大的传输单元

mtu<字节数> 设置网卡的最大传输单元 (bytes)

netmask<子网掩码> 设置网卡的子网掩码掩码可以是有前缀0x的32位十六进制数,也可以是用点分开的4个十进制数。如果不打算将网络分成子网,可以不管这一选项;如果要使用子网,那么请记住,网络中每一个系统必须有相同子网掩码。

tunel 建立隧道

dstaddr 设定一个远端地址,建立点对点通信

-broadcast<地址> 为指定网卡设置广播协议

-pointtopoint<地址> 为网卡设置点对点通讯协议

multicast 为网卡设置组播标志

address 为网卡设置IPv4地址

txqueuelen<长度> 为网卡设置传输列队的长度

4.使用实例:

实例1:显示网络设备信息激活状态的

命令:ifconfig

实例2:启动关闭指定网卡

命令:

ifconfig eth0 up

ifconfig eth0 down

实例3:为网卡配置和删除IPv6地址

命令:

ifconfig eth0 add 33ffe:3240:800:1005::2/64

ifconfig eth0 del 33ffe:3240:800:1005::2/64

实例4:用ifconfig修改MAC地址

命令:

ifconfig eth0 hw ether 00:AA:BB:CC:DD:EE

实例5:配置IP地址

[root@localhost ~]# ifconfig eth0 192.168.120.56 
[root@localhost ~]# ifconfig eth0 192.168.120.56 netmask 255.255.255.0 
[root@localhost ~]# ifconfig eth0 192.168.120.56 netmask 255.255.255.0 broadcast 192.168.120.255

说明:

ifconfig eth0 192.168.120.56 

给eth0网卡配置IP地192.168.120.56

 ifconfig eth0 192.168.120.56 netmask 255.255.255.0 

给eth0网卡配置IP地址192.168.120.56 并加上子掩码255.255.255.0

ifconfig eth0 192.168.120.56 netmask 255.255.255.0 broadcast 192.168.120.255

/给eth0网卡配置IP地址192.168.120.56加上子掩码255.255.255.0加上个广播地址 192.168.120.255 

实例6:启用和关闭ARP协议

命令:

ifconfig eth0 arp

ifconfig eth0 -arp

输出: 

[root@localhost ~]# ifconfig eth0 arp 
[root@localhost ~]# ifconfig eth0 -arp

说明:

ifconfig eth0 arp 开启网卡eth0 arp协议;

ifconfig eth0 -arp 关闭网卡eth0 arp协议; 

实例7:设置最大传输单元

命令:

ifconfig eth0 mtu 1500

[root@localhost ~]# ifconfig   #处于激活状态的网络接口

[root@localhost ~]# ifconfig -a  #所有配置的网络接口,不论其是否激活

[root@localhost ~]# ifconfig eth0  #显示eth0的网卡信息

[root@localhost ~]# ifconfig eth0 down  #关闭eth0网卡

[root@localhost ~]# ifconfig eth0 up    #开启eth0网卡

[root@localhost ~]# ifconfig eth0 add 33ffe:3240:800:1005::2/ 64  #为网卡添加IPv6地址

[root@localhost ~]# ifconfig eth0 del 33ffe:3240:800:1005::2/ 64 #为网卡删除IPv6地址

[root@localhost ~]# ifconfig eth0 hw ether 00:AA:BB:CC:DD:EE  #修改MAC地址

[root@localhost ~]# ifconfig eth0 192.168.1.56  #给eth0网卡配置IP地址

[root@localhost ~]# ifconfig eth0 192.168.1.56 netmask 255.255.255.0  #给eth0网卡配置IP地址,并加上子掩码

[root@localhost ~]# ifconfig eth0 192.168.1.56 netmask 255.255.255.0 broadcast 192.168.1.255   #给eth0网卡配置IP地址,加上子掩码,加上个广播地址

[root@localhost ~]# ifconfig eth0 mtu 1500  #设置能通过的最大数据包大小为 1500 bytes

[root@localhost ~]# ifconfig eth0 arp   #开启arp功能

[root@localhost ~]# ifconfig eth0 -arp  #关闭arp功能

net-tools中ifconfig 和 route 与 iproute2 中 ip

一、作为一个linux的疯狂热爱者,我们首先需要掌握的就是在linux系统下怎么配置IP、路由和主机名基本的linux网络配置,当然如果要我们接入互联网基本的IP地址配置还是不够的,访问网络的话我们需要配置我们的域名解析服务器DNS,下面作为菜鸟的我就把我们平常用到的基本网络配置命令来和大家介绍一下,写的不好的话,还请见谅~~~~~

      本篇主要介绍linux下网络查看、配置的基本命令:ifconfig、ip、route,然后捎带介绍下DNS、主机名等信息的配置!

二、我们在配置网络之前,首先我们来认识一下linux系统下网络接口的类型和命名规则以及网络地址的类型

1、网络接口类型:

lo:本地回环接口

eth[0-9]:以太网接口

pppx:点对点的连接

当然我们平常用到的也就是lo和以太网接口这两种类型回环环接口lo只是我们用在系统内部进行回环测试的,至于eth的以太网接口就是我们经常用来连接网线的那个物理接口了。

2、以太网网卡的命名规则:

在不同的系统之下其命名规则是不尽相同的,我们这就以RedHat 5-32bit的系统为例:

REHL 5-32bit:以太网网卡命名规则的定义文件为/etc/modprod.conf

图像 120

3、网络地址类型:

暂时性网络地址:利用ifconfig等命令配置的网络信息,会立即生效,但重启网络服务或系统会失效

永久性的网络地址:通过修改系统内的网络配置文件进行的修改,不会立即生效,需要重启网络服务或者系统会生效,并且会永久性的生效。 

三、网络IP地址配置命令之ifconfig

1、ifconfig:查看活动的网卡信息,仅限于活动的网卡

        例如先查看本地的网卡信息如下—ifconfig

图像 121

为了说明ifconfig查看的只是活动的网卡信息,我们下面把lo网卡down掉,在查看

图像 122

2、ifconfig的相关子命令

ifconfig  eth[0-9]:后面跟某个网卡则可以直接查看某个网卡的信息,如只查看eth0的信息

图像 123

ifconfig –a :则是查看所有的网卡信息,包括活动或非活动的网卡信息

图像 124

下面利用ifconfig来配置网卡的IP地址,当然这个地址是临时的地址,一旦重启网络服务或者重启网络系统就会失效的!!

格式:ifconfig  ethx IP/MASK:配置某个网卡的ip地址

        例如:设置eth0的IP地址为172.16.35.1/16,则就可以在命令行下直接键入:ifconfig eth0 172.16.36.5/16

图像 126

图像 127

 

我们下面重启一下网络服务,此配置就会失效,然后恢复为原来的IP地址的,如下图

图像 128

3、网络服务的管理命令,上面已经提到过一个重启网络服务的命令了,那么我们的网络服务控制命令都有哪些那???就是很简单,就是start,stop,restart,status这几个命令而已。

用法格式:

/etc/init.d/network {start | stop | restart | status} 或者service network {start | stop | restart | status}

四、永久性IP地址配置

通过上面我们了解了利用ifconfig来配置临时的网络IP地址了,当然这还不能满足我们的需求,我们不能每次使用电脑的时候都配置IP地址啊~那太麻烦,所以我们需要把IP地址配置为固定的IP或者通过DHCP服务来回去,这样的配置就需要修改系统的网络配置文件了,我们REHL5上的网络配置文为/etc/sysconfig/network-scripts/ifcfg-eth[0-9],下面我们就来看看怎么定义这个文件内的内容。

其配置方式有两种:DHCP和固定IP

DHCP的设置比较简单,只需指定BOOTPROTOL类型为DHCP即可,当然、配置之前让我们先来了解下其配置文件内定义的内容都是有哪些?详解如下图所示

图像 129

当然,我们上图是基于固定IP的设置,那么基于DHCP的呢?DHCP的更加简单,配置参数如下

  DEVICE=eth0 
  BOOTPROTO=DHCP 
  ONBOOT=YES 
  HWADDR=......

五、以上内容我们了解了在linux系统上通过ifconfig命令和配置文件来为linux系统配置临时IP地址和永久性的IP的相关操作,那么我们下面来看下关于系统路由的设定,路由相关信息的设定命令是route

1、route:直接可以查看我们系统上的路由信息

     route –n :以数字的形式显示路由信息

图像 130

2、route命令的子选项

添加路由

route  add -host:添加主机路由

route  add -net:添加网络路由

route  add -net  0.0.0.0:添加默认路由

格式:route add -net|host DEST gw NEXTHOP

例如,添加一条路由,让主机通过172.16.7.3访问192.168.0.0/24网段

        route add –net 192.168.0.0/24 gw 172.16.7.3

图像 131

删除路由

route del -host:删除主机路由

route del –net:删除网络路由

  例如,删除刚才加的那条路由信息:route del –net 192.168.0.0、24 即可实现

3、以上利用route命令增加的配置在重启网络服务或者系统的时候,所有的配置都会失效,这只是临时的配置而已,要想使我们配置的路由信息永久性的有效,我们需要把配置信息定义在配置文件内:/etc/sysconfig/network-scripts/route-ethx,ethx表示对应的通过那个网卡路由

配置格式:

格式1:DEST(目的) via NEXTTOP(下一跳)

格式2:ADDRESS0=网络地址(目的地址)、NETMASK0=子网掩码(目的网络)、

GATEWAY0=网关(通过那个网卡的网关)、ADDRESS1=、NETMASK1=……等等,可以设置条路由。

图像 132

图像 133

以上的配置不会立即生效,但是重启网络服务或者系统就会生效,并且是永久有效。

 

六、网络配置的另外一个功能强大的命令:IP

IP命令是iproute2软件包内的一个命令,功能比ifconfig更强大,可以对系统配置IP和路由信息。

1、ip link:配置网络接口属性

     ip link show:查看所有网络接口属性信息

     ip -s link show:查看所有统计信息

     ip link set ethX {up|down|arp {on|off}}:设置网络接口的工作属性

图像 134

2、ip addr:配置网络地址

    ip addr show:查看网络信息,看到的信息和ip link show差不多,都比较简要

    ip addr add IP dev ethX :配置IP地址(此命令配置的网卡信息利用ifconfig查看不到,需要利用ip addr show查看)

图像 135

      ip addr add IP dev ethx label ethX:X:配置子Ip并对其加别名

 图像 139

删除已经配置的IP地址

ip addr del  IPADDR dev STRING

图像 140

3、我们说过IP命令是个强大的命令,那是因为我们不仅仅能利用IP命令来创建IP地址相关的配置,还可以利用IP命令来实现对系统上路由信息的设置,其主要命令如下:

ip route:路由信息

ip route change|replace :修改路由信息

ip route add to 目的网段 dev ethx via IP(下一跳IP)

图像 143

上面就是IP命令的用法,当然这些命令行下的操作只是暂时性的,一旦重启网络服务或系统这些配置都将会失效,如果想使其永久生效,就需要利用前的相关方法在配置文件内进行设定了。

七、IP地址的配置我们已经在前面介绍过了,这里不在重述,下面介绍下关于eth0:0这个主机网络别名的配置文件的配置方法

 

  1. ⑴、命令配置法:ifconfig和ip 
  2.  
  3.       Ifconfig ethx:x IP/netmask 
  4.  
  5.       ip addr add IP dev ethx label ethX:X 
  6.  
  7.       利用命令配置的只是暂时的IP地址,如果重启网络服务和系统都会失效的。 
  8.  
  9. ⑵、配置文件配置法: 
  10.  
  11.     修改/etc/sysconfig/network-scripts/ifcfg-ethx:x 
  12.  
  13.       DEVICE=ethx:x 
  14.  
  15.       BOOTPROTO=static  
  16.  
  17.       IPIPADDR=   IP地址 
  18.  
  19.       NETMASK=  子网掩码 
  20.  
  21.       GATEWAY=  网关 
  22.  
  23.       ONBOOT=YES   是否开机启用 
  24.  
  25.       HWADDR=...... MAC 
  26.  
  27.       非主要地址不能用DHCP服务获得,必须为静止的。 

八、 DNS配置文件:

 

  1. ⑴、DNS配置文件位置:/etc/resolv.conf 
  2.  
  3. ⑵、DNS配置格式: 
  4.  
  5.          nameserver DNS_IP1 
  6.  
  7.          nameserver DNS_IP2 
  8.  
  9. 指定本地解析: 
  10.  
  11.      /etc/hosts下添加 
  12.  
  13.     目标主机IP        主机名       
  14.  
  15.     fg:172.16.36.1  www.chris.com  
  16.  
  17. DNS解析过程-->/etc/hosts-->DNS 服务器 

九、主机名配置文件:

 

  1. ⑴、配置文件位置: /etc/sysconfig/network 
  2.  
  3. ⑵、配置格式: 
  4.  
  5.          HOSTNAME=名称 
  6.  
  7.          NETWORKING={yes|no}:是否开启网络功能 

  图像 145


Linux策略性路由应用及分析(iproute2)

http://blog.chinaunix.net/uid-738429-id-2057370.html


Linux策略性路由应用及分析(iproute2)

策略性路由

  策略性是指对于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

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

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

  还可以添加规则:

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,作为寻找路由的入口点,在这里有必要详细讨论这个函数,下面是源代码:



  上面的这段代码的思路是非常的清晰的。首先程序从优先级高到低扫描所有的规则,如果规则匹配,处理该规则的动作。如果是普通的路由寻址或者是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在路由表进行路由以后,如果命中就会在路由缓存里增加该路由。同时系统还会定时检查路由缓存里的项目是否失效,如果失效则清除。








没有更多推荐了,返回首页