Linux SNAT/DNAT簡單理解與案例分析。

Federico發表於2018-07-25

  在計算機網路中,網路地址轉換(Network Address Translation,縮寫為NAT),也叫做網路掩蔽或者IP掩蔽(IP masquerading),是一種在IP資料包通過路由器或防火牆時重寫來源IP地址或目的IP地址的技術。這種技術被普遍使用在有多臺主機但只通過一個公有IP地址訪問因特網的私有網路中。根據規範,路由器是不能這樣工作的,但它的確是一個方便且得到了廣泛應用的技術。當然,NAT也讓主機之間的通訊變得複雜,導致了通訊效率的降低。

以上是維基百科對NAT技術的描述,我這裡就不做過多的評價了。

目前兩種常用NAT型別:

  • SNAT
  • DNAT

  NAT是作為一種解決IPv4地址短缺以避免保留IP地址困難的方案而流行起來的。網路地址轉換在很多國家廣泛使用。例如:我們家用路由器就是一種NAT技術,它可以將區域網的內部地址轉換為公網地址使內部地址可以像有公網地址的伺服器一樣進行網路通訊。

Linux 6/7防火牆變動:

  • 6

  防火牆使用iptables命令進行配置。

  • 7

  防火牆使用firewall-cmd命令進行配置。可以在7中安裝iptables並通過iptables對防火牆策略進行管理。yum -y install iptables,直接yum安裝 即可,因為很多人用iptables可能會比用firewall-cmd命令更熟悉,至於firewall-cmd我也只是會幾條簡單的命令,還沒有研究過,這裡就是欠下的賬,遲早有一天是要還的。

PREROUTING、POSTROUTING與SNAT、DNAT的對應關係:

Linux  SNAT/DNAT簡單理解與案例分析。

  從圖上看可能更容易理解吧,首先這個路由器可以簡單的理解為家用路由器,下面的伺服器可以簡單的理解為連線在路由器下面的手機或者PC,實際上我們可以將這個路由器理解為一個閘道器裝置,資料從區域網到廣域網會通過閘道器進行協商來實現。
  我們來從Linux防火牆的角度簡單的分析下區域網裝置訪問公網流量是如何進行傳輸的。

1. 區域網訪問網際網路會先經過NAT table的PREROUTING鏈;
2. 經過路由時進行判斷資料包是否要進入本機;
3. 再經過Filter table的FORWARD鏈;
4. 通過NAT table的POSTROUTING鏈傳送到網際網路

  NAT服務的重點在於上述流程的第1和第4步,也是NAT table中的兩條重要的鏈:PREROUTING和POSTROUTING,如果想要了解這兩個鏈與SNAT、DNAT的對應關係,就必須知道他們各自的作用。

  • POSTROUTING:目的在於修改來源IP地址(DNAT)。
  • PREROUTING:目的在於修改目標IP地址(SNAT)。

  那麼就下來就好解釋上面的流程了,PREROUTING修改目標IP地址是因為當前我們的區域網地址無法訪問網際網路,如果將目標地址修改為192.168.1.1那麼路由器存在公網IP,我們就可以通過公網IP對網際網路進行訪問,POSTROUTING修改源地址我們就可以理解為我們訪問網際網路的地址時必須使用的是Public IP而不是區域網地址,這就是通過POSTROUTING鏈進行修改後的結果,也可以看成入流量會經過PREROUTING鏈,出流量會經過POSTROUTING鏈,相信這麼解釋後大家應該就可以差不多明白了,那接下來就上操作了。

操作案例

  無論做那個轉發操作都需要我們將核心的路由轉發功能開啟,有一下兩種方式:
第一種:
sysctl net.ipv4.ip_forward=1
第二種:
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p

通過NAT直接訪問內網伺服器

iptables -t nat -A PREROUTING -p tcp --dport 12345 -j DNAT --to-destination 192.168.1.2:22
iptables -t nat -A POSTROUTING -p tcp -d 192.168.1.2 -j SNAT --to-source 192.168.1.1

  我們這裡也是同時使用了SNAT和DNAT,原因上面已經解釋過了,執行的第一條命令是將所有傳送到ens160這個網路卡的12345埠請求轉發給192.168.1.2的22埠,第二條命令是將192.168.1.2上傳送的所有請求都看作是192.168.1.1傳送的。接下來就可以ssh PublicIP:12345埠進行測試是否可以連線到內網主機了。

通過SNAT實現代理上網

  要實現的功能與上述例項恰好大致相反,我們需要在閘道器伺服器上配置如下操作:
iptables -t nat -A POSTROUTING -o ens192 -s 192.168.1.0/24 -j SNAT --to-source 192.168.1.1
內網雲主機上配置閘道器操作:
ip route add 192.168.1.0/24 via 192.168.1.1
  後續測試內網網路卡是否可以 ping通公網地址即可。

相關文章