網絡操作系統VyOS之NAT實踐

本文基於 網絡操作系統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-2pc-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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章