在真的架設好你的區域網路之前,先拿虛擬機來測試一下如何手動連線,最終也透過 NetworkManager 來玩玩網路設定!
有某些時刻,我們可能需要暫時手動修改網路參數來進行某些測試,這時候,透過直接指令參數來修改,應該是個可行的方案! 同時,某些特定的指令,例如 ip 這個指令,在各大 Linux distribution 裡面都有提供,反而是 NetworkManager 不見得會提供呢! 因此,了解手動修改/透過系統 NetworkManager 設定修改,都需要學會較佳。現在移動裝置這麼多,了解在 PC 上面使用 WiFi 也應該是需要了解的~最終來設定一下 IPv6,應該也是挺有趣的!
如果你有網路卡,不是 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 去查閱! 這裡就不再顯示了。
設定網路參數的方法非常多,有一種是純手工操作的情況~這種情況很常發生在『暫時』使用某個網路參數的條件底下! 也就是說,並沒有要更改設定檔,而只是這次暫時處理網路參數,之後就會恢復其他預設的網路狀態。 此時,學會使用直接指令修改網路參數,也是需要的!尤其也可以直接觀察/除錯~學會這些網路指令, 在未來的其他系統管理,也相當有幫助喔!
在 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 的執行檔,底下僅列出會用到的指令而已!其他指令就自行參考囉! [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 等編輯軟體去修改該檔案內容即可!
既然要設定,那當然就得要有數值~目前我們假定會用到的網路參數如下:
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 輸出的資料,大致上是這樣說明:
許多軟體也能透過 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 』囉!
所謂的『路由表』指的就是你的網路包裹應該『怎麼傳送』的規則~一般來說,你的區網建立起來之後,理論上會給你一個『廣播』的路由, 但是,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 這個指令挺萬用的!我們可以使用這個指令來建立非本機網路的廣播路由呢! 也可以針對不同的目標設定不同的通訊閘!但那個使用太複雜~建議朋友們了解上頭的兩個基本語法就好!
要修改 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
上表當中,比較重要的地方大概有三個;
使用 ifconfig 搭配 route 以及修改 /etc/resolv.conf 之後,你就學會完整的全手動方式設定好你的網路參數囉! 在各家 distribution 上面,你應該都能夠這樣設計好你的網路環境喔!
建立一個方便記憶的主機名稱是需要的!在虛擬機器上面,我們都沒有建立主機名稱的需求,所以預設的主機名稱會是本機 (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 當中!
不知道你會不會覺得怪,為什麼系統會知道『 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 位址啦!直接使用主機名稱就搞定了!
這個檔案真的是在讓你設定主機名稱暱稱用的~所以,不要將大量的網際網路主機名稱寫入到這邊,會出問題! 一般來說,就是寫入不會跟網際網路名稱衝突的暱稱就好了!
設定好你的網路,當然就是得要測試一下你的設定值是否可以生效!其實,我們上面手動處理的流程中,已經有講到如何檢查啦! 這裡只是將過程統一說明而已!相關的指令參數可以持續參考後續的說明~我們這邊單純就是要查詢而已! 任何一步驟出錯,都一定要克服之後,才能夠往下檢查喔!
# 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. 要檢查的部份有兩個,最重要是有預設路由,亦即 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.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. 雖然有多個方法,不過最建議還是使用 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. 檢查主機名稱設定 [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 位址,那就無須設定! # 不過,如果有暱稱的需求,還是可以寫入這個地方喔!
除了使用 net-tools 軟體提供的諸多指令來設定之外,我們也可以透過 ip 這個指令來處理所有的 TCP/IP 設定喔! ip 這個指令是由 iproute 軟題提供的~所以我們得先要安裝好 iproute,然後就有 ip 指令可以使用了! ip 這個指令的功能非常多!你可以 man ip 就知道了!我們這邊只針對 IP/Netmask, gateway, route 的方式來說明而已。
設定 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 去處理~詳細語法可以使用『 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 設定與主機名稱設定等,都與前一小節相同了!
上個小節使用到的方式來修改、處理網路,可以達到立刻變化的目的,但是,下次重新開機後,或者是一段時間之後, 系統可能會改回原本的網路參數。原因是,系統本來就有預設使用的機制在管理網路參數!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 開頭的資料, 則是目前生效的網路參數!兩者可能並不同步!比較需要注意的設定則有:
基本上,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]
沒有設定到的項目,大多使用預設值~整體環境就是這樣而已!設定檔看起來也算簡單!
自動取得網路參數的 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 的網路參數都是比較固定的!
如果你的系統使用的是筆記型電腦,或者是你的 Linux 系統所在處沒有網路線路,那可能就得要透過 WiFi 無線存取點 (Access Point, AP) 來進行無線的連網。但是如果是一般較舊的 PC 系統,基本上不會有無線 WiFi 設備啊~那怎辦?如何模擬?沒關係的, 我們有萬能的 USB 啊!只是,你得要注意的是,我們的 PC 系統並不是筆記型電腦,而且以最小安裝的方式來建構系統, 對於使用 X window 環境的朋友來說,文字介面的 USB WiFi 無線網卡支援度真的是比較差一點~所以,購買 USB 無線網卡時, 一定要注意支援度~鳥哥測試了手邊的不是太新的 USB 無線網卡,結果只有一顆可以讓 RockyLinux 9.x 直接驅動~其他兩顆則無法驅動~ 最終,鳥哥使用了 Asus 的 USB-AC51,品名似乎是 Wireless-AC600 的樣子~
雖然 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 才行!如果沒有安裝好該軟體, 就會出現類似底下的畫面:
# 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 就好!
現在,讓我們來掃描一下區域網路內部有哪些 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 去修改即可!
現在,我們因為有兩條都可以對外的線路存在,所以會出現這樣的情境:
# 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 則會暫時被擱置,不會主動啟用! 你也可以自由的手動切換~
如果企業內部使用的是相對比較便宜的台灣 ADSL 或者是光纖到府服務的網路,那使用的就是俗稱小烏龜數據機撥接連線的方式。 撥接的方式其實稱為點對點 Point-to-Point 的協定 (Protocol),但是我們都用乙太網路來上網了。因此,後來就有所謂的 PPP over Ethernet 的方法~目前 (2023) 由於手機 5G 的盛行,許多家庭基本上已經很少使用光纖到府上網方式了! 不過,對於家庭內部的主機,或者是企業內部的系統,使用這種撥接方式上網,似乎還是挺經濟划算的!
因為實做環境中,並沒有這種撥接的環境~所以,鳥哥只得在另外的環境實做 PPPoE 的流程!實做過程中, 首先需要知道的是接線的方式,你得要有一張網路卡,這張網路卡不要給予任何網路參數設定,只需要連接網路線到撥接用光纖數據機上, 請從數據機的 LAN 埠口拉一條網路線到你預計使用的網路卡,注意喔,是從 LAN 的埠口不是 WAN 的埠口喔!別拉錯了!
接下來,請安裝需要的軟體,跟 wifi 類似,NetworkManager 需要安裝 ppp 以及類似 adsl 的支援模組,這樣才有辦法連接 pppoe 的! 請先安裝吧!
# 1. 先安裝好需要的軟體 [root@localhost ~]# yum install NetworkManager-ppp NetworkManager-adsl
前面講到,鳥哥是在其他環境當中測試的,所以使用的介面卡跟本章稍早之前的情境可能不同~這裡要先說明一下。 目前鳥哥的這個測試環境,會使用到的 PPPoE 環境資料如下,當然啦!你得要替換成自己的參數:
接下來的舉動就簡單啦!直接建立一個名為 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 --
回想一下前一章的 IPv6 位址設定,我們會有一個 private 的 IP 位址段,你可以自己選擇一段你喜歡的私有 IP 位址段, 如果沒有想法,有個網站很有趣,它可以自動幫你挑選一組可以使用的 IPv6 私有網段喔!很有趣!你可以多次 [F5] 刷新底下的網站, 它可以給出不同的 IPv6 網段!
為了簡單處理 IPv6 的私有 IP 位址,我們使用比較簡單的網段,如下所示:
同樣與 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 .... # 確定是可以有回應的!
如上,這樣就設定好我們的 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 來設計主機名稱,基本上,也應該沒有什麼太大的問題啊!總之,多學一點總是沒錯!