指導老師:溫翔安 組員:溫允中4970E011 李雅俐4970E025 蕭積遠4970E026 陳欣暉4970E086 NAT 伺服器 指導老師:溫翔安 組員:溫允中4970E011 李雅俐4970E025 蕭積遠4970E026 陳欣暉4970E086
摘要 內部 LAN 有任何一部主機想要傳送封包出去時 來源 NAT, SNAT 目標 NAT, DNAT
NAT 伺服器的設定 NAT 的全名是 Network Address Translation,字面上的意思是『網路位址的轉換』。由字面上的意思我們來想一想, TCP/IP 的網路封包上面有 IP 位址,那 IP 位址不是有來源與目的嗎?我們的 iptables 指令就能夠修改 IP 封包的表頭資料, 連目標或來源的 IP 位址都可以修改。甚至連 TCP 封包表頭的 port number 也能修改。
單一網域,僅有一個路由器的環境示意圖 NAT 伺服器功能可以達到類似下圖所介紹類似 IP 分享的功能,然而不同的功能取決於我們的 NAT 是修改: (1)來源 IP 還是 (2)目標 IP。
封包如何透過 Linux 主機
內部 LAN 有任何一部主機想要傳送封包出去時 那這個封包要如何透過 Linux 主機而傳送出去? 1.先經過 NAT table 的 PREROUTING 鏈 2.經由路由判斷確定這個封包是要進入本機與否,若不進入本機,則下一步 3.再經過 Filter table 的 FORWARD 鏈 4.通過 NAT table 的 POSTROUTING 鏈,最後傳送出去。
PREROUTING 與 POSTROUTING 重點在於修改 IP !但是這兩條鏈修改的 IP 是不一樣的! POSTROUTING 在修改來源 IP ,PREROUTING 則在修改目標 IP 。 由於修改的 IP 不一樣,所以就稱為來源 NAT (Source NAT, SNAT) 及目標 NAT (Destination NAT, DNAT)。
來源 NAT, SNAT 修改封包表頭的『來源』項目 Linux 主機就是 IP 分享器,那麼他是如何達到 IP 分享的功能?就是透過 NAT 中的 POSTROUTING 來處理的,那麼 NAT 伺服器是如何處理這個封包的呢? 假設:用戶端192.168.1.100主機,連結到YAHOO時,封包表頭會如何變化?
SNAT 封包傳送出去 1.用戶端所發出的封包表頭中,來源會是192.168.1.100 ,然後傳送到 NAT 這部主機。 2.NAT 這部主機的內部介面 (192.168.1.2) 接收到這個封包後,會主動分析表頭資料, 因為表頭資料顯示目的並非 Linux 本機,所以開始經過路由, 將此封包轉到可以連接到 Internet 的 Public IP 處 3.由於 private IP 與 public IP 不能互通,所以 Linux 主機透過 iptables 的 NAT table 內的 Postrouting 鏈將封包表頭的來源偽裝成為 Linux 的 Public IP ,並且將兩個不同來源 (192.168.1.100 及 public IP) 的封包對應寫入暫存記憶體當中, 然後將此封包傳送出去了
SNAT 封包傳送出去的示意圖
如果 Internet 回傳封包呢? 又會怎麼作? 1.在 Internet 上面的主機接到這個封包時,會將回應資料傳送給那個 Public IP 的主機。 2.當 Linux NAT 伺服器收到來自 Internet 的回應封包後,會分析該封包的序號,並比對剛剛記錄到記憶體當中的資料, 由於發現該封包為後端主機之前傳送出去的,因此在 NAT Prerouting 鏈中,會將目標 IP 修改成為後端主機,亦即那部 192.168.1.100,然後發現目標已經不是本機 (public IP), 所以開始透過路由分析封包流向。 3.封包會傳送到 192.168.1.2 這個內部介面,然後再傳送到最終目標 192.168.1.100 機器上去!
SNAT 封包接收的示意圖
目標 NAT, DNAT 修改封包表頭的『目標』項目 SNAT 主要是應付內部 LAN 連接到 Internet 的使用方式,至於 DNAT 則主要用在內部主機想要架設可以讓 Internet 存取的伺服器 假設:我的內部主機 192.168.1.210 啟動了 WWW 服務,這個服務的 port 開啟在 port 80 , 那麼 Internet 上面的主機 (61.xx.xx.xx) 要如何連接到我的內部伺服器呢? 得要透過 Linux NAT 伺服器!所以這部 Internet 上面的機器必須要連接到我們的 NAT 的 public IP 才行。
DNAT 的封包傳送 1.外部主機想要連接到目的端的 WWW 服務,則必須要連接到我們的 NAT 伺服器上頭。 2.我們的 NAT 伺服器已經設定好要分析出 port 80 的封包,所以當 NAT 伺服器接到這個封包後, 會將目標 IP 由 public IP 改成 192.168.1.210 ,且將該封包相關資訊記錄下來,等待內部伺服器的回應。 3.上述的封包在經過路由後,來到 private 介面處,然後透過內部的 LAN 傳送到 192.168.1.210 上頭! 4.192.186.1.210 會回應資料給 61.xx.xx.xx ,這個回應當然會傳送到 192.168.1.2 上頭去。 5.經過路由判斷後,來到 NAT Postrouting 的鏈,然後透過剛剛第二步驟的記錄,將來源 IP 由 192.168.1.210 改為 public IP 後,就可以傳送出去了!
DNAT 的封包傳送示意圖 其實整個步驟就等於 SNAT 的反向傳送!這就是 DNAT !
感謝指導