最近負責的其中一個項目的服務器集群出現了點網絡方面的問題,在處理過程當中又涉及到了防火牆相關的知識和命令,想着有一段時間沒有復習這部分內容了,於是借着此次機會復寫了下順便將本次復習的一些內容以博客的形式記錄下來。
SNAT與DNAT
-
SNAT 在路由之后 做源地址轉換 (postrouting)
-
DNA 在路由之前 做目的地地址轉換 (prerouting)
(1).概述
SNAT: A--->B--->C (比如我們想要訪問百度,淘寶等網站)
1. 企業內部的主機A想訪問互聯網上的主機C,首先將請求數據包(源:ipA,目標:ipC)發送到防火牆所在主機B;
2. B收到后將數據包源地址改為本機公網網卡的ip(源:ipA,目標:ipB),然后經互聯網發送給C;
3. C收到后將回應包(源:ipC,目標:ipB)轉發給C的路由器,經互聯網將回應包轉發給B;
4. B收到回應包后修改其目的地址,即回應包改為(源:ipC,目標:ipA)然后將數據包轉發給A。
實戰舉例說明:
-
准備工作:
C機:橋接網卡,作為外網。IP:172.17.252.227
B機:作為NAT轉換機,兩個網卡都有。IP:172.17.123.224 192.168.199.138
1.開啟轉發功能:
echo 1 > /proc/sys/net/ipv4/ip_forward
或者vim /etc/sysctl.conf
`net.ipv4.ip_forward=1`
然后執行sysctl -p
A機:僅主機網卡,作為內網。IP:192.168.199.142
2.添加路由記錄route add default gw 192.168.199.138
-
效果:實現內網可以訪問外網,外網不可以訪問內網
A機:
C機:
在這個過程中,修改了請求報文的源地址,叫做SNAT(source NAT POSTROUTING),用於局域網訪問互聯網。
不能在防火牆B的prerouting鏈上設置轉換源地址的防火牆策略,因為若在B的prerouting鏈上設置轉換源地址的防火牆策略,此時還未檢查路由表,
還不知道要到達數據包中目標主機需經過本機的哪個網卡接口,即還不知道需將源地址替換為哪個公網網卡的ip,需在postrouting設置轉換源地址的防火牆策略。
DNAT: C--->B--->A (比如對外發布web網站)
1. 互聯網主機C想訪問企業內部的web服務器A,但A的地址是私有地址,無法直接訪問。此時,C可以訪問防火牆的公網地址,
2. C的請求數據包(源:ipC,目標:ipB)到達防火牆B后,在B的prerouting上將請求數據包的目標地址進行修改,並將數據包(源:ipC,目標:ipA)發送給A。
3. A收到后進行回復發送響應包(源:ipA,目的ipC)到防火牆,防火牆收到后對數據包源地址進行修改,並將響應包(源:ipB,目標:ipC)給C。
實現DNAT:
在NAT轉換機上:
iptables -t nat -I PREROUTING 1 -d 172.17.123.224 -j DNAT --to-destination 192.168.199.142 轉換目標地址
- 效果:實現外網訪問內網
C機:
利用這種機制可以將企業內部的服務發布到互聯網。
在這個過程中,修改了請求報文的目標地址,叫做DNAT(destination NAT POSTROUTING),用於互聯網訪問局域網。
必須在防火牆的prerouting上設置修改目標地址的防火牆策略,因為若不在此處修改,請求數據包通過prerouting和路由表后,
由於目標主機是本機,就會將數據包發往input,進而被發往本地進程。
(2).用途
SNAT:源地址轉換,其作用是將ip數據包的源地址轉換成另外一個地址。
1. 保護內網用戶安全,因為公網地址總有一些人惡意掃描,而內網地址在公網沒有路由所以無法被掃描,能被掃描的只有防火牆這一台,這樣就減少了被攻擊的可能。
2. Ipv4地址匱乏,很多公司只有一個ipv4地址,但是卻有幾百個用戶需要上網,這個時候就需要使用SNAT。
3. 省錢,公網地址付費,使用SNAT只需要一個公網ip就可以滿足幾百人同時上網。
DNAT:目的地地址轉換,其作用是將一組本地內部的地址映射到一組全球地址。
在內網中有服務器,如果想讓公網用戶訪問有兩種方法。
1. 配置雙網卡,一網卡對內,一網卡對外;一般是高訪問量的web服務器,為了避免占用網關的流量才這樣做,使用不是很廣泛。
2. 內網web服務器,或是ftp服務器,為了用戶在公網也可以訪問,有不想買公網ip地址,采用DNAT方案。
(3). 應用場景
SNAT:
內部地址要訪問公網上的服務時(如web訪問),內部地址會主動發起連接,由路由器或者防火牆上的網關對內部地址做個地址轉換,
將內部地址的私有IP轉換為公網的公有IP,網關的這個地址轉換稱為SNAT,主要用於內部共享IP訪問外部。
DNAT:
當內部需要提供對外服務時(如對外發布web網站),外部地址發起主動連接,由路由器或者防火牆上的網關接收這個連接,然后將連接轉換到內部,
此過程是由帶有公網IP的網關替代內部服務來接收外部的連接,然后在內部做地址轉換,此轉換稱為DNAT,主要用於內部服務對外發布
實現REDIRECT轉發:通過改變目標IP和端口,將接受的包轉發至不同端口
本例實現目標地址是本機192.168.199.143端口是80的包轉發到本機8080端口:
准備工作:修改192.168.199.143主機的httpd服務的監聽端口為8080
vim /etc/httpd/conf/httpd.conf
Listen 8080
systemctl restart httpd
防火牆策略:
iptables -t nat -A PREROUTING -d 192.168.199.143 -p tcp --dport 80 -j REDIRECT --to-ports 8080
效果:訪問網頁的時候不需要加上8080端口也可以訪問,因為會把80轉換為8080
可能很多人都會發現REDIRECT和上面說過的DNAT有些類似,這里要說明下DNAT和REDIRECT的區別在於,DNAT可以將其數據包發送到除本機以外的其他主機和端口,而REDIRECT則可以將收到的數據包轉發到本機的其他端口,所以我理解就是DNAT的策略一般都制定在專門的NAT服務器上,而REDIRECT的策略一般制定在目標主機上當然也可以用來代替DNAT
另外在centos7上還可以用firewalld實現IP和端口的轉發:
1. firewall-cmd --add-masquerade 啟用偽裝
2. firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.199.143 數據轉發
3. firewall-cmd --reload 使策略立即生效
也可以實現轉發到遠程主機,只需要更改為遠程主機ip即可
如果配置完以上規則后仍不生效,檢查防火牆是否開啟80端口,如果80端口已開啟,仍無法轉發,可能是由於內核參數文件sysctl.conf未配置ip轉發功能,具體配置如下:
vi /etc/sysctl.conf
在文本內容中添加:net.ipv4.ip_forward = 1
保存文件后,輸入命令sysctl -p生效