天天看點

iptables之NAT

iptables之NAT

==============================================================================

概述:

 1.源位址轉換(SNAT)

★源位址轉換(SNAT):POSTROUTING ⊙使用場景: 主要用于實作讓内網用戶端通路外部主機位址時使用,要定義在POSTROUTING鍊或INPUT鍊; ⊙靜态轉換:外網位址是固定的; ⊙動态轉換:外網位址不固定; ★定義方法: iptables -t nat A POSTROUTING -s 内網網絡主機或位址 -j SNAT --to-source NAT伺服器上的某外網位址 圖解如下:
iptables之NAT
★PAT:Port Address Translati:端口映射(了解即可)

SNAT實驗測試如下:

實驗描述:

實驗環境是基于上一篇網絡防火牆的環境,這裡不再過多贅述;

  1.實驗操作之前,内網主機是可以通路外網主機,也可以ping通,如下:

iptables之NAT

  通過外網的日志檢視和請求ping封包清楚的知道源位址是内網主機,内網主機沒有做任何的轉換

iptables之NAT

 2.接下來我們要把内網位址轉換成網關主機的外網位址,已達到僞裝隐藏之源位址的目的。

   1)定義規則源位址轉換為網關主機的外網位址10.1.252.161,允許内網的所有主機通路外網的所有服務

  接下來,内網主機再次通路外網的web服務和ping操作,外網抓包和通路日志已經僞裝成網關主機的外網位址,如下:

iptables之NAT

   為了驗證是在哪個環節發生的位址轉換,我們在網關主機的内網網卡和外網網卡分别抓包,如下:

iptables之NAT

 2.MASQUERADE:位址僞裝

★位址僞裝,能自行判斷該轉換為哪個源位址 This target is only valid in the nat table, in the POSTROUTING chain.  It  should  only  be  used  with  dynamically assigned  IP (dialup) connections: if you have a static IP address, you should use the SNAT target.(這一目标隻能在nat表的POSTROUTING鍊上定義。它适用于動态配置設定的位址,IP(撥号)連接配接,會自動去尋找可用的ip位址:如果你有一個靜态IP位址,應該使用SNAT目标。) 

 3.目标位址轉換(DNAT)

★目标位址轉換(DNAT):PREROUTING 主要用于釋出内部伺服器,讓内網中的伺服器在外網中可以被通路到,要定義在PREROUTING鍊; iptables -t nat -A PREROUTING -d NAT伺服器的某外網位址 -p 某協定 --dport 某端口 -j DNAT --to-destination 内網某伺服器位址[:PORT] ★圖解過程如下:
iptables之NAT

DNAT目标位址轉換實驗如下:

實驗前環境準備:

   1.因為DNAT為目标位址轉換,即讓内網中的伺服器在外網中可以被通路到,是以,為了增加實驗的說服力,我這裡在内網的同一塊網卡上再添加一個ip位址,讓每一個ip位址對應一個服務,如下:

iptables之NAT

   2.如上,位址已經添加成功,假設22位址對應的是web服務,23的位址對應的是ssh服務(這裡可以想象成兩個主機,但實際上是一個主機,為了示範效果);為了不影響實驗效果這裡我先把上例中定義的SNAT規則清空,如下:

實驗如下:

   1.假設内網位址192.168.22.2上提供了web服務,我們希望外網使用者把對網關主機外網網卡請求的web服務的80端口全都轉化到内網的192.168.22.2上,設定如下:

 檢視網關主機确認是沒有開通web服務的80端口

 使用外網主機請求網關主機的web服務,如下:

iptables之NAT

 2.如上,我們隻是把web服務轉發到了一個内網服務上,是有選擇性的。如果我們現在用外網去ping網關主機的外網位址,是不通的,要想通定義如下:

  外網主機去ping網關主機的10.1.252.161,在内網主機上抓包如下:

iptables之NAT

  3.如果我們現在想把外網通路網關主機的外網位址的80端口(web服務)通過目标位址轉換為内網位址的8080端口,那就需要做端口映射了(PAT)

iptables之NAT

 上圖為主配置檔案中的,下圖為定義的虛拟主機中監聽位址的修改

iptables之NAT

   如上定義好之後在内網主機上使用ss -tnl檢視是否監聽在8080端口,然後重新開機服務即可(因為是修改了監聽位址,是以要重新開機,重載可能沒用)

 然後重新在網關主機上添加規則使網關主機的80端口映射為内網主機的8080端口即可,如下:

 測試外網主機通路内網主機的web服務如下:

iptables之NAT

  4.現在我們用外網去通路網關主機外網位址的ssh服務,可以順利的遠端登入到網關主機的外網位址,這裡不做示範,那如果我在網關主機添加一條規則,使外網使用者通路網關主機的外網位址的ssh服務時映射到内網主機上(即ssh遠端登入内網主機)能否實作呢?

   1)首先,在網關主機添加一條規則,指明要映射的ip(因為有兩個ip是以映射到另一個主機上)和端口,如下:

  現在測試,使用外網使用者遠端登入網關主機的外網位址如下:

iptables之NAT

    這是什麼原因,難道登入不了麼,檢視資訊猜測是外網主機之前遠端登入網關主機的外網位址資訊全都記錄在/root/.ssh/know_hosts 的檔案中,因為端口轉換是以與之前那記錄的資訊不比對,是以報錯,這裡我把/root/.ssh/know_hosts檔案中的記錄資訊清空,然後在次登入,果然可以順利登入到内網主機上了,如下:

iptables之NAT

    可是這樣就有了一個問題,那就是網關主機外網的22号端口被内網給占用了,如果遠端登入的話直接登入的就為内網主機,這樣對内網伺服器很不安全;為了安全起見,我們在網關主機上重新定義一個端口(22022)映射到内網主機,如下:

  測試通路如下:

iptables之NAT

 4.REDIRECT:重定向

★定義: This  target  is only valid in the nat table, in the PREROUTING and OUTPUT chains, and user-defined chains which are only called from those chains. 僅在目前主機上完成端口映射 ★用法: --to-ports port[-port]

 使用REDIRECT僅可完成本機端口的映射轉換,實驗如下:

 内網主機上現在httpd的端口為8080,添加規則如下:

iptables之NAT

 在網關主機上測試如下:

iptables之NAT

     如此一來,在前端網關主機上添加的目标位址轉化的端口映射80到8080端口的規則,就可以把8080端口去掉,這樣還是網關主機的80端口到内網主機的80端口,如下:

  用外網主機通路網關主機的外網位址還是可以轉換為内網位址的8088端口

注意:

在應用當中,我們可以綜合nat表和filter表來完成控制通路,比如,我們可以通過定義nat表來完成位址轉換,通過filter表來完成過濾功能。因為nat表僅負責完成位址轉換,轉換完成之後,這個封包到底能不能出去就要靠filter表的定義了。

還有一種場景,假如我們釋出的内部伺服器是一個web服務,允許外網使用者通過DNAT來通路我們的内網web伺服器,但是有一個外網使用者經常對我們的主機發起攻擊的操作,我們要拒絕這個外網使用者的通路,可以有兩種方法來控制其通路,一種是在内網主機上添加防火牆起到控制作用,另一種也可以在網關主機添加防火牆規則控制其通路。

5.RETURE

★功能: 從調用的鍊上傳回到原來的鍊上

6.自定義鍊

自定義連隻有在被調用時才會生效

繼續閱讀