标签 iproute 下的文章

IPROUTE2之IP工具的学习笔记-替代net-tools实现常用网络命令

IPROUTE2之IP工具的学习笔记-替代net-tools实现常用网络命令

前言:

在Linux系统下,我们可能经常会使用ifconfig执行一些网络管理任务,该命令属于net-tools工具组,这是一个很多年前就停止维护的项目,已经有越来越多的人认识到,ifconfig在现代网络环境中已经不再是一个好的工具了,有些发行版的Linux系统已经默认不在包含它,当我们在没有net-tools工具的系统上尝试运行ifconfig时,会提示command not found。这中情况我们可以尝试安装net-tools以可以再次运行ifconfig,或者我们可以考虑学习一个新的工具。iproute2通常以一个名为iproute或iproute2的包形式发放,它由多个工具组成,其中最重要的工具是iptc,IP控制IPv4和IPv6配置,TC代表流量控制。本文即针对ip工具进行学习。该项目目前由Stephen Hemminger负责维护,其原始作者为 Alexey Kuznetsov,,他以在Linux内核中实现QoS而闻名。

获取工具:

与net-tools相反,iprouter2工具在越来越多的Linux发行版本中集成,我们尝试运行以下命令(注意大小写)查看ip实用程序的版本以此检查是否配置了该实用程序:

ip -V

正常回显信息为:

ip utility, iproute2-*******

若回显信息为:command not found,则表示没有配置该工具,如果需要,您可以安装该工具。使用以下命令可以在CentOS下安装iproute2.

yum install -y iproute

使用以下命令可以在Ubuntu下安装iproute2:

sudo apt-get update
sudo apt-get install iproute2

其他系统的配置方法大家可自行搜索相关资料。

命令语法:

我们常使用ifconfig命令大多由IP命令集取代,以下是其命令通用形式:

ip [OPTIONS] OBJECT [COMMAND [ARGUMENTS]]

OPTIONS:

OPTIONS(选项)是一组多值修饰符,它们影响ip实用程序的一般行为和输出。所有选项均以“ - ”字符开头,可以通过输入完整形式或其缩略形式实现。目前可以使用以下选项:

-V,-Version ---输出ip实用程序的版本号并退出。

-s,-stats,-statistics ---输出更多信息。
可以重复此选项以增加输出的详细级别。比如,我们可以观察ip -4 a , ip -4 -s a , ip -4 -s -s a 这三条命令输出信息的区别。通常,附加信息是设备或功能统计或值。在许多情况下,值输出应该与 /proc/ 目录的输出相同,其中值的名称与值本身没有直接关系。

-f[amily] { inet | inet6 | ipx | dnet | bridge | link } ---强制使用哪个协议族。
如果此选项不存在,则使用的协议族输出将从其他命令行参数中猜出。如果命令行的其余部分没有提供足够的信息来猜测协议族,则ip命令会回退到默认的inet协议族。链接是一个特殊的系列标识符,意味着不涉及网络协议。此选项有几个快捷方式,如下所示:
-4 | -6 | -I | -D | -B | -0 | 常用如下:
-4 ---IPv4快捷方式。
-6 ----IPv6快捷方式。
-0 ----链接的快捷方式。
例如,我们使用 ip -6 a 命令输出所有IPv6地址。

-o,-oneline ---通过用“\”字符替换任何换行符将输出内容格式化为单行。

OBJECT:

OBJECT(对象)是您希望操作或获取有关信息的对象类型。其包含:

{ link | address | addrlabel | route | rule | neighbour | ntable | tunnel | tuntap | maddress | mroute | mrule | monitor | xfrm |netns | l2tp | tcp_metrics | token }  

以下对其进行介绍:
link---物理或逻辑网络设备,亦可使用 l
address ---设备上的协议(IPv4或IPv6)地址,亦可使用 a , addr
addrlabel ---协议地址选择的标签配置。
route ---路由表条目。
rule---路由策略数据库中的规则。
neighbour --- ARP或NDISC缓存条目,亦可使用n
ntable --- neighbour缓存的操作。
tunnel--- IP隧道。
tuntap ---管理TUN/TAP设备。
maddress --- 多播地址。
mroute ---组播路由缓存条目。
mrule ---多播路由策略数据库中的规则。
monitor ---监视netlink信息。
xfrm ---管理IPSec策略。
netns ---管理网络命名空间。
l2tp ---通过IP隧道传输以太网(L2TPv3)。
tcp_metrics ---管理TCP Metrics。
token ---管理标记化的接口标识符。

