×××概述:html
×××(Virtual Private NetWork,虛擬專用網絡)架設在公共共享的基礎設施互聯網上,在非信任的網絡上創建私有的安全的鏈接,把分佈在不一樣地域的辦公場所、用戶或者商業夥伴互聯起來。git
在目前的實踐中,常見的×××構建技術:github
PPTP(Point-to-Point Tunneling Protocol,點到點的隧道協議)×××算法
IPSec(Internet Protocol Security,互聯網協議安全)×××vim
SSL/TLS(Secure Sockets Layer,安全接口層)×××windows
3種常見×××構建技術對比:安全
PPTP 須要創建2個隧道進行通訊,控制和數據傳輸分離,其中傳輸數據使用GRE。在同一個局域網裏面的多個內網主機須要創建多條GRE通道鏈接到同一臺×××服務器時,須要在防火牆或者NAT設備上進行特殊設置。bash
IPSec ×××是一個比較成熟的方案,但其配置較複雜,學習成本比較高。IPSec ××× 在商業××× 硬件設備上實現的比較多。服務器
SSL/TLS ××× 工做在用戶態,不須要對內核作特殊的修改,可移植性比較高,配置簡單,學習成本低(常見:Open×××,Bad×××)。網絡
Open××× (當前主流)
功能特性:
對任何IP子網或者虛擬以太網通一個UDP或者TCP端口來創建隧道。
架構一個可擴展的,負載均衡的×××集羣系統,同時支持來自上千用戶的鏈接。
使用任意加密算法,能夠實現簡單的靜態密碼的傳統加密,或者基於證書的公鑰私鑰加密算法。
對數據流進行實時的壓縮。
支持對端節點經過DHCP動態獲取IP
NAT 支持,對於面向鏈接的有狀態防火牆,不須要特殊設置。
客戶端使用,支持Windows,Mac OS ,Linux
3種實現案例:
Peer-to-Peer ×××,這種場景,將Internet 兩臺機器(公網地址)使用×××鏈接起來。
Remote Access ×××(遠程訪問),該實現方案,旨在解決,移動辦公,常常出差不在辦公室的,公司生產環境鏈接。在這個場景種遠程訪問者通常沒有公網IP,他們使用內網地址經過防火牆設備及逆行NAT轉換後鏈接互聯網。
SIte-to-Site ××× ,用於鏈接兩個或者多個地域上不一樣的局域網LAN,每一個LAN有一臺Open××× 服務器做爲接入點,組成虛擬專用網絡,使得不一樣LAN裏面的主機和服務器都可以相互通信。
實踐案例1:
使用Open××× 建立基於證書驗證Remote Access 的×××
物理結構圖:
1、安裝準備
Open××× 服務器:CetnOS6.8(192.168.1.123,172.16.100.1)
客戶端:Windows 10(192.168.1.114) ,Ubuntu 16.0(192.168.0.182)
一、服務端安裝依賴庫:
OpenSSL,LSZ(一種無損壓縮算法),PAM(一種可插入式的身份驗證模塊)
#安裝gcc、openssl、lzo、pam
yum install -y gcc openssl-devel lzo-devel pam-devel
二、網絡設置
(1)開啓服務器端路由轉發功能
# vi /etc/sysctl.conf net.ipv4.ip_forward = 1 # sysctl -p 或者: #sed -i 's/net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/g' /etc/sysctl.conf #sysctl -p
(2)設置nat轉發:
注:保證×××地址池可路由出外網 # iptables -t nat -A POSTROUTING -s 172.16.100.0/24 -o eth0 -j MASQUERADE
(3)設置open***端口經過:
# iptables -A INPUT -p UDP --dport 1194 -j ACCEPT # iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 重啓iptables: 注:這裏提一下,INPUT策略是執行後即時生效的,POSTROUTING須要保存並重啓服務才能生效 # service iptables saves # service iptables restart
注:此防火牆也能夠關閉(則2,3能夠不用設置)。
(4)時間同步(重要):
# ntpdate asia.pool.ntp.org
2、安裝Open×××服務端
#wget http://swupdate.open***.org/community/releases/open***-2.4.3.tar.gz.asc #tar zxvf open***-2.4.3.tar.gz #cd open***-2.4.3 # ./configure --prefix=/usr/local/open*** # make && make install
3、配置Open×××服務端
配置主要有兩個部分:
生成服務器和客戶端所需的各類證書。
是編寫服務器和客戶端所需的配置文件。
(1)下載easy-rsa,建立證書(這部分能夠參考"easy-rsa 生成Open×××證書"快速生成全部證書)。
Github 源碼2.x
地址:https://github.com/Open×××/easy-rsa/tree/release/2.x
#unzip easy-rsa-release-2.x.zip #cp -rf easy-rsa/ /usr/local/open***/ ########建立CA證書######## #cd /usr/local/open***/easy-rsa/2.0 #source ./vars #初始化命令,用於設置後續命令所需的相關變量信息 NOTE: If you run ./clean-all, I will be doing a rm -rf on /usr/local/open***/easy-rsa/2.0/keys #./clean-all #清除以前建立的全部證書和密鑰 #./build-ca #生成CA證書和密鑰 Generating a 2048 bit RSA private key ...+++ ...........................................................................+++ writing new private key to 'ca.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [US]:CN State or Province Name (full name) [California]:SH Locality Name (eg, city) [SanFrancisco]:SH Organization Name (eg, company) [Fort-Funston]:ChangLiang Organizational Unit Name (eg, section) [MyOrganizationalUnit]:DevOps Common Name (eg, your name or your server's hostname) [Fort-Funston CA]:Open×××_CA Name [EasyRSA]: Email Address [me@myhost.mydomain]:liujian@erichfund.com ##咱們的CA證書和密鑰就已經生成成功了,生成的證書和密碼默認均存放在當前目錄keys。 [root@localhost 2.0]#ls keys/ ca.crt ca.key index.txt serial ############建立服務端證書############# 命令./build-key-server ServerName來生成客戶端證書和密鑰 [root@localhost 2.0]#./build-key-server server#./build-key clientName來生成客戶端證書和密鑰 Generating a 2048 bit RSA private key ............................+++ ....................+++ writing new private key to 'server.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [US]:CN State or Province Name (full name) [California]:SH Locality Name (eg, city) [SanFrancisco]:SH Organization Name (eg, company) [Fort-Funston]:ChangLiang Organizational Unit Name (eg, section) [MyOrganizationalUnit]:DevOps Common Name (eg, your name or your server's hostname) [server]:server Name [EasyRSA]: Email Address [me@myhost.mydomain]:liujian@erichfund.com Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Using configuration from /usr/local/open***/easy-rsa/2.0/openssl-1.0.0.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'CN' stateOrProvinceName :PRINTABLE:'SH' localityName :PRINTABLE:'SH' organizationName :PRINTABLE:'ChangLiang' organizationalUnitName:PRINTABLE:'DevOps' commonName :PRINTABLE:'server' name :PRINTABLE:'EasyRSA' emailAddress :IA5STRING:'liujian@erichfund.com' Certificate is to be certified until Aug 20 05:16:14 2027 GMT (3650 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated [root@localhost 2.0]#ls ./keys/ 01.pem ca.crt ca.key index.txt index.txt.attr index.txt.old serial serial.old server.crt server.csr server.key ############建立客戶端證書############### 命令./build-key clientName來生成客戶端證書和密鑰 [root@localhost 2.0]#./build-key client1 Generating a 2048 bit RSA private key ........................................................+++ ..................................................+++ writing new private key to 'client1.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [US]:CN State or Province Name (full name) [California]:SH Locality Name (eg, city) [SanFrancisco]:SH Organization Name (eg, company) [Fort-Funston]:ChangLiang Organizational Unit Name (eg, section) [MyOrganizationalUnit]:DevOps Common Name (eg, your name or your server's hostname) [client1]:Open×××_Client Name [EasyRSA]: Email Address [me@myhost.mydomain]: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Using configuration from /usr/local/open***/easy-rsa/2.0/openssl-1.0.0.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'CN' stateOrProvinceName :PRINTABLE:'SH' localityName :PRINTABLE:'SH' organizationName :PRINTABLE:'ChangLiang' organizationalUnitName:PRINTABLE:'DevOps' commonName :T61STRING:'Open×××_Client' name :PRINTABLE:'EasyRSA' emailAddress :IA5STRING:'me@myhost.mydomain' Certificate is to be certified until Aug 20 05:34:01 2027 GMT (3650 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated [root@localhost 2.0]#ls ./keys/ 01.pem 02.pem ca.crt ca.key client1.crt client1.csr client1.key index.txt index.txt.attr index.txt.attr.old index.txt.old serial serial.old server.crt server.csr server.key ##########生成迪菲·赫爾曼交換密鑰########### 命令爲./build-dh(無需額外輸入,耐心等待生成完畢便可)。迪菲·赫爾曼交換密鑰是一種安全協議,用以對數據進行加密。 #./build-dh ###########生成TLS-auth密鑰############ 這一步驟是可選操做。Open×××提供了TLS-auth功能,能夠用來抵禦Dos、UDP端口淹沒***。出於安全考慮,你能夠啓用該功能;啓用該功能,你須要執行命令open*** --genkey --secret keys/ta.key來生成TLS-auth所需的密鑰文件。 #/usr/local/open***/sbin/open*** --genkey --secret keys/ta.key 到這裏,咱們的證書生成就告一段落了。若是你之後想要生成新的客戶端或執行其餘操做,只須要先執行命令. ./vars,而後執行相應的命令便可,例如./build-key client2。
證書到這建立完成,看看有哪些證書:
1:CA證書和密鑰
2:服務器端證書和密鑰。
3:客戶端client1的證書和密鑰,
4:迪菲·赫爾曼交換密鑰 (若是你的KEY_SIZE=1024,則該文件名稱爲dh1024.pem)。
5:啓用tls-auth所需的文件。
其中,服務器端須要用到的文件有:
ca.crt ca.key dh2048.pem (若是最初的變量KEY_SIZE設爲1024,這裏就是dh1024.pem) server.crt server.key ta.key (若是不開啓tls-auth,則無需該文件)
客戶端client1須要用到的文件有:
ca.crt client1.crt client1.key (名稱client1根據我的設置可能有所不一樣) ta.key (若是不開啓tls-auth,則無需該文件)
(2)編輯服務器所需的配置文件。
#mkdir -p /usr/local/open***/config #cd /usr/local/open***/config #cp /usr/local/open***/easy-rsa/2.0/keys/{ca.crt,ca.key,server.crt,server.key,ta.key,dh2048.pem} . #ls ca.crt ca.key dh2048.pem server.crt server.key ta.key #cp /opt/open***-2.4.3/sample/sample-config-files/server.conf . #mkdir -p /var/log/open***#建立日誌目錄 #vim server.conf
local 192.168.1.123 #指定監聽的本機IP(由於有些計算機具有多個IP地址),該命令是可選的,默認監聽全部IP地址。 port 1194 #指定監聽的本機端口號 proto udp #指定採用的傳輸協議,能夠選擇tcp或udp ;proto tcp dev tun #指定建立的通訊隧道類型,可選tun或tap,前者工做在三層(TCP/IP),後者工做2層(鏈路層) ca /usr/local/open***/config/ca.crt #指定CA證書的文件路徑 cert /usr/local/open***/config/server.crt #指定服務器端的證書文件路徑 key /usr/local/open***/config/server.key #指定服務器端的私鑰文件路徑 dh /usr/local/open***/config/dh2048.pem #指定迪菲赫爾曼參數的文件路徑 server 172.16.100.0 255.255.255.0 #指定虛擬局域網佔用的IP地址段和子網掩碼,此處配置的服務器自身佔用10.0.0.1。 ifconfig-pool-persist ipp.txt #服務器自動給客戶端分配IP後,客戶端下次鏈接時,仍然採用上次的IP地址(第一次分配的IP保存在ipp.txt中,下一次分配其中保存的IP)。 push "redirect-gateway def1 bypass-dhcp" #若是啓用,該命令將配置全部客戶端經過×××重定向其默認 #網絡網關,致使全部IP流量(如Web瀏覽和#和DNS查找)經過××× push "dhcp-option DNS 202.96.209.5" #給客戶端推送DNS push "dhcp-option DNS 8.8.8.8" tls-auth /usr/local/open***/config/ta.key 0 #開啓TLS-auth,使用ta.key防護***。服務器端的第二個參數值爲0,客戶端的爲1。 keepalive 10 120 #每10秒ping一次,鏈接超時時間設爲120秒。 comp-lzo #開啓×××鏈接壓縮,若是服務器端開啓,客戶端也必須開啓 client-to-client #容許客戶端與客戶端相鏈接,默認狀況下客戶端只能與服務器相鏈接 persist-key persist-tun #持久化選項能夠儘可能避免訪問在重啓時因爲用戶權限下降而沒法訪問的某些資源。 status /var/log/open***/open***-status.log log /var/log/open***/open***.log log-append /var/log/open***/open***.log #日誌保存路徑 verb 4 #指定日誌文件的記錄詳細級別,可選0-9,等級越高日誌內容越詳細 explicit-exit-notify 2 #服務端重啓,客戶端自動重連 |
注意1(能夠不作配置。):
push "redirect-gateway def1 bypass-dhcp" 若是啓用,該命令將配置全部客戶端經過×××重定向其默認 #網絡網關,致使全部IP流量(如Web瀏覽和#和DNS查找)經過××× push "dhcp-option DNS 202.96.209.5" #給客戶端推送DNS client-config-dir ccd #指定文件,對客戶端進行細粒度配置(單獨給某個客戶端推送路由等)。 |
(3)啓動Open×××
#/usr/local/open***/sbin/open*** /usr/local/open***/config/server.conf &
#這裏要加載server.conf 配置文件啓動。
注:啓停腳本:
#cp -a /opt/open***-2.4.3/distro/rpm/open***.init.d.rhel /etc/init.d/open*** #建立啓動腳本 #ln -sv /usr/local/open***/sbin/open*** /usr/sbin/open*** #啓動腳本中會用到,也能夠不執行此命令,直接在啓動腳本中修改 #vi /etc/init.d/open*** #在85行,修改成:work=/usr/local/open***/config [root@localhost config]#service open*** stop Shutting down open***: [ OK ] [root@localhost config]#service open*** start Starting open***: [ OK ] #添加開機啓動 [root@localhost config]#chkconfig --add open*** [root@localhost config]#chkconfig open*** on [root@localhost config]#chkconfig --list | grep 3:on crond 0:off1:off2:on3:on4:on5:on6:off network 0:off1:off2:on3:on4:on5:on6:off open*** 0:off1:off2:on3:on4:on5:on6:off rsyslog 0:off1:off2:on3:on4:on5:on6:off sshd 0:off1:off2:on3:on4:on5:on6:off
4、Open×××客戶端安裝配置:
一、Linux客戶端(Ubuntu16 ):
(1)依賴環境配置:
# apt-get install libpam0g-dev libssl-dev #wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.06.tar.gz #tar zxvf lzo-2.06.tar.gz #cd lzo-2.06/ #./configure --prefix=/usr/local/ #make && make install
(2)其下載安裝同服務端同樣,可是配置文件及證書文件以下:
#mkdir -p /usr/local/open***/config #cd /usr/local/open***/config #scp root@192.168.1.123:/usr/local/open***/easy-rsa/2.0/keys/{client1.crt,client1.key,ca.crt,ca.key,ta.key,dh2048.pem} . # ls ca.crt ca.key client1.crt client1.key client.conf dh2048.pem ta.key #vim client.conf
client #指定當前×××是客戶端 dev tun #必須與服務器端的保持一致 proto udp #必須與服務器端的保持一致 remote 192.168.1.123 1194 #指定鏈接的遠程服務器的實際IP地址和端口號 resolv-retry infinite #斷線自動從新鏈接,在網絡不穩定的狀況下(例如:筆記本電>腦無線網絡)很是有用。 nobind #不綁定特定的本地端口號 persist-key persist-tun ca ca.crt #指定CA證書的文件路徑 cert client1.crt #指定當前客戶端的證書文件路徑 key client1.key #指定當前客戶端的私鑰文件路徑 ns-cert-type server #指定採用服務器校驗方式 tls-auth ta.key 1 #若是服務器設置了防護DoS等***的ta.key,則必須每一個客戶端開 啓;若是未設置,則註釋掉這一行,同服務端一致。 comp-lzo #啓用壓縮,與服務器保持一致 log-append /var/log/open***/open***.log verb 4 #指定日誌文件的記錄詳細級別,可選0-9,等級越高日誌內容越詳細 |
(3)啓動客戶端:
#/usr/local/open***/sbin/open*** /usr/local/open***/config/client.conf &
#客戶端一樣可使用服務端的啓動腳本,只須要修改配置文件爲:client.conf
root@ljohn:/usr/local/open***/config# ping 172.16.100.1
PING 172.16.100.1 (172.16.100.1) 56(84) bytes of data.
64 bytes from 172.16.100.1: icmp_seq=1 ttl=64 time=0.477 ms
64 bytes from 172.16.100.1: icmp_seq=2 ttl=64 time=1.09 ms
客戶端嘗試ping服務器的虛擬IP地址172.16.100.1,順利ping通。
二、Windows客戶端安裝配置
windows中只須要安裝Open××× GUI,並部署配置文件及客戶端證書。
(1)客戶端下載地址:https://swupdate.open***.org/community/releases/open***-install-2.4.3-I602.exe
安裝過程當中,遇到網絡設配器請點擊安裝,其他默認"Next"便可:
(2)安裝完成後在「C:\Program Files\Open×××\config」目錄中部署文件:配置文件同上(但後綴名.o***)
(3)啓動客戶端:
右擊桌面 "Opne××× GUI" 以管理員身份運行,再雙擊任務欄"Opne××× GUI" 圖標(或者任務欄右擊 "Opne××× GUI",點擊 "connect" 鏈接),鏈接成功以下圖顯示。
ping一下Open××× 服務器虛擬IP:172.16.100.1
至此完成基於證書驗證Remote Access Open×××的配置,至此客戶端能夠鏈接上Open××× Server。
4、客戶端訪問內網地址配置
方案一:
以上4個步驟已經完成Open×××的配置,可是還不能與內網(192.168.1.198)通訊,地址映射(虛擬主機 ,DMZ均可以,建議用)須要給內網機器添加靜態路由:
Linux平臺:
[root@CLJJ-10 ~]#route add -net 172.16.100.0/24 gw 192.168.1.123
Windows平臺:
C:\WINDOWS\system32>route add -p 172.16.100.0 mask 255.255.255.0 192.168.1.123 metric 3 if 1
Ping 內網環境的IP:192.168.1.198
方案二:
給路由器配置一條靜態路由,以下圖所示:
注意:若是是3層交換機加一條靜態路由,有防火牆還須要開啓端口映射及相關策略。
終於完成全部配置,對於出差在外,運維小夥伴,能夠躺在家辦公了(想得美)。
*****************************FAQ******************************
一、Authenticate/Decrypt packet error: cipher final failed
編輯server.conf 配置文件
註釋:cipher AES-256-CBC
二、
Authenticate/Decrypt packet error: packet HMAC authentication failed
TLS Error: incoming packet authentication failed
TLS Error: cannot locate HMAC in incoming packet from [AF_INET]192.168.1.123:1194
注:這三個錯誤都源於這個tls-auth 認證問題,只須要服務端和客戶端關閉此功能便可解決:在此行加上; 分號。若是須要開啓能夠關閉後再嘗試開啓
參考資料: