基於linux系統(Ubuntu)的IPSec VPN隧道搭建實驗——包括路由配置和NAT轉發設置教程,超完整!!!

歷時兩週,嘔心瀝血.

中間用了5天在解決爲什麼顯示VPN建立了,但是ping的時候沒有加密,而且子網直接與對方公網進行信息傳輸的問題。

最後終於在諮詢老師後得以解決該問題~

在網上看到好多VPN配置方案,都沒有遇到過博主這種問題,主要大家都沒有講VPN配置前需要做哪些網絡配置。所以爲了後面的大家不再遇到網絡配置的這類坑,特地在這裏寫了一份超詳細的傻瓜式教程,大家只要按照我寫的一步一步執行,絕對沒有問題噠~  

切記不要跳過任何步驟哦,每一個步驟都是非常重要的!

 

  1. 配置虛擬機&虛擬網卡(這個不詳述了,網上教程很多,方法也很多,大家配好網卡的時候要記得檢查是否可以連上網,如果可以的話一般都配的沒問題。然後也要記得查看下ifconfig,確保網卡和網關IP地址對應)

系統A   外網網關(ens192) IP地址:10.1.1.1,內網網關(ens160) IP地址:172.16.0.1

系統B   外網網關(ens192)IP地址:10.1.1.2,內網網關(ens160) IP地址:172.17.0.1

路由器路由地址  10.0.0.1

 

   2. 配置路由表(重要)

刪除內網網卡的路由配置(以系統B爲例),如圖:

刪除路由命令:

$sudo route del -net 172.16.0.0/16 gw 0.0.0.0

下圖所示兩條路由配置必須保留,不然會影響IPSec連接和聯網:

如果添加其他內網相關的靜態路由,會提供一種非加密的路由傳輸方式,導致發送的報文未被加密。

(注:如果是ssh遠程訪問虛擬機,千萬不要刪掉第一條,不然會直接斷開遠程訪問入口,導致無法訪問虛擬機)

這個方法只是暫時性地修改了路由配置,只是方便實驗時做修改,開機重啓後還會還原到原來的路由配置,永久配置靜態路由的方法(以A爲例):

$sudo vim /etc/rc.local

在中括號前寫入:

route del -net 172.16.0.0 netmask 255.255.0.0 gw 0.0.0.0

重啓以後,就永久寫入啦~  

  3. NAT地址轉換(重要!,就是我開頭說的那個問題的解決方案。

由於路由配置只能保證報文轉發時可以順利把報文轉發到目的IP地址,而無法將轉出報文的目的地址從內網IP修改外網IP,將會導致在報文傳送過程中IPsec無法通過識別通信雙方的IP地址識別需要加密的報文信息。所以NAT地址轉換在這裏非常重要。

請在操作前關閉ufw防火牆

A&B

$sudo ufw disable

先清空iptables原有規則:

A&B  

$sudo iptables -F

$sudo iptables -t nat -F

下面是轉換命令:

$sudo iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -j SNAT --to-source 10.1.1.1 
#發送報文時,將內網源IP地址修改爲外網IP地址    
$sudo iptables -t nat -A OUTPUT -d 172.17.0.0/16 -j DNAT –to-source 10.1.1.2 
#發送報文時,將目的內網IP地址修改爲對方的外網IP地址

$sudo iptables -t nat -A POSTROUTING -s 172.17.0.0/16 -j SNAT --to-source 10.1.1.2 
#發送報文時,將內網源IP地址修改爲外網IP地址     
$sudo iptables -t nat -A OUTPUT -d 172.16.0.0/16 -j DNAT –to-source 10.1.1.1 
#發送報文時,將目的內網IP地址修改爲對方的外網IP地址

查看配置結果:

$sudo iptables -t nat -L -n #查看配置結果

這個方法也只是暫時性地修改了iptables的規則,永久配置iptables方法如下(在上面的命令執行完以後,該方法只針對Ubuntu系統):
A&B  

$sudo chmod 777 /etc/iptables.rules #修改文件權限爲可寫入          
$sudo iptables-save > /etc/iptables.rules #保存iptables設置          
$sudo iptables-restore < /etc/iptables.rules #重新加載iptables.rules文件

 

4.  在網址爲https://github.com/hwdsl2/setup-ipsec-vpn/blob/master/README-zh.md 的網站上下載ipsec VPN。

三種下載方式可選:

a. 使用腳本隨機生成的 VPN 登錄憑證 (完成後會在屏幕上顯示):

$sudo wget https://git.io/vpnsetup -O vpnsetup.sh && sudo sh vpnsetup.sh

b. 編輯腳本並提供你自己的 VPN 登錄憑證:

$sudo wget https://git.io/vpnsetup -O vpnsetup.sh
$nano -w vpnsetup.sh[替換爲你自己的值: YOUR_IPSEC_PSK, YOUR_USERNAME 和 YOUR_PASSWORD]
$sudo sh vpnsetup.sh

c. 將你自己的 VPN 登錄憑證定義爲環境變量:

# 所有變量值必須用 '單引號' 括起來
# *不要* 在值中使用這些字符:  \ " '
$sudo wget https://git.io/vpnsetup -O vpnsetup.sh && sudo \
$VPN_IPSEC_PSK='你的IPsec預共享密鑰' \
$VPN_USER='你的VPN用戶名' \
$VPN_PASSWORD='你的VPN密碼' sh vpnsetup.sh

 

5. 配置 ipsec.conf 文件

$sudo vim /etc/ipsec.conf

   

version 2.0 #這一行請大家不要刪掉

config setup
        protostack=netkey
        interfaces=%defaultroute  #IPsec使用的虛接口和實接口
        uniqueids=no   
conn host-host #pc==網關---網關==pc
        left=10.1.1.1 #本機網關IP地址
        right=10.1.1.2  #目的主機網關IP地址
        authby=secret  #認證方式:secret(共享密鑰)
        auto=add  #自動執行ipsec auto --add  
conn net-net  #pc==內網==外網網關---外網網關==內網==pc
        left=10.1.1.1   #本機外網網關IP地址
        leftsubnet=172.16.0.0/16   #本機內網網段地址 
        right=10.1.1.2  #目的主機外網網關IP地址
        rightsubnet=172.17.0.0/16  #目的主機內網網段IP地址
        autby=secret  #認證方式:secret(共享密鑰)
        auto=add  #自動執行 ipsec auto –add

 

$sudo vim /etc/ipsec.conf
config setup
        protostack=netkey
        interfaces=%defaultroute  #IPsec使用的虛接口和實接口
        uniqueids=no   
conn host-host #pc==網關---網關==pc
        left=10.1.1.2 #本機網關IP地址
        right=10.1.1.1  #目的主機網關IP地址
        authby=secret  #認證方式:secret(共享密鑰)
        auto=add  #自動執行ipsec auto --add  
conn net-net  #pc==內網==外網網關---外網網關==內網==pc
        left=10.1.1.2   #本機外網網關IP地址
        leftsubnet=172.17.0.0/16   #本機內網網段地址 
        right=10.1.1.1  #目的主機外網網關IP地址
        rightsubnet=172.16.0.0/16  #目的主機內網網段IP地址
        autby=secret  #認證方式:secret(共享密鑰)
        auto=add  #自動執行 ipsec auto –add

 

6. 配置ipsec.secrets文件

注:要求PSK設置在16比特以上(因爲默認調用sha256函數,要求加密密鑰在16比特以上)

A&B

$sudo vim /etc/ipsec.secrets
%any  %any :  PSK  “12345678901234567890”(密碼只要A、B相同即可, 冒號後面一定要打空格)

 

7. 啓動ipsec VPN

A&B 

$sudo ipsec restart
$sudo ipsec aut –add host-host #添加host-host連接模式
$sudo ipsec auto --up host-host #選擇一種連接模式,啓動它

配置成功:

A

B

 

8. 檢查ipsec是否啓動成功

A/B 

$sudo setkey -D #查看SAD條目
$sudo ipsec status #查看ipsec狀態
$sudo ipsec verify #查看ipsec運行狀態

 

9. 使用tcpdump&&wireshark抓包

A 

$ping 172.17.0.1

B 

$tcpdump -nvvs 256 -i ens192 host 10.1.1.1
-n  不把網絡地址轉換成名字
-vv 使tcpdump輸出詳細的報文信息
-s  指定報文的大小
-i  指定捕獲VPN網關數據包所經過的物理網卡

截獲如下報文信息,證明VPN配置成功:

 

當我們在啓動ipsec某一模式,比如host-host的同時,使用wireshark截包,會截獲本次ipsec通訊所使用的加密算法、hash函數等:

 

 

10. 遇到問題

  • 驗證階段,ping對方主機時,顯示傳輸中的ICMP報文未被加密:

未進行NAT地址轉換,導致目的地址爲內網地址,而非外網地址,導致IPsec無法識別而無法對報文進行加密。

解決方案詳見教程步驟2.

  • ip衝突:

在實驗過程中,我發現主機A的內網網關IP存在IP衝突,導致B可以直接ping通A。

可用如下命令(暫時)修改IP地址:                   

$sudo ifconfig ens160 172.18.0.1 netmask 255.255.0.0

 

  • net-net中配置了子網以後反而無法截獲到加密數據包:

當我打開連接net-net時,我發現在我通過A的內網ping B的內網時,我所截獲的10.1.1.1與10.1.1.2之間是未加密的。

而我啓動host-host時,發現10.1.1.1和10.1.1.2之間傳送的報文反而是加密的。而兩者之間只是相差了子網的設置。

經檢查,發現我原來配置的路由表中畫紅線的這條會導致內網IP直接與對端內網IP地址(相當於我提供了一條不用加密的路徑吧),所以需要把這條刪去。

   其實完全可以把其它的三條刪去,只留下第一條保持系統可以連上路由器的網關就行。

 

如有疑問,歡迎留言~

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