所有对象的名称可以全部或缩写形式书写。例如: address 可以缩写为 addr 或只是 a 。但是,如果您在脚本中使用这些命令,则应该养成始终使用操作的完整规范的习惯。使用缩写使其易于在命令行上使用,但很难理解脚本中的逻辑。由于您可能不是唯一需要处理脚本的人,因此您应该努力使它们尽可能完整。

COMMAND:

COMMAND(命令)指定要对对象执行的操作。可能的操作集取决于对象类型。通常,可以是 adddeleteshowlist )对象。但某些对象不允许所有的这些操作或具有一些其他命令,help 命令适用于所有的 OBJECT,它可以打印出可用命令和参数语法约定的列表。
即我们可以使用以下命令列出address的命令语法:

ip address help

如果没有给出命令,则假定一些默认命令。通常它是 showlist ), 或者,如果无法列出此类的对象,则默认输出 help

ARGUMENTS:

ARGUMENTS(参数)是具体化命令的命令选项列表。参数取决于命令和对象。可以发出以下两种类型的参数:
--- flags - 缩写为单个关键字。
--- parameters - consisting of a keyword followed by a value.
每个命令都有一个默认参数,如果省略参数,则使用默认参数。例如:dev参数是ip link命令的默认值,因此ip link list eth0相当于ip link list dev eth0
正如我们上面提到的对象名称,所有关键字都可以用第一个或前几个唯一字母缩写。当交互式使用ip时,这些快捷方式很方便,但不建议在脚本中使用它们,请不要在报告错误或寻求帮助时使用它们。

退出状态

如果命令成功,则退出状态为0;如果存在语法错误,则退出状态为1。如果内核报告错误,则退出状态为2。

常用命令:

ip link-网络设备配置

ip link show ---查看设备属性。

此语句中,show可写为:list,lst,sh,ls,l 。其后可跟以下参数:
* dev NAME(默认值)--- NAME指定要显示的网络设备。
如果省略此参数,则该命令将列出所有设备。

* up ---仅显示正在运行的接口。
例如,使用以下命令列出lo的信息:

ip link show dev lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

冒号前面的数字是接口索引或ifindex,此编号唯一标识接口。如果查看cat / proc / net / dev的输出,您将看到网络设备的列出顺序与您在此处看到的编号相同。ifindex之后是接口名称(lo,eth0,venet0,sit0等)。接口名称在任何给定时刻也是唯一的,但接口可能会从列表中消失,例如卸载相应的驱动程序模块时,稍后将创建另一个具有相同名称的接口。此外,使用ip link set DEVICE name NEWNAME命令,系统管理员可以更改设备名称。
接口名称也可以有另一个名称或在“@”符号后附加关键字NONE。这表示此设备绑定到主/从设备关系中的另一个设备。因此,通过该设备发送的数据包被封装并通过主设备转发。如果名称为NONE,则主设备未知。
在接口名称之后,我们看到接口mtu(最大传输单元),它确定数据包的最大大小,该数据包可以通过该接口作为单个包发送。
qdisc(排队规则)显示在接口上使用哪种排队算法。特别的是,关键字noqueue意味着此接口不排队任何内容。关键字noop表示接口处于黑洞模式,其会立即丢弃送达的所有数据包。

