防火牆之地址轉換SNAT DNAT
防火牆之地址轉換SNAT DNAT
一、SNAT源地址轉換。
1、原理:在路由器後(PSOTROUTING)將內網的ip地址修改為外網網卡的ip地址。
2、應用場景:共享內部主機上網。
3、設置SNAT:網關主機進行設置。
(1)設置ip地址等基本信息。
(2)開啟路由功能:
sed -i "/ip-forward/s/0/1/g"
sysctl -p
(3)編寫規則:
iptables -t nat -I POSTROUTING -o 外網網卡 -s 內網網段 -j SNAT --to-source 外網ip地址 #適用於外網ip地址固定場景
iptables -t nat -I POSTROUTING -o 外網網卡 -s 內網網段 -j MASQUERADE #適用於共享動態ip地址上網(如adsl撥號,dhcp獲取外網ip)
(4)做好安全控制:使用FORWARD時機進行控制,嚴格設置INPUT規則。
二、DNAT目的地址轉換:
1、原理:在路由前(PREROUTING)將來自外網訪問網關公網ip及對應埠的目的ip及埠修改為內部伺服器的ip及埠,實現發布內部伺服器。
2、應用場景:發布內部主機服務。
3、設置DNAT:網關主機上設置。
(1)設置ip、開啟路由、設置SNAT
(2)編寫防火牆規則:
iptables -t nat -I PREROUTING -i 外網網卡 -d 外網ip tcp --dport 發布的埠 -j DNAT --to-destination 內網服務ip:埠
NAT network address translation
僅從報文請求來看,可以分為:
SNAT 源地址轉換
DNAT 目標地址轉換
PNAT 埠轉換
NAT server:能根據需要實現SNAT DNAT PNAT
並非是用戶空間的進程完成轉換功能,靠的是內核中的地址轉換規則
私有IP客戶端訪問互聯網的方法
SNAT 、PROXY
SNAT:主要用於實現內網客戶端訪問外部主機時使用(區域網上網用)
定義在POSTROUTING鏈上
iptables -t nat -A postrouting -s 內部網路地址或主機地址 -j SNAT --to-source NAT伺服器上的某外部地址
另外一個target
MASQUERADE地址偽裝(適用於PPPOE撥號上網,假設eth1是出口)
iptables -t nat -A postrouting -s 內部網路或主機地址 -o eth1 -j MASQUERADE
DNAT:主要用於內部伺服器被外網訪問(發布服務)
定義在PREROUTING
iptables -t nat -A PREROUTING -d NAT伺服器的某外部地址 -p 某協議 --dport 某埠 -j DNAT --to-destination 內網伺服器地址[:port]
注意:NAT伺服器需要打開數據轉發
echo 1 > /proc/sys/net/ipv4/ip_forward
或者修改/etc/sysctl.conf net.ipv4.ip_forward = 1
實驗操作
SNAT、DNAT
實驗一:
SNAT
規劃主機A 作為SNAT server
eth0 ip地址172.20.1.10(外部地址),eth1 192.168.1.1(內部地址)
主機B當做區域網內主機
eth0 ip地址192.168.1.2 默認路由要指向192.168.1.1
SNAT server:
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 172.20.1.10
#上面和我們實例操作相同
[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
主機B ping外部的其它主機(172.20.1.20模擬互聯網上的主機)
DNAT
[root@nat ~]# iptables -t filter -F
[root@nat ~]# iptables -t nat -F
[root@nat ~]# iptables -t nat -A PREROUTING -d 10.1.249.125 -p tcp --dport 80 -j DNAT --to-destination 192.168.2.4
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- 0.0.0.0/0 10.1.249.125 tcp dpt:80 to:192.168.2.4
[root@nat ~]# netstat -tln | grep "<80>" 此時本機上並沒有開放80埠
[root@wai ~]# curl http://10.1.249.125
hello --> 此時我們訪問為 nat 主機上的80埠 由上面可知,此伺服器上並沒有開放80,而是將請求送往 後端伺服器
實體案例
我們有一台機器A可以上外網,配置eth0=192.168.1.1,eth1=222.13.56.192
有6台機器只有內網IP ,分別是192.168.1.102~192.168.1.108,想讓這6台機器通過機器A上網
在機器A 防火牆上配置如下即可
/sbin/iptables -t nat -I POSTROUTING -s 192.168.1.101 -j SNAT --to-source 222.13.56.192
/sbin/iptables -t nat -I POSTROUTING -s 192.168.1.102 -j SNAT --to-source 222.13.56.192
/sbin/iptables -t nat -I POSTROUTING -s 192.168.1.103 -j SNAT --to-source 222.13.56.192
/sbin/iptables -t nat -I POSTROUTING -s 192.168.1.104 -j SNAT --to-source 222.13.56.192
/sbin/iptables -t nat -I POSTROUTING -s 192.168.1.105 -j SNAT --to-source 222.13.56.192
/sbin/iptables -t nat -I POSTROUTING -s 192.168.1.108 -j SNAT --to-source 222.13.56.192
在 6台機器上路由顯示
route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 em1
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 em1
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 em1
iptables中DNAT轉發的配置方法
1.一對一流量完全DNAT
首先說一下網路環境,普通主機一台做防火牆用,網卡兩塊
eth0 192.168.0.1 內網
eth1 202.202.202.1 外網
內網中一台主機 192.168.0.101
現在要把外網訪問202.202.202.1的所有流量映射到192.168.0.101上
命令如下:
#將防火牆改為轉發模式
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
iptables -t nat -X
iptables -t mangle -X
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t nat -A PREROUTING -d 202.202.202.1 -j DNAT --to-destination 192.168.0.101
iptables -t nat -A POSTROUTING -d 192.168.0.101 -j SNAT --to 192.168.0.1
2.多對多流量完全DNAT
說是多對多,實際上這裡的配置是指定了多個一對一
環境:
eth0 192.168.0.1 內網
eth1 202.202.202.1 、202.202.202.2 外網
內網中2台主機 192.168.0.101、192.168.0.102
現在要把外網訪問202.202.202.1的所有流量映射到192.168.0.101上,同時把把外網訪問202.202.202.2的所有流量映射到192.168.0.102上
這裡順便提一下如何為網卡配置多個IP
ifconfig eth1:1 202.202.202.2 netmask 255.255.255.0 up
#將防火牆改為轉發模式
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
iptables -t nat -X
iptables -t mangle -X
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t nat -A PREROUTING -d 202.202.202.1 -j DNAT --to-destination 192.168.0.101
iptables -t nat -A POSTROUTING -d 192.168.0.101 -j SNAT --to 192.168.0.1
iptables -t nat -A PREROUTING -d 202.202.202.2 -j DNAT --to-destination 192.168.0.102
iptables -t nat -A POSTROUTING -d 192.168.0.102 -j SNAT --to 192.168.0.1
3.一對多根據協議DNAT
這個最常用,一般是內網或DMZ區內有多個應用伺服器,可以將不同的應用流量映射到不同的伺服器上
環境:
eth0 192.168.0.1 內網
eth1 202.202.202.1 外網
內網中2台主機 192.168.0.101(Web伺服器)、192.168.0.102(郵件伺服器)
現在要把外網訪問202.202.202.1的Web流量映射到192.168.0.101上,同時把把外網訪問202.202.202.1的郵件訪問流量映射到192.168.0.102上
命令如下:
#將防火牆改為轉發模式
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
iptables -t nat -X
iptables -t mangle -X
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
#Web訪問設置
iptables -t nat -A PREROUTING -d 202.202.202.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.101:80
iptables -t nat -A POSTROUTING -d 192.168.0.101 -p tcp --dport 80 -j SNAT --to 192.168.0.1
#郵件訪問設置
iptables -t nat -A PREROUTING -d 202.202.202.1 -p tcp --dport 25 -j DNAT --to-destination 192.168.0.102:25
iptables -t nat -A POSTROUTING -d 192.168.0.102 -p tcp --dport 25 -j SNAT --to 192.168.0.1
iptables -t nat -A PREROUTING -d 202.202.202.1 -p tcp --dport 110 -j DNAT --to-destination 192.168.0.102:110
iptables -t nat -A POSTROUTING -d 192.168.0.102 -p tcp --dport 110 -j SNAT --to 192.168.0.1
SNAT:源地址轉換,代理內部客戶端訪問外部網路
目標地址不變,重新改寫源地址,並在本機建立NAT表項,當數據返回時,根據NAT表將目的地址數據改寫為數據發送出去時候的源地址,並發送給主機,目前基本都是解決內網用戶用同一個公網IP地址上網的情況。
DNAT:目標地址轉換,將內部伺服器發布至外部網路
和SNAT相反,源地址不變,重新修改目標地址,在本機建立NAT表項,當數據返回時,根據NAT表將源地址修改為數據發送過來時的目標地址,並發給遠程主機在DNAT的基礎上,可以根據請求數據包的埠做PNAT(埠轉換,也稱為埠映射),可以根據請求數據包不同的埠改寫不同的目標地址,從而發送給不同的主機這在用一個公網地址做不同服務時用的比較多,而且相對來說,用NAT的方式可以隱藏後端伺服器的真實地址,比較安全。
SNAT的數據流向過程
首先進入PREROUTING,發現不是本網段的地址,而後開始查找路由表(查找路由的過程在PREROUTING和FORWARD之間),於是經過FORWARD鏈進行轉發,在通過POSTROUTING時進行NAT轉換。在這個流程中,NAT轉換的步驟在POSTROUTING鏈上實現,之所以不再PREROUTING上做NAT是因為數據包在進來之前,還不知道是本網段地址還是外網地址。
DNAT的數據流向過程
在DNAT中,NAT要在PREROUTING鏈上做。在數據進入主機後,路由選擇過程是在PREROUTING和FORWARD之間的,所以應該先做地址轉換之後再進行路由選擇,而後經過FORWARD鏈,最後從POSTROUTING鏈出去。
PC1地址:172.16.251.185 網關指向:172.16.251.186
route add default gw 172.16.251.186
route
NAT伺服器地址:172.16.251.185
PC2地址:
二、SNAT的實現:
1、在我們做NAT之前,首先要把NAT伺服器的路由功能打開,不然數據包過不了FORWARD鏈
sysctl -w net.ipv4.ip_forward=1
######也可以使用文件永久生效,下面值改為1即可
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
######執行如下命令讓其生效
sysctl -p
2、在NAT伺服器添加iptables規則如:
iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -j SNAT --to-source 192.168.254.61
#在POSTROUTING鏈上面,將來自源地址為172.16.0.0/16網段的數據包的源地址都轉換為192.168.254.61
查看iptables規則:
iptables -t nat -L -n -v
3、下面我們在PC1上做測試,PC1現在就可以Ping通PC2主機了,如下圖:
4、PC1 ping PC2,在PC1主機上抓包來測試:
tcpdump -i eth0 -v | grep 192
三、DNAT的實現:
1、在NAT伺服器添加iptables規則如:
iptables -t nat -A PREROUTING -d 192.168.254.61 -j DNAT --to-destination 172.16.251.185
#在PREROUTING鏈上面,將請求地址NAT伺服器 eth1 192.168.1.254的數據包全部轉發到PC1 172.16.251.185主機上
查看iptables規則:
iptables -t nat -L -n -v
測試:PC1上面做了WEB服務,我們在PC2上看是否能請求到WEB頁面:
請求防火牆eth1地址,192.168.254.61
2、在NAT伺服器添加iptables規則如:
iptables -t nat -A PREROUTING -d 192.168.254.61 -p tcp --dport 80 -j DNAT --to-destination 172.16.251.185:8080
#此條規則是將所有請求NAT伺服器eth1 192.168.254.61地址的80號埠都轉發到172.16.251.185主機上8080埠,當然前提必須在PC1上面監聽8080埠
查看iptables規則:
基於動態IP地址來做NAT代理內部客戶端來上網
如果IP地址是動態獲取的ADSL寬頻來做NAT代理上網實現方式
iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -o eth1 -j MASQUEREADE
注釋:這裡最好使用"-o"選項來指定出口,MASQUEREADE會自動調用該介面的地址作為源地址出去。
2. 先說收DNAT
DNAT目標地址轉換在PREROUTING鏈上做;可以將虛擬機的服務映射到宿主機的ip上,達到訪問宿主的 ip就等於訪問虛擬機的效果;
iptables -t nat -A PREROUTING -d 192.168.1.51 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.122.2:80
-d 物理機的ip --dport 埠 DNAT 被映射的內網主機ip:埠
應用場景:
這樣主要是為了 能讓內網的主機能夠對外提供服務:數據包的第一站 PREROUTING ,匹配到規則就執行規則進行DNAT轉發,經過FORWARD ,到達POSTROUTING出站。沒有匹配到就進入INPUT,進行匹配
3.再說SNAT
SNAT源地址轉換在POSTROUTING鏈上做; 可以為區域網提供上網服務
iptables -t nat -A PORTROUTING -o br0 -j MASQUERADE
應用場景:
主機上的NAT 虛擬機需要訪問物理網路,虛擬機直接通過先 經過FORWARD,然後通過POSTROUTING 將源地址轉換
4. 再說說不需要經過轉換的數據包,如圖示綠色的部分,直接到達INPUT-->OUTPUT-->POSTROUTING出來了,比如說我要ssh遠程這個主機,走的就是這個流向;
A. 如果想讓相對的區域網內伺服器對外提供web服務,需要做DNAT規則:
iptables -t nat -A PREROUTING -d 公網IP -p tcp –m tcp --dport 公網埠 -j DNAT --to-destination 內網IP:80
我將外網IP 的80,8080 埠都映射到了內網IP的80埠:
經過PREROUTING 鏈後還需要經過FORWARD 鏈,需要在FORWARD這開放提供web服務的80 埠:
iptables -A FORWARD -p tcp -m tcp --dport 80 -j ACCEPT
理論上還需要開放一下--sport 80 , 但是如果已經有下面這個規則了,就不需要了:
這個規則是允許已有連接直接通過;但有大量數據包經過時,可以提高速度!
iptables - I FORWARD –p tcp -m state -- state RELADE,RSTABLISHED - j
ACCEPT
看看實際的效果:
B. 當然FORWARD鏈處,可以對轉發進行數據包的過濾,比如我想通過公網伺服器的ip,遠程ssh連接局域
網內的伺服器,就可以使用DNAT進行轉換內網主機的22埠,但是為了安全,我想限制可以遠程的IP地
址:我只想讓我一個人可以 遠程,我的ip是192.168.1.154,內網網段是192.168.122.0/24
DNAT:
iptables -t nat -A PREROUTING -d 192.168.1.51 -p tcp -m tcp --dport 8081 --to-destination 192.168.122.2:22
FORWARD:
iptables -A FORWARD -s 192.168.1.154 -d 192.168.122.0/24 -p tcp -m tcp --dport 22 -j ACCEPT
我的ip地址
在192.168.1.154上 ssh遠程一下看看
再到其他的主機上ssh試試看,這個主機ip是192.168.1.20
看的出來FORWARD 上的那個規則生效了。
C. 當內網的主機或本地的虛擬機需要通過本機上網時,需要做SNAT規則:我的環境是虛擬機要通過宿主
機上網,虛擬機以宿主機為網關,虛擬機的網段是192.168.122.0/24,宿主機的網段是
192.168.1.0/24,相對來說宿主機網段就是外網,虛擬機就是內網。
-j MASQUERADE 是當外網ip不固定時,這個配置 I 可以自動獲取外網ip。
iptables -t nat -A POSTROUTING -o br0 -s 內網段/24 -j MASQUERADE
-s配置不是必須的,在真實區域網環境中,也許會有多個區域網段,這時就可以通過-s 配置,指定那個網段可以上網
{!-- PGC_COLUMN --}? 著作權歸作者所有
作者: linjin200
原文:https://my.oschina.net/u/3367404/blog/3006589


※IP地址與MAC地址的區別
※分散式系統因果一致性與COPS演算法
TAG:程序員小新人學習 |