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