今天得知公司同事在上周向客戶申請開通的 MAC 位址是錯誤的,同事誤把「公司電腦」的 MAC 位址傳給客戶申請,但是入廠的時候卻是帶自己的筆電過去使用,實在是瞎爆了。接著我好奇問了全公司所有工程師知不知道什麼叫 MAC 位址,想不到也有 1/10 的人不知道這是什麼,這著實讓我非常驚訝。這篇文章我試圖用比較淺顯的文句,帶大家瞭解 MAC address 是個什麼玩意。
認識 IP 地址
我們在同一個「區域網路」內若要讓電腦與電腦之間的網路相連,就勢必要知道對方的「位址」在哪裡,那什麼是位址(Address)?我想大家不管是怎樣的小白,身為一個開發人員,就算你是純前端人員,最最最基本的,總該要知道什麼是 IP 地址吧!
我簡單分類一下,IP 大致分兩種:
-
動態 IP 地址
透過區域網路中的 DHCP 伺服器,自動取得一個可用的 IP 地址。
-
靜態 IP 地址
自己在電腦網卡設定中,手動設定一組 IP 地址與其他網路資訊,如子網路遮罩(Subnet mask)、預設網路匝道(Gateway)、域名伺服器(DNS)等等。
好的,你應該知道,在同一個「區域網路」內,IP 是不允許重複的,重複的 IP 地址,會導致許多問題,最嚴重會導致電腦無法上網。基本上,現在許多 AP 或網路分享器都有內建 DHCP 伺服器,所以要取得重複的 IP 地址已經不太容易發生,除非你執意要自行管理區域網路的 IP 地址。
因為每個人的電腦中,都可能有一個到多個「網路介面」(Network Interface)。所謂「網路介面」其實就是「網路卡」的意思,如果你的筆電可以上網的方式同時包括「實體網路線」、「Wi-Fi 無線網路」與「4G 網路」上網,那麼你的電腦就至少有 3 個「網路介面」。像我的桌上型電腦,就有兩張實體的網路卡,因此光是可插實體線的網路介面就有兩張。
注意: 虛擬網卡也是一種網路介面,一樣也有 MAC address 喔!
每個「網路介面」可以指派一個到多個 IP 地址,如果你身為一個網管人員,負責管理一群多達上百人的廠商測試區(廠測區),而廠測區裡面什麼形形色色的人都有,只要有人隨便亂設定個 IP 地址,就會有人上不了網,你該怎麼管理?所以其實 IP 是很難管制的。
認識 MAC 位址
所謂 MAC 是 Media Access Control (媒體存取控制位址) 的縮寫,通常每一個「網路介面」都會有一組 MAC 位址 (MAC address),而且「理論上」這個 MAC address 必須是全球唯一的編號,絕對不能重複。
MAC address (媒體存取控制位址) 有時候也會稱為 LAN Address (區域網路位址)、Ethernet Address (乙太網路位址)、burned-in address (燒寫位址) 或 Hardware address (硬體位址)、Physical Address (實體位址) 等名詞,這些全部都是「同義字」喔!
實際上,每一張實體的網路卡在出廠的時候,就會內建一組「理論上」無法修改的 MAC 位址,而且 IEEE 有嚴格規定 MAC 的編碼原則,每一家網路卡製作廠商都要事先申請一組 MAC 位址的前綴(Prefix),確保不同家的網卡廠商不會產生相同的 MAC 位址。
網路的運作原理相當複雜,我不打算講的太過深入,像是 OSI model 總共分了 7 個層次,IP 屬於 Network Layer (網路層),而 MAC 屬於 Data link layer (資料連接層) 的東西,這些網路細節知識,有興趣的朋友可以自己花點時間研究看看。
我們每台電腦為了要上網,需要有個 IP 地址,但是電腦與電腦之間的連接,通常會需要一個 Switch (交換器) 用來交換彼此的網路封包。你為了要讓一個網路封包可以順利傳送到另一台電腦,你必須確保封包可以順利抵達 Switch 之後,可以讓 Switch 幫你轉送到對方的電腦中。網路的底層運作(資料連接層),其實是透過 MAC 位址找到對方的,因為 MAC 位址是真正「唯一」的位址資訊!
認識 ARP 協議
所謂 ARP 是 Address Resolution Protocol (位址解析協定) 的縮寫,這是一個專門用在 Data link layer (資料連接層) 的通訊協定,主要用途就是拿來找到「區域網路」中的另一台電腦用的。
每一台電腦都必須維護著一份 ARP Cache 資料,紀錄著你曾經連接過的 IP-to-MAC 或 IP-to-Physical 的對應表,你只要透過 arp -a
命令,就可以顯示出所有你曾經連接過的 ARP 紀錄,如下圖示:
# arp -a
Interface: 172.30.108.80 --- 0xcd
Internet Address Physical Address Type
172.30.96.1 00-15-5d-e5-48-9e dynamic
172.30.111.255 ff-ff-ff-ff-ff-ff static
224.0.0.22 01-00-5e-00-00-16 static
224.0.0.251 01-00-5e-00-00-fb static
224.0.0.252 01-00-5e-00-00-fc static
239.255.255.250 01-00-5e-7f-ff-fa static
255.255.255.255 ff-ff-ff-ff-ff-ff static
注意:這裡不會出現你自己電腦的 MAC 位址,這裡所呈現的都是「對方電腦」的 IP-to-MAC 紀錄。
如果你真的想查詢出自己電腦的 MAC 位址,最簡單的方法,就是先 PING 對方的 IP 地址 (ping 172.30.96.1
),如果連的上的話,就可以立刻透過 arp -a
就可以查出對方「網路介面」的 MAC 位址。
事實上,這份俗稱 ARP Table
的對照表,是可以隨時清除的,你只要重新連線,就會再次透過 ARP 解析出對方的 MAC 位址。以下是在 Windows 刪除 ARP Table 對應表的命令:
netsh interface ip delete arpcache
注意: Windows 下使用 arp -d *
命令可能有 Bug,有些電腦能執行,但我的電腦不知為何無法執行!
如果你的電腦有使用 Windows VPN 撥接 VPN 連線的話,預設 Windows 會採用 full tunnel mode
進行連線,所有連外的網路都會自動建立 VPN 網路介面的 ARP 資料,而這份資料透過上述指令是無法清除的,必須用以下命令才行:
ipconfig /flushdns && netsh interface ip delete arpcache
如何查詢自己的 MAC 位址
其實要自己查詢出自己正在使用中的 MAC 位址,真的沒有想像中的容易,查錯的機會其實蠻高的。
查詢 MAC 位址的邏輯是這樣的:
-
你要先確認你用什麼方式上網 (實體網路 / Wi-Fi 無線網路 )
這個步驟的確認難度,很有可能超乎你的想像。
首先,你目前可能正在使用 Wi-Fi 上網,但是客戶端廠測區要求的網路環境必須是實體網路。
你可能擁有超過一張實體網卡,但是都沒有接實體網路線,那麼你將會擁有超過一個 MAC 地址,但你不知道哪一張網路介面對應到哪一個實體網路接孔。
有些筆電並沒有內建實體網卡,而是要用外接的方式才有網卡,而你從來沒有接過實體網路卡,所以電腦沒有任何網路介面的資訊,因此你查不到任何 MAC 位址,自然不知道 MAC 位址是多少。
有些筆電並沒有內建實體網卡,你曾經接過,但此時你沒有攜帶外接網卡出來,但你還是有機會查到的。
有些筆電並沒有內建實體網卡,但曾經接過好幾張不同的外接網卡,在你的電腦中可能有好幾張未被啟用的網路介面,所以你也可能無法判斷到底哪一張才是你未來要用的網路介面,所以你很難判斷 MAC 位址到底要用哪一個!
如果你的電腦需要事先撥接 VPN 連到客戶的內網,此時連到客戶內網伺服器的 MAC 位址,並不是你正在使用的網卡,而是 VPN Server 所配發的虛擬網路介面所使用的 MAC 位址,這部分的 MAC 位址是你查不到的。所以一般來說,在用 VPN 撥接連網的情況下,通常不會特別用鎖定 MAC 位址的方法管理網路。
-
透過指令快速查出 MAC 位址編號
Windows
ipconfig /all
Linux
ip a show
macOS (請開啟 Terminal
執行)
ifconfig
老實說,如果你的電腦環境單純,是可以很容易查出 MAC addresss 的,但是只要網路環境稍微複雜一點點,例如你在本機裝了 Hyper-V 服務、安裝 Docker Desktop、...之類的,就有可能突然冒出一大堆「網路介面」可用,每個「網路介面」各自擁有一個 MAC address 可選,你此時就有可能陷入選擇障礙了! 😅
總結
由於 MAC 位址「理論上」並不會重複,全世界所有的實體網卡都不應該有重複的 MAC 位址。如果我是網管人員,為了有效的管制廠測區的上網情況(Network Access Control)(NAC),避免有不知道哪裡來的小白設定了一個可能會讓大家斷線的 IP 地址,我會選擇在 Switch 設備上進行 IP bind MAC
設定,也就是把 IP address 與 MAC address 的對應表全部寫死在設備中,所有要上網的人全部都要來事先申請,當記錄寫入設備後,只要有人用了一個沒看過的 MAC 地址,就直接將他的網路封包全部丟棄,如此一來就不會影響到其他人上網了!
希望這篇文章足夠淺顯易懂,幫助那些不知道該如何查出 MAC 位址的開發人員! 👍
相關連結