From(试试Linux下的ip命令,ifconfig已经过时了): https://linux.cn/article-3144-1.html
From(linux网络配置命令之ifconfig、ip和route): http://chrinux.blog.51cto.com/6466723/1188108
From(linux网络工具iproute2的使用简介): 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 的众多对比。
要安装 ip,请 点击这里 ( http://www.linuxgrill.com/anonymous/iproute2/NEW-OSDL/ )下载 iproute2 套装工具 。不过,大多数 Linux 发行版已经预装了 iproute2 工具。
iproute2 的核心命令是 ip,ip 命令和 ifconfig 类似,但前者功能更强大,并旨在取代后者。使用 ip 命令,只需一个命令,你就能很轻松地执行一些网络管理任务
iproute2 ip 命令常用备忘
ip地址管理1.显示ip地址ip aip address showip addr show dev eth0ip a sh eth02.增加删除地址ip address add 192.0.2.1/24 dev eth0ip addr del 192.0.2.2/24 dev eth03.显示接口统计ip -s link ls eth0
网卡和链路配置4.显示链路ip link showip link sh eth04.修改接口状态ip link set eth0 upip link s gre01 down
路由表管理5.显示路由表ip routeip ro show dev gre016.增加新路由ip route add 10.2.2.128/27 dev gre017.增加默认路由ip route add default via 192.168.1.18.修改默认路由ip route chg default via 192.168.1.29.删除默认路由ip route del default
隧道配置10.增加删除GRE隧道ip tunnel add gre01 mode gre local 10.1.1.1 remote 20.2.2.1 ttl 255ip tunnel del gre0111.IPIP隧道ip tunl a ipip01 mode ipip local 10.1.1.1 remote 20.2.2.1 ttl 25512.显示隧道ip tunnel show13.显示隧道统计ip -s tunl ls gre01
邻居和arp表管理13.查看arp表ip neigh show14.手工增加删除arp项ip neighbor add 10.2.2.2 dev eth0ip neigh del 10.2.2.1 dev eth0
socket统计15.显示当前监听ss -l15.显示当前监听的进程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.129ip route add 10.10.10.10 via 192.168.92.129ip route add 172.31.100.0/24 dev eno16777736ip route add 172.32.0.2 dev eno16777736#查看路由表[root@localhost ~]# ip route show table main#删除ip route del 10.0.0.0/24ip route del 10.10.10.10ip route del 172.31.100.0/24ip 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#添加网卡别名并添加标记 labelip addr add 192.168.1.2 label eno16777736:0 dev eno16777736#查看下,多了eno16777736:0ip addr show eno16777736[root@localhost ~]# ip addr add 192.168.55.191/24 label eth0:1 dev eth0[root@localhost ~]# ip addr show
网络接口相关
(1) 查询所有已连接的网络接口
下面的命令显示出所有可用网络接口的列表(无论接口是否激活)。
$ ifconfig -a # 使用 net-tools
$ ip link show # 使用 iproute2
使用 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地址( IPv4 / IPv6)
显示网络接口的 IPv4 地址
$ ifconfig eth1 # 使用 net-tools
$ ip addr show dev eth1 # 使用 iproute2如果是网卡绑定了多 IP 的话,iproute2 能显示所有的地址,而 net-tools 只能显示一个
使用 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 的简略写法。
显示网络接口的 IPv6 地址
net-tools 和 iproute2 都可以显示出所有已分配的 IPv6 地址。
$ ifconfig eth1 # 使用 net-tools
$ ip -6 addr show dev eth1 # 使用 iproute2
(3)设置IP地址( IPv4 / IPv6)
为网络接口分配IPv4地址
$ sudo ifconfig eth1 10.0.0.1/24 # 使用 net-tools$ sudo ip addr add 10.0.0.1/24 dev eth1 # 使用 iproute2
$ sudo ip addr add 192.168.0.193/24 dev wlan0
$ ip addr show wlan0
$ sudo ip addr del 192.168.0.193/24 dev wlan0
使用 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别名” 的方式做到的。
# 使用 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
为网络接口分配 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
(4)删除网络设备的IP地址
就 IP 地址的移除而言,除了给接口分配全0地址外,net-tools 没有提供任何合适的方法来移除网络接口的 IPv4 地址。而 iproute2 则能很好地完成。
$ sudo ifconfig eth1 0 # 使用 net-tools
$ sudo ip addr del 10.0.0.1/24 dev eth1 # 使用 iproute2
使用 net-tools:ifconfig eth0 0
使用 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 选项。
移除网络设备的IPv6地址
使用这些命令可移除接口中不必要的 IPv6 地址。
$ sudo ifconfig eth1 inet6 del 2002:0db5:0:f102::1/64 # 使用 net-tools
$ sudo ip -6 addr del 2002:0db5:0:f102::1/64 dev eth1 # 使用 iproute2
(5)激活或者停用网络接口
使用这些命令来激活或停用某个指定的网络接口。
使用net-tools:
$ sudo ifconfig eth1 up
$ sudo ifconfig eth1 down使用iproute2:
$ sudo ip link set eth1 down
$ sudo ip link set eth1 up
使用 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
改变网络接口的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地址,你需要知道路由包从哪里来。可以使用下面的路由选项(译注:列出了路由所使用的接口等):
ip route get 10.42.0.47
添加和修改默认路由
这里的命令用来添加或修改内核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 add default via 192.168.0.196
$ 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
显示网络统计数据
使用 ip 命令还可以显示不同网络接口的统计数据。
当你需要获取一个特定网络接口的信息时,在网络接口名字后面添加选项ls即可。使用多个选项-s会给你这个特定接口更详细的信息。特别是在排除网络连接故障时,这会非常有用。
$ ip -s -s link ls p2p1
监控 netlink 消息
也可以使用ip命令查看netlink消息。monitor选项允许你查看网络设备的状态。比如,所在局域网的一台电脑根据它的状态可以被分类成REACHABLE或者STALE。使用下面的命令:
$ ip monitor all
查看套接字统计信息
这里的命令用来查看套接字统计信息(比如活跃或监听状态的TCP/UDP套接字)。
使用net-tools:
$ netstat
$ netstat -l使用iproute2:
$ ss
$ ss -l
查看ARP表
地址解析协议(ARP)用于将一个IP地址转换成它对应的物理地址,也就是通常所说的MAC地址。使用 ip 命令的 neigh 或者neighbour 选项,你可以查看接入你所在的局域网的设备的 MAC 地址。
使用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
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 upifconfig eth0 down实例3:为网卡配置和删除IPv6地址命令:ifconfig eth0 add 33ffe:3240:800:1005::2/64ifconfig eth0 del 33ffe:3240:800:1005::2/64实例4:用ifconfig修改MAC地址命令:ifconfig eth0 hw ether 00:AA:BB:CC:DD:EE实例5:配置IP地址ifconfig eth0 192.168.120.56 ifconfig eth0 192.168.120.56 netmask 255.255.255.0 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.56ifconfig eth0 192.168.120.56 netmask 255.255.255.0 给eth0网卡配置IP地址:192.168.120.56 ,并加上子掩码:255.255.255.0ifconfig 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 arpifconfig 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 1500ifconfig # 处于激活状态的网络接口
ifconfig -a # 所有配置的网络接口,不论其是否激活
ifconfig eth0 # 显示eth0的网卡信息
ifconfig eth0 down # 关闭eth0网卡
ifconfig eth0 up # 开启eth0网卡
ifconfig eth0 add 33ffe:3240:800:1005::2/ 64 # 为网卡添加IPv6地址
ifconfig eth0 del 33ffe:3240:800:1005::2/ 64 # 为网卡删除IPv6地址
ifconfig eth0 hw ether 00:AA:BB:CC:DD:EE # 修改MAC地址
ifconfig eth0 192.168.1.56 # 给eth0网卡配置IP地址
ifconfig eth0 192.168.1.56 netmask 255.255.255.0 # 给eth0网卡配置IP地址,并加上子掩码# 给eth0网卡配置IP地址,加上子掩码,加上个广播地址
ifconfig eth0 192.168.1.56 netmask 255.255.255.0 broadcast 192.168.1.255 ifconfig eth0 mtu 1500 # 设置能通过的最大数据包大小为 1500 bytes
ifconfig eth0 arp # 开启arp功能
ifconfig eth0 -arp # 关闭arp功能
net-tools 中 ifconfig 和 route 与 iproute2 中 ip
主要介绍 linux 下网络查看、配置的基本命令:ifconfig、ip、route,然后捎带介绍下 DNS、主机名 等信息的配置!
配置网络之前,首先我们来认识一下linux系统下网络接口的类型和命名规则以及网络地址的类型
1. 网络接口类型
- lo:本地回环接口。一般在系统内部进行回环测试使用。
- eth[0-9]:以太网接口。以太网接口就是我们经常用来连接网线的那个物理接口了。
- pppx:点对点的连接
2. 以太网网卡的命名规则
在不同的系统之下其命名规则是不尽相同的,我们这就以 RedHat 5-32bit的系统为例:
REHL 5-32bit:以太网网卡命名规则的定义文件为 /etc/modprod.conf
3. 网络地址类型
- 暂时性网络地址:利用 ifconfig 等命令配置的网络信息,会立即生效,但重启网络服务或系统会失效。
- 永久性的网络地址:通过修改系统内的网络配置文件进行的修改,不会立即生效,需要重启网络服务或者系统会生效,并且会永久性的生效。
4. 网络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}
5. 永久性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=......
6. 路由相关信息设定命令 route
路由的设定,路由相关信息的设定命令是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=……等等,可以设置条路由。
以上的配置不会立即生效,但是重启网络服务或者系统就会生效,并且是永久有效。
7. IP 命令
IP 命令是 iproute2 软件包内的一个命令,功能比 ifconfig 更强大,可以对系统配置IP和路由信息。
ip link # 配置网络接口属性
ip link show # 查看所有网络接口属性信息
ip -s link show # 查看所有统计信息
ip link set ethX {up|down|arp {on|off}} # 设置网络接口的工作属性
ip addr # 配置网络地址
ip addr show # 查看网络信息,看到的信息和ip link show差不多,都比较简要# 配置IP地址(此命令配置的网卡信息利用ifconfig查看不到,需要利用ip addr show查看)
ip addr add IP dev ethX
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命令的用法,当然这些命令行下的操作只是暂时性的,一旦重启网络服务或系统这些配置都将会失效,如果想使其永久生效,就需要利用前的相关方法在配置文件内进行设定了。
8. 网络别名的配置文件的配置方法
(1). 命令配置法:ifconfig和ip Ifconfig ethx:x IP/netmask ip addr add IP dev ethx label ethX:X 利用命令配置的只是暂时的IP地址,如果重启网络服务和系统都会失效的。
(2). 配置文件配置法: 修改/etc/sysconfig/network-scripts/ifcfg-ethx:x DEVICE=ethx:x BOOTPROTO=static IPIPADDR= IP地址 NETMASK= 子网掩码 GATEWAY= 网关 ONBOOT=YES 是否开机启用 HWADDR=...... MAC 非主要地址不能用DHCP服务获得,必须为静止的。
9. DNS配置文件:
(1). DNS配置文件位置:/etc/resolv.conf
(2). DNS配置格式: nameserver DNS_IP1 nameserver DNS_IP2
指定本地解析: /etc/hosts下添加 目标主机IP 主机名 fg:172.16.36.1 www.chris.com
DNS解析过程-->/etc/hosts-->DNS 服务器
10. 主机名配置文件:
(1). 配置文件位置: /etc/sysconfig/network
(2). 配置格式: 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
对于接口的配置可以用下面的命令进行: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 保留
路由配置命令的格式如下:
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在路由表进行路由以后,如果命中就会在路由缓存里增加该路由。同时系统还会定时检查路由缓存里的项目是否失效,如果失效则清除。