上一節,咱們探究了網絡延遲增大問題的分析方法,並經過一個案例,掌握瞭如何用hping三、tcpdump、Wireshark、strace 等工具,來排查和定位問題的根源。後端
簡單回顧一下,網絡延遲是最核心的網絡性能指標。因爲網絡傳輸、網絡包處理等各類因素的影響,網絡延遲不可避免。但過大的網絡延遲,會直接影響用戶的體驗。安全
因此,在發現網絡延遲增大的狀況後,你能夠先從路由、網絡包的收發、網絡包的處理,再到應用程序等,從各個層級分析網絡延遲,等到找出網絡延遲的來源層級後,再深刻定
位瓶頸所在。bash
今天,我再帶你來看看,另外一個可能致使網絡延遲的因素,即網絡地址轉換(NetworkAddress Translation),縮寫爲 NAT。服務器
接下來,咱們先來學習 NAT 的工做原理,並弄清楚如何優化 NAT 帶來的潛在性能問題網絡
NAT 技術能夠重寫 IP 數據包的源 IP 或者目的 IP,被廣泛地用來解決公網 IP 地址短缺的問題。它的主要原理就是,網絡中的多臺主機,經過共享同一個公網 IP 地址,來訪問外網資源。同時,因爲 NAT 屏蔽了內網網絡,天然也就爲局域網中的機器提供了安全隔離。框架
你既能夠在支持網絡地址轉換的路由器(稱爲 NAT 網關)中配置 NAT,也能夠在 Linux服務器中配置 NAT。若是採用第二種方式,Linux 服務器實際上充當的是「軟」路由器的角色。tcp
NAT 的主要目的,是實現地址轉換。根據實現方式的不一樣,NAT 能夠分爲三類:工具
NAPT 是目前最流行的 NAT 類型,咱們在 Linux 中配置的 NAT 也是這種類型。而根據轉換方式的不一樣,咱們又能夠把 NAPT 分爲三類。
性能
第一類是源地址轉換 SNAT,即目的地址不變,只替換源 IP 或源端口。SNAT 主要用於,多個內網 IP 共享同一個公網 IP ,來訪問外網資源的場景。學習
第二類是目的地址轉換 DNAT,即源 IP 保持不變,只替換目的 IP 或者目的端口。DNAT主要經過公網 IP 的不一樣端口號,來訪問內網的多種服務,同時會隱藏後端服務器的真實IP 地址。
第三類是雙向地址轉換,即同時使用 SNAT 和 DNAT。當接收到網絡包時,執行DNAT,把目的 IP 轉換爲內網 IP;而在發送網絡包時,執行 SNAT,把源 IP 替換爲外部IP。
雙向地址轉換,其實就是外網 IP 與內網 IP 的一對一映射關係,因此經常使用在虛擬化環境中,爲虛擬機分配浮動的公網 IP 地址。
爲了幫你理解 NAPT,我畫了一張圖。咱們假設:
那麼 SNAT 和 DNAT 的過程,就以下圖所示:
從圖中,你能夠發現:
瞭解了 NAT 的原理後,咱們再來看看,如何在 Linux 中實現 NAT 的功能。
Linux 內核提供的 Netfilter 框架,容許對網絡數據包進行修改(好比 NAT)和過濾(好比防火牆)。在這個基礎上,iptables、ip6tables、ebtables 等工具,又提供了更易用
的命令行接口,以便系統管理員配置和管理 NAT、防火牆的規則。
其中,iptables 就是最經常使用的一種配置工具。要掌握 iptables 的原理和使用方法,最核心的就是弄清楚,網絡數據包經過 Netfilter 時的工做流向,下面這張圖就展現了這一過程。
在這張圖中,綠色背景的方框,表示表(table),用來管理鏈。Linux 支持 4 種表,包括filter(用於過濾)、nat(用於 NAT)、mangle(用於修改分組數據) 和 raw(用於原
始數據包)等。
跟 table 一塊兒的白色背景方框,則表示鏈(chain),用來管理具體的 iptables 規則。每一個表中能夠包含多條鏈,好比:
固然,你也能夠根據須要,建立你本身的鏈。
灰色的 conntrack,表示鏈接跟蹤模塊。它經過內核中的鏈接跟蹤表(也就是哈希表),記錄網絡鏈接的狀態,是 iptables 狀態過濾(-m state)和 NAT 的實現基礎。
iptables 的全部規則,就會放到這些表和鏈中,並按照圖中順序和規則的優先級順序來執行。
針對今天的主題,要實現 NAT 功能,主要是在 nat 表進行操做。而 nat 表內置了三個鏈:
熟悉 iptables 中的表和鏈後,相應的 NAT 規則就比較簡單了。咱們還以 NAPT 的三個分類爲例,來具體解讀一下。
根據剛纔內容,咱們知道,SNAT 須要在 nat 表的 POSTROUTING 鏈中配置。咱們經常使用兩種方式來配置它。
第一種方法,是爲一個子網統一配置 SNAT,並由 Linux 選擇默認的出口 IP。這實際上就是常常說的 MASQUERADE:
iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -j MASQUERADE
第二種方法,是爲具體的 IP 地址配置 SNAT,並指定轉換後的源地址:
iptables -t nat -A POSTROUTING -s 192.168.0.2 -j SNAT --to-source 100.100.100.100
再來看 DNAT,顯然,DNAT 須要在 nat 表的 PREROUTING 或者 OUTPUT 鏈中配置,其中, PREROUTING 鏈更經常使用一些(由於它還能夠用於轉發的包)。
iptables -t nat -A PREROUTING -d 100.100.100.100 -j DNAT --to-destination 192.168.0.2
雙向地址轉換,就是同時添加 SNAT 和 DNAT 規則,爲公網 IP 和內網 IP 實現一對一的映射關係,即:
iptables -t nat -A POSTROUTING -s 192.168.0.2 -j SNAT --to-source 100.100.100.100 $ iptables -t nat -A PREROUTING -d 100.100.100.100 -j DNAT --to-destination 192.168.0.2
在使用 iptables 配置 NAT 規則時,Linux 須要轉發來自其餘 IP 的網絡包,因此你千萬不要忘記開啓 Linux 的 IP 轉發功能。
你能夠執行下面的命令,查看這一功能是否開啓。若是輸出的結果是 1,就表示已經開啓了 IP 轉發:
sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 1
若是還沒開啓,你能夠執行下面的命令,手動開啓:
sysctl -w net.ipv4.ip_forward=1 net.ipv4.ip_forward = 1
固然,爲了不重啓後配置丟失,不要忘記將配置寫入 /etc/sysctl.conf 文件中:
cat /etc/sysctl.conf | grep ip_forward net.ipv4.ip_forward=1
講了這麼多的原理,那當碰到 NAT 的性能問題時,又該怎麼辦呢?結合咱們今天學過的NAT 原理,你先本身想一想,動手試試,下節課咱們繼續「分解」。
今天,咱們一塊兒學習了 Linux 網絡地址轉換 NAT 的原理。
NAT 技術可以重寫 IP 數據包的源 IP 或目的 IP,因此廣泛用來解決公網 IP 地址短缺的問題。它可讓網絡中的多臺主機,經過共享同一個公網 IP 地址,來訪問外網資源。同時,
因爲 NAT 屏蔽了內網網絡,也爲局域網中機器起到安全隔離的做用。
Linux 中的 NAT ,基於內核的鏈接跟蹤模塊實現。因此,它維護每一個鏈接狀態的同時,也會帶來很高的性能成本。具體 NAT 性能問題的分析方法,咱們將在下節課繼續學習。