以下这些信息都是尖括号内的选项。在尖括号内是汇总接口标志的位置。最常用的标志如下:

  • UP ---此设备已打开,准备接受数据包以传输到网络上,并且可能会从网络上的其他节点接收数据包。

  • LOOPBACK ---接口不与其他主机通信。通过它发送的所有数据包都将返回给发送方,并且可以接收退回的数据包。

  • BROADCAST ---此设备可以将数据包发送到共享相同物理链路的所有其他主机。示例:以太网

  • POINTOPOINT ---网络只有两端连接两个节点。发送到链路的所有数据包都将到达对等链路,并且所有收到的数据包都是由对等体发起的。
    如果既未设置LOOPBACK也未设置BROADCAST或POINTOPOINT,则假定接口是NBMA(非广播多路访问)链路。NBMA是最通用的设备类型,也是最复杂的设备类型,因为连接到NBMA链路的主机无法在没有其他手动提供的配置信息的情况下向任何其他主机发送信息。

  • MULTICAST ---一个标记接口多播的标志。广播是多播的一个特殊情况,其中多播组包含链路上的所有节点作为成员。请注意,软件不得将此标志的缺失解释为接口无法进行多播。根据定义,任何POINTOPOINT和BROADCAST链接都是多播的,因为我们可以直接访问所有链接邻居,从而直接访问它们的任何特定组。由于与传输相关的高成本,不建议在仅广播网络上使用高带宽多播传输,但不严格禁止这种使用。

  • PROMISC ---设备监听并向内核提供链路上的所有流量。这包括网络上通过收发器的每个数据包。通常,此模式仅存在于广播链路上,并由网桥和网络监控设备使用。

  • ALLMULTI ---设备接收在链路上漫游的所有多播数据包。组播路由器使用此模式。

  • NOARP ---这个标志与其他标志不同。它没有不变的值,其解释取决于所涉及的网络协议。通常,它表示设备不需要任何地址解析,并且软件或硬件知道如何在没有协议栈帮助的情况下传送数据包。

  • DYNAMIC ---是一个建议标志,将此接口标记为动态创建和销毁。

  • SLAVE ---此接口与其他接口绑定,以共享链路容量。

示例输出的第二行包含有关与设备关联的链路层地址的信息。第一个字定义接口硬件类型,然后确定地址的格式和语义,因此逻辑上是地址本身的一部分。站点和广播地址的默认格式(或点对点链接的对等地址)是由冒号分隔的十六进制字节序列。但是,某些链接类型可能会有自己的自然地址格式,这些格式在演示文稿中使用。IE:IP隧道的地址打印为点分四IP地址。虽然NBMA链路没有明确定义的广播或对等地址,但该字段可能包含有用的信息,例如广播中继的地址或ARP服务器的地址。

ip link set ---更改设备属性。

您可以使用ip link set 请求多个参数更改。如果您请求多个参数更改并且任何一个更改失败,则ip会在失败后立即中止,因此失败之前的参数更改已完成,并且不会在中止时撤消。这是使用ip命令使系统处于不可预测状态的唯一情况。解决方案是避免使用一个ip link set调用更改多个参数。根据需要使用尽可能多的单独 ip link set 命令来执行所需的操作。

参数:

  • dev NAME (default) --- NAME 指定操作的网络设备。
  • up / down --- 将设备状态更改为UP或DOWN。
  • arp on / arp off --- 更改设备上的NOARP标志状态。
    注意,如果设备已处于UP状态,则不允许此操作。由于ip utility和内核都不检查此情况,因此在设备运行时更改标志会产生非常不可预测的结果。最好将设备设置为关闭然后发出此命令。
  • multicast on / multicast off --- 更改设备上的MULTICAST标志。
  • dynamic on / dynamic off --- 更改设备上的DYNAMIC标志。
  • name NAME --- 更改设备名称。
    注意,如果设备正在运行或已配置某些地址,则不建议执行此操作。您会因在设备运行或已分配寻址时更改设备名称而导致破坏系统安全性并搞砸其他网络守护进程或程序。
  • txqueuelen NUMBER / txqlen NUMBER --- 更改设备的传输队列长度。
  • mtu NUMBER --- 更改设备的MTU。
  • address LLADDRESS --- 更改接口的站地址。
  • broadcast LLADDRESS, brd LLADDRESS or peer LLADDRESS --- 在POINTOPOINT接口的情况下更改链路层广播地址或对等地址。
    注意,对于大多数物理网络设备(以太网,令牌环等),更改链路层广播地址将破坏网络。如果你不明白这个操作到底做了什么,请不要使用这个参数。
  • ip命令不允许更改PROMISC或ALLMULTI标志,因为这些标志被认为是过时的,不应在管理上进行更改。

