本文基於 網絡操作系統VyOS應用實踐(四) 修改,完善了實驗細節及
1-to-1 NAT
部分。
NAT
NAT即網絡地址轉換,最常見的就是各種虛擬機工具的NAT模式,讓虛擬機以宿主的網絡地址與外網通訊,內網主機發送數據時,內網的地址將會被轉換為運行NAT服務的主機的地址,內網主機都以該主機地址為代表與外界溝通。
原理的確很簡單,接下來將會通過實驗,操作VyOS進行NAT實驗。
下圖為本實驗的基本拓撲:
實驗拓撲
實驗拓撲圖
網絡拓撲
實驗環境是GSN3
網絡拓撲圖
SNAT
SNAT是把內網的地址轉換為NAT服務的宿主的地址進行對外訪問,在實際運作時,SNAT修改離開internal的包的源地址,VyOS支持兩種配置方式,一種是用出口接口(上圖VyOS連接external的接口)上的地址作為全局的外網地址,另一種方式是手動設置,可以設置一個范圍,出口時用其中一個地址。
在DHCP環境下,SNAT應該選擇前者,即設置為MASQUERADE
。
下面的實驗會使用MASQUERADE方式,設置完畢后,會通過發送ICMP包,然后通過wireshark
抓包驗證SNAT的配置。
在VMware上配置好4個虛擬機后,登陸VyOS開始設置:
一般,配置SNAT需要知道以下內容(或者說設置SNAT的步驟):
- 1.我們想轉換的內網IP
- 2.使用哪個接口作為出口接口
- 3.使用哪個外網地址作為轉換目標
對於上面的問題,本實驗中的答案是:
- 1.需要轉換的源地址為192.168.225.3與192.168.225.4
- 2.使用VyOS的eth1接口作為出口接口(我的設置中,eth1連接到192.168.10.3/24)
- 3.使用masquerade
在本例中,我們使用
masquerade
(含義:偽裝)作為轉換地址,而不是IP地址。masquerade目標實際上是一個別名,表示“使用出口接口上的任何IP地址”,而不是靜態配置的IP地址。如果您使用DHCP作為傳出接口,並且不知道外部地址是什么,這將非常有用。
下面我們開始實驗:
設定IP及網關
- vyos 設定端口
vyos@vyos:~$ configure
[edit]
vyos@vyos# set interfaces ethernet eth1 address '192.168.10.2/24'
vyos@vyos# set interfaces ethernet eth2 address '192.168.225.2/24'
- PC-1 設定IP/網關
ip 192.168.225.3/24 192.168.225.2
- PC-2 設定IP/網關
ip 192.168.225.4/24 192.168.225.2
- PC-3 設定IP/網關
ip 192.168.10.3/24 192.168.10.2
先測驗未啟用SNAT情況
下圖沒有啟用SNAT,vyos僅僅起到路由的作用
可以看到在external區域抓到的包的source(右圖第一行)還是192.168.225.3,而返回的包中,destination也還是192.168.225.3。
PC-1> ping 192.168.10.3
192.168.10.3 icmp_seq=1 timeout
192.168.10.3 icmp_seq=2 timeout
84 bytes from 192.168.10.3 icmp_seq=3 ttl=63 time=6.000 ms
84 bytes from 192.168.10.3 icmp_seq=4 ttl=63 time=5.000 ms
84 bytes from 192.168.10.3 icmp_seq=5 ttl=63 time=3.500 ms
啟用SNAT
先為vm1設置一個rule(和防火牆類似,以rule定義規則):
vyos@vyos:~$ configure
[edit]
vyos@vyos# set nat source rule 10 outbound-interface 'eth1'
[edit]
vyos@vyos# set nat source rule 10 source address '192.168.225.3/24'
[edit]
vyos@vyos# set nat source rule 10 translation address 'masquerade'
再用類似的方法為vm2設置rule:
vyos@vyos# set nat source rule 11 outbound-interface 'eth1'
[edit]
vyos@vyos# set nat source rule 11 source address '192.168.225.4/24'
[edit]
vyos@vyos# set nat source rule 11 translation address 'masquerade'
commit並且保存,這樣一來就完成了SNAT的設置,接着,我們通過wireshark進行驗證,證明SNAT起了作用:
這幅圖是啟用了SNAT的單個ICMP包的抓包結果:
上圖左邊的是internal的抓包結果,右邊的是external的結果。
可以看到,由vm1發出的ICMP包,一開始的source是192.168.225.3,然后在external區域抓到的包是已經被修改過source的包,因為使用了MASQUERADE,所以external中抓到的包的source是192.168.10.2,即vyos的eth1接口。然后在返回的包中(即右圖第二行),destination是192.168.10.2而不是192.168.225.3,最后通過轉換,internal區域中抓到的包的destination是192.168.225.3。
這就是啟用SNAT和不啟用SNAT的區別。
關於設置NAT時的注意事項:
如果內部網絡有很多節點需要使用SNAT,VyOS官方建議每256個節點就使用一個外部IP地址進行NAT。如果有8000個節點,那么就需要32個外部IP地址才夠。
DNAT
DNAT主要是用於隱藏內部網絡的機器的真實地址,DNAT的原理是修改目標地址和端口。外部節點訪問內部節點時,目標地址是運行NAT服務的節點的外網地址,DNAT接受數據后,會修改數據包的目標地址,改為內網節點的地址。
網絡拓撲
實驗環境是GSN3
,為了方便測試python
,我們將pc-2
和pc-3
換成vyos
的虛機。
網絡拓撲圖
實驗目標:
假設在我的internal網絡里有一個節點運行xmlrpc服務,但為了安全,我不想直接把該節點暴露給external區域,此時,可以使用防火牆加DNAT實現我的目的。
思路:
vm2運行xmlrpc服務,vm3運行客戶端。使用防火牆,限制vm3只能通過端口1800訪問XMLRPC服務器,同時啟用DNAT,隱藏vm2的地址,只暴露vyos的eth1接口的地址。
設定IP及網關
- VM-2 設定IP/網關
set interfaces ethernet eth1 address '192.168.225.4/24'
# 不設置下面的內容,無法訪問到另一個端口地址,即192.168.10.2
set protocols static route 0.0.0.0/0 next-hop 192.168.225.2
- VM-3 設定IP/網關
set interfaces ethernet eth1 address '192.168.10.3/24'
set protocols static route 0.0.0.0/0 next-hop 192.168.10.2
- vyos 設定端口
vyos@vyos:~$ configure
[edit]
vyos@vyos# set interfaces ethernet eth1 address '192.168.10.2/24'
vyos@vyos# set interfaces ethernet eth2 address '192.168.225.5/24'
設定防火牆
首先,我們先進行防火牆設置。先划分區域,創建internal和external區域:
在vyos-1
上
vyos@vyos# set zone-policy zone IN description "Internal zone"
[edit]
vyos@vyos# set zone-policy zone EX description "External zone"
[edit]
然后把eth0划分給區域IN,eth1划分給EX:
vyos@vyos# set zone-policy zone IN interface eth0
[edit]
vyos@vyos# set zone-policy zone EX interface eth1
然后開始根據目的設置防火牆規則,這里,默認的規則為reject:
vyos@vyos# set firewall name EX-TO-IN default-action reject
[edit]
vyos@vyos# set firewall name EX-TO-IN rule 1 action accept
[edit]
vyos@vyos# set firewall name EX-TO-IN rule 1 state established enable
[edit]
vyos@vyos# set firewall name EX-TO-IN rule 1 state related enable
[edit]
vyos@vyos# set firewall name EX-TO-IN rule 10 action accept
[edit]
vyos@vyos# set firewall name EX-TO-IN rule 10 destination port 1800
[edit]
vyos@vyos# set firewall name EX-TO-IN rule 10 source address 192.168.10.3
[edit]
vyos@vyos# set firewall name EX-TO-IN rule 10 protocol tcp
再設置一個返回數據的規則:
vyos@vyos# set firewall name IN-TO-EX default-action reject
[edit]
vyos@vyos# set firewall name IN-TO-EX rule 1 action accept
[edit]
vyos@vyos# set firewall name IN-TO-EX rule 1 state established enable
[edit]
vyos@vyos# set firewall name IN-TO-EX rule 1 state related enable
[edit]
vyos@vyos# set firewall name IN-TO-EX rule 10 action accept
[edit]
vyos@vyos# set firewall name IN-TO-EX rule 10 source port 1800
[edit]
vyos@vyos# set firewall name IN-TO-EX rule 10 source address 192.168.225.4
[edit]
vyos@vyos# set firewall name IN-TO-EX rule 10 protocol tcp
應用兩組規則:
vyos@vyos# set zone-policy zone IN from EX firewall name EX-TO-IN
[edit]
vyos@vyos# set zone-policy zone EX from IN firewall name IN-TO-EX
xmlrpc客戶端可以正確運作:
上面的實驗內容僅僅滿足了安全性,只允許來自192.168.10.3這個可信節點的客戶端訪問1800端口,但是連接的時候還是直接用vm2的真實地址的,我們還需要設置DNAT進行地址隱藏。
然后進行DNAT的設置。
啟用DNAT
在vyos中,設置DNAT和SNAT的方法和步驟略有不同,其步驟一般是:
- 1.知道數據會從哪個接口進來
- 2.要轉發的是什么協議,端口號是什么
- 3.要轉發的目標內網節點地址
對於上面的問題,本實驗中的答案是:
- 1.從eth1接口進入
- 2.端口為1800,TCP協議
- 3.目標地址為vm2的地址,即192.168.225.4
登陸vyos進行DNAT的設置:
vyos@vyos# set nat destination rule 10 destination port '1800'
[edit]
vyos@vyos# set nat destination rule 10 inbound-interface 'eth1'
[edit]
vyos@vyos# set nat destination rule 10 protocol 'tcp'
[edit]
vyos@vyos# set nat destination rule 10 translation address '192.168.225.4'
[edit]
現在,登入vm3,改變serverproxy的地址,調用XMLRPC並抓包:
上圖,我使用了vyos暴露在外的192.168.10.2這個地址,xmlrpc服務也成功地返回了結果。
檢查抓包結果:
我們先分析右圖,第4行,源地址為192.168.10.3,目標地址為192.168.10.2,可以看到客戶端先把數據發到vyos的eth1接口上,然后看左圖第四行,現在,destination已經變成了192.168.225.4。
左圖第6行開始返回數據,source是vm2的地址,然而到了右圖,source已經不再是192.168.225.4而是192.168.10.2。可以看到,DNAT的確是起到了隱藏vm2的真實地址的作用,那么一來,最初的目的就達到了。
可以看到,DNAT其實有點接近防火牆的功能,不是單單地進行地址轉換,還對協議和端口進行了限制。
1-to-1 NAT
另一個常用於DNAT
的術語是1-to-1 NAT
。對於1-to-1 NAT
配置,dnat和snat都用於將外部IP地址到內部IP地址之間的所有通信進行NAT,反之亦然。
通常,1對1的NAT規則會忽略目標端口(所有端口),並用all或ip替換協議。
然后創對應的SNAT規則,設定NAT,用於內部IP到保留的外部IP流通。這便可以外部IP地址專用於內部IP地址,對於不具有端口概念的協議(如GRE
)非常有用。
網絡拓撲
設定IP及網關
- PC-1 設定IP/網關
ip 192.168.225.3/24 192.168.225.2
- PC-2 設定IP/網關
ip 192.168.10.3/24 192.168.10.2
- vyos設定ip
vyos@vyos:~$ configure
[edit]
set interfaces ethernet eth2 address '192.168.225.2/24'
set interfaces ethernet eth2 description 'Inside interface'
set interfaces ethernet eth1 address '192.168.10.2/24'
set interfaces ethernet eth1 description 'Outside interface'
設定 1-to-1 NAT
set nat destination rule 2000 description '1-to-1 NAT example'
set nat destination rule 2000 destination address '192.168.10.2'
set nat destination rule 2000 inbound-interface 'eth1'
set nat destination rule 2000 translation address '192.168.225.3'
set nat source rule 2000 description '1-to-1 NAT example'
set nat source rule 2000 outbound-interface 'eth1'
set nat source rule 2000 source address '192.168.225.3'
set nat source rule 2000 translation address '192.168.10.2'
PC-1 ping PC-2
在PC-1
上執行如下命令:
PC-1> ping 192.168.10.3
84 bytes from 192.168.10.3 icmp_seq=1 ttl=63 time=10.000 ms
84 bytes from 192.168.10.3 icmp_seq=2 ttl=63 time=5.500 ms
84 bytes from 192.168.10.3 icmp_seq=3 ttl=63 time=4.000 ms
84 bytes from 192.168.10.3 icmp_seq=4 ttl=63 time=5.000 ms
84 bytes from 192.168.10.3 icmp_seq=5 ttl=63 time=2.500 ms
抓包Ethernetswitch-2
to PC-2
:
可以發現,原地址192.168.225.3
已經變成了192.168.10.2
PC-2 ping PC-1
PC-2
在不知道 PC-1
地址的情況下,可以通過訪問192.168.10.2
來訪問PC-1
PC-2> ping 192.168.10.2
84 bytes from 192.168.10.2 icmp_seq=1 ttl=63 time=6.000 ms
84 bytes from 192.168.10.2 icmp_seq=2 ttl=63 time=5.500 ms
84 bytes from 192.168.10.2 icmp_seq=3 ttl=63 time=3.500 ms
84 bytes from 192.168.10.2 icmp_seq=4 ttl=63 time=6.500 ms
84 bytes from 192.168.10.2 icmp_seq=5 ttl=63 time=6.000 ms
抓包Ethernetswitch-1
to PC-1
:
可以發現,原地址192.168.10.2
已經變成了192.168.225.3