Linux-SNAT和DNAT
文章目錄
- Pre
- 前提:開啟IP轉發
- IP包的結構
- 數據包在iptables中要經過的鏈(chain)
- 總結
- -j SNAT
- -j DNAT
Pre
Linux-iptables命令
Linux-SNAT和DNAT
在上一博客Linux-iptables命令中,我們知道了一些iptable的nat表中幾個鏈的區別,這里單獨講其中兩個鏈拿出來詳細說明。
-
DNAT(Destination Network Address Translation,目的地址轉換) 通常被叫做目的映射。
-
SNAT(Source Network Address Translation,源地址轉換)通常被叫做源映射
前提:開啟IP轉發
開啟內核轉發的模塊。
echo 1 > /porc/sys/net/ipv4/ip_forward #臨時生效,重啟失效永久生效:
vi /etc/sysctl.conf修改其中的net.ipv4.ip_forward = 1
執行
sysctl -p立刻生效
IP包的結構
我們在設置Linux網關或者防火墻時經常要用來的兩種方式。
首先,我們要了解一下IP包的結構
在任何一個IP數據包中,都會有Source IP Address與Destination IP Address這兩個字段,數據包所經過的路由器也是根據這兩個字段是判定數據包是由什么地方發過來的,它要將數據包發到什么地方去。而iptables的DNAT與SNAT就是根據這個原理,對Source IP Address與Destination IP Address進行修改。
數據包在iptables中要經過的鏈(chain)
圖中正菱形的區域是對數據包進行判定轉發的地方。
在這里,系統會根據IP數據包中的destination ip address中的IP地址對數據包進行分發。如果destination ip adress是本機地址,數據將會被轉交給INPUT鏈。如果不是本機地址,則交給FORWARD鏈檢測。
這也就是說,我們要做的DNAT要在進入這個菱形轉發區域之前,也就是在PREROUTING鏈中做,
比如我們要把訪問202.103.96.112的訪問轉發到192.168.0.112上:
iptables -t nat -A PREROUTING -d 202.103.96.112 -j DNAT --to-destination 192.168.0.112這個轉換過程當中,其實就是將已經達到這臺Linux網關(防火墻)上的數據包上的destination ip address從202.103.96.112修改為192.168.0.112然后交給系統路由進行轉發。
而SNAT自然是要在數據包流出這臺機器之前的最后一個鏈也就是POSTROUTING鏈來進行操作
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 58.20.51.66這個語句就是告訴系統把即將要流出本機的數據的source ip address修改成為58.20.51.66。這樣,數據包在達到目的機器以后,目的機器會將包返回到58.20.51.66也就是本機。如果不做這個操作,那么你的數據包在傳遞的過程中,reply的包肯定會丟失。
總結
PREROUTING: 位于 nat 表,用于修改目的地址(DNAT)(上一節說的是數據包作路由選擇前應用此鏈中的規則 記住!所有的數據包進來的時侯都先由這個鏈處理)
POSTROUTING:位于 nat 表,用于修改源地址 (SNAT)(上一節說的是對數據包作路由選擇后應用此鏈中的規則,所有的數據包出來的時侯都先由這個鏈處理.
-j SNAT
簡單的說,開放內網機器外網權限
注意:【系統在路由及過慮等處理直到數據包要被送出時才進行SNAT】
-j SNAT --to IP[-IP][:端口-端口](nat 表的 POSTROUTING鏈) 源地址轉換,SNAT 支持轉換為單 IP,也支持轉換到 IP 地址池 (一組連續的 IP 地址)
例如:
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1將內網 192.168.0.0/24 的原地址修改為 1.1.1.1,用于 NAT
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1-1.1.1.10同上,只不過修改成一個地址池里的 IP
-j DNAT
簡單的來說是發布內部服務器,讓外面的internet用戶能訪問到服務器,如網站等
有一種DNAT的特殊情況是重定向,也就是所謂的Redirection,這時候就相當于將符合條件的數據包的目的ip地址改為數據包進入系統時的網絡接口的ip地址
-j DNAT --to IP[-IP][:端口-端口](nat 表的 PREROUTING 鏈) 目的地址轉換,DNAT 支持轉換為單 IP,也支持轉換到 IP 地址池 (一組連續的 IP 地址)
例如:
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to 192.168.0.1把從 ppp0 進來的要訪問 TCP/80 的數據包目的地址改為 192.168.0.1
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 81 -j DNAT --to 192.168.0.2:80 iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to192.168.0.1-192.168.0.10公網訪問 http://218.100.100.111時:(假設公網上用戶的IP為199.199.199.199,端口12345為隨機的產生的。)
數據源 : ip:199.199.199.199 sport:12345
數據目標: ip:218.100.100.111 dport 80
此時,通過-A PREROUTING –i eth0 –p tcp –d 218.100.100.111 --dport 80 –j DNAT --to-destination 192.168.5.179:80 告訴199.199.199.199,您要訪問的真正地址應該是192.168.5.179:80
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Linux-SNAT和DNAT的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux-iptables命令
- 下一篇: Docker容器导入导出