天天看點

iptables 網絡位址轉換NAT

防火牆上的網絡位址轉換有3類

  • SNAT 源位址轉換
  • DNAT 目的位址轉換
  • 端口映射

SNAT

源位址轉換,讓本地網絡中的主機通過某一特定位址通路外部網絡,具體實作一般都在POSTROUTING鍊上,因為如果資料包是發給本機的。如果在PREROUTING鍊上做,不就是相當于浪費功夫嗎嗎,因為最後也是要發給自己,結果在發給自己之前還做了一層轉換,是以有點浪費資源了。綜合來說在POSTROUTING上做最合适。

為什麼要進行源位址轉換呢。我們想象一個場景,我們隻有一個公網IP但是這時候我們有很多主機需要上網,我們内網的主機上網肯定需要公網IP才能上網。這時候我們隻有一個公網IP,就可以進行SNAT轉換,吧通路網際網路的資料包都發給那個擁有公網ip的網關。網關進行SNAT轉換,将源位址轉換為公網IP位址。公網上資料包響應請求的時候發給網關。由網關再把目标位址轉換回來。這樣有2個好處。第一.保證了内網主機的安全。第二,解決了ipv4位址緊缺的問題。

常用的幾個選項

--to-source [ipaddr[-ipaddr]][:port[-port]] ##表示要指定的新的源IP,這裡可以是多個位址
--random ##如果上面是多個位址,這個選項可以用來表示随機選一個位址當作源位址
MASQUERADE 如果這裡的網關位址會一直變化。也就是将要指定的新的源IP一直變化的話,這裡可以使用這個選項。具體例子
##iptables -t nat -A POSTROUTING -s 192.168.253.0/24 -j MASQUERADE
           
  • 1
  • 2
  • 3
  • 4
  • 5

原理圖

iptables 網絡位址轉換NAT

實作

實作也比較簡單我們準備3台機器,網絡拓撲圖也就和原理圖一樣。

網關(網關有2個ip)

  • 192.168.253.128
  • 192.168.0.104

内網IP

  • 192.168.253.129

外網IP

  • 192.168.0.105

第一步,設定好網絡環境。

網關:打開核心轉發功能

sysctl  net.ipv4.ip_forward=           
  • 1

第二步

内網主機:增加一條路由,将去192.168.0.0網段的都發送給192.168.253.128這個網關

ip route add /  via  dev eth0           
  • 1

第三步

外網主機:設定一下外網的路由條目,吧192.168.253.0網段的資料包。發送給192.168.0.104(網關)處理

ip route add / via  dev ens33
           
  • 1
  • 2

第四步

測試一下

現在我們在内網ping一下外網看能不能通

iptables 網絡位址轉換NAT

這裡表示成功了。

第五步

網絡環境配置好了。我們現在正式來做snat

在網關設定,将源位址為192.168.253.0網段的資料包做snat轉換,将源位址改為192.168.253.104

iptables -t nat -A POSTROUTING -s / -j SNAT --to-source            
  • 1

有一點,如果這裡的網關的IP是動态IP不是一個固定的外網ip則需要使用下面這條指令

iptables -t nat -A POSTROUTING -s / -j MASQUERADE           
  • 1

第六步

我們現在外網主機上安裝httpd服務

yum install httpd -y
echo "hello nat" > /var/www/html/index.html ##制作一個測試頁
systemctl  start httpd ##啟動服務           
  • 1
  • 2
  • 3

然後我們在外網這台主機上抓包

iptables 網絡位址轉換NAT

這裡可以看到請求的ip已經變成網關的ip192.168.0.104了

我們也可以再驗證一下,我們在網關上,清空防火牆規則

然後再用内網通路一次,同時在外網抓包

iptables 網絡位址轉換NAT

清空規則之後,這裡的源ip已經變成了192.168.253.129也就是内網IP了。說明确實是那條指令生效了

DNAT

DNAT 的全稱為Destination Network Address Translation目的位址轉換,原理和SNAT類似,隻是DNAT修改的是目的位址。而SNAT修改的是源位址。

還有就是DNAT一般在PREROUTING鍊上修改。為什麼呢。我們可以這樣想。如果本地主機正好也開啟了一個和服務端提供服務相同的端口,這時候,我們再去通路網關,網關将會将請求送到自己的使用者空間,這樣後端的伺服器就沒有收到請求。而用戶端得到的也不是他想要的東西。是以綜合考慮在PREROUTING會比較好。

那DNAT主要是為了解決什麼樣的問題呢?我們想象這樣一個場景。假設我們不是用戶端了。我們現在是服務端,要提供web服務。當使用者來連接配接的時候,如果直接通路我們的真實伺服器。這是不是不太好。相當于直接暴露在公網,有一些黑客很容易就攻擊你。而如果我們告訴使用者一個ip,讓使用者來連接配接這個ip。再由這個網關或者說防火牆進行DNAT,轉發給後端。這樣一來,至少有2個好處。第一,保證了後端主機的一定安全,因為沒有直接暴露在公網。第二,如果躲在網關後面的伺服器不止一台。我們還可以做一些負載均衡,讓網站更健壯。(但是這種直接配置iptables來完成負載均衡的方法,一般不這麼用了。)

常用的幾個選項

--to-destination [ipaddr[-ipaddr]][:port[-port]] ##将要進行變換的DST位址。可以是多個
--random ##如果上面的位址有多個,則随機選一個指定。           
  • 1
  • 2

實作

實驗環境:

網關(網關有2個ip)

  • 192.168.253.128
  • 192.168.0.104

使用者用戶端

  • 192.168.253.129

後端真實伺服器IP

  • 192.168.0.105

内容:環境還是差不多但是角色變了,我們這裡用使用者用戶端去通路網關。由網關進行目的位址轉換。

剛才的那些轉發路由條目已經設定好了 ,我們隻需要清空網關的規則,重新寫一條規則就可以了

iptables  -t nat -F  ##清空nat表所有規則
iptables  -t nat -X  ##删除nat表中所有自定義的空鍊
iptables -t nat -A PREROUTING -d  -p tcp --dport  -j DNAT --to-destination            
  • 1
  • 2
  • 3

然後我們測試一下,在用戶端通路網關192.168.253.128

iptables 網絡位址轉換NAT

這個就比較明顯了。我們通路的網關,但是收到了192.168.0.105這台伺服器上的起始頁資訊。是以可以看出是成功了

端口映射

端口映射,顧名思義,就是修改端口。

實作比較簡單直接簡單說一下,試驗環境就是上面的網絡環境。實驗内容:我們通路網關192.168.253.128的80端口。然後轉發到後端192.168.0.105的8080端口。

網關:我們先清空網關的nat表

iptables  -t nat -F  ##清空nat表所有規則
iptables  -t nat -X  ##删除nat表中所有自定義的空鍊
iptables -t nat -A PREROUTING -d  -p tcp --dport  -j DNAT --to-destination            
  • 1
  • 2
  • 3

後端伺服器:将httpd端口換到8080端口

修改配置檔案/etc/httpd/conf/httpd.conf

Listen ##設定為8080           
  • 1

重新開機httpd服務

systemctl  restart httpd           
  • 1

然後看一下8080端口起了沒

iptables 網絡位址轉換NAT

再用用戶端通路一次

iptables 網絡位址轉換NAT

通路成功。這裡想說明的一點這個通路成功不是因為緩存,我們可以換一個起始頁再測試

echo "i am 8080" > /var/www/html/index.html            
  • 1

再用用戶端通路一次。

iptables 網絡位址轉換NAT

防火牆上的網絡位址轉換有3類

繼續閱讀