例子:
ip link set venet1 address 000000000001 --- 更改接口venet1的站地址(MAC地址)为000000000001。
ip link set venet1 up ---启动接口venet1。

ip link的其他命令还有ip link add (用于添加虚拟Link), ip link delete (用户删除虚拟Link),本文暂不讲述。具体可参考命令:ip link help,或可参考:IP Link - Linux Man Pages

ip address - 协议地址管理

缩略词: address, addr, a
可用命令: add, delete, flush, show (list)
地址是指连接到网络设备的协议(IP或IPv6)地址。每个设备必须至少有一个地址才能使用相应的协议。可以将多个不同的地址连接到一个设备。
ip addr命令允许您查看接口上的地址及其属性。您可以添加新地址并删除旧地址,而无需考虑任何排序。

ip address add ---添加新的协议地址。

参数:

  • dev NAME --- 我们添加地址的设备的名称。
  • local ADDRESS (default) --- 接口的地址。
    地址格式取决于协议。IPv4使用点分四组,IPv6使用由冒号分隔的十六进制半字序列。 ADDRESS后面可以跟一个斜杠和一个十进制数字,它以CIDR表示法编码网络前缀(子网掩码)长度。 如果未指定CIDR子网掩码表示法,则该命令假定指定了主机(/ 32掩码)地址。
  • peer ADDRESS--- pointopoint接口的远程端点的地址。同样,ADDRESS后面可能跟一个斜杠和十进制数字,编码网络前缀长度。如果指定了对等体地址则本地地址不能具有的网络前缀长度中的网络前缀与所述对等体相关联,而不是与本地地址。换句话说,在指定对等地址和本地地址时,只能将网络掩码分配给对等地址。
  • broadcast ADDRESS --- 接口上广播地址。
    可以使用特殊符号“+”和“ - ”代替指定广播地址。在这种情况下,广播地址由或设置所有接口主机位衍生的一个(+)或由所有接口主机位设置为零( - )。在IPv4网络的大多数现代实现中,您将需要使用(+)设置。与ifconfig不同,除非明确请求,否则ip命令不会设置广播地址。
  • label NAME --- 每个地址都可以用标签字符串标记。
    为了保持使用Linux-2.0净别名兼容性,这个字符串必须与设备的名称一致或必须用的设备名,后跟一个冒号前缀。(eth0:duh)
  • scope SCOPE_VALUE --- 此地址有效的区域范围。
    可用范围在以下文件中列出 /etc/iproute2/rt_scopes 。预定义的范围值为:
  • global --- 地址全局有效。
  • site --- (仅限IPv6)地址是本地站点,仅在此站点内有效。
  • link --- 地址是本地链接,仅在此设备上有效。
  • host --- 该地址仅在此主机内有效。

示例:
ip addr add 127.0.0.1/8 dev lo brd + scope host
--- 将通常的环回地址添加到环回设备。必须先启用该设备,然后才能显示此地址。

ip addr add 10.0.0.1/24 brd + dev eth0
--- 将地址长度为24(网络掩码255.255.255.0)的地址10.0.0.1和标准广播添加到接口eth0

ip address delete ---删除协议地址。

缩略:delete,del,d
参数:
参数与 ip addr add 的参数一致。设备名称是必需参数,其余是可选的。如果没有给出参数,则删除列出的第一个地址。

示例:
ip addr del 127.0.0.1/8 dev lo
--- 从loopback设备中删除环回地址。

Alexey states说:
"最好不要尝试重复这个实验 8-}"
删除接口eth0上的所有IPv4地址:

while ip -f inet addr del dev eth0; do
nothing
done

ip address show ---查看协议地址。

