坑边闲话:Windows 平台现在是两套命令控制体系,一套是向后兼容的 CMD 窗口,另一套是 PowerShell Core. 非 Core 版本的 PowerShell 我们今天不谈。与之类似,Linux 平台的网络命令也是分了两代,一代是 net-tools,另一代是 iproute2. 紧随时尚潮流的你,赶紧跟我学起 iproute2 命令套装!

1. net-tools 已是烈士暮年·

首先来介绍一下老一代的 net-tools 套装。

net-tools 是一个程序的集合,专门为 Linux 系统实现,而且构成了 NET-3 网络的基础。

传统的 net-tools 具体包括以下的若干程序:

  • arp
  • hostname
  • ifconfig
  • netstat
  • rarp
  • route
  • plipconfig
  • slattach
  • mii-tool
  • iptunnel
  • ipmaddr

注意,OpenWrt 21.02 并没有囊括 net-tools 所有的命令,只有部分依旧比较常用的命令得到支持。比如 ifconfignetstatroutemiit-tool 等。这是因为这些命令已经比较老了,继续支持的原因是好多用户离不开他们。比较少见的老命令自然就直接被拿掉了。

net-tools 目前正在逐渐被淘汰。如果你像我一样热爱最新的技术,那就跳过这一节,直接看 iproute2 命令吧!

2. iproute2 接过大旗·

iproute2 能做 net-tools 能做的所有事情。

iproute2 是一个命令套装,其中的命令都以 ip 开头。如 ip addrip routeip link 等。

那么问题来了,我们该如何学习 iproute2 命令集合呢?一般而言有两种思路,一是在 net-tools 的基础上学习,通过类比迁移掌握新的命令。另一种是直接从 iproute2 本身出发,理解这个命令套装的构建原理和思路。

当然后者逼格更高~~

不过逼格不能当饭吃,还是从一般应用场景出发吧。循序渐进~~

iproute2 中的命令都以 ip 加空格开头,看起来好像后面的都是 ip 命令的参数。但是实际上 ip 命令绝不会单独使用。这一点要牢记~

另外,iproute2 的命令非常多,也特别复杂,一篇文章就讲得明明白白并不是不可能,只是会很枯燥。这篇博客会尽力写得详细一点,但主要目的还是希望帮大家入门。入门之后,某些具体配置可以直接看 help 输出。

2.0. 警告·

iproute2 命令是严格依赖内核版本的,因此如果你的 OpenWrt 是下载的某个 snapshot 版本,也就是并非稳定版,那么有可能因为内核版本问题而无法 opkg install 某些 iproute2 的命令。

所以,要么弄个稳定版系统,要么在编译的时候就把 iproute2 都选择好。

2.1 引子:查看网络接口的状态·

  • net-tools: ifconfig (Interface Configration)
  • iproute2: ip addr show

一般而言,ath 指的是无线网卡,eth 指的是有线以太网卡,lo 指的是本机回环地址。

网络设备也可能使用其他名称,如 wlan0.

讲到这里我们要点明 ip 命令的构成。

2.2 ip 命令格式与子命令·

iproute2 命令的样式:

ip + 指定的对象(如 address,可简写为 addr 甚至 a)+ 操作(如 show

ip addr show.

ip 后面不一定要紧跟一个指定的操作对象,还可以先加一个过滤器、显示参数等。其写法如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
-0           -- link protocol, no networking
-4 -- IPv4 【常见】
-6 -- IPv6 【常见】
-B -- family bridge
-D -- family DECnet
-I -- family IPX
-M -- family MPLS
-all -- executes specified command over all objects
-brief -- brief output
-color -- color output【常见,很好用】
-details -- output more detailed information
-family -- select protocol family
-human -- output statistics with human readable values
-iec -- print human readable rates in IEC units (ie. 1K = 1024)
-oneline -- output one record per line
-resolve -- use system resolver for DNS names
-statistics -- output statistics
-timestamp -- display current time when using monitor option
-tshort -- display current time in shorter format when using monitor option

其中 -color 选项非常有用,它可以高亮某些字段,让我们阅读起来更方便一些。如图 1 所示。

图 1. ip -color 选项,以彩色格式输出。

2.3 ip 的操作对象字段·

常见的 ip 命令操作对象如图 2 所示。

图 2. ip 命令之后的操作对象。

这里我们着重解释一下几个常用的作用对象。

  • addr,即 address,用来管理地址
  • link,即网卡管理。这个就比较偏硬件了,我一般用来设置 MTU 或混杂模式,其他倒是很少用。
  • monitor,监控连接的设备。简单运行 ip monitor 即可查看当前可建立连接的所有设备
  • neigh,即查看网络邻居,简单可理解 ARP 表。如果你是局域网中的设备,那么能看到局域网中所有的电脑;如果在路由器上运行这个命令,则还可以看到上一级路由器。
  • route,这就是我们见天要讲的最终要的一个作用对象,即路由表

以上这些作用对象,在后面不加任何动作、参数的情况下,默认调用查看动作。如图 3 所示。

图 3. ip addr 直接执行,实际上是执行了 ip addr show

2.4 ip route 配置路由表·

ip route 命令是操作路由表的核心命令。我们举个例子。

输入 ip route 并执行,将得到所有的 IPv4 路由表。如果要查看 ipv6 路由表,可执行 ip -6 route 命令。

图 4. ip route 的可选动作。

为了好理解,我把 Windows 上通过 PowerShell 配置新路由表的命令与 iproute2 命令写在一起,大家对照着看。可以看到 iproute2 的命令更加精简,在没有提示的情况下输入更快;Windows PowerShell 的命令看上去更漂亮一致,参数与参数名保持对,十分满足强迫症。

1
2
# Linux iproute2
ip route add 10.211.0.0/16 via 124.16.7.254 dev eth0
1
2
// Windows powershell
New-NetRoute -DestinationPrefix 10.211.0.0/16 -NextHop 124.16.7.254 -ifIndex 0

iproute2 里,via 关键字和 nexthop 关键字均为预定义字段。如图 5 所示。

图 5. ip route add 中常见的几个参数。

一般我们认为在静态路由配置里,via 就是下一跳的意思。但是 Linux 把这个 nexthop 单独拎出来用,其实主要是为了弄多路径路由(如图 5 所示)。多路径路由是个很复杂的概念,今天就不展开讲了。做一般配置时,只需把 Powershell 里的 NextHop 参数理解为 iproute2 里的 via 即可。

其余的 metric、默认路由  0.0.0.0/0 等表达,也可以参照 iproute2ip 手册来学习。非常简单。

注意:与 PowerShell 的另一个不同的地方是 Linux iproute2 区分被转发流量的源地址。在 ip route add 中以 src 关键字表示。可理解为某限制条件,一般可留空。

总结·

这篇介绍 Linux 路由表配置的文章陆陆续续写了两三天,希望能对各位同学有所帮助,不严谨的地方还请在评论区指出。

下一篇我们讲 macOS 的网络配置命令。