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