背景:因公司業務逐漸遷移到阿里雲上,因此有需求搭建一條從公司內容到阿里雲的×××隧道,因環境限制並未有***設備可使用,因此計劃在linux上搭建ipsec***來實現該功能。拓撲圖以下:linux
目的:在阿里雲服務器172.16.0.11和公司服務器192.168.6.79之間創建一條ipsec ***隧道。實現兩端私網網段的互訪。其中私網地址分別是:172.16.0.11/16和192.168.0.0/16。vim
服務器版本:CentOS release 6.5 (Final)centos
軟件說明:安全
1. Openswan簡介
Openswan是Linux下IPsec的最佳實現方式,其功能強大,最大程度地保證了數據傳輸中的安全性、完整性問題。
Openswan支持2.0、2.二、2.4以及2.6內核,能夠運行在不一樣的系統平臺下,包括X8六、X86_6四、IA6四、MIPS以及ARM。
Openswan是開源項目FreeS/WAN中止開發後的後繼分支項目,其分裂爲兩個項目,Openswan與 Strongswan,Openswan由三個主要組件構成:配置工具(ipsec命令腳本)、Key管理工具(pluto)、內核組件(KLIPS/26sec)
26sec使用2.6內核內建模塊Netkey,用來替代Openswan開發的KLIPS模塊,2.4及如下版本內核無Netkey模塊支持,只能使用KLIPS。若是你用的是2.6.9以上的內核,推薦使用26sec,能夠不用給內核打Nat-T補丁就可使用NAT,2.6.9如下版本內核的NETKEY存在Bug,推薦使用KLIPS。IPSec差很少是最老的×××標準了,她的依然很安全,固然是在配置好之後。言下之意,她的配置比較麻煩。本文下面將作說明。服務器
由於FreeS/WAN已經在2004年三月中止開發,因此咱們使用她的後繼項目Openswan來作咱們的IPSec實驗。其相比FreeS/WAN有個好處,若是使用 26sec 的時候,Openswan不用打補丁,就能夠用nat。網絡
三、Openswan的認證方式app
Openswan支持許多不一樣的認證方式,包括RSA keys、pre-shared keys、xauth或x.509證書方式。本文使用最簡單的口令PSK認證。ide
四、Openswan的鏈接方式:工具
Network-To-Network方式
Network-To-Network方式是把兩個網絡鏈接成一個虛擬專用網絡。當鏈接創建後,每一個子網的主機均可透明地訪問遠程子網的主機。要實現此種鏈接方式,要知足如下兩個條件:
I. 每一個子網各自擁有一臺安裝有OpenSWan的主機做爲其子網的出口網關或者路由;
II.每一個子網的IP段不能有疊加ui
安裝說明(其中任意一臺服務器):
一、開啓數據轉發
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 0
二、關閉icmp重定向
三、關閉SELinux
四、安裝openswan
這裏並無加載任何的IPsec stack,當啓動IPsec後悔自動加載系統自帶的netkey。
wKiom1i2w1TAj4coAABpdBFJFWs798.png
#netstat -nplu //查看監聽端口
wKioL1i2w7mCVyf-AABbAppC8Ww358.png
咱們能夠看到openswan監聽在UDP的500和4500兩個端口,其中500是用來IKE密鑰交換協商,4500的NAT-T是nat穿透的。
Openswan配置(network-to-network):
version 2
config setup
plutostderrlog=/var/log/pluto.log //指定***的日誌生成文件
protostack=netkey
nat_traversal=yes
virtual_private=
oe=off
conn net-to-net //指定該***鏈接的名字
authby=secret
type=tunnel
left=192.168.6.79 //left是指本地主機。br/>leftsubnet=192.168.0.0/16
leftid=@test2
leftnexthop=%defaultroute
right=1.1.1.1 //right是指對端主機。br/>rightsubnet=172.16.0.0/16
rightid=@test1
rightnexthop=%defaultroute
auto=start //start表示自動鏈接***,add表明須要手動鏈接
一樣的另一臺***server上面,信息和上面同樣,只要注意到left和right便可。
vim /etc/ipsec.secrets
192.168.6.79 0.0.0.0 : PSK "**"
重啓兩個***服務
啓動咱們建立的con名字
#ipsec auto --up net-to-net /當配置的auto=add 時,才須要手動啓動,配置爲start則不須要。
能夠進入日誌文件查看,鏈接日誌
vim /var/log/pluto.log
Feb 23 20:11:44: "net-to-net" #1: transition from state STATE_MAIN_I2 to state STATE_MAIN_I3
Feb 23 20:11:44: "net-to-net" #1: STATE_MAIN_I3: sent MI3, expecting MR3
Feb 23 20:11:46: packet from 123.56.12.108:500: received Vendor ID payload [Dead Peer Detection]
Feb 23 20:11:46: packet from 123.56.12.108:500: received Vendor ID payload [FRAGMENTATION]
Feb 23 20:11:46: packet from 123.56.12.108:500: received Vendor ID payload [RFC 3947]
Feb 23 20:11:46: packet from 123.56.12.108:500: ignoring Vendor ID payload [draft-ietf-ipsec-nat-t-ike-03]
Feb 23 20:11:46: packet from 123.56.12.108:500: ignoring Vendor ID payload [draft-ietf-ipsec-nat-t-ike-02_n]
Feb 23 20:11:46: packet from 123.56.12.108:500: ignoring Vendor ID payload [draft-ietf-ipsec-nat-t-ike-02]
Feb 23 20:11:46: "net-to-net" #2: enabling possible NAT-traversal with method RFC 3947 (NAT-Traversal)
Feb 23 20:11:46: "net-to-net" #2: responding to Main Mode
Feb 23 20:11:46: "net-to-net" #2: transition from state STATE_MAIN_R0 to state STATE_MAIN_R1
Feb 23 20:11:46: "net-to-net" #2: STATE_MAIN_R1: sent MR1, expecting MI2
Feb 23 20:11:46: "net-to-net" #2: NAT-Traversal: Result using RFC 3947 (NAT-Traversal) sender port 500: I am behind NAT+peer behind NAT
Feb 23 20:11:46: "net-to-net" #2: transition from state STATE_MAIN_R1 to state STATE_MAIN_R2
Feb 23 20:11:46: "net-to-net" #2: STATE_MAIN_R2: sent MR2, expecting MI3
Feb 23 20:11:46: "net-to-net" #2: Main mode peer ID is ID_FQDN: '@test1'
Feb 23 20:11:46: "net-to-net" #2: transition from state STATE_MAIN_R2 to state STATE_MAIN_R3
Feb 23 20:11:46: "net-to-net" #2: new NAT mapping for #2, was 123.56.12.108:500, now 123.56.12.108:4500
Feb 23 20:11:46: "net-to-net" #2: STATE_MAIN_R3: sent MR3, ISAKMP SA established {auth=PRESHARED_KEY cipher=aes_256 integ=sha group=MODP2048}
Feb 23 20:11:46: "net-to-net" #2: the peer proposed: 192.168.0.0/16:0/0 -> 172.16.0.0/16:0/0
Feb 23 20:11:46: "net-to-net" #3: responding to Quick Mode proposal {msgid:43be8e61}
Feb 23 20:11:46: "net-to-net" #3: us: 192.168.0.0/16===192.168.6.79<192.168.6.79>[@test2]
Feb 23 20:11:46: "net-to-net" #3: them: 123.56.12.108<123.56.12.108>[@test1]===172.16.0.0/16
Feb 23 20:11:46: "net-to-net" #3: transition from state STATE_QUICK_R0 to state STATE_QUICK_R1
Feb 23 20:11:46: "net-to-net" #3: STATE_QUICK_R1: sent QR1, inbound IPsec SA installed, expecting QI2 tunnel mode {ESP/NAT=>0xac8224cd <0x7f04b45c xfrm=AES_128-HMAC_SHA1 NATOA=none NATD=123.56.12.108:4500 DPD=passive}
Feb 23 20:11:46: "net-to-net" #3: transition from state STATE_QUICK_R1 to state STATE_QUICK_R2
Feb 23 20:11:46: "net-to-net" #3: STATE_QUICK_R2: IPsec SA established tunnel mode {ESP/NAT=>0xac8224cd <0x7f04b45c xfrm=AES_128-HMAC_SHA1 NATOA=none NATD=123.56.12.108:4500 DPD=passive}
Feb 23 20:12:48: "net-to-net" #1: max number of retransmissions (8) reached STATE_MAIN_I3. Possible authentication failure: no acceptable response to our first encrypted message
Feb 23 20:12:48: "net-to-net" #1: deleting state #1 (STATE_MAIN_I3)
當咱們看到ipsec sa estabilished,就證實咱們鏈接成功了,也能夠從中看到一些加密方法,密鑰交換參數,咱們也能夠在配置文件裏面添加以下信息進行修改。
ike=aes256-sha2_256;modp2048
phase2alg=aes256-sha2_256;modp2048
而後在clinet1上面去ping對端子網的設備,能夠看到以下,可是×××Server是不能ping通對方子網的設備的。
open***搭建完成後,是不會生成虛擬網卡的,而且路由表也不須要指定。
wKiom1i2x1qQHIL-AABfxXd2RUg814.png
wKioL1i2x47RDwONAAAg-qhEODQ138.png
防火牆配置:
公司***服務器對外提供服務須要配置靜態NAT,因此在防火牆上須要爲服務器192.168.6.79設置對應的公網ip地址爲2.2.2.2,並在策略中放行。
注:本次搭建***服務器整體上還算順利,主要遇到的兩個問題仍是在阿里雲上,因爲對阿里雲的網絡結構不太熟悉,因此形成了問題。
阿里雲給的公網地址1.1.1.1,實則是彈性IP,至關於公網IP並無配置在虛擬雲主機上,而是在阿里雲的出口網關上(至關NAT),以前配置的時候,阿里雲***服務器的left地址寫成了公網地址1.1.1.1,形成鏈接失敗。
阿里雲提供的VPC實則是專有網絡,內部網絡間是作了二層隔離的,內部172.16.0.0/16網段的主機之間默認是能夠互訪的,但要訪問192.168.0.0/16網段是不能夠的,即便你在主機上添加了該路由,也是不能訪問的。這也是我以前建立完***,鏈接也成功了,但就是不能訪問對端子網的服務器地址。。。解決辦法是:在VPC網絡中的虛擬路由器的路由表中添加一條到192.168.0.0/24的路由,下一跳地址就寫成阿里雲的***服務器實例。