手把手教你 Linux 平台的路由表配置
坑边闲话: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
所有的命令,只有部分依旧比较常用的命令得到支持。比如 ifconfig
,netstat
,route
,miit-tool
等。这是因为这些命令已经比较老了,继续支持的原因是好多用户离不开他们。比较少见的老命令自然就直接被拿掉了。
net-tools
目前正在逐渐被淘汰。如果你像我一样热爱最新的技术,那就跳过这一节,直接看 iproute2
命令吧!
2. iproute2
接过大旗·
iproute2
能做 net-tools
能做的所有事情。
iproute2
是一个命令套装,其中的命令都以 ip
开头。如 ip addr
,ip route
,ip 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 | -0 -- link protocol, no networking |
其中 -color
选项非常有用,它可以高亮某些字段,让我们阅读起来更方便一些。如图 1 所示。
2.3 ip
的操作对象字段·
常见的 ip
命令操作对象如图 2 所示。
这里我们着重解释一下几个常用的作用对象。
addr
,即address
,用来管理地址link
,即网卡管理。这个就比较偏硬件了,我一般用来设置MTU
或混杂模式,其他倒是很少用。monitor
,监控连接的设备。简单运行ip monitor
即可查看当前可建立连接的所有设备neigh
,即查看网络邻居,简单可理解ARP
表。如果你是局域网中的设备,那么能看到局域网中所有的电脑;如果在路由器上运行这个命令,则还可以看到上一级路由器。route
,这就是我们见天要讲的最终要的一个作用对象,即路由表
以上这些作用对象,在后面不加任何动作、参数的情况下,默认调用查看动作。如图 3 所示。
2.4 ip route
配置路由表·
ip route
命令是操作路由表的核心命令。我们举个例子。
输入 ip route
并执行,将得到所有的 IPv4 路由表。如果要查看 ipv6
路由表,可执行 ip -6 route
命令。
为了好理解,我把 Windows 上通过 PowerShell 配置新路由表的命令与 iproute2
命令写在一起,大家对照着看。可以看到 iproute2
的命令更加精简,在没有提示的情况下输入更快;Windows PowerShell 的命令看上去更漂亮一致,参数与参数名保持对,十分满足强迫症。
1 | # Linux iproute2 |
1 | // Windows powershell |
在 iproute2
里,via
关键字和 nexthop
关键字均为预定义字段。如图 5 所示。
一般我们认为在静态路由配置里,via
就是下一跳的意思。但是 Linux 把这个 nexthop
单独拎出来用,其实主要是为了弄多路径路由(如图 5 所示)。多路径路由是个很复杂的概念,今天就不展开讲了。做一般配置时,只需把 Powershell 里的 NextHop
参数理解为 iproute2
里的 via
即可。
其余的 metric
、默认路由 0.0.0.0/0
等表达,也可以参照 iproute2
的 ip
手册来学习。非常简单。
注意:与 PowerShell 的另一个不同的地方是 Linux iproute2
区分被转发流量的源地址。在 ip route add
中以 src
关键字表示。可理解为某限制条件,一般可留空。
总结·
这篇介绍 Linux 路由表配置的文章陆陆续续写了两三天,希望能对各位同学有所帮助,不严谨的地方还请在评论区指出。
下一篇我们讲 macOS 的网络配置命令。