1? 概述
地址轉換(NAT)就是:路由器將私有地址轉換為公有地址使數據包能夠發到因特網上,同時從因特網上接收數據包時,將公用地址轉換為私有地址。 在計算機網絡中,網絡地址轉換(Network Address Translation或簡稱NAT,也叫做網絡掩蔽或者IP掩蔽)是一種在IP數據包通過路由器或防火墻時重寫源IP地址或/和目的IP地址的技術。
地址轉換NAT(Network Address Translation)又稱地址代理,它實現了私有網絡訪問外部網絡的功能。這種技術被普遍使用在有多臺主機但只通過一個公有IP地址訪問因特網的私有網絡中。根據規范,路由器是不能這樣工作的,但它的確是一個方便并得到了廣泛應用的技術。當然,NAT也讓主機之間的通信變得復雜,導致通信效率的降低。
本文將結合例子講解NAT技術的實現和相關原理
2? 環境準備
準備三臺機器
A:? 192.168.32.61當內網主機,路由指向172.18.50.65
B:? 172.18.50.65? 192.168.32.65當路由器,開啟路由轉發功能:echo 1 >/proc/sys/net/ipv4/ip_forward
C:172.18.50.73當外網主機,指向網關172.18.50.65
3? NAT原理介紹和示例
路由器中,實現NAT轉換是由表nat實現的
nat表默認centos7有四條鏈:PREROUTING,INPUT,OUTPUT,POSTROUTING
nat表默認centos6有三條鏈:PREROUTING,OUTPUT,POSTROUTING
請求報文:修改源/目標IP,由策略定義如何修改
響應報文:修改源/目標IP,根據跟蹤機制自動實現
在NAT技術中,主要有分為三個,SNAT,DNAT,PNAT,相關介紹和示例如下
3.1? SNAT:source NAT
SNAT,改寫封包來源 IP 為某特定 IP 或 IP 范圍,可以指定 port 對應的范圍,進行完此處理動作后,將直接跳往下一個規則(mangleostrouting)。
一般僅轉換ip,一般情況下不轉換端口,但是如果端口剛好已經被使用了,路由器也會一起轉換端口,此時路由器上沒有記錄連接,但是在客戶端和服務器上可以看到對應的連接。
讓本地網絡中的主機通過某一特定地址訪問外部網絡,實現地址偽裝
策略一般作用于POSTROUTING, INPUT鏈
.SNAT:固定IP
--to-source[ipaddr[-ipaddr]][:port[-port]]
--random:如果使用選項--random,則端口映射將被隨機化
語法
iptables? -t nat?-A POSTROUTING -s LocalNET?! -dLocalNet -j SNAT --to-source ExtIP
#ExtIP公網地址
.示例:
#路由器上配置,表示所有內網的地址192.168.32.0/24都通過SNAT轉換為地址172.18.50.65
iptables -t nat -APOSTROUTING -s 192.168.32.0/24 -j SNAT --to-source 172.18.50.65
3.2? MASQUERADE:
改寫封包來源 IP 為防火墻 NIC IP,可以指定 port 對應的范圍,進行完此處理動作后,直接跳往下一個規則(mangleostrouting)。這個功能與 SNAT 略有不同,當進行 IP 偽裝時,不需指定要偽裝成哪個 IP,IP 會從網卡直接讀,當使用撥接連線時,IP 通常是由 ISP 公司的 DHCP 服務器指派的,這個時候 MASQUERADE 特別有用。
如果通過ADSL撥號的話,ip是不固定的。所以這個時候需要用網卡名來替換
--to-ports port[-port]
--random:如果使用選項--random,則端口映射將被隨機化
iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j MASQUERADE
.示例:
#以下語句在路由器上配置,表示將內網的192.168.32.0/24網段的ip進行NAT轉換,動作是MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.32.0/24 -j MASQUERADE
3.3DNAT:destination NAT
改寫封包目的地 IP 為某特定 IP 或 IP 范圍,可以指定 port 對應的范圍,進行完此處理動作后,將會直接跳往下一個規則(filter:input 或 filter:forward)。
把本地網絡中的主機上的某服務開放給外部網絡訪問(發布服務和端口映射),但隱藏真實IP。當外部主機訪問服務器時,有路由器通過DNAT做地址轉換,從而訪問到本地的服務器
策略一般作用于PREROUTING, OUTPUT鏈,這里服務器上看到的訪問的ip不是路由器的公網ip,而是源客戶端的ip
語法
iptables -t nat -A PREROUTING -d ExtIP -p tcp|udp? --dport? PORT -j DNAT ?--to-destination ?InterSeverIP[:PORT]
.示例:
在路由器上配置
#以下語句表示當訪問172.18.50.65的80端口時,將轉到內部服務器:192.168.32.61進行響應。如果http服務器發布的端口是默認的80,那么轉發的目的地址不需要跟端口號
iptables -t nat -A PREROUTING -d172.18.50.65 -p tcp --dport 80 -j DNAT --to-destination 192.168.32.61
#以下語句表示當訪問172.18.50.65的80端口時,將轉到內部服務器:192.168.32.61進行響應。如果http服務器發布的端口是非標準端口,那么轉發的目的地址需要跟端口號,如8080
iptables -t nat -APREROUTING? ?-d 172.18.50.65 -p tcp --dport 80 -j DNAT--to-destination 192.168.32.61:8080
測試,直接訪問路由器的公網ip
curl??http://172.18.50.65
3.3? PNAT: port NAT
實現端口轉換,端口和IP都進行修改
PANT是通過動作轉發REDIRECT實現,將封包重新導向到另一個端口,這個功能可以用來實作通透式porxy 或用來保護 web 服務器。
這個也是作用在nat表中。
可用于:PREROUTING,OUTPUT或自定義鏈
通過改變目標IP和端口,將接受的包轉發至不同地址
示例:
#以下配置在提供httpd服務的機器上配置,表示當有人訪問80端口時,就把請求轉到81端口
iptables -t nat ?-A PREROUTING -d 192.168.32.61 ?-p tcp --dport 80 ?-j REDIRECT --to-ports 81
?