服务器架设篇 - RockyLinux 9

第五章、创建与检查网络连接

在真的架设好你的局域网路之前,先拿虚拟机来测试一下如何手动连接,最终也通过 NetworkManager 来玩玩网络设置!

最近更新时间: 2023/08/18

有某些时刻,我们可能需要暂时手动修改网络参数来进行某些测试,这时候,通过直接指令参数来修改,应该是个可行的方案! 同时,某些特定的指令,例如 ip 这个指令,在各大 Linux distribution 里面都有提供,反而是 NetworkManager 不见得会提供呢! 因此,了解手动修改/通过系统 NetworkManager 设置修改,都需要学会较佳。现在移动设备这么多,了解在 PC 上面使用 WiFi 也应该是需要了解的~最终来设置一下 IPv6,应该也是挺有趣的!

5.1、手动创建网络参数的方式

如果你有网络卡,不是 lo 这块 loopback 的内部网卡,而是实际的网络卡存在你的系统中,那就代表你可以设计对外的网络连接参数了! 不过,你还是得要先确认有网卡,而且该张网卡的名称才行。以前的网络卡 (Network Interface Card, NIC) 名称代号通常是从 eth0 开始编号, 所以有 eth0, eth1 等等,而新的内核系统中,如果没有额外的外带参数,那网络卡的名称代号会使用总线的位置喔! 所以会有类似 eno1, enp0s3 等怪异的 NIC 名称代号等。

  • 内核抓到的网络卡信息

内核抓到的硬件信息,可以使用 lspci 来取得列表~不过,要使用 lspci 指令,需要先安装 pciutils 软件才行。 简单的使用方式,可以这样瞧一瞧:

# 1. 在实体机器上面查看网卡信息
[root@cloud ~]# yum -y install pciutils
[root@cloud ~]# lspci | grep -i eth
00:1f.6 Ethernet controller: Intel Corporation Ethernet Connection (12) I219-V
# 这一张就是 Intel 的 I219-V 实体网卡!应该是主板上面的内置网卡!最前面 00:1f.6 开头 00 通常代表内置设备

# 2. 在虚拟机上面查看网络卡信息
[root@localhost ~]# yum -y install pciutils
[root@localhost ~]# lspci | grep -i eth
01:00.0 Ethernet controller: Red Hat, Inc. Virtio network device (rev 01)
# 看到 Red Hat 的 Virtio 就知道是虚拟网卡,而且最前面显示 01:00.0,通常是外置插卡设备

除了使用 lspci 去列出总线上面的硬件之外,我们也可以通过 dmesg 取得相关的硬件信息!这次, 我们可以使用 eth 以及总线的关键字来处理!

# 1. 实体机器总线 00:1f.6 以及 eth 来查找网卡的相关参数与模块 
[root@cloud ~]# dmesg | egrep -in '00:1f.6|eth'
401:[    0.161768] pci 0000:00:1f.6: [8086:0d55] type 00 class 0x020000
402:[    0.161788] pci 0000:00:1f.6: reg 0x10: [mem 0xb1080000-0xb109ffff]
403:[    0.161882] pci 0000:00:1f.6: PME# supported from D0 D3hot D3cold
688:[    0.887015] e1000e 0000:00:1f.6: enabling device (0000 -> 0002)
689:[    0.887195] e1000e 0000:00:1f.6: Interrupt Throttling Rate (ints/sec) set to dynamic conservative mode
706:[    1.115798] e1000e 0000:00:1f.6 0000:00:1f.6 (uninitialized): registered PHC clock
707:[    1.181193] e1000e 0000:00:1f.6 eth0: (PCI Express:2.5GT/s:Width x1) fc:34:97:3b:eb:86
708:[    1.181197] e1000e 0000:00:1f.6 eth0: Intel(R) PRO/1000 Network Connection
709:[    1.181268] e1000e 0000:00:1f.6 eth0: MAC: 12, PHY: 12, PBA No: FFFFFF-0FF
710:[    1.191204] e1000e 0000:00:1f.6 eno1: renamed from eth0
929:[   36.245584] e1000e 0000:00:1f.6 eno1: NIC Link is Up 1000 Mbps Full Duplex, Flow Control: Rx/Tx
931:[   40.836654] e1000e 0000:00:1f.6 eno1: NIC Link is Up 1000 Mbps Full Duplex, Flow Control: Rx/Tx
# 可以发现驱动程序模块为 e1000e,同时网卡名称由 eth0 改为 eno1 了!

# 2. 虚拟机总线 01:00.0 搭配 eth 查找网卡参数
[root@localhost ~]# dmesg | egrep '01:00.0|eth'
[    0.122591] pci 0000:01:00.0: [1af4:1041] type 00 class 0x020000
[    0.123770] pci 0000:01:00.0: reg 0x14: [mem 0xc1f00000-0xc1f00fff]
[    0.127164] pci 0000:01:00.0: reg 0x20: [mem 0x800000000-0x800003fff 64bit pref]
[    0.127736] pci 0000:01:00.0: reg 0x30: [mem 0xfffc0000-0xffffffff pref]
[    0.210830] pci 0000:01:00.0: can't claim BAR 6 [mem 0xfffc0000-0xffffffff pref]: no compatible bridge window
[    0.212205] pci 0000:01:00.0: BAR 6: assigned [mem 0xc1f40000-0xc1f7ffff pref]
[    1.753458] virtio_net virtio1 enp1s0: renamed from eth0
# 看起来使用的是 virtio_net 网络卡模块,网卡名称为 enp1s0 这个!

我们可以明显的看到,缺省的网卡很可能是 eth0 这样的型态,不过后来会根据总线的形式来进行网卡名称的变更。 同时也能看到不同主机使用的不同网卡模块~相关的模块消息,可以使用 modinfo module_name 去查阅! 这里就不再显示了。

5.1.1、使用 net-tools 的软件处理

设置网络参数的方法非常多,有一种是纯手工操作的情况~这种情况很常发生在『暂时』使用某个网络参数的条件底下! 也就是说,并没有要更改设置档,而只是这次暂时处理网络参数,之后就会恢复其他缺省的网络状态。 此时,学会使用直接指令修改网络参数,也是需要的!尤其也可以直接观察/调试~学会这些网络指令, 在未来的其他系统管理,也相当有帮助喔!

在 RHEL 系列的 distribution 中,通常使用 net-tools 作为网络管理工具软件名称,等等我们再来讨论 iproute 软件的用法。 另外,要注意的是,我们等等会直接修改虚拟机的网络参数,所以,你最好不要使用 ssh 进入到虚拟机,否则一下子就会被踢出来! 毕竟你会改掉 IP 地址啊!哈哈!记得使用 remote-viewer 等其他方式登录你的虚拟机环境喔! 另外,我们在 KVM host 上面的防火墙,也可能需要修改一下!毕竟每一台虚拟机所激活的端口口应该是不一样的! 不能只是放行 5911/tcp 而已!那就这样做看看:

