一、搭建背景
由於公司做的業務比較多,因爲分爲網絡公司和其他業務的公司,也就是幾家公司分開,不在同一個地方,然後網絡公司的一些數據需要給其他業務的公司訪問,也就是共享資料也去讓大家都可以訪問,網絡公司的很多共享數據都是放到Linux測試機上,因此就有使用***的需求。
二、Open***原理與實戰彙總
概述:
1.Open*** 開源軟件,首先要感謝Open***團隊。
2.在網上找了些關於Open***文章發現在大部分都在講配置,很少有人寫原理的。
3.大家可以在網上找一下Open***的相關原理
三、Open***原理及實現--一般理論
open***基於openssl來實現安全,但是卻不是傳統意義上的ssl***,它只是一個普通的***,工作在ip層而不是傳輸層。***的含義着重點有兩層意思,一個是v,也就是虛擬,另一個是p,也就是專用。
虛擬就是說不用物理佈線,僅僅在邏輯上實現一個網絡,虛擬網絡之所以能實現並建立起來,靠的是分層模型的優勢,分層模型直接將網絡按照邏輯意義縱向分成了7個層次(或者tcp/ip的5個層次),每一層都僅僅承載數據而不管數據的格式和內容,上下層次間僅僅通過接口和服務來通信,理論上任何層次的數據都可以被承載在其它的任何層次或者它當前的層次上,於是就出現了很多XX over YY的網絡模型,比較典型的比如ppp over ethernet等。
over模型按照數據層次可以分爲三類:
第一類是上層數據承載於下層,這實際上就是我們使用的普通的tcp/ip模型;
第二類是同層承載,比如上面說的pppoe,這一類構建方式主要是爲了在一個以傳輸佔主導的層次上增加一個非傳輸意義的邏輯或者說實現一個隧道,比如pppoe中,ethernet主要用於局域網傳輸,而且性價比十分合理,但是卻缺乏認證機制,但是ppp協議的認證功能雖然很好,但是卻缺乏多點通信和尋址能力,作爲傳輸協議意義不大,於是就使用ethernet進行傳輸,使用ppp進行認證,另外一個同層承載的例子是IPSec的隧道模式,它將一個ip數據報封裝於另一個ip數據報中,這樣實際上也就實現了一般意義上的“虛擬局域網絡”(注意不是vlan),因爲在數據報到達最終目的地之前,參與路由的始終是外層的ip頭,內層的ip頭連同真實數據都被外層ip當成了data,因此不參與路由,所以從隧道的出發路由器到結束路由器,不管中間經過的是局域網,廣域網還是別的什麼,內層的ip數據報一直“以爲”自己在出發路由器的那個局域網內,因此就實現了一個虛擬網絡,實現了***中的v,那麼p呢,IPSec將v和p做到了一起,也就是說在實現ip over ip的過程中實現了安全,這就是熟知的ah協議和esp協議,實現了安全才能保證專用,否則別人都可以進入你的虛擬網絡了,作爲***來說,IPsec就到此爲止,但是IPSec的用處不光如此,IPSec主要是保證ip數據報的安全(因爲ip層不提供任何安全保護,ipv6就不一樣了,完全不需要IPSec),***只是它的隧道模式的一個應用,除了隧道模式,IPSec還有傳輸模式,不建立隧道,只是將認證或者加密的功能置於ip數據報中,當然也就是不需要ip over ip了。
衆所周知IPSec的隧道模式實現的***有一個缺陷,那就是很難穿越nat,因爲nat要修改ip頭,一旦ip頭被修改了,那麼最終的ah或者esp的認證加密的校驗結果就會出錯,因此就不能隨意在nat的網絡環境中使用IPSec實現的***,當然不涉及ip頭認證的IPSec協議還是可以用的。難道***就IPSec這一根稻草了嗎?認證和加密的邏輯十分複雜和多樣,不適合在ip層做,ip層做好快速路由和連接不同子網就夠了,如果將分層模型的每個層次僅僅當作一種交通工具來看待的話,問題就容易解決了,交通工具或者叫運輸工具可以相互運輸,大卡車可以運小卡車,也可以拆了被小卡車運,大卡車還可以運輸別的大卡車,它們都可以被放入集裝箱被輪船運輸,分層模型就是這樣的,我們可以讓應用層或者表示層或者傳輸層來承載ip數據報,這也就是over模型的第三類,即上層承載下層,很多時候越往上層邏輯越複雜,實現越靈活,如果想要在低層次實現高度複雜的邏輯,不妨試試這種模型,這個意義上看,IPSec實現的***最後肯定不如ip over ssl好,因爲擴充IPSec很難,畢竟它在協議棧中的位置不適合做大幅修改,但是ssl的擴展性卻很好,它本身就在協議棧的頂端,即使影響也就影響應用層,比如迫使http轉換到https。
如果說低層就不該有複雜多樣且多變的邏輯這種設計思想是對的,那麼IPsec就不該出現,IPv6除了擴充地址空間外,新增的功能淨加重了ip層的負擔,IPv6的複雜設計淨是商業公司爲了推自己的接口或者設備而使出的伎倆,不過也說不準,留給歷史評述吧。
***不一定要實現隧道,只要能互相訪問並且保證互訪者獨佔性的網絡理論上都是***,然而隧道的方式更具有代表性,各種實現也更豐富和花哨。
四、***原理及實現--隧道的一種實現
理論上已經合理的ip over ssl還需要一些額外的技術支撐才能使用,必須想辦法將一個ip數據報原封不動的讓它被ssl重新封裝一次,這個動作不可能在原始的標準協議棧中執行,標準協議棧不支持數據雙向流動,那麼解決方案之一就是修改協議棧,在ip層之下實現一個輕量的ssl協議層,但是如此一來就又回到了IPSec的老路上,因此此法不可取,正確的方法是不修改協議棧,讓一切留在它應該在的地方,於是ssl必然得在應用層或者說是表示層實現,現在的問題是如何將下層的ip數據報重新引入上面的應用層,而且還不能修改標準協議棧,於是必然地要讓ip數據報繼續往下走,然後最終從一個網卡流出,於是就出了協議棧,接下來就可以自由發揮了,讓數據流出網卡的原因是不能修改協議棧,但是還不能真的讓它流出機器,如果它走了就不能指望用ssl封裝它了,那麼流到哪裏呢?
迴環設備是一個不錯的選擇,從迴環設備流出的數據實際上又流進了迴環設備,用戶空間只需要打開回環設備然後讀取就可以了,注意不能通過一般套接字讀取,畢竟那些數據不是發給我們的,要使用類似抓包的方式進行數據抓取,並且用防火牆禁止被抓取的數據繼續被forward,這實際上是一種巧妙的攔截方式,被抓取得數據然後經過ssl封裝後再發向一個真的ip地址,我們需要配置的就是將所有的***數據全部發往回環設備,其實就是添加一條路由,虛擬網絡已經建立,事情到此爲止看似要結束了。
但是且慢,問題來了,以後所有***數據都會經標準協議棧流出再流進loopback,然後作爲裸數據進入應用層,接着整個原始***數據連同它的原始ip頭封裝作爲應用數據接受ssl協議的封裝,然後發往***的另一端,在另一端數據從真實網卡進入,然後由於這是隧道的終點,數據直接進入應用層,在應用層,***服務器等候在那裏,得到原始的***裸數據還有它在發送端的ip頭,服務端得到這個東西有什麼用呢,接下來它要怎麼做呢,它只是隧道的終點,並不是真的要接收數據的機器,因此它必須將數據重新發到真正需要它的機器,很顯然它要作爲一個應用層代理存在,剝去原始的ip頭,得到原始的數據,然後將數據發給真實的目的地,且不說此法是否可能,有兩點不合理之處足以否定它,由於***服務器實現了代理,那麼數據必然要在該處集中並剝去ip頭,並且在相反的方向要做同樣的處理,那麼它就要記住所有的ip頭,否則數據就會有去無回,如此一來,***服務器的負載可堪忍受?性能呢?
第二點,代理的方式消除了隧道的透明性,目的地受到數據後會不知道數據從何而來,統一認爲是***服務器發來的,這樣就無法根據數據源點進行策略化服務。綜上原因,loopback設備可用但不可行,因爲它是本機閉合的,也就是說只有loopback出去的數據才能進入loopback,它又且僅有兩個出口,一讀一寫都在應用層,你無法將數據作爲物理層的流寫入loopback,而只能作爲應用層的數據通過協議棧逐級封裝到達loopback,然後再逐級解封回來,***發送端面臨同樣的問題,因爲僅僅是路由將數據出口指向了loopback, 如果不用抓包的方式(pcap)的話是得不到數據的,而這種方式又十分影響性能,加之還要配置複雜的防火牆規則禁止進入loopback的數據被轉發,性能又受影響,隧道兩端由於是全雙工通信,因此一端面臨的問題在數據反向時在對端同樣存在,拋開這些不談,僅就loopback無法自由配置ip地址這一條,它就不能被選中來實現隧道,***網絡需要被管理,有時管理本身就很複雜,虛擬網絡不僅僅就一張,我們需要爲每張虛擬網絡準備一個子網,也就是每個虛擬網絡要有不同的ip,所以必然需要靈活的ip配置,故而loopback不能實現優雅透明的隧道,既然如此我們回到原點,無非就是做到兩點:
第一,數據必須按照協議棧的標準逐級封裝和解封裝,不能修改協議棧;
第二就是數據到了最下面物理層的時候不能真的走掉,而是回到用戶空間,於是乎虛擬網卡就成了很好的選擇。
以上的都是Open***的一些理論知識,這些也都是從網上搜集大牛們的blog來的。
五、Open***在centos6.3下搭建步驟
1、多的不說,上來直接yum安裝,安裝這個還不夠,因爲我們這裏安裝的是2.3.2,所以還要安裝easy-rsa這個包:
[root@backup yunwei]# yum install -y open*** easy-rsa
2、複製相關的配置文件到/etc/open***目錄下
[root@backup yunwei]# rpm -ql open*** //查看open***的各文件安裝路徑 [root@backup yunwei]# cp -r /usr/share/doc/open***-2.3.2/sample/sample-config-files/server.conf /etc/open***/ [root@backup yunwei]# cp -r /usr/share/easy-rsa/2.0/ /etc/open***/
3、生成證書,修改/etc/open***/2.0/目錄下的vars文件
[root@backup 2.0]# vim vars export KEY_COUNTRY="CN" # 國家 export KEY_PROVINCE="BJ" # 省份 export KEY_CITY="BJ" # 城市 export KEY_ORG="open***" # 組織 export KEY_EMAIL="[email protected]" # 郵件 export KEY_OU="MyOrganizationalUnit" # 單位
修改好之後保存退出:
[root@backup 2.0]# env | grep KEY [root@backup 2.0]# source ./vars #讓 vars 文件生效(還可以用點執行生效. vars) NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/open***/2.0/keys [root@backup 2.0]# env | grep KEY KEY_EXPIRE=3650 [email protected] KEY_OU=MyOrganizationalUnit KEY_SIZE=2048 KEY_DIR=/etc/open***/2.0/keys KEY_NAME=EasyRSA KEY_CITY=BJ KEY_PROVINCE=BJ KEY_ORG=open*** KEY_CONFIG=/etc/open***/2.0/openssl-1.0.0.cnf KEY_COUNTRY=CN [root@backup 2.0]# ./clean-all #清除所有證書 [root@backup 2.0]# ls build-ca build-inter build-key-pass build-key-server build-req-pass inherit-inter list-crl openssl-0.9.8.cnf pkitool sign-req whichopensslcnf build-dh build-key build-key-pkcs12 build-req clean-all keys openssl-0.9.6.cnf openssl-1.0.0.cnf revoke-full vars [root@backup 2.0]#
第一次安裝 open*** 服務必須執行./ clean-all,執行後會多出一個 keys 目錄,keys 目錄
中是存放所有證書。注意:生產環境 pvn 服務器上線很久了,如果再需要添加新客戶端
證書,不需要執行./ clean-all,只需要執行 build-key-pass 或者 build-key。
4、創建CA證書:
[root@backup 2.0]# ./build-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) [CN]: 按回車 State or Province Name (full name) [BJ]: 按回車 Locality Name (eg, city) [BJ]: 按回車 Organization Name (eg, company) [open***]: 按回車 Organizational Unit Name (eg, section) [3drich]: 按回車 Common Name (eg, your name or your server's hostname) [open*** CA]: 按回車 Name [EasyRSA]: 按回車 Email Address [[email protected]]: 按回車 [root@backup 2.0]#
5、創建服務端證書和密鑰 key 文件
[root@backup 2.0]# ./build-key-server server 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) [CN]: 回車 State or Province Name (full name) [BJ]: 回車 Locality Name (eg, city) [BJ]: 回車 Organization Name (eg, company) [open***]: 回車 Organizational Unit Name (eg, section) [3drich]: 回車 Common Name (eg, your name or your server's hostname) [server]: 回車 Name [EasyRSA]: 回車 Email Address [[email protected]]: 回車 Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: 指服務端與客戶端發送密鑰交換認證,可以不填。 An optional company name []: 公司名稱,可以不填。 Using configuration from /etc/open***/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:'BJ' localityName :PRINTABLE:'BJ' organizationName :PRINTABLE:'open***' organizationalUnitName:PRINTABLE:'3drich' commonName :PRINTABLE:'server' name :PRINTABLE:'EasyRSA' emailAddress :IA5STRING:'[email protected]' Certificate is to be certified until Sep 12 01:19:20 2024 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@backup 2.0]#
6、創建客戶端證書和 key 文件(這裏設置一個客戶端分別爲:yunwei,你可以根據需要生成多個客戶端)
[root@backup 2.0]# ./build-key yunwei 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) [CN]: State or Province Name (full name) [BJ]: Locality Name (eg, city) [BJ]: Organization Name (eg, company) [open***]: Organizational Unit Name (eg, section) [3drich]: Common Name (eg, your name or your server's hostname) [client1]: Name [EasyRSA]: Email Address [[email protected]]: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Using configuration from /etc/open***/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:'BJ' localityName :PRINTABLE:'BJ' organizationName :PRINTABLE:'open***' organizationalUnitName:PRINTABLE:'3drich' commonName :PRINTABLE:'yunwei' name :PRINTABLE:'EasyRSA' emailAddress :IA5STRING:'[email protected]' Certificate is to be certified until Sep 12 01:25:38 2024 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
根據自己的需求還可以創建第二第三第四.....個客戶端。
7、創建密鑰交換協議文件(Diffie Hellman)
[root@backup 2.0]# ./build-dh Generating DH parameters, 2048 bit long safe prime, generator 2 This is going to take a long time .......................................................................+...+........+........................................................................................................................................................................................++*++* root@backup 2.0] #
8、配置服務端 *** 配置文件 server.conf。在 open***-2.3.2 目錄中把 server.conf 和 client.conf 配置文件拷貝到/etc/open***/目錄下
[root@backup 2.0]# cp /usr/share/doc/open***-2.3.2/sample/sample-config-files/client.conf /etc/open***/
9、備份 server.conf、client.conf 這 2 個文件
[root@backup open***]# cp server.conf{,.bak} [root@backup open***]# cp client.conf{,.bak} [root@backup open***]# ls 2.0 client.conf client.conf.bak server.conf server.conf.bak
10、創建客戶 *** 日誌文件
[root@backup open***]# mkdir /var/log/open*** [root@backup open***]# touch open***-status.log [root@backup open***]# touch open***.log [root@backup open***]# ls open***.log open***-status.log
11、配置 *** 服務端 server.conf
[root@backup open***]# pwd /etc/open*** [root@backup open***]# cat server.conf | grep "^[^#|^;]" local 10.17.1.20 #監聽地址 port 1194 #監聽端口 proto tcp #監聽協議 dev tun #採用路由隧道模式 ca /etc/open***/2.0/keys/ca.crt #ca證書路徑 cert /etc/open***/2.0/keys/server.crt #服務器證書 key /etc/open***/2.0/keys/server.key # This file should be kept secret 服務器密鑰 dh /etc/open***/2.0/keys/dh2048.pem #密鑰交換協議文件 server 10.8.0.0 255.255.255.0 #給客戶端分配地址池,注意:不能和***服務器內網網段有相同 ifconfig-pool-persist ipp.txt push "route 192.168.20.0 255.255.255.0" #把這條路由發送給客戶端,客戶連接成功後自動加入路由表,默認的下一跳地址:10.8.0.1。 client-to-client #客戶端之間互相通信 keepalive 10 120 #存活時間,10秒ping一次,120 如未收到響應則視爲斷線 comp-lzo #傳輸數據壓縮 max-clients 100 #最多允許 100 客戶端連接 user nobody #用戶 group nobody #用戶組 persist-key persist-tun status /var/log/open***/open***-status.log log /var/log/open***/open***.log verb 3
到這裏應該算是把服務器上的Open***配置好了,這個的話我們就要把剛纔生成的客戶端key和ca拉到我們的電腦上去,
12、在要需要連***的電腦上安裝windows下的open***軟件,這裏就不再多說了,windows下安裝軟件應該不在話下了。
裝好之後再找到***的安裝路徑,找到config這個文件,如果裏面沒有以下文件就自己手動創建
把剛纔從服務器上拉下來的那三個文件放到open***這個文件夾裏去,然後再使用txt編輯open***.o***這個文件,把下面內容貼進去,保存。
這裏要注意:remote這個地址是你公司的外網地址,同時還要在你們公司的路由器上做1194的端口映射,因爲open***服務器是在公司的測試機上,而公司的測試機使用的都是內網ip地址的,所以需要做外網到內網的ipt和端口的映射,很簡單,有網管的話叫網管設置一下就可以了。
客戶端改好之後就基本上差不多了,接下來我們先啓動服務器上的open***服務,然後我們再連接一下就可以了。
接上之後圖標會變成綠色:
OK,現在已經連接上去了,但是我們還需要配置iptables,如果不配置iptables的話連接上***之後你就上不了網了,只能使用***,所以要配置一下iptables:
開啓內核轉發轉發功能,將 net.ipv4.ip_forward = 0 改成 1
[root@backup1 open***]# vim /etc/sysctl.conf [root@backup open***]# sysctl -p #讓它生效 net.ipv4.ip_forward = 1 net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.default.accept_source_route = 0 kernel.sysrq = 0 kernel.core_uses_pid = 1 net.ipv4.tcp_syncookies = 1 error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key error: "net.bridge.bridge-nf-call-iptables" is an unknown key error: "net.bridge.bridge-nf-call-arptables" is an unknown key kernel.msgmnb = 65536 kernel.msgmax = 65536 kernel.shmmax = 68719476736 kernel.shmall = 4294967296
----------------- iptables for open***配置過程 -----------------------
配置默認過濾策略。這裏一定要在打開22口後配置,否則配完後直接就斷了。。。。
接下來允許open***的端口連接
# iptables -A INPUT -p udp --dport 1194 -j ACCEPT
這裏777是我設置的open***的連接端口,各位同學根據自己的情況修改。
配置完成後,最後一步就是配置open***的nat功能了。
# iptables -t nat -A POSTROUTING -s 10.78.0.0/24 -o em1 -j MASQUERADE ——將所有10.78.0.0網段的包轉發到em1口,看準自己服務器上的是什麼端口,我這裏的是em1
配置完成,但是試了很久都連不上……經過仔細檢查和百度,發現還有很多細節上的步驟……
1:開啓系統的路由功能
echo "1" > /proc/sys/net/ipv4/ip_forward
2:添加FORWARD白名單
iptables -A FORWARD -i tun+ -j ACCEPT
3:允許虛擬網段的所有連接
iptables -A INPUT -s 10.78.0.0/24 -j ACCEPT
4:保持已經建立的連接(否則服務器無法上網)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
好了,這樣配置好ipables規則之後就可以連接上了,這樣的話如在外地使用***連接之後就可以隨意使用公司裏配置內網ip的服務器了,可以連接你服務器上的共享文件的服務器,ftp,samba什麼的都可以使用內網ip連接了。