×××技術經過密鑰交換、封裝、認證、加密手段在公共網絡上創建起私密的隧道,保障傳輸數據的完整性、私密性和有效性。Open×××是近年來新出現的開放源碼項目,實現了SSL×××的一種解決方案。html
傳統SSL ×××經過端口代理的方法實現,代理服務器根據應用協議的類型(如http,telnet等)作相應的端口代理,客戶端與代理服務器之間創建SSL安全鏈接,客戶端與應用服務器之間的全部數據傳輸經過代理服務器轉發。這種實現方式煩瑣,應用範圍也比較窄:僅適用於用TCP固定端口進行通訊的應用系統,且對每一個須要代理的端口進行單獨配置;對於每一個須要用到動態端口的協議都必須從新開發,且在代理中解析應用協議才能實現代理,如FTP協議;不能對TCP之外的其它網絡通訊協議進行代理;代理服務器前端的防火牆也要根據代理端口的配置變化進行相應調整。前端
Open×××以一種全新的方式實現了SSL×××的功能,克服了傳統SSL×××的一些缺陷,擴展了應用領域,而且防火牆上只需開放TCP或UDP協議的一個端口。算法
在Linux2.4版本以上,操做系統支持一個名爲tun的設備,tun設備的驅動程序中包含兩個部分,一部分是字符設備驅動,一部分是網卡驅動。網卡的驅動把從TCP/IP協議棧收到的數據包結構skb放於tun設備的讀取隊列,用戶進程經過調用字符設備接口read得到完整的IP數據包,字符驅動read函數的功能是從設備的讀取隊列讀取數據,將核心態的skb傳遞給用戶;反過來字符驅動write函數給用戶提供了把用戶態的數據寫入核心態的接口,write函數把用戶數據寫入核心空間並穿入TCP/IP協議棧。該設備既能以字符設備的方式被讀寫,做爲系統的虛擬網卡,也具備和物理網卡相同的特色:可以配置IP地址和路由。對虛擬網卡的使用是Open×××實現其SSL×××功能的關鍵。vim
Open×××服務器通常須要配置一個虛擬IP地址池和一個自用的靜態虛擬IP地址(靜態地址和地址池必須在同一個子網中),而後爲每個成功創建SSL鏈接的客戶端動態分配一個虛擬IP地址池中未分配的地址。這樣,物理網絡中的客戶端和Open×××服務器就鏈接成一個虛擬網絡上的星型結構局域網,Open×××服務器成爲每一個客戶端在虛擬網絡上的網關。Open×××服務器同時提供對客戶端虛擬網卡的路由管理。當客戶端對Open×××服務器後端的應用服務器的任何訪問時,數據包都會通過路由流經虛擬網卡,Open×××程序在虛擬網卡上截獲數據IP報文,而後使用SSL協議將這些IP報文封裝起來,再通過物理網卡發送出去。Open×××的服務器和客戶端在虛擬網卡之上創建起一個虛擬的局域網絡,這個虛擬的局域網對系統的用戶來講是透明的。windows
Open×××的服務器和客戶端支持tcp和udp兩種鏈接方式,只需在服務端和客戶端預先定義好使用的鏈接方式(tcp或udp)和端口號,客戶端和服務端在這個鏈接的基礎上進行SSL握手。鏈接過程包括SSL的握手以及虛擬網絡上的管理信息,Open×××將虛擬網上的網段、地址、路由發送給客戶端。鏈接成功後,客戶端和服務端創建起SSL安全鏈接,客戶端和服務端的數據都流入虛擬網卡作SSL的處理,再在tcp或udp的鏈接上從物理網卡發送出去。後端
應用層的外出數據,通過系統調用接口傳入核心TCP/IP層作處理,在TCP/IP通過路由到虛擬網卡,虛擬網卡的網卡驅動發送處理程序hard_start_xmit()將數據包加入skb表並完成數據包從核心區到用戶區的複製,Open×××調用虛擬網卡的字符處理程序tun_read(),讀取到設備上的數據包,對讀取的數據包使用SSL協議作封裝處理後,經過socket系統調用發送出去。安全
物理網卡接收數據包,通過核心TCP/IP上傳到Open×××,Open×××經過link_socket_read()接收數據包,使用SSL協議進行解包處理,通過處理的數據包Open×××調用虛擬網卡的字符處理程序tun_write()寫入虛擬網卡的字符設備,設備驅動程序完成數據從用戶區到核心區的複製,並將數據寫入skb鏈表,而後調用網卡netif_rx()接收程序,數據包再次進入系統TCP/IP協議棧,傳到上層應用程序。服務器
Open×××提供tun和tap兩種工做模式。在tun模式下,從虛擬網卡上收到的是不含物理幀頭IP數據包,SSL處理模塊對IP包進行SSL封裝;在tap模式下,從虛擬網卡上收到的是包含物理幀頭的數據包,SSL處理模塊對整個物理幀進行SSL封裝。Tap模式稱爲網橋模式,整個虛擬的網絡就像網橋方式鏈接的物理網絡。這種模式能夠傳輸以太網幀、IPX、NETBIOS等數據包,應用範圍更廣。網絡
Open×××軟件包須要和openssl軟件一塊兒安裝,由於Open×××調用了Openssl函數庫,Open×××的客戶端和服務端創建SSL連接的過程是經過調用Openssl來實現的。經過bio_write()/函數把數據寫入Openssl的狀態機通道,bio_read()從Openssl讀取結果。Open×××還調用Openssl的加解密函數處理轉發的數據包。運維
Open×××可以運行於大多常見的系統平臺,是一個基於SSL/TLS的×××解決方案。Open×××可以基於TAP/TUN虛擬設備驅動實現2層及3層的連接,提供基於SSL/TLS的工業級別加密功能,而且實現了大多數常見×××解決方案的所有特性。但目前提供整合了Open×××的×××硬件廠商還不太多。
lzo提供了一種數據加密的算法,這裏open***會用到lzo算法,因此要安裝lzo
解壓及安裝
# tar xvf lzo-2.04.tar.gz
# cd lzo-2.04
# ./configure --prefix=/usr/local/lzo
# make && make install
# cd ../
# tar xvf open***-2.1.4.tar.gz
# cd open***-2.1.4
# ./configure --prefix=/usr/local/open*** --with-lzo-headers=/usr/local/lzo/include/ --with-lzo-lib=/usr/local/lzo/lib/ --with-ssl-headers=/usr/include/openssl/ --with-ssl-lib=/usr/lib
# make && make install
# cd ../
[root@test1 ~]# mkdir /etc/open***
[root@test1 ~]# cp /root/open***-2.1.4/easy-rsa/ /etc/open***/ -r
[root@test1 ~]# cd /etc/open***/easy-rsa/2.0/
[root@test1 2.0]# cat vars |grep -v '^$'|grep -v '^#'
export EASY_RSA="`pwd`" RSA在當前目錄
export OPENSSL="openssl"
export PKCS11TOOL="pkcs11-tool"
export GREP="grep"
export KEY_CONFIG=`$EASY_RSA/whichopensslcnf $EASY_RSA`
這個是一個很特別的參數沒有「」, openssl的配置文件
export KEY_DIR="$EASY_RSA/keys" 密鑰的位置
echo NOTE: If you run ./clean-all, I will be doing a rm -rf on $KEY_DIR
export PKCS11_MODULE_PATH="dummy"
export PKCS11_PIN="dummy"
export KEY_SIZE=1024 密鑰的大小長度
export CA_EXPIRE=3650 CA證書的過時時間天數
export KEY_EXPIRE=3650 密鑰的時間過時天數
export KEY_COUNTRY="CN" 國家
export KEY_PROVINCE="HB" 省份
export KEY_CITY="WH" 城市
export KEY_ORG="test.com" 組織
export KEY_EMAIL="root@localhost" 郵箱
下面這個命令在第一次安裝時能夠運行,之後在添加客戶端時千萬別運行,這個命令 會清除全部已經生成的證書密鑰。
#./clean-all
[root@test1 2.0]# ./build-ca
Generating a 1024 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]:CN
State or Province Name (full name) [HB]:HUB
Locality Name (eg, city) [WH]:WH
Organization Name (eg, company) [test.com]:test.com
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [test.com CA]:test1.test.com
Name []:
Email Address [root@localhost]:
[root@test1 2.0]# ./build-key-server test1.test.com
Generating a 1024 bit RSA private key
.......................................++++++
..........................++++++
writing new private key to 'test1.test.com.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]:CN
State or Province Name (full name) [HB]:HB
Locality Name (eg, city) [WH]:WH
Organization Name (eg, company) [test.com]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [test1.test.com]:
Name []:
Email Address [root@localhost]:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:123456
An optional company name []:
Using configuration from /etc/open***/easy-rsa/2.0/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'CN'
stateOrProvinceName :PRINTABLE:'HB'
localityName :PRINTABLE:'WH'
organizationName :PRINTABLE:'test.com'
commonName :PRINTABLE:'test1.test.com'
emailAddress :IA5STRING:'root@localhost'
Certificate is to be certified until Oct 6 03:30:01 2023 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
注意在進入 Common Name (eg, your name or your server's hostname) []: 的輸入時, 每一個證書輸入的名字必須不一樣.
[root@test1 2.0]# ./build-key test2.test.com
Generating a 1024 bit RSA private key
............................................................................................................................++++++
......................++++++
writing new private key to 'test2.test.com.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) [HB]:
Locality Name (eg, city) [WH]:
Organization Name (eg, company) [test.com]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [test2.test.com]: 每一個client的hostname都不能同樣
Name []:
Email Address [root@localhost]:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:123456
An optional company name []:
Using configuration from /etc/open***/easy-rsa/2.0/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'CN'
stateOrProvinceName :PRINTABLE:'HB'
localityName :PRINTABLE:'WH'
organizationName :PRINTABLE:'test.com'
commonName :PRINTABLE:'test2.test.com'
emailAddress :IA5STRING:'root@localhost'
Certificate is to be certified until Oct 6 03:36:48 2023 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@test1 2.0]# ./build-dh
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
..............+...............+..+..............................................+..+..............+.......+.............
local 192.168.55.25 #換成服務端的IP
[root@test1 2.0]# mkdir /etc/open***/easy-rsa/2.0/conf
[root@test1 2.0]# cp /root/open***-2.1.4/sample-config-files/server.conf /etc/open***/easy-rsa/2.0/conf/
[root@test1 2.0]# cat /etc/open***/easy-rsa/2.0/conf/server.conf |grep -v '^$'|grep -v '^;'|grep -v '^#'
port 1194
proto udp
dev tun
ca /etc/open***/easy-rsa/2.0/keys/ca.crt
cert /etc/open***/easy-rsa/2.0/keys/test1.test.com.crt
key /etc/open***/easy-rsa/2.0/keys/test1.test.com.key # This file should be kept secret
dh /etc/open***/easy-rsa/2.0/keys/dh1024.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "dhcp-option DNS 192.168.55.25"
push "dhcp-option DNS 8.8.8.8"
client-to-client
keepalive 10 120
comp-lzo
user nobody
group nobody
persist-key
persist-tun
status open***-status.log
log open***.log
verb 3
[root@test1 2.0]# /usr/local/open***/sbin/open*** --config /etc/open***/easy-rsa/2.0/conf/server.conf &
[3] 11924
vim /etc/sysctl.conf
#修改如下內容:
net.ipv4.ip_forward = 1
# sysctl –p
# iptables -t nat -A POSTROUTING -o eth0 -s 10.8.0.0/24 -j MASQUERADE
# /etc/init.d/iptables save
4.1在windows7客戶端上安裝open***-2.1_rc22-install.exe
4.2將服務器上的/etc/open***/easy-rsa/2.0/
keys下的文件拷貝到C:\Program Files (x86)\Open×××\config
4.3在windows7客戶端上將C:\Program Files (x86)\Open×××\sample-config\client.o***拷貝到C:\Program Files (x86)\Open×××\config下
4.4編輯client.o*** 修改以下
remote 服務器IP 1194
4.5 運行client.o***測試是否能夠ping通10.8.0.1,,也就是服務器的tun接口IP。。
5.1鏈接open***時出現錯誤提示:
TLS_ERROR: BIO read tls_read_plaintext error: error:140890B2:SSL routines:SSL3_GET_CLIENT_CERTIFICATE:no certificate returned
TLS Error: TLS object -> incoming plaintext read error
TLS Error: TLS handshake failed
這個彷佛是提示系統時間和證書時間不一致,具體解決措施爲:
1.修改vps時間與本地時間一致
2.重啓vps
3.從新鏈接open***試試
4.若是依舊不能鏈接open***,能夠在vps上從新生成一個新的證書。
5.2今天,部署了下×××,部署完成鏈接的時候,老是提示鏈接失敗,很鬱悶,貼出日誌:
Sun Mar 18 20:25:54 2012 [jesse] Peer Connection Initiated with 10.0.0.200:5000
Sun Mar 18 20:25:55 2012 SENT CONTROL [jesse]: 'PUSH_REQUEST' (status=1)
Sun Mar 18 20:25:55 2012 PUSH: Received control message: 'PUSH_REPLY,route 172.16.1.0 255.255.255.0,route 10.0.1.0 255.255.255.0,topology net30,ping 10,ping-restart 120,ifconfig 10.0.1.6 10.0.1.5'
Sun Mar 18 20:25:55 2012 Options error: Unrecognized option or missing parameter(s) in [PUSH-OPTIONS]:3: topology (2.0.9)
Sun Mar 18 20:25:55 2012 OPTIONS IMPORT: timers and/or timeouts modified
Sun Mar 18 20:25:55 2012 OPTIONS IMPORT: --ifconfig/up options modified
Sun Mar 18 20:25:55 2012 OPTIONS IMPORT: route options modified
Sun Mar 18 20:25:55 2012 TAP-WIN32 device [本地鏈接 3] opened: \\.\Global\{2893A584-9C99-43FE-B17C-E1F7160BE530}.tap
解決方法
There are no TAP-Win32 adapters on this system. You should be able to create a TAP-Win32 adapter by going to Start -> All Programs -> Open××× -> Add a new TAP-Win32 virtual ethernet adapter.
5.3 All TAP-Win32 adapters on this system are currently in use
那麼頗有多是你的TAP虛擬網卡沒有打好驅動,那麼只能換其餘的open***的gui軟件了
5.5官方的open***排錯
若是遇到Open×××初始化失敗,或者ping失敗,下面有一些共同的問題症狀和解決辦法:
1.你獲得以下錯誤信息: TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity). 這個錯誤指出客戶端不能跟服務器創建網絡連接.
解決辦法:
a.請確認客戶端訪問的服務器的機器名/IP和端口是正確的.
b.若是你的Open×××服務器是單網卡,並處在受保護的局域網中,請確認你你的網關防火牆使用了正確的端口轉發規則。好比:你的Open×××機器的地址是192.168.4.4,但處在防火牆保護下,時刻監聽着UDP協議1194的鏈接請求,那麼負責維護192.168.4.x子網的網關就會有一個端口轉發策略,即全部訪問UDP協議1194端口的請求都被轉發到192.168.4.4 。
c.打開服務器的防火牆容許UDP協議1194端口鏈接進來,(或者不論是TCP仍是UDP協議在服務器的配置文件中配置了)。
2.你獲得以下錯誤信息: Initialization Sequence Completed with errors – 這個錯誤可能發生在windows下(a)你沒有啓用DHCP客戶端服務(b)你的XP SP2使用了某個第三方的我的防火牆。
解決辦法: 啓動DHCP客戶端服務或者你確認你的XP SP2正確使用了我的防火牆.
3.你雖然得到了Initialization Sequence Completed 的信息,但ping測試仍是失敗了,那就一般是在服務器或者客戶端的防火牆阻止過濾了在TUN/TAP設備結構上的網絡流量。
解決辦法: 關閉客戶端的防火牆,若是防火牆過濾了TUN/TAP設備端口的流量。好比在Windows XP SP2系統,你能夠到Windows 安全中心 -> Windows 防火牆 -> 高級 而後不要選擇TAP-Win32 adapter設備 (即禁止TUN/TAP設備使用防火牆過濾 ,實質上就是告訴防火牆不要阻止×××認證信息)。 一樣在服務器端也要確認TUN/TAP設備不實用防火牆過濾 (也就是說在TUN/TAP接口上選擇過濾是有必定的安全保障的. 具體請看下面一節的訪問策略).
4.當以udp協議的配置文件啓動的時候鏈接中止,服務器的日誌文件顯示以下一行信息:
TLS: Initial packet from x.x.x.x:x, sid=xxxxxxxx xxxxxxxx
無論怎麼樣,這信息只在服務器端顯示,在客戶端是不會顯示相同的信息。
解決辦法: 你只擁有單向鏈接從客戶端到服務器,從服務器到客戶端的鏈接被防火牆擋住, 一般在客戶端這邊,防火牆(a)多是個運行在客戶端的我的防火牆軟件(b)或者服務客戶端的NAT路由 網關被設置爲從服務器端訪問客戶端的UDP協議包被阻擋返回。
查看FAQ能獲得更多故障解決的信息.
遇到問題:open***客戶端都能連的上去,但不能用。前兩天發現open***被關了。如今打開了仍是有問題,才發現配置被更改了。主要是改了server.conf文檔中的路由設置。主是看到Ping不通分配給個人10.0.8.6,只能Ping的通10.0.8.1而10.0.8.2ping不通,想應該是路由問題。改了本機路由也沒有做用。才發現server.conf中的push "route 10.8.0.0 255.255.0.0"沒有了,加上這句話就能夠了。
收穫:
1. 這個Open***配置了還真很差管理,之後搭服務應都規範化,不能再太隨意。
2. 本身接手維護的東西,必定要整理好文檔。下次維護真是要命,什麼都要重來
vim /etc/rc.d/rc.local
/usr/local/sbin/open*** --config /etc/server.conf