缩略:show,list,lst,sh,ls,l
参数:

  • dev NAME (default) --- 设备名称。
  • scope SCOPE_VAL --- 仅列出具有此范围的地址。
  • to PREFIX --- 仅列出与此前缀匹配的地址。
  • label PATTERN --- 仅列出标签与PATTERN匹配的地址。
    PATTERN是通常的shell regexp样式模式。
  • dynamic / permanent ---(仅限IPv6)仅列出stateless address configuration配置的地址,或仅列出永久(非动态)地址。
  • tentative --- (仅限IPv6)仅列出地址,但未通过重复地址检测。
  • deprecated --- 仅限IPv6)仅列出弃用的地址。
  • primary / secondary --- 仅列出主要(或次要)地址。
    示例:
    ip -4 a ls eth0 ---列出eth0上的IPv4地址。

ip address flush ---刷新协议地址。

参数:
此命令刷新由某些条件筛选的协议地址。此命令与show具有相同的参数。主要区别在于,如果没有给出参数,则此命令不会运行。否则你可能会错误地删除所有地址。此命令(以及下面描述的其他刷新命令)非常危险。如果你犯了一个错误,命令不会请求确认或跳过,它真的会完全的地清除你的所有地址。一定要注意!

使用选项-statistics,命令变得详细,并打印出已删除的地址数和处理轮数以刷新地址列表。如果给出-statistics选项两次,那么ip addr flush也会以完整格式转储所有已删除的地址,如ip addr list部分所述。

ip neighbor --- neighbor/arp 表管理。

neighbour table对象在共享相同物理链路的主机的协议地址和链路层地址之间建立绑定。 Neighbour对象条目组织成表。IPv4 Neighbour对象表在另一个名称下称为ARP table。这些命令允许您查看neighbour table绑定及其属性,添加新neighbour table条目以及删除旧neighbour table条目。
参数:add, change, replace, delete, flush and show (list)

ip neighbor add ---添加新neighbor条目

ip neighbor change ---改变现有条目

ip neighbor replace ---添加新的或更改现有条目

缩略:add, a; change, chg; replace, repl
这些命令可创建新neighbor记录或更新现有neighbor记录。

  • to ADDRESS (default) --- 邻居的协议地址。它是IPv4或IPv6地址。
  • dev NAME --- 此邻居所连接的接口。
  • lladdr LLADDRESS --- 邻居的链路层地址。LLADDRESS可以为null。
  • nud NUD_STATE --- 邻居条目的状态。nud是“Neighbor Unreachability Detection”的缩写。

此状态可以采用以下值之一:

  • permanent --- 邻居条目永远有效,只能通过管理方式删除。
  • noarp --- 邻居条目有效,不会尝试验证此条目,但可以在其生命周期到期时删除。
  • reachable --- 邻居条目有效,直到可达性超时到期。
  • stale --- 邻居条目有效,但可疑。如果条目有效且此命令未更改地址,则ip neighbor的此选项不会更改邻居状态。

示例:
ip neigh add 10.0.0.3 lladdr 000001 dev eth0 nud perm
---在设备eth0上为邻居10.0.0.3添加永久ARP条目。
ip neigh chg 10.0.0.3 dev eth0 nud reachable
---将其状态更改为可达。

ip neighbor delete ---删除neighbor条目。

缩略:delete,del,d。
此命令使neighbor条目失效。参数与ip neigh add相同,只有lladdr和nud被忽略。
示例:
ip neigh del 10.0.0.3 dev eth0
---在设备eth0上使邻居10.0.0.3的ARP条目无效。
删除的neighbor条目不会立即从表中消失; 如果它正在使用中,则它在最后一个客户端释放它之前不会被删除,否则它将在下一次垃圾收集期间被销毁。
警告!尝试删除或手动更改内核创建的noarp条目可能会导致不可预测的行为。更具体地说,即使在NOARP接口上,内核也可能开始尝试解析该地址,或者将地址更改为多播或广播。

ip neighbor show ---列出邻居条目。

缩略:show,list,sh,ls。
此命令显示neighbor表。
参数:

  • to ADDRESS (default) --- 前缀选择要列出的neighbours。
  • dev NAME --- 仅列出连接到此设备的邻居。
  • unused --- 仅列出邻居,现在没有使用。
  • nud NUD_STATE --- 仅列出此状态中的邻居条目。 NUD_STATE takes values listed below after the example or the special value all, which means all the states. 此选项可能不止一次出现。如果没有此选项,ip将列出除none和noarp之外的所有条目。

