[机派X] Day 6 - Linux 没网路,我要怎麽发铁人赛的文章

引言

今天是机派X系列文章的第六天。
昨天介绍了 Linux 的权限管理机制以及一些相关指令,今天要继续介绍网路相关的指令。

本篇大纲:

  • 引言
  • netplan 简介
  • Network Manager 简介
  • Network Manager 安装与设定
  • ping 工具简介
  • dig 工具简介
  • tracepath 工具简介
  • 关於本文章系列

网路(Internet)的概念无关乎作业系统,不管使用何种作业系统,现代网路的运作都遵循一致的标准,因此本篇不会着墨在网路的基础概念,而会专注於 Linux 所提供的网路相关工具,其中包含如何让 Linux 连上网路、常用的网路侦错工具等。

不同的 Linux 发行版(Distribution)通常配有不同的网路管理工具,本篇将以我们之前在树莓派上安装的 Ubuntu Server 20.04 为范例来做介绍。

netplan 简介

Ubuntu 传统的网路管理工具有三种:

  1. /etc/network/interfaces
  2. network-manager
  3. systemd-networkd

不过自从 Ubuntu 17.10 後,以上三种工具都将退居幕後,改以 netplan 当作网路的前端设定工具,使用者只需要撰写少量设定就可以让 netplan 自动生成後端的网路设定文件,而目前预设的後端网路管理工具是 network-manager。

netplan 的设定采用 yaml 格式撰写,可以从 Ubuntu 官方网站找到 范本,对於熟悉网路架构的人来说感觉像是「填空题」,只需要把对应的 IP、预设闸道(Gateway)以及 DNS 设定填到对应的栏位即可。

例如,以下是动态 IP 的设定档内容:

network:
  version: 2
  renderer: NetworkManager
  ethernets:
    enp3s0:
      dhcp4: true

设定编辑完成後,使用以下指令即可让 netplan 自动产生 Network Manager 的相关设定:

sudo netplan apply

其他详细资讯请参阅 Ubuntu 官方提供的说明。

Network Manager 简介

netplan 虽然是 Ubuntu 内建的前端网路管理工具,但我自己还是喜欢直接使用 Network Manager。
Network Manager 主要有两个指令可以使用 nmtui 与 nmcli。

nmtui 可以提供类 GUI 的设定界面,如下图所示:
nmtui 执行截图

nmtui 执行截图

我想上面两张截图已经能够证明 nmtui 的易用程度,基本上无须记忆任何格式或关键字,可以很直觉的操作。

与 nmtui 对比,nmcli 则是提供指令界面,通常可以用在程序撰写中,例如:使用 nmcli 指令定时检查某个 Wi-Fi SSID 是否在可连接的范围中,并适时切换要连接到的网路连线。

下图是 nmcli 执行的截图片段。
nmtui 执行截图

nmtui 与 nmcli 也可以搭配使用,例如先用 nmtui 建立一个复杂的连线设定,之後就可以使用 nmcli 快速控制连线状态。
关於 nmcli 的操作范例,请容许我在後面的脚本范例再举例说明。

Network Manager 安装与设定

由於 Ubuntu Desktop 才是使用 Network Manager 当作後端,而我们使用的 Ubuntu Server 则需要手动安装 Network Manager。

请执行以下指令来安装 Network Manager,其中的 apt 是个套件管理软件,会在之後的文章中详细介绍。
Network Manager 安装的过程中会需要网路,因此你可以先用 netplan 设定好网路连线。

sudo apt update
sudo apt install network-manager -y

完成安装後,就可以尝试使用 nmcli 与 nmtui 指令了。
例如:

nmcli

树莓派上内建一个乙太网路接口与无线网路模组。
当执行 nmcli 会显示仅有部份网路界面(Interface , if)可以使用:
nmtui 执行截图

从图中可以观察到:
wlan0 是指无线网路,目前尚未连接,可以使用 nmcli 或 nmtui 设定要连接到的无线网路。
然而,有线网路 eth0 却出现未被纳管(unmanaged)的状态,原因是 netplan 还在运作中,所以 Network Manager 才会对其置之不理。

