伺服器架設篇 - 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以來統計人數
計數器
其他連結
環境工程模式篇
鳥園討論區
鳥哥舊站

今日 人數統計
昨日 人數統計
本月 人數統計
上月 人數統計