網路概論(四)
前言
之前幾篇文章內提到 IP 位址之後機會就會順便提到 MAC 位址,看起來似乎兩個是綁在一起的,其實兩者並沒有絕對的關係,我們從開放式系統互聯模型(Open System Interconnection Model,簡稱:OSI 模型)可以看出他們分別歸屬在第 3 層-網路層與第 2 層-資料連結層,OSI 模型對筆者來說是一種容易看懂但是很難理解的東西,因為它含括實體的硬體到抽象的資料結構,對筆者這種網路門外漢來說可能會越說越模糊,不過今天要提到路由器,就不得不跟交換器比較一下差異。
乙太網路 (Ethernet)
我們一般人接觸網路幾乎都是採用乙太網路(Ethernet)技術,而乙太網路是以 MAC 位址當作端點識別,所以 MAC 位址也可以稱為乙太網路位址(Ethernet Address),我們俗稱的交換器應該稱作乙太網路交換器(Ethernet Switch),我們電腦使用的網路卡應該稱作乙太網路網路卡(Ethernet Adapter),而接下來要說的路由器也應該稱作乙太網路路由器(Ethernet Router),我們一般獎的網路封包(Package)算是 OSI 第 3 層的資料,而現在要說的乙太網路則屬於第 2 層-資料連結層,之前為了避免太多專有名詞,所以沒有特意區分,在封包加上第 2 層資料時會稱為資料框(Data Frame),就乙太網路而言也可以稱做 Ethernet Frame,主要會加入 MAC 位址來指定傳遞路線(傳遞目的 MAC 位址不見得是實際終點,只要是目的 IP 位址不再我們所處的網段,都會以預設閘道的 MAC 位址,當作目的位址)。
完整 Frame 格式請參閱維基百科:Ethernet Frame
所以我們只要知道當我們是透過乙太網路來傳輸資料,那 Frame 就會內含 MAC 位址,相反就不一定了,這也是為什麼一般討論路由器時很少談論到 MAC 位址,因為沒有絕對關係。
例如 ADSL 網路,他在數據機對外連線是透過電話線,而它的網路技術是採用非同步傳輸模式(Asynchronous Transfer Mode,簡稱:ATM),從維基百科:非同步傳輸模式可以看到它就使用 MAC 位址,而是採用識別碼,但是還是資料連結層的概念,它是一個可以被尋找到的位址,所以一樣可以知道傳輸的路徑。
實體層 (Physical Layer)
如果有使用過早期的手機應該就會體驗過那種充電傳輸線分雜的痛苦,在那個時代連自家廠牌的手機都有多種傳輸接頭,市面上也開始出現了如下圖這種可以通吃的傳輸線,後來歐盟要求手機廠商統一使用 Type-C。
而 OSI 第 1 層-實體層主要就是訂定硬體設備或是連接線的標準,但是要注意的是就如同我們說的第 3 層 IP 位址與第 2 層 MAC 位址沒有絕對關係一樣,第 1 層也與第 2 層不會有絕對的關係,例如我們一般可以在路由器或是網管型交換器上看到的序列埠(Serial port,一般設備會標示為 Console Port),這是為了避免設定修改錯誤或是被別人惡意修改導致我們無法透過網路方式連結到管理介面,所以一般會提供 RS-232 標準序列埠讓我們可以使用終端機來連線設定,一般序列埠大多會如下圖左邊的路由器以 DE-9 當作連接埠,但是在中高階的網路設備上,會如下圖右邊路由器會以 RJ-45 當作連接埠。
所以不要以為有 RJ-45 就是提供乙太網路連線功能,它同樣是序列埠的標準連接埠,既然是標準你就可以買到下圖這種 RJ-45 轉 DE-9 (COM Port) 的連接線(一般購買設備會隨機附贈),甚至你只要知道它的相對接點也可以自己製作。
路由器 (Router)
我們所謂的網際網路(Internet)主要是透過 ISP 網路(或跨國企業網路)互相串接組成的,而我們的電腦則串接到這些 ISP 業者的機房,再透過他們對外的網路幹線鏈結到世界各地,但是如下面示意圖,連線設備之間其實有很多傳輸路徑可以選擇,這樣不論是網路斷線或是線路頻寬滿載都可以調整傳輸路線。
很顯然這種需要可以決定路徑的傳輸方式是交換器無法做到的,所以我們需要一個可以處理這種狀況的設備-路由器(Router),我們在網路概論(二)內有提到作業系統內有一個路由表 (Routing Table),路由器可以說是以此為基礎的網路設備,路由表可以設定傳輸的路徑(介面卡),當然就 ISP 業者而言這應該說是具有路由功能的設備或是機房,因為這無法靠單一設備處理地區的所有網際網路請求,當然它還有一些一般路由器沒有的特殊功能例如更強大的路由協定。
但是我們今天要說的是最普及的乙太網路路由器(Ethernet Router),我們以 MikroTik 的 RB4011iGS+RM為例,從他們提供的硬體架構來看其實路由器內連接 2 個 5 Port 的乙太網路交換器。
它是採用 RJ-45 當作 Console Port。
因為是透過交換器傳輸,所以路由器輸出前會將封包打包成 Ethernet Frame(或稱 MAC Frame),這邊再次強調路由器本身其實是不管 MAC 位址的,只因為它是透過乙太網路(交換器)來做,所以必須轉換乙太網路封包格式(加上 MAC 位址)交換器才有辦法傳輸資料。
Request
我們現在假設對網際網路上的主機(IP 位址:216.58.200.226
)發送資料,首先因為這個 IP 位址不在內部網路,所以我們電腦的路由表只有預設閘道會符合規則,因此我們來源端的 IP 位址就會使用 192.168.10.100
,MAC 位址則會此用這組 IP 位址所對應的網路卡 D4:5D:64:5D:F3:8B
,當然這也表示資料會透過這張網路卡輸出。
接著因為是預設閘道所以我們目的端的 MAC 位址會替換成這組 IP 位址所對應的 MAC 位址,所以封包格式會如下圖。
也因為我們會連線到內部網路以外的主機幾乎都是在網際網路上,所以預設閘道幾乎都是指向路由器,因為我們要透過路由器與網際網路交換資料。
路由表 (Routing Table)
在路由器內一樣有路由表,由於目的端的 IP 位址 216.58.200.226
不再我們的既有的網段內,所以會以預設路由輸出。
在這邊會透過第 5 連接埠傳送到我們俗稱小烏龜的數據機(IP 位址:118.163.1.254
),因為是透過乙太網路傳輸,所以會修改對應的 MAC 位址。
網路位址轉換 (Network Address Translation)
因為我們電腦的 IP 位址是使用網際協定所保留的網段,所以這是一個不存在於網際網路的位址,如果直接將封包發送出去,目的端的主機回傳資料時,就會找不到我們的位址,當然我們也永遠收不到資料,因此路由器提供另一種功能-網路位址轉換(Network Address Translation,簡稱:NAT),它再幫我們轉送封包之前會先將封包內的來源端 IP 位址替換成我們從 ISP 業者所配發到的真實 IP 位址,這樣目的端主機就可以將資料回傳給我們的路由器。
Reaponse
當遠端主機處理完之後會開始回傳資料,我們可以看到來源端與目的端的 IP 位址與我們傳出去的相反,因為我們最終是由路由器代為送出,所以目的端的 IP 位址是路由器 IP 位址 118.163.123.123
。
接著路由器再回傳給電腦前會再做 NAT 轉換,將目的端的 IP 位址改成我們電腦的 IP 位置 192.168.10.100
。
我們透過 TCP/IP 協定傳輸資料時會包含一組通訊埠(Port),這與交換器上的實體連接埠不同,這種通訊埠編號(Port Number)主要可以與程序(Process)綁定,這樣電腦接收到網路資料之後就可以知道要交由哪一個程序處理,比較主流的程序會使用的通訊埠可以查閱:TCP/UDP埠列表。
最後由路由表可以知道我們須透過第 2 連接埠(ether2) 將資料回傳給電腦,所以依照乙太網路協定調整對應的 MAC 位址。
我們可以看到輸出時先做路由再做 NAT,輸入時先做 NAT 再做路由,步驟剛好相反。
雖然 IP 位址是遠端主機,但是從目的端的 MAC 位址就知道,其實我們電腦面對的始終都是路由器。
而路由器的功能就像是物流業者,我們在寄送包裹時其實並不是直接送達目的地址,中間會經過一些轉運中心或是地方營業所。
在電腦內我們也可以透過
tracert
指令來查閱中間的傳遞路徑。
NAT 應用
上面我們主要以內部電腦對外請求為例,但是反過來我們也可以利用 NAT 來轉換外部對我們的請求,最常見的用途就是架設網站,我們可以透過 NAT 設定將來自外部對 HTTPS 443 連接埠的請求都轉向網頁伺服器(Web Server)的 IP 位址 192.168.10.10
。
雖然我們可以事先在路由器設定好 DNS 主機位址,但是每台電腦其實可以自行修改。
因為 DNS 查詢是透過 53 通訊埠來發出請求,所以筆者就利用 NAT 功能將來自內網 53 通訊埠的 TCP 與 UDP 請求都轉向自己架設的 DNS 伺服器-AdGuard Home(IP 位址:192.168.10.5
)。
筆者為將 DNS 伺服器上負責處理 DNS 請求的通訊埠設為
8053
通訊埠,所以設定 NAT 轉換時也一同修改通訊埠。
這樣的好處是不論用戶端的 DNS 為何,最終經過路由器時網路封包還是會轉向我們指定的 IP 位址所對應的主機,而用戶端電腦卻不會察覺到差異。
這樣我們既可以透過 AdGuard Home 來過濾一些為危險的網站來提升內部網路安全性,同時也不會影響用戶端的設定,從下圖可以看到封鎖了 2 個成人網站,但是其實這不是使用者主動去瀏覽,而是使用者所瀏覽的一般網站內嵌了成人網站的連結,現在因為 JavaScript 的技術成熟,所以很多網站都可以利用內嵌的 JavaScript 程式在使用者不知情狀況下主動執行一些”任務”。
除了 53 Port 之外其實還有其他通訊埠處理 DNS 請求,尤其是最近開始興起的 DNS-over-TLS(簡稱:DoT),主要連接埠如下:
資料來源:AdGuard Home - Docker
後記
現在的路由器其實還有很多常見的功能,例如 DHCP、防火牆、VPN …等等功能,說實在的筆者也不知道那些是路由器必備的功能。
另一個題外話,小烏龜到底算是路由器還是閘道器,其實筆者原本認為它比較偏向路由器,因為它具備 Wi-Fi 無線分享功能,也就是它一定內含有 DHCP 以及 NAT 功能,不過看到它的型號 I-040GW
,感覺尾巴 GW 代表閘道器(Gateway),上網查詢之後才發現它真的是閘道器,不過想想也是,因為它並沒有替換掉來自我們路由器的 IP 位址,遠端主機收到的來源端 IP 位址仍然是 118.163.123.123
,轉發是它的主要功能,所以說是閘道器沒有錯,或者我們可以說它是具有路由功能的閘道器。