# 将 5900 到 5999 的 100 个端口口都放行,避免之后重复处理
[root@cloud ~]# firewall-cmd --permanent --add-port=5900-5999/tcp
[root@cloud ~]# firewall-cmd --reload
[root@cloud ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eno1
  sources:
  services: cockpit dhcpv6-client ssh
  ports: 5900-5999/tcp
  protocols:
....
[root@cloud ~]# systemctl restart libvirtd
# 由于 libvirtd 会去修改防火墙,所以,我们重起过 firewalld 之后,得要重起 libvirtd
# 否则你的虚拟机对外网络会被抵挡住而无法连上 Internet 喔!

这样就搞定母系统的防火墙等相关数据~

  • net-tools 内的常用指令

在最小安装的情况下,这个 net-tools 软件可能会没有安装~所以我们后来是有主动安装这套软件的!安装完毕之后 里面到底有什么可以使用的指令呢?基本上,我们这个小节会用到的有这些:

# 列出 net-tools 的运行档,底下仅列出会用到的指令而已!其他指令就自行参考啰!
[root@localhost ~]# rpm -ql net-tools | grep '/[s]*bin'
/usr/bin/netstat        # 查看网络端口口与连接状态
/usr/sbin/arp           # 查看 MAC addr 与 IP addr 的对应
/usr/sbin/ether-wake    # 可以通过 MAC addr 从网络去唤醒远程主机进行开机
/usr/sbin/ifconfig      # 可以设置 IP/netmask
/usr/sbin/route         # 可以设置缺省路由

我们会用到的大概就是 ifconfig 以及 route 这两个指令!但是,我们还有个 DNS 服务器 IP 地址要设置啊!那怎么设置? 其实系统的 DNS 设置值在 /etc/resolv.conf 上!直接通过 vim 等编辑软件去修改该文件内容即可!

  • 手动创建网络参数的范例数据设计:

既然要设置,那当然就得要有数值~目前我们假定会用到的网络参数如下:

  • IP/Netmask: 192.168.10.101/24
  • Gateway: 192.168.10.254
  • DNS: 168.95.1.1
  • 主机名称: test.vbird.qq
  • 用 ifconfig 观察/启动/关闭/设置 网卡参数

ifconfig 主要是可以手动的启动、观察与修改网络接口的相关参数,可以修改的参数很多,包括 IP 地址以及 MTU 等等都可以修改,详细语法请 man ifconfig,底下仅列出它的常用语法:

[root@localhost ~]# ifconfig [-sa] [interface]    <==观察/输出 网络接口信息
[root@localhost ~]# ifconfig interface [up|down]  <==启动/关闭 网络接口
[root@localhost ~]# ifconfig interface {options}  <==设置/修改 网络接口参数

# 1. 简单列出 (-s),目前虚拟机上面的所有网卡信息 (-a)
[root@localhost ~]# ifconfig -s -a
Iface      MTU    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
enp1s0    1500   431422      0 392751 0         30012      0      0      0 BMRU
lo       65536      365      0      0 0           365      0      0      0 LRU
# 简单看出有 enp1s0 以及 lo 两张网卡,MTU 分别是 1500/65536,接收封包的正常与错误数量等。
# -s 可以使用简易的统计参数表表
# -a 若有未激活的网卡,也会将该网卡的数据列出来的意思

# 2. 以上面案例中的 enp1s0 网卡接口,使用 ifconfig 列出该张网卡的详细信息
[root@localhost ~]# ifconfig enp1s0
enp1s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.52  netmask 255.255.255.0  broadcast 192.168.10.255
        inet6 fe80::5054:ff:feed:63aa  prefixlen 64  scopeid 0x20<link>
        ether 52:54:00:ed:63:aa  txqueuelen 1000  (Ethernet)
        RX packets 431515  bytes 50396418 (48.0 MiB)
        RX errors 0  dropped 392834  overruns 0  frame 0
        TX packets 30020  bytes 2479291 (2.3 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
# 输出的信息比较丰富!

上述 ifconfig 输出的数据,大致上是这样说明:

  • enp1s0:就是网卡的名称!旧系统使用 eth0 开始编号,新内核系统大致都以总线名称编号
  • flags:针对网卡的几个旗标,常见是 UP/RUNNING,代表激活。BBROADCAST, MULTICAST代表支持广播以及群播功能。
  • mtu:就是前一章提到的 MAC 封装里头的最大数据量,有些网卡可以提供支持到 9000 左右。
  • inet:就是 IP 地址、子网络遮罩、广播地址的参数
  • inet6:就是 IPv6 地址相关的数据, prefixlen 指的就是 IPv6 的 netmask 比特数
  • ether:MAC 网卡卡号
  • txqueuelen:用来传输数据的缓冲区的保存长度
  • RX:接收数据的封包数、字节数、错误封包数、丢弃数等等。
  • TX:发送数据的封包数、字节数、错误封包数、丢弃数等等。

许多软件也能通过 ifconfig 输出的 RX bytes 以及 TX bytes 作为数据数据的总数来分析,可以知道这张网络接口接收/发送的数据总量。 而 ifconfig 除了可以观察之外,也可以将某个适配器完整关闭!当关闭适配器时,使用 ifconfig 观察适配器,除了加上适配器名称之外, 也可以加上 -a ,将所有的接口信息通通列出来!现在,让我们来设置这张网络卡的新的 IP 地址吧!

# 3. 修改/设置网络参数,主要是 IP 地址与 netmask 还有 MTU 也可以!
[root@localhost ~]# ifconfig enp1s0 192.168.10.101 netmask 255.255.255.0 mtu 1500
[root@localhost ~]# ifconfig enp1s0
enp1s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.101  netmask 255.255.255.0  broadcast 192.168.10.255
        inet6 fe80::5054:ff:feed:63aa  prefixlen 64  scopeid 0x20<link>
        ether 52:54:00:ed:63:aa  txqueuelen 1000  (Ethernet)
....

[root@localhost ~]# ping -c 3 192.168.10.101
PING 192.168.10.101 (192.168.10.101) 56(84) bytes of data.
64 bytes from 192.168.10.101: icmp_seq=1 ttl=64 time=0.029 ms
64 bytes from 192.168.10.101: icmp_seq=2 ttl=64 time=0.041 ms
64 bytes from 192.168.10.101: icmp_seq=3 ttl=64 time=0.041 ms
....
# 当 ping 自己的 IP 地址时,会有回应,没有问题!

[root@localhost ~]# ping -c 3 192.168.10.254
ping: connect: Network is unreachable

oroot@localhost ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
# 很怪!有 IP 地址,但是却没有网络!原来是没有路由的关系!

使用 ifconfig 去改网络参数时,很有可能会导致路由表的遗失,此时你自己的 IP 地址会自成一个区网, 无法与外头连接,所以使用类似 ping 等网络检测工具时,会显示『 Network is unreachable 』的错误!这真是麻烦! 此时,我们得要使用 route 这个指令来进行路由表的建置了。

如果要暂时关闭网络卡,则直接『 ifconfig enp1s0 down 』即可关闭喔!当然,打开网络界面就会是『 ifconfig enp1s0 up 』啰!

  • 用 route 指令创建路由表

所谓的『路由表』指的就是你的网络包裹应该『怎么发送』的规则~一般来说,你的区网创建起来之后,理论上会给你一个『广播』的路由, 但是,RockyLinux 9 这一版次的 ifconfig 在修订了 IP 地址之后,竟然连原本的路由都不见了...所以,我们得要使用 route 指令来建置! 创建的方法其实也不难,可以这样加入一个『广播的路由』条件!详细的 route 语法,请自行 man route,底下仅介绍跟我们运作比较有关的语法!

# 1. 使用 route 创建一个广播用的路由表
[root@localhost ~]# route add -net 192.168.10.0/24 dev enp1s0
# 添加一个广播区网,使用的广播接口 (dev) 为 enp1s0 这个接口名称!

[root@localhost ~]# route -n
Kernel IP routing table
Destination     Gateway   Genmask         Flags Metric Ref Use Iface
192.168.10.0    0.0.0.0   255.255.255.0   U     0      0     0 enp1s0
# 192.168.10.0/24 这个广播接口的路由表回来了!

[root@localhost ~]# ping -c 3 192.168.10.254
PING 192.168.10.254 (192.168.10.254) 56(84) bytes of data.
64 bytes from 192.168.10.254: icmp_seq=1 ttl=64 time=0.189 ms
64 bytes from 192.168.10.254: icmp_seq=2 ttl=64 time=0.142 ms
64 bytes from 192.168.10.254: icmp_seq=3 ttl=64 time=0.165 ms
....
# 这个时候,就可以进行局域网路的连接了!但是仍然无法连接到互联网喔!

终于,我们可以在区网内到处跑了!但是,并没有看到缺省路由!亦即我们没有找到通信闸啊!这时, 让我们来创建一个缺省路由吧!

# 2. 创建一个缺省路由 (default gateway)!
[root@localhost ~]# route add -net default gw 192.168.10.254
[root@localhost ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.10.254  0.0.0.0         UG    0      0        0 enp1s0
192.168.10.0    0.0.0.0         255.255.255.0   U     0      0        0 enp1s0

[root@localhost ~]# ping -c 3 168.95.1.1
PING 168.95.1.1 (168.95.1.1) 56(84) bytes of data.
64 bytes from 168.95.1.1: icmp_seq=1 ttl=53 time=2.29 ms
....
# 终于,对外网络也通了!剩下 DNS 服务器 IP 地址的设置而已!

其实 route 这个指令挺万用的!我们可以使用这个指令来创建非本机网络的广播路由呢! 也可以针对不同的目标设置不同的通信闸!但那个使用太复杂~建议朋友们了解上头的两个基本语法就好!

  • 由 /etc/resolv.conf 修改 DNS IP 地址

要修改 DNS IP 地址,倒是直接修改 /etc/resolv.conf 文件内容即可!因为我们需要修改 DNS 服务器的 IP 地址成为 168.95.1.1, 所以,你可以使用 vim 或 nano 改成这样即可:

# 1. 通过编辑软件,修改加入 nameserver 的数据到 resolv.conf 文件即可!
[root@localhost ~]# vim /etc/resolv.conf
# Generated by NetworkManager
nameserver 168.95.1.1
nameserver 8.8.8.8
# 一部主机系统上面可以有多个 DNS 服务器 IP 地址,上面鸟哥写了两部主机这样。

一部主机可以拥有多部 DNS 服务器 IP 地址的设置,使用 nameserver 来依序指定要查找的 DNS 服务器。 上面的设置中,我们这部虚拟机会先去 168.95.1.1 查找数据,如果无法连上 168.95.1.1 时,就使用 8.8.8.8 来查找的意思。 那么如何确定 DNS 设置是正常的呢?可以使用 dig 来查找即可!

# 2. 查找设置的 DNS 服务器是否顺利连上与顺利运作:
[root@localhost ~]# dig www.google.com
; <<>> DiG 9.16.23-RH <<>> www.google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 11560
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;www.google.com.                        IN      A

;; ANSWER SECTION:
www.google.com.         269     IN      A       142.251.43.4

;; Query time: 1 msec
;; SERVER: 168.95.1.1#53(168.95.1.1)
;; WHEN: Thu Aug 17 09:48:38 CST 2023
;; MSG SIZE  rcvd: 59

上表当中,比较重要的地方大概有三个;

  • 第一个是你用 dig 问了什么,因此会有『 QUESTION 』的阶段,下方则是说明我们需要找到 www.google.com 的 A (Address)
  • 第二个则是会有回答『 ANSWER 』阶段,直接回答 IP 地址在 142.251.43.4。大家可以注意一下,你查找到的 google IP 地址可能跟我不一样, 这是因为 DNS 系统就可以帮你达到一些网络分流的效果了!
  • 最后还会列出这笔纪录是哪部 DNS 服务器查找的,所以就会有『 SERVER 』的说明喔!

使用 ifconfig 搭配 route 以及修改 /etc/resolv.conf 之后,你就学会完整的全手动方式设置好你的网络参数啰! 在各家 distribution 上面,你应该都能够这样设计好你的网络环境喔!

我们的 RHEL 9 系列 distribution 中,缺省使用一个名为 NetworkManager 的服务在管理与维护网络, 但是我们在使用手动方式修改网络参数时,并没有停止这个服务!所以,一段时间过后,你会发现刚刚设计的网络参数跑掉了! 这是正常的现象喔!除非我们将 NetworkManager 关闭啦!这部份本章后面的小节会再提到!这里只是先说明一下!
  • 使用 hostnamectl 创建主机名称,并查看 /etc/hostname

创建一个方便记忆的主机名称是需要的!在虚拟机上面,我们都没有创建主机名称的需求,所以缺省的主机名称会是本机 (localhost)。 我们在手动设置的范例中,缺省的主机名称需求是 test.vbird.qq 这样,使用 hostnamectl 设计非常简单:

# 1. 创建主机名称
[root@locahost ~]# hostnamectl hostname test.vbird.qq
[root@locahost ~]# hostnamectl
 Static hostname: test.vbird.qq
       Icon name: computer-vm
         Chassis: vm 🖴
      Machine ID: 252149b1ed3c407e84f3816bb9cb40e7
         Boot ID: 29c0d327894d49ad9df6945a1f92b30a
....
[root@locahost ~]# cat /etc/hostname
test.vbird.qq
# 其实写入了 /etc/hostname 当中!
  • 编辑 /etc/hosts 达成主机名称暱称与 IP 地址对应

不知道你会不会觉得怪,为什么系统会知道『 locahost 』就是 127.0.0.1 呢?这是因为 /etc/hosts 的帮忙! 基本上,内部私有 IP 地址,可以纪录到 /etc/hosts 当中,某些具有『主机名称暱称』的数据,也可以写入该文件! 不过编辑该文件时,要特别注意,不要删除前面具有 localhost 的两行!

# 1. 让你的 test.vbird.qq 以及 test 都可以连接到你的 IPv4 地址
[root@localhost ~]# vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.10.101 test.vbird.qq test
# IP 地址      主机名称      其他暱称

[root@localhost ~]# ping -c 3 test
PING test.vbird.qq (192.168.10.101) 56(84) bytes of data.
64 bytes from test.vbird.qq (192.168.10.101): icmp_seq=1 ttl=64 time=0.029 ms
....
# 如此一来,你就不用背诵 IP 地址啦!直接使用主机名称就搞定了!

这个文件真的是在让你设置主机名称暱称用的~所以,不要将大量的互联网主机名称写入到这边,会出问题! 一般来说,就是写入不会跟互联网名称冲突的暱称就好了!

5.1.2、检查网络参数设置的结果(网络调试)

设置好你的网络,当然就是得要测试一下你的设置值是否可以生效!其实,我们上面手动处理的流程中,已经有讲到如何检查啦! 这里只是将过程统一说明而已!相关的指令参数可以持续参考后续的说明~我们这边单纯就是要查找而已! 任何一步骤出错,都一定要克服之后,才能够往下检查喔!

  • 第 1 步,先检查 IP/Netmask 设置是否正确:
    检查的方法很简单,通过『 ip addr show 接口名称 』处理,或『 ifconfig 接口名称』即可!
    # 1. 先检查自身的设置,设置不对就回去改,设置正确才能往下:
    [root@localhost ~]# ip addr show enp1s0
    2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
        link/ether 52:54:00:ed:63:aa brd ff:ff:ff:ff:ff:ff
        inet 192.168.10.101/24 brd 192.168.10.255 scope global noprefixroute enp1s0
           valid_lft forever preferred_lft forever
        inet6 fe80::5054:ff:feed:63aa/64 scope link noprefixroute
           valid_lft forever preferred_lft forever
    # 看起来是正确的!如果错误的话,就得回前一小节使用 ifconfig 持续修改!
    
  • 第 2 步,检查路由表与缺省路由设置是否正确,就是看 gateway 的意思:
    检查方式很固定!就是使用 route -n 查看即可!
    # 2. 要检查的部份有两个,最重要是有缺省路由,亦即 0.0.0.0/0 那个规则,另一个则是接口自己的广播路由
    [root@localhost ~]# route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    0.0.0.0         192.168.10.254  0.0.0.0         UG    0      0        0 enp1s0  <==这就是缺省路由
    192.168.10.0    0.0.0.0         255.255.255.0   U     0      0        0 enp1s0  <==这是广播路由!
    # 我们目前只有一张网卡一个接口,所以一个广播路由,一个缺省路由,应该是正常的!
    # 若没看到广播路由或者是缺省路由,请回上一小节使用 route 加入即可!
    
  • 第 3 步,检查本机与 gateway 之间的连接是否正常:
    虽然有缺省路由的 gateway 设置,但是那是我们自己本机的设置,我们并不知道本机与路由器之间的通信状况如何, 或者是连接两者的 switch 与网络线如何,因此需要使用 ping 来检测一下!因为 gateway 可能会抵挡 ICMP 封包, 所以即使 ping 没有回应也没关系,使用 arp -n 查看是否能够正确的抓到 ARP 列表即可!
    # 3.1 使用 ping 检查与 gateway 之间的连接
    [root@localhost ~]# ping -c 3 192.168.10.254
    PING 192.168.10.254 (192.168.10.254) 56(84) bytes of data.
    64 bytes from 192.168.10.254: icmp_seq=1 ttl=64 time=0.079 ms
    ....
    # 有回应就 OK!
    
    # 3.2 查看是否有 ARP 列表,重点在看能不能抓到 gateway 的网卡卡号而已! 
    [root@localhost ~]# arp -n
    Address            HWtype  HWaddress           Flags Mask    Iface
    192.168.10.254     ether   52:54:00:00:ff:01   C             enp1s0
    # 确实是有对应起来!那就应该没问题!
    
    这一个步骤当中如果出现问题 (ARP 列表并没有出现 gateway 的 IP 地址) 时,主要检查的方向 (1)gateway 或者是 IP 分享器, 是不是忘记开机?还是因为停电的关系没有启动?先去看看电源再说; (2)是不是连接的 switch 没有开机?摸摸看有没有很烫? 有没有可能 hub/switch 热当了? (3)switch 连接到两者的端口口上面的灯号是否正常闪烁?换个 port 插是否能正常? (4)网络线有没有可能折烂了?或者是经常热拔插导致水晶头信号传输不佳?换一条网络线测试看看。
  • 第 4 步,检查 DNS 服务器是否正确提供服务
    DNS 服务器 IP 地址设置错误,简单的说,就是 /etc/resolv.conf 设置错误时,你的网络一定不会通的!这是因为大家都用主机名称上网了, 没有人会直接使用 IP 地址上网...检查的方式很简单:(1)可以使用『 ping 主机名称』来看看有没有翻译成为 IP 地址;(2)使用 nslookup 查找主机名称; (3)建议用 dig 查找主机名称!
    # 4. 虽然有多个方法,不过最建议还是使用 dig 来查找!要特别注意 SERVER 的 IP 地址!
    [root@localhost ~]# dig linux.vbird.org
    ....
    ;; QUESTION SECTION:
    ;linux.vbird.org.               IN      A
    
    ;; ANSWER SECTION:
    linux.vbird.org.        600     IN      A       140.116.44.180
    
    ;; Query time: 118 msec
    ;; SERVER: 168.95.1.1#53(168.95.1.1)
    ....
    # 不但有回应,而且确定是我们自己指定的 DNS IP 地址,那就没问题!
    
    DNS 是个很庞大的系统,所以,它出错问题就非常严重!因此,基本上,鸟哥是说基本上,DNS 服务器应该是活的好好的! 所以连不上 DNS 服务器时,可能就是你自己的 gateway 有问题!因为 gateway 不是我们自己指定的!所以,你可能得要往上问上一层 ISP,他们的 gateway 服务是否正常啊!
  • 第 5 步,检查主机名称与 IP 地址对应是否正确
    这个就比较简单,其实没做这一步也没关系~不过,建议还是检查一下比较妥当!使用 hostnamectl 测试,若有问题,再以 hostnamectl 重新设置。 之后查看一下 /etc/hosts 有没有编辑错即可!
    # 5. 检查主机名称设置
    [root@locahost ~]# hostnamectl
     Static hostname: test.vbird.qq
           Icon name: computer-vm
             Chassis: vm 🖴
          Machine ID: 252149b1ed3c407e84f3816bb9cb40e7
             Boot ID: 29c0d327894d49ad9df6945a1f92b30a
    .....
    [root@locahost ~]# cat /etc/hosts
    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    
    192.168.10.101 test.vbird.qq test
    # 针对内部 private IP 地址来说,建议有上述最后一行,如果是 public IP 地址,那就无须设置!
    # 不过,如果有暱称的需求,还是可以写入这个地方喔!
    

5.1.3、使用 iproute 的软件处理

除了使用 net-tools 软件提供的诸多指令来设置之外,我们也可以通过 ip 这个指令来处理所有的 TCP/IP 设置喔! ip 这个指令是由 iproute 软题提供的~所以我们得先要安装好 iproute,然后就有 ip 指令可以使用了! ip 这个指令的功能非常多!你可以 man ip 就知道了!我们这边只针对 IP/Netmask, gateway, route 的方式来说明而已。

  • 通过 ip addr 来处理 IP/Netmask 设置

设置 IP/Netmask 的方式,使用 ip addr 来处理非常快速!同时也很直觉~先来查看目前的数据:

# 1 先查看目前的网络设置
[root@localhost ~]# ip addr show enp1s0
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:ed:63:aa brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.101/24 brd 192.168.10.255 scope global noprefixroute enp1s0
       valid_lft forever preferred_lft forever
....

我们之前已经设置过网络参数了,所以你可以看到上面的数据。现在,你有两个选择~一个是使用 ip addr change 去修改网络参数即可, 另一个则是使用 ip addr del 去删除网络参数后,再以 ip addr add 去增加网络参数~详细的指令操作你可以查找『 man ip-address 』找到, 我们这边使用 ip addr [del|add] 进行处理看看!

[root@localhost ~]# man ip-address
ip address [add|change|replace|del] IFADDR dev IFNAME
# 鸟哥有简化 man page 的内容...详情请自行查阅 man page 喔!

# 2.1 先删除目前的网络设置
[root@localhost ~]# ip addr del 192.168.10.101/24 dev enp1s0
[root@localhost ~]# ip addr show enp1s0
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:ed:63:aa brd ff:ff:ff:ff:ff:ff
    inet6 fe80::5054:ff:feed:63aa/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
# 你会很明显的发现,原本的 inet 那一行消失不见了!因为没有 IPv4 的地址存在了!

# 2.2 重建网络参数
[root@localhost ~]# ip addr add 192.168.10.101/24 dev enp1s0

很快的,我们就可以创建好所需要的网络参数!IP/Netmask 搞定!没问题!

  • 通过 ip route 来处理 gateway 与广播路由设置

接下来,路由设置可以使用 ip route 去处理~详细语法可以使用『 man ip-route 』去查找~首先,我们先来查查看目前的路由表~ 方法很简单喔!

# 1. 观察路由表信息
[root@localhost ~]# ip route show
192.168.10.0/24 dev enp1s0 proto kernel scope link src 192.168.10.101
# 我们上面用 ip addr 的方式来删除/添加网络参数,所以缺省路由会消失!

同样的,路由表可以删除/取代与添加,我们依旧使用删除与添加来处理路由看看:

# 2.1 先删除所有路由信息
[root@localhost ~]# ip route del 192.168.10.0/24
[root@localhost ~]# ip route show
# 此时,会一片空白!没东西!

# 2.2 开始创建广播用的路由表
[root@localhost ~]# ip route add 192.168.10.0/24 dev enp1s0
[root@localhost ~]# ip route show
192.168.10.0/24 dev enp1s0 scope link
# 终于出现一个路由信息!

# 2.3 开始创建缺省路由
[root@localhost ~]# ip route add default via 192.168.10.254 dev enp1s0
[root@localhost ~]# ip route show
default via 192.168.10.254 dev enp1s0
192.168.10.0/24 dev enp1s0 scope link
# 喔耶!网络环境又创建回来了!

后续的 DNS 设置与主机名称设置等,都与前一小节相同了!

你可以使用 net-tools 或者是 iproute 软件来进行网络参数的设置!学会这个好处多多!

5.2、使用 NetworkManager 机制处理网络连接

上个小节使用到的方式来修改、处理网络,可以达到立刻变化的目的,但是,下次重新开机后,或者是一段时间之后, 系统可能会改回原本的网络参数。原因是,系统本来就有缺省使用的机制在管理网络参数!RHEL 系列版本很喜欢使用 NetworkManager 这个服务,而且这个服务从 RHEL 7 以后,缺省都是打开的!所以,在上面小节我们讨论手动变化网络参数的时候, 你会发现到,过一段时间后,网络参数会改原本的情境,那就是被 NetworkManager 抢回控制权啦!

确认一下我们确实有使用 NetworkManager 服务:

[root@localhost ~]# systemctl status NetworkManager
● NetworkManager.service - Network Manager
     Loaded: loaded (/usr/lib/systemd/system/NetworkManager.service; enabled; preset: enabled)
     Active: active (running) since Wed 2023-08-16 22:44:48 CST; 14h ago
       Docs: man:NetworkManager(8)
   Main PID: 5908 (NetworkManager)
      Tasks: 3 (limit: 12243)
     Memory: 3.1M
        CPU: 699ms
     CGroup: /system.slice/NetworkManager.service
             └─5908 /usr/sbin/NetworkManager --no-daemon
....
# 目前的设置是没问题的!有启动,而且目前正在使用中。

NetworkManager 除了提供图形界面的管理工具之外,也提供了文本界面的 nmcli 指令!我们先来看看这个指令的简单用法! 先用 nmcli 来查看目前的连接界面有哪些,同时注意到连接名称有哪些!

# 1. 看一下目前的网络卡接口情况:
[root@localhost ~]# nmcli device
DEVICE  TYPE      STATE                   CONNECTION
enp1s0  ethernet  connected               enp1s0
lo      loopback  connected (externally)  lo
# 设备  类型      状态                    连接名称

[root@localhost ~]# nmcli connection
NAME    UUID                                  TYPE      DEVICE
enp1s0  0b413fa2-5192-3674-a542-323759ec20bc  ethernet  enp1s0
lo      add9f515-6d76-42e1-8404-45422b8667f0  loopback  lo
#连接名 识别码                                类型      网络卡设备名称

如上表所示, nmcli device 的输出中,那个 CONNECTION 指的其实就是面 nmcli connection 输出的 NAME 项目。 由 nmcli device 我们会知道的网络界面有 enp1s0 与 lo 两者而已,而在 nmcli connection 里面,同样通过 DEVICE 知道了适配器的名称!那么,我们来查找一下 enp1s0 这个连接名称的设置内容与实际运作的内容有什么数据:

# 2. 看一下 enp1s0 这个『连接名称 (NAME)』的详细内容
[root@localhost ~]# nmcli connection show enp1s0
# connection 阶段,主要与连接名称有关的设置,包括是否开机激活的 autoconnect 项目
connection.id:                          enp1s0
connection.uuid:                        0b413fa2-5192-3674-a542-323759ec20bc
connection.stable-id:                   --
connection.type:                        802-3-ethernet
connection.interface-name:              enp1s0
connection.autoconnect:                 yes
....
# 802-3-ethernet 阶段,主要与硬件参数关系较高,包括 mtu, speed 项目等
802-3-ethernet.port:                    --
802-3-ethernet.speed:                   0
802-3-ethernet.duplex:                  --
802-3-ethernet.auto-negotiate:          no
802-3-ethernet.mac-address:             --
802-3-ethernet.cloned-mac-address:      --
802-3-ethernet.generate-mac-address-mask:--
802-3-ethernet.mac-address-blacklist:   --
802-3-ethernet.mtu:                     auto
....
# ipv4 阶段,主要与 IPv4 的地址/gateway/DNS 等设置有关喔!
ipv4.method:                            auto
ipv4.dns:                               --
ipv4.dns-search:                        --
ipv4.dns-options:                       --
ipv4.dns-priority:                      0
ipv4.addresses:                         --
ipv4.gateway:                           --
ipv4.routes:                            --
....
# ipv6 阶段,就跟 IPv6 的设置有关了!
ipv6.method:                            auto
ipv6.dns:                               --
ipv6.dns-search:                        --
ipv6.dns-options:                       --
ipv6.dns-priority:                      0
ipv6.addresses:                         --
ipv6.gateway:                           --
....
# GENERAL 阶段,大写字符开始的项目,就是目前正在运作当中的实际参数
GENERAL.NAME:                           enp1s0
GENERAL.UUID:                           0b413fa2-5192-3674-a542-323759ec20bc
GENERAL.DEVICES:                        enp1s0
GENERAL.IP-IFACE:                       enp1s0
GENERAL.STATE:                          activated
GENERAL.DEFAULT:                        yes
GENERAL.DEFAULT6:                       no
GENERAL.SPEC-OBJECT:                    --
GENERAL.VPN:                            no
GENERAL.DBUS-PATH:                      /org/freedesktop/NetworkManager/ActiveConnection/7
GENERAL.CON-PATH:                       /org/freedesktop/NetworkManager/Settings/2
GENERAL.ZONE:                           --
GENERAL.MASTER-PATH:                    --
IP4.ADDRESS[1]:                         192.168.10.101/24
IP4.GATEWAY:                            192.168.10.254
IP4.ROUTE[1]:                           dst = 0.0.0.0/0, nh = 192.168.10.254, mt = 100
IP4.ROUTE[2]:                           dst = 192.168.10.0/24, nh = 0.0.0.0, mt = 0
IP4.DNS[1]:                             192.168.10.254
# 看到 DHCP,代表一定跟自动取得网络参数的 dhcp (auto) 设置有关!
DHCP4.OPTION[1]:                        broadcast_address = 192.168.10.255
....
# 底下则是实际使用当中的 IPv6 网络参数
IP6.ADDRESS[1]:                         fe80::5054:ff:feed:63aa/64
IP6.GATEWAY:                            --
IP6.ROUTE[1]:                           dst = fe80::/64, nh = ::, mt = 1024

上表当中,最左侧的项目,如果是小写字符,代表的是『设置值』项目,而如果是大写,例如 IP4 与 GENERAL 开头的数据, 则是目前生效的网络参数!两者可能并不同步!比较需要注意的设置则有:

  • connection.autoconnect [yes|no]:是否需要启动这个网络界面
  • ipv4.method [auto|manual]:取得的方式为自动或手动
  • ipv4.addresses [IP/Netmask]:直接设置 IP 地址与子网络遮罩
  • ipv4.gateway [GWIP]:设置 Gateway 的 IP 地址
  • ipv4.dns [DNSIP]:设置 DNS server 的 IP 地址

5.2.1、固定网络参数设置方式(manual)

基本上,NetworkManager 针对单一网络卡的设置可以有多组不同的设置选项,然后视需求启动需要的项目即可! 我们等等先删除掉缺省的 enp1s0 这个连接名称 (NAME),设置的是 enp1s0-manual 名称~ 使用的参数跟手动设置的网络参数相同,只是 DNS 设置给予两个服务器 IP 地址,分别是 168.95.1.1 与 8.8.8.8, 那就让我们来实际测试一下:

# 1. 先删除旧有的连接名称
[root@localhost ~]# nmcli connection delete enp1s0
Connection 'enp1s0' (0b413fa2-5192-3674-a542-323759ec20bc) successfully deleted.

# 2. 创建一个名为 enp1s0-manual 的连接名称,使用手动设置,将所有参数写入
[root@localhost ~]# nmcli connection add con-name enp1s0-manual type ethernet ifname enp1s0 \
>  ipv4.method manual ipv4.addresses 192.168.10.101/24  \
>  ipv4.gateway 192.168.10.254 ipv4.dns 168.95.1.1,8.8.8.8
Connection 'enp1s0-manual' (fcd5aa18-4357-454d-bdab-2d7fd0807a55) successfully added.

[root@localhost ~]# nmcli connection up enp1s0-manual
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/10)

# 3. 查看一下目前的连接名称之后,看看 enp1s0-manual 的详细设置
[root@localhost ~]# nmcli connection
NAME           UUID                                  TYPE      DEVICE
enp1s0-manual  fcd5aa18-4357-454d-bdab-2d7fd0807a55  ethernet  enp1s0
lo             add9f515-6d76-42e1-8404-45422b8667f0  loopback  lo

[root@localhost ~]# nmcli connection show enp1s0-manual
connection.id:                          enp1s0-manual
connection.uuid:                        fcd5aa18-4357-454d-bdab-2d7fd0807a55
....
connection.interface-name:              enp1s0
connection.autoconnect:                 yes
....
ipv4.method:                            manual
ipv4.dns:                               168.95.1.1,8.8.8.8
....
ipv4.addresses:                         192.168.10.101/24
ipv4.gateway:                           192.168.10.254
....
IP4.ADDRESS[1]:                         192.168.10.101/24
IP4.GATEWAY:                            192.168.10.254
IP4.ROUTE[1]:                           dst = 192.168.10.0/24, nh = 0.0.0.0, mt = 100
IP4.ROUTE[2]:                           dst = 0.0.0.0/0, nh = 192.168.10.254, mt = 100
IP4.DNS[1]:                             168.95.1.1
IP4.DNS[2]:                             8.8.8.8
....
# 大致上就是我们需要的项目!而且这个设置会永久生效!开机就会自动激活了!

这样就搞定了!而事实上,我们刚刚的设置 (小写开头的部份) 是保存在系统上的设置档!可以这样简单的查找到:

[root@localhost ~]# cat /etc/NetworkManager/system-connections/enp1s0-manual.nmconnection
[connection]
id=enp1s0-manual
uuid=fcd5aa18-4357-454d-bdab-2d7fd0807a55
type=ethernet
interface-name=enp1s0

[ethernet]

[ipv4]
address1=192.168.10.101/24,192.168.10.254
dns=168.95.1.1;8.8.8.8;
method=manual

[ipv6]
addr-gen-mode=default
method=auto

[proxy]

没有设置到的项目,大多使用默认值~整体环境就是这样而已!设置档看起来也算简单!

5.2.2、自动取得网络参数设置方式(auto)

自动取得网络参数的 auto 设置,实在很简单!指定 ipv4.method 为 auto 即可!只是要注意,如果不小心设置过 ipv4.address 的话, 就得要将该值清空才行!我们来创建一个 enp1s0-auto 的连接名称,就指定自动取得网络参数之后, 同时强制 ipv4.address 为空值看看。

# 1. 先创建名为 enp1s0-auto 的连接名称:
[root@localhost ~]# nmcli connection add con-name enp1s0-auto type ethernet ifname enp1s0 \
>  ipv4.method auto ipv4.addresses ''
Connection 'enp1s0-auto' (24f5eeb1-3b37-4c5c-9479-cb8610e62f70) successfully added.

[root@localhost ~]# nmcli connection
NAME           UUID                                  TYPE      DEVICE
enp1s0-manual  fcd5aa18-4357-454d-bdab-2d7fd0807a55  ethernet  enp1s0
lo             add9f515-6d76-42e1-8404-45422b8667f0  loopback  lo
enp1s0-auto    24f5eeb1-3b37-4c5c-9479-cb8610e62f70  ethernet  --
# 你会发现,目前有作用的是 enp1s0-auto 这个项目!因为该项目的 DEVICE 有适配器存在。
# 而刚刚创建的 enp1s0-auto 的 DEVICE 则为空!因为并没有激活啊!

设置完毕之后,我们开始通过自动取得网络参数来激活我们这部系统:

# 2. 改用 enp1s0-auto 来激活网络参数:
[root@localhost ~]# nmcli connection up enp1s0-auto
[root@localhost ~]# nmcli connection
NAME           UUID                                  TYPE      DEVICE
enp1s0-auto    24f5eeb1-3b37-4c5c-9479-cb8610e62f70  ethernet  enp1s0
lo             add9f515-6d76-42e1-8404-45422b8667f0  loopback  lo
enp1s0-manual  fcd5aa18-4357-454d-bdab-2d7fd0807a55  ethernet  --

# 3. 使用之前手动方式去查看网络参数:
[root@localhost ~]# ip addr show enp1s0; route -n
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:ed:63:aa brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.52/24 brd 192.168.10.255 scope global dynamic noprefixroute enp1s0
       valid_lft 3551sec preferred_lft 3551sec
    inet6 fe80::739e:6f62:6024:2663/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.10.254  0.0.0.0         UG    100    0        0 enp1s0
192.168.10.0    0.0.0.0         255.255.255.0   U     100    0        0 enp1s0
# 网络参数已经变成自动调整了!

设置完毕之后,我们会有两个连接名称与 enp1s0 这个设备有关,那你想要让哪一个连接名称会激活? 这时就得要指定 autoconnection 的项目了!假设未来要使用的是手动设置,自动设置只是一个测试项目, 那我们可以这样进行实验看看:

# 1. 将 enp1s0-manual 项目变成缺省激活,而 enp1s0-auto 变成缺省停止:
[root@localhost ~]# nmcli connection modify enp1s0-manual connection.autoconnect yes
[root@localhost ~]# nmcli connection modify enp1s0-auto   connection.autoconnect no

# 2. 将所有连接名称通通关闭
[root@localhost ~]# nmcli connection down enp1s0-auto
Connection 'enp1s0-auto' successfully deactivated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/2)

[root@localhost ~]# nmcli connection
NAME           UUID                                  TYPE      DEVICE
lo             add9f515-6d76-42e1-8404-45422b8667f0  loopback  lo
enp1s0-auto    24f5eeb1-3b37-4c5c-9479-cb8610e62f70  ethernet  --
enp1s0-manual  fcd5aa18-4357-454d-bdab-2d7fd0807a55  ethernet  --
# 可以看到,两个连接名称都空掉了!不再占用 DEVICE !

# 3. 重新启动 NetworkManager 的服务
[root@localhost ~]# systemctl restart NetworkManager
[root@localhost ~]# nmcli connection
NAME           UUID                                  TYPE      DEVICE
enp1s0-manual  fcd5aa18-4357-454d-bdab-2d7fd0807a55  ethernet  enp1s0
lo             add9f515-6d76-42e1-8404-45422b8667f0  loopback  lo
enp1s0-auto    24f5eeb1-3b37-4c5c-9479-cb8610e62f70  ethernet  --
# 这样就可以发现,缺省会使用 enp1s0-manual 这个连接名称喔!

其实,可以拥有多个自由设置的连接名称,然后抽换启动的项目,就能够保留曾经使用过的设置值~ 这也能够让自己明白以前的设置项目!或者是到不同地方使用不同的设置值~应该都挺方便的!当然啦! server 就不太需要这样切来切去~毕竟 server 的网络参数都是比较固定的!

5.2.3、WiFi 无线网卡设置

如果你的系统使用的是笔记本电脑,或者是你的 Linux 系统所在处没有网络线路,那可能就得要通过 WiFi 无线访问点 (Access Point, AP) 来进行无线的连网。但是如果是一般较旧的 PC 系统,基本上不会有无线 WiFi 设备啊~那怎办?如何仿真?没关系的, 我们有万能的 USB 啊!只是,你得要注意的是,我们的 PC 系统并不是笔记本电脑,而且以最小安装的方式来建构系统, 对于使用 X window 环境的朋友来说,文本接口的 USB WiFi 无线网卡支持度真的是比较差一点~所以,购买 USB 无线网卡时, 一定要注意支持度~鸟哥测试了手边的不是太新的 USB 无线网卡,结果只有一颗可以让 RockyLinux 9.x 直接驱动~其他两颗则无法驱动~ 最终,鸟哥使用了 Asus 的 USB-AC51,品名似乎是 Wireless-AC600 的样子~

  • 使用实体机器的 USB 无线网卡硬件一览

虽然 USB 可以通过所谓的 pass-through 将 USB 设备的控制权交给虚拟机使用,不过,设置上面还是有点小麻烦。 所以,在这个无线网卡的设置上面,我们移动到实体机器来进行~现在,将 Asus AC51 这颗 USB 安插到主机的插孔上, 然后使用底下的方式找一下,到底有没有这颗 USB 设备呢;

# 1. 使用 lsusb 看看有没有抓到这颗设备
[root@cloud ~]# lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 008: ID 0b05:17d1 ASUSTek Computer, Inc. AC51 802.11a/b/g/n/ac Wireless Adapter [Mediatek MT7610U]
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
# 看起来是有抓到喔!

# 2. 使用 nmcli 的功能,看 NetworkManager 有没有抓到网络接口
[root@cloud ~]# nmcli device
DEVICE       TYPE      STATE                   CONNECTION
eno1         ethernet  connected               eno1
lo           loopback  connected (externally)  lo
templan      bridge    connected (externally)  templan
vnet0        tun       connected (externally)  vnet0
wlp0s20f0u5  wifi      unmanaged               --
# 上面这个就是 wifi 的设备了!目前尚未设置喔!而且似乎有点怪怪的!
  • 确认 NetworkManager 对 WiFi 的支持

要开始使用 NetworkManager 管理 wifi 设备之前,得要确认有安装 NetworkManager-wifi 才行!如果没有安装好该软件, 就会出现类似底下的画面:

# 1. 确认 wifi 缺省是打开的
[root@cloud ~]# nmcli general
STATE      CONNECTIVITY  WIFI-HW  WIFI     WWAN-HW  WWAN
connected  full          missing  enabled  missing  enabled

如上所示,虽然 WIFI 是打开的 (enabled),但是 WIFI 的硬件设备,都是 missing 的!这就比较怪异! 明明网卡接口有抓到,但是却无法顺利激活!应该就是没有安装上述的软件之故!安装之后重新启动 NetworkManager 测试看看:

# 2. 安装好 NetworkManager-wifi 测试看看
[root@cloud ~]# yum -y install NetworkManager-wifi
[root@cloud ~]# systemctl restart NetworkManager
[root@cloud ~]# nmcli general
STATE      CONNECTIVITY  WIFI-HW  WIFI     WWAN-HW  WWAN
connected  full          enabled  enabled  missing  enabled
# WWAN-HW 跟电话拨接比较有关,先不理它!有 WIFI-HW enabled 就好!
  • 扫描与列出目前的无线 AP 状态

现在,让我们来扫描一下局域网路内部有哪些 WiFi 的 AP 存在!可以这样做看看:

[root@cloud ~]# nmcli device wifi rescan
[root@cloud ~]# nmcli device wifi list
IN-USE  BSSID              SSID            MODE   CHAN  RATE        SIGNAL  BARS  SECURITY
        B8:27:EB:D8:AE:89  RPi-vbird       Infra  1     65 Mbit/s   99      ▂▄▆█  WPA1
        E8:CC:18:F1:BF:F8  vbird-2.4G      Infra  2     270 Mbit/s  85      ▂▄▆█  WPA1 WPA2
        E8:CC:18:F1:BF:FA  vbird-5G        Infra  149   135 Mbit/s  80      ▂▄▆_  WPA2

看起来目前速度与性能最好的,可能是 vbird-2.4G 这个 SSID 名称的 AP 最好!而且加密机制支持 WPA1 与 WPA2 这样。 经询问到这个 AP 管理员相关密码,现在,让我们来尝试连接到这个无线 AP 看看:

[root@cloud ~]# nmcli device wifi connect vbird-2.4G password 'XXX' ifname wlp0s20f0u5
Device 'wlp0s20f0u5' successfully activated with '51a27365-95b0-48d9-8048-390646be3ff2'.

[root@cloud ~]# nmcli connection
NAME        UUID                                  TYPE      DEVICE
eno1        24199355-b3a4-3f4d-bd6e-65be1085a499  ethernet  eno1
lo          08244c39-77bc-412e-a6dd-a632a2d7688d  loopback  lo
vbird-2.4G  51a27365-95b0-48d9-8048-390646be3ff2  wifi      wlp0s20f0u5
templan     58c9ba71-95b9-4b2a-950e-81a83891ebb0  bridge    templan
vnet0       a0abae67-eadc-4632-84ee-0c17311b6678  tun       vnet0

让我们模仿笔记本电脑连接到 AP 只需要知道 SSID 跟密码的情境,不要使用 nmcli connection add 的方式去添加连接, 而是简单通过 nmcli device wifi connect 的方式连接到 SSID 即可!NetworkManager 会自动产生一个与 SSID 相同名称的连接名称,若有其他要修改的项目,同样可以通过 nmcli connection modify 去修改即可!

  • 测试切换无线 WiFi 上网功能

现在,我们因为有两条都可以对外的线路存在,所以会出现这样的情境:

# 1. 先检查两张对外网卡的参数:
[root@cloud ~]# ip addr show eno1
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether fc:34:97:3b:eb:86 brd ff:ff:ff:ff:ff:ff
    inet 192.168.201.249/24 brd 192.168.201.255 scope global noprefixroute eno1
       valid_lft forever preferred_lft forever

[root@cloud ~]# ip addr show wlp0s20f0u5
3: wlp0s20f0u5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether c8:7f:54:8d:98:68 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.116/24 brd 192.168.0.255 scope global dynamic noprefixroute wlp0s20f0u5
       valid_lft 603975sec preferred_lft 603975sec
# 可以看到有两个独立的网段存在!

# 2. 查看一下目前的缺省路由情况
[root@cloud ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.201.254 0.0.0.0         UG    100    0        0 eno1
0.0.0.0         192.168.0.254   0.0.0.0         UG    600    0        0 wlp0s20f0u5
192.168.0.0     0.0.0.0         255.255.255.0   U     600    0        0 wlp0s20f0u5
192.168.10.0    0.0.0.0         255.255.255.0   U     0      0        0 templan
192.168.201.0   0.0.0.0         255.255.255.0   U     100    0        0 eno1

头疼了!有两个 default gateway 喔!尤其通常封包传递的顺序,会依据 Metric 的大小,越小的 Metric 会越优先使用~ 由上表的数据来看,原本的 192.168.201.254 的 Metric 比较小,因此缺省会使用这个 gateway 来传输! 那个由 AP 位置取得的 192.168.0.254 根本就不会被用到...那怎办?没关系!我们可以使用手动的方式, 暂时删除 192.168.201.254 这条缺省路由,这样我们就只会有一个缺省路由了!测试看看:

# 3. 删除旧的缺省路由
[root@cloud ~]# route del -net default gw 192.168.201.254
[root@cloud ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.254   0.0.0.0         UG    600    0        0 wlp0s20f0u5
192.168.0.0     0.0.0.0         255.255.255.0   U     600    0        0 wlp0s20f0u5
192.168.10.0    0.0.0.0         255.255.255.0   U     0      0        0 templan
192.168.201.0   0.0.0.0         255.255.255.0   U     100    0        0 eno1

# 4. 打开监听模式
[root@cloud ~]# tcpdump -i wlp0s20f0u5 -nn
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on wlp0s20f0u5, link-type EN10MB (Ethernet), snapshot length 262144 bytes
23:21:20.221038 IP 192.168.0.116 > 168.95.1.1: ICMP echo request, id 3, seq 1, length 64
23:21:20.224537 IP 168.95.1.1 > 192.168.0.116: ICMP echo reply, id 3, seq 1, length 64
23:21:21.222698 IP 192.168.0.116 > 168.95.1.1: ICMP echo request, id 3, seq 2, length 64
23:21:21.225535 IP 168.95.1.1 > 192.168.0.116: ICMP echo reply, id 3, seq 2, length 64
23:21:22.224931 IP 192.168.0.116 > 168.95.1.1: ICMP echo request, id 3, seq 3, length 64
23:21:22.230009 IP 168.95.1.1 > 192.168.0.116: ICMP echo reply, id 3, seq 3, length 64

你可以打开两个窗口,一个运行 tcpdump 的监听,另一个则是使用类似 ping 的方式去 ping -c 3 168.95.1.1, 你大概就会看到如上的画面,画面中你会发现到封包是从 192.168.0.116 这个 IP 发送出去的喔! 可以确定 gateway 使用了 WiFi AP 连接出去的!可以使用没问题了!

  • 恢复正常网络参数

要恢复正常的路由表情况,重新启动 eno1 这条连接即可!

[root@cloud ~]# nmcli connection up eno1
[root@cloud ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.201.254 0.0.0.0         UG    100    0        0 eno1
0.0.0.0         192.168.0.254   0.0.0.0         UG    600    0        0 wlp0s20f0u5
....

如果你不想要删除这条 AP 的连接,那么只能将这个接口暂时不要启动啰!使用的方式应该很简单!

[root@cloud ~]# nmcli connection modify vbird-2.4G connection.autoconnect no
[root@cloud ~]# nmcli connection down vbird-2.4G
[root@cloud ~]# systemctl restart NetworkManager
[root@cloud ~]# nmcli connection
NAME        UUID                                  TYPE      DEVICE
eno1        24199355-b3a4-3f4d-bd6e-65be1085a499  ethernet  eno1
lo          08244c39-77bc-412e-a6dd-a632a2d7688d  loopback  lo
templan     58c9ba71-95b9-4b2a-950e-81a83891ebb0  bridge    templan
vnet0       a0abae67-eadc-4632-84ee-0c17311b6678  tun       vnet0
vbird-2.4G  51a27365-95b0-48d9-8048-390646be3ff2  wifi      --

一切顺利的话,未来只会激活有线网络的 eno1 这个连接名称,而无线网络的 vbird-2.4G 则会暂时被搁置,不会主动激活! 你也可以自由的手动切换~

下一章,我们会尝试将这个 USB 无线网卡变成 WiFi AP 的样式,所以,这条 NetworkManager 的连接名称,确实也是可以删除啦!

5.2.4、台湾拨接上网(PPPoE)

如果企业内部使用的是相对比较便宜的台湾 ADSL 或者是光纤到府服务的网络,那使用的就是俗称小乌龟调制解调器拨接连接的方式。 拨接的方式其实称为点对点 Point-to-Point 的协定 (Protocol),但是我们都用以太网路来上网了。因此,后来就有所谓的 PPP over Ethernet 的方法~目前 (2023) 由于手机 5G 的盛行,许多家庭基本上已经很少使用光纤到府上网方式了! 不过,对于家庭内部的主机,或者是企业内部的系统,使用这种拨接方式上网,似乎还是挺经济划算的!

因为实做环境中,并没有这种拨接的环境~所以,鸟哥只得在另外的环境实做 PPPoE 的流程!实做过程中, 首先需要知道的是接线的方式,你得要有一张网络卡,这张网络卡不要给予任何网络参数设置,只需要连接网络线到拨接用光纤调制解调器上, 请从调制解调器的 LAN 端口口拉一条网络线到你预计使用的网络卡,注意喔,是从 LAN 的端口口不是 WAN 的端口口喔!别拉错了!

  • 调制解调器 LAN <===> 网络卡

接下来,请安装需要的软件,跟 wifi 类似,NetworkManager 需要安装 ppp 以及类似 adsl 的支持模块,这样才有办法连接 pppoe 的! 请先安装吧!

# 1. 先安装好需要的软件
[root@localhost ~]# yum install NetworkManager-ppp NetworkManager-adsl

前面讲到,鸟哥是在其他环境当中测试的,所以使用的适配器跟本章稍早之前的情境可能不同~这里要先说明一下。 目前鸟哥的这个测试环境,会使用到的 PPPoE 环境数据如下,当然啦!你得要替换成自己的参数:

  • 拨接帐号: 1234567@hinet.net
  • 拨接密码: ABCDEFG
  • 使用网卡: eth0

接下来的举动就简单啦!直接创建一个名为 hinet 或者是你可以了解的连接名称,然后就可以进行网络设置了! 简单的说,就是这样做:


[root@localhost ~]# nmcli connection add type pppoe con-name hinet ifname eth0 \
>  pppoe.username 1234567@hinet.net pppoe.password 'ABCDEFG'
Connection 'hinet' (cf7175a1-da10-4574-8092-5cc56c0ec710) successfully added.

[root@localhost ~]# nmcli connection
NAME   UUID                                  TYPE      DEVICE
eth0   c4e90453-d7d6-3d1c-b9d6-3977c797daa4  ethernet  eth0
lo     84b2994b-eae9-482f-9042-2d534c44a4cb  loopback  lo
hinet  cf7175a1-da10-4574-8092-5cc56c0ec710  pppoe     --

上面动作完成后,你的连接帐号与密码会记载在 /etc/NetworkManager/system-connections/hinet.nmconnection 文件中, 所以,该文件权限缺省是 600 啦!接下来,如果一切顺利,你就可以使用底下的方式来激活你的拨接了!

# 1. 启动 hinet 拨接之后,若帐号/密码/连接都正常,应该可以取得正确的连接!
[root@localhost ~]# nmcli connection up hinet
[root@localhost ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether 00:15:5d:00:7a:00  txqueuelen 1000  (Ethernet)
        RX packets 829  bytes 164949 (161.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 695  bytes 73073 (71.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
...

ppp0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1492
        inet 220.143.226.167  netmask 255.255.255.255  destination 168.95.98.254
        inet6 fe80::2bbb:4f62:3ef7:18e9  prefixlen 64  scopeid 0x20<link>
        inet6 2001:b011:e003:4831:6bab:e8:2d5e:b55b  prefixlen 64  scopeid 0x0<global>
        inet6 fe80::d110:bc4b:55b3:1e31  prefixlen 64  scopeid 0x20<link>
        ppp  txqueuelen 3  (Point-to-Point Protocol)
        RX packets 32  bytes 2552 (2.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 35  bytes 2624 (2.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

拨接成功之后,我们的系统会通过以太网路卡仿真出一块实体可以连接到 ISP 机房的网卡,那就是上面 ppp0 这块适配器! 详细看里面的信息,可以知道 public IP 地址,同时 netmask 是 32 比特!该连接会直接连接到 168.95.98.254 呢! 而且,MTU 不是标准的 1500 喔!拨接都会使用 1492 这个 MTU 数值! 此外,这次的连接也提供了 IPv6 的地址喔!所以我们可以拥有 IPv6 的连接啦!使用 ip addr show ppp0 看看结果变怎样:

# 2. 单纯看 ppp0 这块接口
[root@localhost ~]# ip addr show ppp0
15: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1492 qdisc fq_codel state UNKNOWN group default qlen 3
    link/ppp
    inet 220.143.226.167 peer 168.95.98.254/32 scope global ppp0
       valid_lft forever preferred_lft forever
    inet6 2001:b011:e003:4831:6bab:e8:2d5e:b55b/64 scope global noprefixroute
       valid_lft forever preferred_lft forever
....

基本上,输出的信息差不多!反正,就记得一件事,拨接成功之后,就会有个名为 ppp0 的接口出现了! 该接口其实是附挂在以太网卡上的!所以,以太网卡被停止,那么 ppp0 就会消失了!要注意喔!再来, 既然有 IPv6 的地址了,那么路由表会变怎样?

# 3. 查看 IPv4 的路由表
[root@localhost ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         168.95.98.254   0.0.0.0         UG    101    0        0 ppp0
168.95.98.254   0.0.0.0         255.255.255.255 UH    0      0        0 ppp0
168.95.98.254   0.0.0.0         255.255.255.255 UH    101    0        0 ppp0
# 要注意,由于是点对点,所以 Genmask 的部份,不是 0.0.0.0 就是 255.255.255.255

# 4. 查看 IPv6 的路由表
[root@localhost ~]# route -n -6
Kernel IPv6 routing table
Destination                    Next Hop                   Flag Met Ref Use If
::1/128                        ::                         U    256 2      0 lo
2001:b011:e003:4831::/64       ::                         U    101 1      0 ppp0
fe80::d110:bc4b:55b3:1e31/128  ::                         U    101 1      0 ppp0
fe80::d2f0:dbff:fea7:6000/128  ::                         U    101 1      0 ppp0
fe80::d2f0:dbff:fea7:6000/128  ::                         U    256 2      0 ppp0
fe80::/64                      ::                         U    1024 1      0 ppp0
::/0                           fe80::d2f0:dbff:fea7:6000  UG   101 3      0 ppp0
::1/128                        ::                         Un   0   4      0 lo
2001:b011:e003:4831:6bab:e8:2d5e:b55b/128 ::                         Un   0   3      0 ppp0
fe80::2bbb:4f62:3ef7:18e9/128  ::                         Un   0   4      0 ppp0
fe80::d110:bc4b:55b3:1e31/128  ::                         Un   0   3      0 ppp0
ff00::/8                       ::                         U    256 1      0 eth0
ff00::/8                       ::                         U    256 2      0 ppp0
::/0                           ::                         !n   -1  1      0 lo

所以,确定有 IPv6 的路由呢!相当有趣啊!不过,此时特别注意!你取得的是 public IP 喔!等于是你部系统直接连接到互联网上! 大家都可以直接连接了!所以要特别注意自己的网络安全!如果一切顺利没问题~测试过后,将你的网络调整回来吧!

# 5. 调整回原本的网络参数
[root@localhost ~]# nmcli connection up eth0
[root@localhost ~]# nmcli connection
NAME   UUID                                  TYPE      DEVICE
eth0   c4e90453-d7d6-3d1c-b9d6-3977c797daa4  ethernet  eth0
lo     15a34299-91de-4255-8170-19967a413ebe  loopback  lo
hinet  cf7175a1-da10-4574-8092-5cc56c0ec710  pppoe     --

5.3、IPv6 地址设置

回想一下前一章的 IPv6 地址设置,我们会有一个 private 的 IP 地址段,你可以自己选择一段你喜欢的私有 IP 地址段, 如果没有想法,有个网站很有趣,它可以自动帮你挑选一组可以使用的 IPv6 私有网段喔!很有趣!你可以多次 [F5] 刷新底下的网站, 它可以给出不同的 IPv6 网段!

为了简单处理 IPv6 的私有 IP 地址,我们使用比较简单的网段,如下所示:

  • 整体网段:fd00::/64
  • 第 1 个设置值:fd00::0001/64

同样与 192.168.10.0/24 为例,这里假设从 fd00::10:1/64 到 fd00::10:254/64 这样设置!请前往 test 虚拟机上面, 由于本章的测试范例为 192.168.10.101/24,所以 IPv6 就设置为 fd00::10:101/64 啰!

# 1. 设置好 IPv6 的 IP 地址,不需要 gateway 与 DNS 设计,只需要 IP 地址即可
[root@test ~]# nmcli connection modify enp1s0-manual ipv6.method manual ipv6.addresses fd00::10:101/64
[root@test ~]# nmcli connection up enp1s0-manual
[root@test ~]# ip addr show enp1s0
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:ed:63:aa brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.101/24 brd 192.168.10.255 scope global noprefixroute enp1s0
       valid_lft forever preferred_lft forever
    inet6 fd00::10:101/64 scope global noprefixroute
       valid_lft forever preferred_lft forever
    inet6 fe80::98f:2abc:ed9a:cd96/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

# 2. 测试能否使用 ping 确认 IP 地址
[root@test ~]# ping -c 3 fd00::10:101
PING fd00::10:101(fd00::10:101) 56 data bytes
64 bytes from fd00::10:101: icmp_seq=1 ttl=64 time=0.032 ms
64 bytes from fd00::10:101: icmp_seq=2 ttl=64 time=0.046 ms
....
# 确定是可以有回应的!
  • 使用 /etc/hosts 方便记忆

如上,这样就设置好我们的 IPv6 地址了!只是...等等~IPv6 的地址很难记忆耶!我们可以使用 /etc/hosts 来协助嘛? 当然是可以的!只是,为了跟 IPv4 的主机名称进行分辨,例如 localhost 为例,它就会有个 localhost6 这样的主机名称~ 所以,我们可以使用不同的主机名称来定义,如果使用了相同的主机名称分别绑在 IPv4 与 IPv6 的地址上,那就得要在 ping 的时候特别强调使用的 IP 协定版本!例如:

[root@test ~]# ping -c 3 -4 localhost
[root@test ~]# ping -c 3 -6 localhost

毕竟使用主机名称比较容易记忆,所以,我们也可以这样做:

[root@test ~]# vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.10.101 test.vbird.qq test
fd00::10:101   test6

[root@test ~]# ping -c 3 test6

IPv6 的地址设置大略知道怎么处理就好,鸟哥目前接触的环境里面,似乎没有提供 public 的 IPv6 地址, 也就没有机会使用到 IPv6 gateway 的情境!不过,局域网路里面,如果可以使用 IPv6 来进行连接, 搭配 /etc/hosts 来设计主机名称,基本上,也应该没有什么太大的问题啊!总之,多学一点总是没错!

修改历史:
  • 2023/08/18:将互联网的连接在虚拟机底下做个测试!增加主机 wifi 的连网功能,使用 Networkmanager 为主力设置!
2023/08/18以来统计人数
计数器
其他链接
环境工程模式篇
鸟园讨论区
鸟哥旧站

今日 人数统计
昨日 人数统计
本月 人数统计
上月 人数统计