ip neighbor flush ---刷新邻居条目。

此命令刷新邻居表。可以选择条目以通过各种标准进行刷新。
此命令与show具有相同的参数。请注意,在没有给出参数时它将不会运行,并且要刷新的默认邻居状态不包括permanent或noarp。
使用选项-statistics,命令输出变得详细,并打印出删除的邻居数和刷新邻居表时的轮数。如果选项被给出两次,ip neigh flush也会以前一小节中描述的格式转储所有已删除的邻居。

ip route - 路由表管理。

缩写:route,ro,r。
此命令管理内核路由表中的路由条目。内核路由表将有关协议路径的信息保存到其他网络节点。
因本人才疏学浅,暂只列出相关命令。

ip route add ---添加新路由。

ip route change ---改变路线。

ip route replace ---更改路由或添加新路由。

ip route delete ----删除路由。

ip route show ---此命令格式允许查看路由表内容并查看由某些条件选择的路由。

ip route flush --- 允许组删除路由,此命令允许按某些条件选择刷新路由。

ip route get --- 获取路由路径。此命令获取到目标的单个路径,并在内核看到时准确打印其内容。

ip rule ---路由策略数据库管理。

缩写:rule,ru。
路由策略数据库控制路由选择算法的规则。
因特网中使用的经典路由算法仅基于分组的目的地地址做出路由决定,并且在理论上,但在实践中不在TOS字段上。在某些情况下,我们希望以不同方式路由数据包,这不仅取决于目标地址,还取决于其他数据包字段,例如源地址,IP协议,传输协议端口甚至数据包有效负载。此任务称为“策略路由(policy routing)”。
"policy routing" != "routing policy" (“策略路由”!=“路由策略”)
"policy routing" = "cunning routing" (“策略路由” = “灵活路由”)
"routing policy" = "routing tactics" or "routing plan" (“路由策略”=“路由策略”或“路由计划”)
因本人才疏学浅,暂只列出相关命令。

ip rule add ---插入新规则。

ip rule show --- 列出策略规则。

ip tunnel - ip隧道配置。

ip tunnel add - 创建隧道。

ip tunnel show - 列出隧道属性。

ip monitor和rtmon ---路由状态监控。

ip实用程序允许连续监视设备,地址和路由的状态。此选项具有不同的格式,因为命令监视器首先在命令行上,后跟对象列表。
ip monitor [ file FILE ] [ all OBJECT-LIST ]
OBJECT-LIST是我们要监视的对象类型列表。它可能包含链接,地址和路由。如果没有给出文件参数,则ip打开RTNETLINK,监听它并以前面部分中描述的格式转储状态更改。
如果给出了文件名,则ip不会侦听RTNETLINK,而是打开假定包含以二进制格式保存的RTNETLINK消息的文件并将其转储。可以使用实用程序rtmon生成此类历史文件。此实用程序具有类似于ip monitor的命令行语法。理想情况下,应在发出第一个网络配置命令之前启动rtmon。可以随时启动rtmon,因为它使用在启动时转储的系统状态快照预先填充历史记录。


正是如此,IPROUTE2的IP实用程序是Linux下用于执行高级IP网络操作的ifconfig和路由实用程序的替代品。虽然标准实用程序足以满足简单设置,但仍建议学习使用ip实用程序,以便熟悉其用法并能够充分利用此实用程序的强大功能。

参考:

  1. Wiki页
    https://wiki.linuxfoundation.org/networking/iproute2

  2. Linux手册页-systutorials
    https://www.systutorials.com/docs/linux/man/8-ip/

  3. IPROUTE2 Utility Suite Howto
    http://www.policyrouting.org/iproute2.doc.html

  4. IP Link - Linux Man Pages
    https://www.systutorials.com/docs/linux/man/8-ip-link/

  5. 试试Linux下的ip命令,ifconfig已经过时了
    https://linux.cn/article-3144-1.html

  6. linux网络工具iproute2的使用简介
    https://blog.csdn.net/astrotycoon/article/details/52317288

  7. 新的网络管理工具 ip 替代 ifconfig 零压力
    https://linuxstory.org/replacing-ifconfig-with-ip/