一、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
規划主機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 配置,指定那個網段可以上網
LVS的nat模式和fullnat模式的區別
nat模式
1 當client主機(cip)訪問web服務器(rip)時,因為rip是內網ip,此時的目標ip是負載均衡器的前端ip(vip),當負載均衡器收到cip發來的報文后會根據里面的iptables規則里的地址,將報文里的目標地址改為web服務器的rip並將報文根據規則里的算法發送出去
2 client主機將報文發送到rip后,由於報文的目標地址是自己(cip),所以會響應請求,將響應報文返回給lvs,然后lvs將此報文的sip(rip)修改為vip並發送給client主機的客戶端。
fullnat模式
1 client主機(cip)將請求發往前端的負載均衡器(vip),請求報文源地址是CIP,目標地址為VIP。負載均衡器收到報文后,發現請求的是在規則里面存在的地址,那么它將客戶端請求報文的源MAC地址改為自己DIP的MAC地址,目標MAC改為了RIP的MAC地址,並將此包發送給RS。
2 RS發現請求報文中的目的MAC是自己,就會將次報文接收下來,處理完請求報文后,將響應報文通過lo接口送給eth0網卡直接發送給client主機(cip)。
NAT模式下報文變化
發送接收
cip ---> vip
cip ---> rip(DNAT)
rip ---> cip
vip ---> cip(SNAT)
fullnat模式下報文變化
發送接收
cip ---> vip
lip ---> rip(SNAT + DNAT)
撕裂--->唇
vip ---> cip(SNAT + DNAT)
注釋:
- CIP為客戶端的地址
- VIP為虛擬地址
- 撕裂為真實的服務器
- 唇為本地地址
- SNAT為來源地址轉換
- DNAT為目的地址轉換