转载于:https://blog.csdn.net/freeking101/article/details/68939059
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:
-
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
-
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)
-
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:总传送/接受的量
-
root@astrol:~
-
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
-
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
-
root@astrol:~
-
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:~# ifconfig eth0
-
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
-
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
root@astrol:~# ip addr add 192.168.6.140/24 brd + dev eth0:1
-
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
-
root@astrol:~
-
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:~
-
root@astrol:~
-
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
root@astrol:~# ip addr flush dev eth0
-
root@astrol:~# ifconfig eth0 up
-
root@astrol:~# ifcofig eth0 dow
-
root@astrol:~# ip link set eth0 up
-
root@astrol:~# ip link set eth0 down
-
root@astrol:~# ifconfig eth0 multicast
-
root@astrol:~# ifconfig eth0 -multicast
-
root@astrol:~# ip link set eth0 multicast on
-
root@astrol:~# ip link set eth0 multicast off
-
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
-
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
-
root@astrol:~# ifconfig eth0 down
-
root@astrol:~# ifconfig eth0 hw ether 00:0c:29:0d:ce:95 up
-
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
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
设置和删除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
你也可以使用相同的方式来删除IP地址,只需用del代替add。
$ sudo ip addr del 192.168.0.193/24 dev wlan0
delete ip address
列出路由表条目
ip命令的路由对象的参数还可以帮助你查看网络中的路由数据,并设置你的路由表。第一个条目是默认的路由条目,你可以随意改动它。
在这个例子中,有几个路由条目。这个结果显示有几个设备通过不同的网络接口连接起来。它们包括WIFI、以太网和一个点对点连接。
$ ip route show
ip route show
假设现在你有一个IP地址,你需要知道路由包从哪里来。可以使用下面的路由选项(译注:列出了路由所使用的接口等):
$ ip route get 10.42.0.47
ip route get
更改默认路由
要更改默认路由,使用下面ip命令:
$ sudo ip route add default via 192.168.0.196
default route
显示网络统计数据
使用ip命令还可以显示不同网络接口的统计数据。
ip statistics all interfaces
当你需要获取一个特定网络接口的信息时,在网络接口名字后面添加选项ls即可。使用多个选项-s会给你这个特定接口更详细的信息。特别是在排除网络连接故障时,这会非常有用。
$ ip -s -s link ls p2p1
ip link statistics
ARP条目
地址解析协议(ARP)用于将一个IP地址转换成它对应的物理地址,也就是通常所说的MAC地址。使用ip命令的neigh或者neighbour选项,你可以查看接入你所在的局域网的设备的MAC地址。
$ ip neighbour
ip neighbour
监控netlink消息
也可以使用ip命令查看netlink消息。monitor选项允许你查看网络设备的状态。比如,所在局域网的一台电脑根据它的状态可以被分类成REACHABLE或者STALE。使用下面的命令:
$ 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
获取帮助
当你陷入困境,不知道某一个特定的选项怎么用的时候,你可以使用help选项。man页面并不会提供许多关于如何使用ip选项的信息,因此这里就是获取帮助的地方。
比如,想知道关于route选项更多的信息:
$ 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 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
说明:
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
3、网络地址类型:
暂时性网络地址:利用ifconfig等命令配置的网络信息,会立即生效,但重启网络服务或系统会失效
永久性的网络地址:通过修改系统内的网络配置文件进行的修改,不会立即生效,需要重启网络服务或者系统会生效,并且会永久性的生效。
三、网络IP地址配置命令之ifconfig
1、ifconfig:查看活动的网卡信息,仅限于活动的网卡
例如先查看本地的网卡信息如下—ifconfig
为了说明ifconfig查看的只是活动的网卡信息,我们下面把lo网卡down掉,在查看
2、ifconfig的相关子命令
ifconfig eth[0-9]:后面跟某个网卡则可以直接查看某个网卡的信息,如只查看eth0的信息
ifconfig –a :则是查看所有的网卡信息,包括活动或非活动的网卡信息
下面利用ifconfig来配置网卡的IP地址,当然这个地址是临时的地址,一旦重启网络服务或者重启网络系统就会失效的!!
格式:ifconfig ethx IP/MASK:配置某个网卡的ip地址
例如:设置eth0的IP地址为172.16.35.1/16,则就可以在命令行下直接键入:ifconfig eth0 172.16.36.5/16
我们下面重启一下网络服务,此配置就会失效,然后恢复为原来的IP地址的,如下图
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即可,当然、配置之前让我们先来了解下其配置文件内定义的内容都是有哪些?详解如下图所示
当然,我们上图是基于固定IP的设置,那么基于DHCP的呢?DHCP的更加简单,配置参数如下
DEVICE=eth0
BOOTPROTO=DHCP
ONBOOT=YES
HWADDR=......
五、以上内容我们了解了在linux系统上通过ifconfig命令和配置文件来为linux系统配置临时IP地址和永久性的IP的相关操作,那么我们下面来看下关于系统路由的设定,路由相关信息的设定命令是route
1、route:直接可以查看我们系统上的路由信息
route –n :以数字的形式显示路由信息
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
删除路由
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=……等等,可以设置条路由。
以上的配置不会立即生效,但是重启网络服务或者系统就会生效,并且是永久有效。
六、网络配置的另外一个功能强大的命令:IP
IP命令是iproute2软件包内的一个命令,功能比ifconfig更强大,可以对系统配置IP和路由信息。
1、ip link:配置网络接口属性
ip link show:查看所有网络接口属性信息
ip -s link show:查看所有统计信息
ip link set ethX {up|down|arp {on|off}}:设置网络接口的工作属性
2、ip addr:配置网络地址
ip addr show:查看网络信息,看到的信息和ip link show差不多,都比较简要
ip addr add IP dev ethX :配置IP地址(此命令配置的网卡信息利用ifconfig查看不到,需要利用ip addr show查看)
ip addr add IP dev ethx label ethX:X:配置子Ip并对其加别名
删除已经配置的IP地址
ip addr del IPADDR dev STRING
3、我们说过IP命令是个强大的命令,那是因为我们不仅仅能利用IP命令来创建IP地址相关的配置,还可以利用IP命令来实现对系统上路由信息的设置,其主要命令如下:
ip route:路由信息
ip route change|replace :修改路由信息
ip route add to 目的网段 dev ethx via IP(下一跳IP)
上面就是IP命令的用法,当然这些命令行下的操作只是暂时性的,一旦重启网络服务或系统这些配置都将会失效,如果想使其永久生效,就需要利用前的相关方法在配置文件内进行设定了。
七、IP地址的配置我们已经在前面介绍过了,这里不在重述,下面介绍下关于eth0:0这个主机网络别名的配置文件的配置方法
- ⑴、命令配置法:ifconfig和ip
- Ifconfig ethx:x IP/netmask
- ip addr add IP dev ethx label ethX:X
- 利用命令配置的只是暂时的IP地址,如果重启网络服务和系统都会失效的。
- ⑵、配置文件配置法:
- 修改/etc/sysconfig/network-scripts/ifcfg-ethx:x
- DEVICE=ethx:x
- BOOTPROTO=static
- IPIPADDR= IP地址
- NETMASK= 子网掩码
- GATEWAY= 网关
- ONBOOT=YES 是否开机启用
- HWADDR=...... MAC
- 非主要地址不能用DHCP服务获得,必须为静止的。
八、 DNS配置文件:
- ⑴、DNS配置文件位置:/etc/resolv.conf
- ⑵、DNS配置格式:
- nameserver DNS_IP1
- nameserver DNS_IP2
- 指定本地解析:
- /etc/hosts下添加
- 目标主机IP 主机名
- fg:172.16.36.1 www.chris.com
- DNS解析过程-->/etc/hosts-->DNS 服务器
九、主机名配置文件:
- ⑴、配置文件位置: /etc/sysconfig/network
- ⑵、配置格式:
- HOSTNAME=名称
- NETWORKING={yes|no}:是否开启网络功能
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在路由表进行路由以后,如果命中就会在路由缓存里增加该路由。同时系统还会定时检查路由缓存里的项目是否失效,如果失效则清除。
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:
-
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
-
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)
-
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:总传送/接受的量
-
root@astrol:~
-
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
-
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
-
root@astrol:~
-
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:~# ifconfig eth0
-
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
-
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
root@astrol:~# ip addr add 192.168.6.140/24 brd + dev eth0:1
-
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
-
root@astrol:~
-
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:~
-
root@astrol:~
-
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
root@astrol:~# ip addr flush dev eth0
-
root@astrol:~# ifconfig eth0 up
-
root@astrol:~# ifcofig eth0 dow
-
root@astrol:~# ip link set eth0 up
-
root@astrol:~# ip link set eth0 down
-
root@astrol:~# ifconfig eth0 multicast
-
root@astrol:~# ifconfig eth0 -multicast
-
root@astrol:~# ip link set eth0 multicast on
-
root@astrol:~# ip link set eth0 multicast off
-
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
-
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
-
root@astrol:~# ifconfig eth0 down
-
root@astrol:~# ifconfig eth0 hw ether 00:0c:29:0d:ce:95 up
-
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
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
设置和删除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
你也可以使用相同的方式来删除IP地址,只需用del代替add。
$ sudo ip addr del 192.168.0.193/24 dev wlan0
delete ip address
列出路由表条目
ip命令的路由对象的参数还可以帮助你查看网络中的路由数据,并设置你的路由表。第一个条目是默认的路由条目,你可以随意改动它。
在这个例子中,有几个路由条目。这个结果显示有几个设备通过不同的网络接口连接起来。它们包括WIFI、以太网和一个点对点连接。
$ ip route show
ip route show
假设现在你有一个IP地址,你需要知道路由包从哪里来。可以使用下面的路由选项(译注:列出了路由所使用的接口等):
$ ip route get 10.42.0.47
ip route get
更改默认路由
要更改默认路由,使用下面ip命令:
$ sudo ip route add default via 192.168.0.196
default route
显示网络统计数据
使用ip命令还可以显示不同网络接口的统计数据。
ip statistics all interfaces
当你需要获取一个特定网络接口的信息时,在网络接口名字后面添加选项ls即可。使用多个选项-s会给你这个特定接口更详细的信息。特别是在排除网络连接故障时,这会非常有用。
$ ip -s -s link ls p2p1
ip link statistics
ARP条目
地址解析协议(ARP)用于将一个IP地址转换成它对应的物理地址,也就是通常所说的MAC地址。使用ip命令的neigh或者neighbour选项,你可以查看接入你所在的局域网的设备的MAC地址。
$ ip neighbour
ip neighbour
监控netlink消息
也可以使用ip命令查看netlink消息。monitor选项允许你查看网络设备的状态。比如,所在局域网的一台电脑根据它的状态可以被分类成REACHABLE或者STALE。使用下面的命令:
$ 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
获取帮助
当你陷入困境,不知道某一个特定的选项怎么用的时候,你可以使用help选项。man页面并不会提供许多关于如何使用ip选项的信息,因此这里就是获取帮助的地方。
比如,想知道关于route选项更多的信息:
$ 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 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
说明:
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
3、网络地址类型:
暂时性网络地址:利用ifconfig等命令配置的网络信息,会立即生效,但重启网络服务或系统会失效
永久性的网络地址:通过修改系统内的网络配置文件进行的修改,不会立即生效,需要重启网络服务或者系统会生效,并且会永久性的生效。
三、网络IP地址配置命令之ifconfig
1、ifconfig:查看活动的网卡信息,仅限于活动的网卡
例如先查看本地的网卡信息如下—ifconfig
为了说明ifconfig查看的只是活动的网卡信息,我们下面把lo网卡down掉,在查看
2、ifconfig的相关子命令
ifconfig eth[0-9]:后面跟某个网卡则可以直接查看某个网卡的信息,如只查看eth0的信息
ifconfig –a :则是查看所有的网卡信息,包括活动或非活动的网卡信息
下面利用ifconfig来配置网卡的IP地址,当然这个地址是临时的地址,一旦重启网络服务或者重启网络系统就会失效的!!
格式:ifconfig ethx IP/MASK:配置某个网卡的ip地址
例如:设置eth0的IP地址为172.16.35.1/16,则就可以在命令行下直接键入:ifconfig eth0 172.16.36.5/16
我们下面重启一下网络服务,此配置就会失效,然后恢复为原来的IP地址的,如下图
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即可,当然、配置之前让我们先来了解下其配置文件内定义的内容都是有哪些?详解如下图所示
当然,我们上图是基于固定IP的设置,那么基于DHCP的呢?DHCP的更加简单,配置参数如下
DEVICE=eth0
BOOTPROTO=DHCP
ONBOOT=YES
HWADDR=......
五、以上内容我们了解了在linux系统上通过ifconfig命令和配置文件来为linux系统配置临时IP地址和永久性的IP的相关操作,那么我们下面来看下关于系统路由的设定,路由相关信息的设定命令是route
1、route:直接可以查看我们系统上的路由信息
route –n :以数字的形式显示路由信息
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
删除路由
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=……等等,可以设置条路由。
以上的配置不会立即生效,但是重启网络服务或者系统就会生效,并且是永久有效。
六、网络配置的另外一个功能强大的命令:IP
IP命令是iproute2软件包内的一个命令,功能比ifconfig更强大,可以对系统配置IP和路由信息。
1、ip link:配置网络接口属性
ip link show:查看所有网络接口属性信息
ip -s link show:查看所有统计信息
ip link set ethX {up|down|arp {on|off}}:设置网络接口的工作属性
2、ip addr:配置网络地址
ip addr show:查看网络信息,看到的信息和ip link show差不多,都比较简要
ip addr add IP dev ethX :配置IP地址(此命令配置的网卡信息利用ifconfig查看不到,需要利用ip addr show查看)
ip addr add IP dev ethx label ethX:X:配置子Ip并对其加别名
删除已经配置的IP地址
ip addr del IPADDR dev STRING
3、我们说过IP命令是个强大的命令,那是因为我们不仅仅能利用IP命令来创建IP地址相关的配置,还可以利用IP命令来实现对系统上路由信息的设置,其主要命令如下:
ip route:路由信息
ip route change|replace :修改路由信息
ip route add to 目的网段 dev ethx via IP(下一跳IP)
上面就是IP命令的用法,当然这些命令行下的操作只是暂时性的,一旦重启网络服务或系统这些配置都将会失效,如果想使其永久生效,就需要利用前的相关方法在配置文件内进行设定了。
七、IP地址的配置我们已经在前面介绍过了,这里不在重述,下面介绍下关于eth0:0这个主机网络别名的配置文件的配置方法
- ⑴、命令配置法:ifconfig和ip
- Ifconfig ethx:x IP/netmask
- ip addr add IP dev ethx label ethX:X
- 利用命令配置的只是暂时的IP地址,如果重启网络服务和系统都会失效的。
- ⑵、配置文件配置法:
- 修改/etc/sysconfig/network-scripts/ifcfg-ethx:x
- DEVICE=ethx:x
- BOOTPROTO=static
- IPIPADDR= IP地址
- NETMASK= 子网掩码
- GATEWAY= 网关
- ONBOOT=YES 是否开机启用
- HWADDR=...... MAC
- 非主要地址不能用DHCP服务获得,必须为静止的。
八、 DNS配置文件:
- ⑴、DNS配置文件位置:/etc/resolv.conf
- ⑵、DNS配置格式:
- nameserver DNS_IP1
- nameserver DNS_IP2
- 指定本地解析:
- /etc/hosts下添加
- 目标主机IP 主机名
- fg:172.16.36.1 www.chris.com
- DNS解析过程-->/etc/hosts-->DNS 服务器
九、主机名配置文件:
- ⑴、配置文件位置: /etc/sysconfig/network
- ⑵、配置格式:
- HOSTNAME=名称
- NETWORKING={yes|no}:是否开启网络功能
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在路由表进行路由以后,如果命中就会在路由缓存里增加该路由。同时系统还会定时检查路由缓存里的项目是否失效,如果失效则清除。