我们可以透过以下步骤让 Network Manager 取回乙太网路的管理权:

Step1. 禁止 netplan 使用乙太网路

使用以下指令编辑 netplan 的设定文件:

sudo vim /etc/netplan/50-cloud-init.yaml

将图中关於 eth0 的设定全部删除。
netplan 设定档案内容截图

使用以下指令让 netplan 的设定档变更生效。

sudo netplan apply

Step2. 要求 Network Manager 管理乙太网路

请执行以下指令,该指令会在 Network Manager 设定目录中新增设定档案。

sudo touch /etc/NetworkManager/conf.d/10-globally-managed-devices.conf

接下来让 Network Manager 重新载入设定。

sudo systemctl reload NetworkManager

Step3. 检查设定是否生效

请再次执行 nmcli 或 nmtui 并检查 eth0 界面是否已经纳入 Network Manager 的管理。
例如:

nmcli

图中可以看到 eth0 现在已成功连线,如果你的 eth0 是处於连线中断(disconnected)状态,可以使用 nmcli 或 nmtui 设定後即可成功连线。
nmtui 执行截图

ping 工具简介

Network Manager 显示成功连线後,你可能会需要一些工具来测试连线是否正常。或是在网路异常时,使用这些工具来完成除错(Debug)。

第一个工具是 ping,能够从本机(local)发送 ICMP 封包到其他主机上,测试两台电脑间是否能够通讯。
当然,有些主机为了安全因素,不接受 ICMP 封包连线测试,此时 ping 也就无能为力了。

以下是 ping 指令的基本语法,COUNT 可以决定要传送几个 ICMP 封包,DESTINATION 则是封包传送的目的地,也就是要测试的目标主机。若是省略 COUNT 就会一直发送 ICMP 封包,若要停止,请按 Ctrl + C 强制中止指令。

ping [-c COUNT] DESTINATION

例如:使用 ping 测试与台南大学主机 140.133.2.17 的连线。

ping 140.133.2.17

ping 执行截图

dig 工具简介

接下来则是 DNS 查询工具:dig。

dig 指令简易用法如下,QUERY 就是要查询的网域名称(domain name)。

dig [QUERY]

例如:以下查询台南大学网站 www.nutn.edu.tw 所对应到的 IP。

dig www.nutn.edu.tw

dig 执行截图

例如:以下反查 140.133.2.17 的纪录。

dig -x 140.133.2.17

dig 执行截图

tracepath 工具简介

透过 tracepath 可以测试两主机间封包传输时的跳跃(Jump)次数与节点资讯。

以下是 tracepath 的简易用法,DESTINATION 是要测试的目标主机,-m 则可以指定封包传送时最多可接受几次跳跃。

tracepath [-m MAX_HOPS] DESTINATION

例如:以下查询本机与台南大学主机 140.133.2.17 间的封包传输路径。

tracepath -m 10 140.133.2.17

tracepath 执行截图

关於本文章系列

如果对於文章内容有建议、纠错或图源标示不正确的问题,欢迎参考 [机派X] Day 1 尝试与文章作者联络。
想看更多本系列的文章,请连结至 [机派X] Day 1 查看大纲。


<<:  Day04 - 学习 Vue CLI package.json 设定档

>>:  Day03 - 复习 canvas translate 与 rotate

[Day 18] Facial Recognition: CNN网路与孪生网路简单介绍

此CNN非彼CNN 卷积神经网路 (Convolutional Neural Network),通...

[Day12] Firestore

前几天总共介绍了4种不同的储存方式,今天要来介绍最後一种: Cloud FireStore。 Fir...

机器人/AGV/AMR安全标准

与国际接轨,免不了的需要共通性标准,即要符合最小有效沟通成本,也要可以将合作伙伴的利益最大化(传说中...

Day4 理解 golang slice 用法及原理 IV

这篇主要写两个主题,作为 理解 golang slice 用法及原理 系列的结尾 : nil sli...

Day-05 JavaScript阵列

阵列可以一次宣告大量的变数,有节省时间、空间的优点。在JavaScript里,阵列可储存不同型态的值...