防火牆上的網絡位址轉換有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
原理圖
實作
實作也比較簡單我們準備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一下外網看能不能通
這裡表示成功了。
第五步
網絡環境配置好了。我們現在正式來做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
然後我們在外網這台主機上抓包
這裡可以看到請求的ip已經變成網關的ip192.168.0.104了
我們也可以再驗證一下,我們在網關上,清空防火牆規則
然後再用内網通路一次,同時在外網抓包
清空規則之後,這裡的源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
這個就比較明顯了。我們通路的網關,但是收到了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端口起了沒
再用用戶端通路一次
通路成功。這裡想說明的一點這個通路成功不是因為緩存,我們可以換一個起始頁再測試
echo "i am 8080" > /var/www/html/index.html
- 1
再用用戶端通路一次。
防火牆上的網絡位址轉換有3類