什麼是open***?mysql
Open×××是一個基於OpenSSL庫的應用層×××實現
open***可工做於兩種模式:c++
tun 一種是IP遂道路由模式,主要應用於點對點 eth 一種是基於以太網的遂道橋模式, 應用於點對多點,有多個分支機構
open***提供兩種安全模式:sql
Static Key X509 PKI (Public Key Infrastructure)
1.基礎環境安裝:數據庫
OS: CentOS_6.4 2.6.32-358.el6.x86_64 yum install -y openssl openssl-devel lzo gcc gcc-c++
安裝LZO 用於壓縮通信數據加快傳輸速度安全
wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.09.tar.gz tar zxvf lzo-2.09.tar.gz cd lzo-2.09.tar.gz ./configure make && make install
TUN/TAPbash
Open***要使用到TUN/TAP做爲接口創建隧道,但須要內核支持。TUN 接口建立的是三層路由隧道,創建方便;服務器
TAP 是二層網卡橋接隧道,即建立一個以太網橋接,相對複雜。 TUN 接口下全部的客戶端處於一個徹底獨立的子網內,與 ××× 服務器所在的子網沒有關係; TAP 接口的好處相較之下則至關明顯,客戶端能夠得到 ××× 服務器所處子網的 IP(即,忽略物理上的區別,能夠徹底將客戶端看作是於 ××× 服務器處於同一子網的另外一臺機器)
檢查內核是否支持TUN/TAP設備驅動網絡
modinfo tun 若是有正常的輸出,則支持
肯定內核支持TUN/TAP模塊以後,加載模塊app
modinfo tun # 加載 lsmod tun # 檢查 ls /dev/net/tun # 檢查文件是否存在判斷tun模塊是否加載
2.安裝open×××tcp
a) RPM安裝epel源
rpm -ivh http://mirrors.sohu.com/fedora-epel/6/x86_64/epel-release-6-8.noarch.rpm sed -i 's/^mirrorlist=https/mirrorlist=http/' /etc/yum.repos.d/epel.repo
b) 源碼安裝Open×××
下載 http://open***.net/
tar zxvf open***-2.1.3.tar.gz cd open***-2.1.3 ./configure make && make install
3.配置Open×××
a)初始化PKI 設置環境變量 # mkdir -pv /etc/open*** # cp -r ../../open***-2.1.3/easy-rsa /etc/open*** ×××變量 # cd /etc/open***/easy-rsa/2.0 # cat var # 自定義修改以下內容 export KEY_COUNTRY="CN" # 國家 export KEY_PROVINCE="SH" # 省 export KEY_CITY="SH" # 市 export KEY_ORG="ZZT" # 公司 export KEY_OU="IT" # 部門 export KEY_EMAIL="me@zzt.com" # 郵箱 初始化環境變量 # source vars # ./clean-all # ./build-ca # 生成根證書ca.crt和根密鑰ca.key(一路按回車便可),由於vars文件已經在上面自定義默認的變量值 # ./build-key-server server # 爲服務端生成證書和密鑰(一路按回車,直到提示須要輸入y/n時,輸入y再按回車,一共兩次) 每個登錄的×××客戶端須要有一個證書,每一個證書在同一時刻只能供一個客戶端鏈接,下面創建 # ./build-key client # 爲客戶端生成證書和密鑰(一路按回車,直到提示須要輸入y/n時,輸入y再按回車,一共兩次) # ./build-dh # 建立迪菲·赫爾曼密鑰,會生成dh2048.pem文件(生成過程比較慢,在此期間不要去中斷它) # open*** --genkey --secret keys/ta.key # 生成ta.key文件(防DDos***、UDP淹沒等惡意***)
4.建立服務器端配置文件
將須要用到的open***證書和密鑰複製一份到剛建立好的keys目錄中
mkdir -pv /etc/open***/keys cp /etc/open***/easy-rsa/2.0/keys/{ca.crt,server.{crt,key},dh1024.pem,ta.key} /etc/open***/keys/
複製一份服務器端配置文件模板server.conf到/etc/open***/
cp ./../open***-2.1.3/sample-config-files/server.conf /etc/open***/ cat /etc/open***/server.conf ;local a.b.c.d # 申明本機使用的IP地址,也能夠不說明 port 1194 # 端口 proto tcp # 協議,默認使用udp,若是使用HTTP Proxy,必須使用tcp協議 dev tun # 申明使用的設備可選tap和tun,tap是二層設備,支持鏈路層協議;tun是ip層的點對點協議,限制稍微多一些 ca keys/ca.crt # 全路徑爲/etc/open***/keys/ca.crt,用於驗證客戶是證書是否合法 cert keys/server.crt # 全路徑爲/etc/open***/keys/server.crt,Server使用的證書文件 key keys/server.key # 全路徑爲/etc/open***/keys/server.key,Server使用的證書對應的key,注意文件的權限,防止被盜 dh keys/dh1024.pem # 全路徑爲/etc/open***/keys/dh1024.pem server 10.8.0.0 255.255.255.0 # 地址池,配置×××使用的網段,Open×××會自動提供基於該網段的DHCP服務,保證惟一,不要和實際的局域網衝突便可 ifconfig-pool-persist ipp.txt # 用於記錄某個Client得到的IP地址,相似於dhcpd.lease文件,防止open***從新啓動後「忘記」Client曾經使用過的IP地址 ;client-config-dir /etc/open***/ccd # 定義每一個客戶端的個性化配置文件 # 推送路由信息到客戶端,以容許客戶端可以鏈接到服務器背後的其餘私有子網 # (簡而言之,就是設置容許客戶端訪問×××服務器自身所在的其餘局域網) push "route 10.2.8.0 255.255.255.0" # 能夠設置多個服務端所在的其餘局域網地址範圍 push "route 192.168.0.0 255.255.255.0" ;push "dhcp-option DNS 10.8.0.1" # 用Open×××的DHCP功能爲客戶端提供指定的DNS、WINS等 ;route 10.9.0.0 255.255.255.252 # ×××啓動後,在××× Server上增長的路由,×××中止後自動刪除 client-to-client # 可讓客戶端之間相互訪問直接經過open***程序轉發,不用發送到tun或者tap設備後從新轉發,優化Client to Client的訪問效率 duplicate-cn # 若是客戶端都使用相同的證書和密鑰鏈接×××,必定要打開這個選項,不然每一個證書只容許一我的鏈接××× keepalive 10 120 # 每10秒經過×××的Control通道ping對方,若是連續120秒沒法ping通,認爲鏈接丟失,並從新啓動×××,從新鏈接 tls-auth keys/ta.key 0 # 全路徑爲/etc/open***/keys/ta.key,注意server端後面的數字確定使用0,client使用1 comp-lzo # 對數據進行壓縮,注意Server和Client一致 user nobody #定義運行open***的用戶 group nobody persist-key # 經過keepalive檢測超時後,從新啓動×××,不從新讀取keys,保留第一次使用的keys persist-tun # 經過keepalive檢測超時後,從新啓動×××,一直保持tun或者tap設備是linkup的,不然網絡鏈接會先linkdown而後linkup status /var/log/open***-status.log # 按期把open***的一些狀態信息寫到文件中,以便本身寫程序計費或者進行其餘操做 log /var/log/***/open***.log # 記錄日誌,每次從新啓動open***後刪除原有的log信息 log-append /var/log/***/open***.log # 和log一致,每次從新啓動open***後保留原有的log信息,新信息追加到文件最後 verb 3 # 至關於debug level,改爲verb 5能夠多查看一些調試信息 ;mute 20 # 重複信息的沉默度。相同類別的信息只有前20條會輸出到日誌文件中
5.配置內核和防火牆,啓動服務
開啓路由轉發功能 # echo 1 > /proc/sys/net/ipv4/ip_forward 或者 # sed -i '/net.ipv4.ip_forward/s/0/1/' /etc/sysctl.conf # sysctl -p 配置防火牆,別忘記保存 # iptables -A INPUT -s 10.8.0.0/24 -j ACCEPT # 開啓虛擬網段 # iptables -A INPUT -s 10.8.0.0/24 -m state --state NEW -m tcp -p tcp -j ACCEPT # # iptables -A INPUT -m state --state NEW -m udp -p udp --dport 1194 -j ACCEPT # # iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE # iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -d 10.2.8.0/24 -o eho0 -j SNAT --to-source 10.2.8.10 # 將虛擬網段10.8.0.0/24訪問內網10.2.8.0/24都經過內網網卡eth0而且將源地址轉換成10.2.8.10轉發 # service iptables save # service iptables restart # 重啓
# 啓動open***並設置爲開機啓動
建立open***啓動腳本
cp ../../open***-2.1.3/sample-scripts/open***.init /etc/init.d/open*** /etc/init.d/open*** start service open*** start 或者 /usr/local/sbin/open*** --daemon --config /etc/open***/server.conf # 守護進程模式啓動 echo "/usr/local/sbin/open*** --daemon --config /etc/open***/server.conf" >> /etc/rc.local # 開機啓動
爲客戶端分配靜態IP:(可選)
在/etc/open***/server.conf中增長 client-config-dir /etc/open***/ccd 而後在 /etc/open***/ccd目錄中放針對每一個客戶端的個性化配置文件。 文件名就用客戶端名 生成key的時候輸入的 "Common Name" 名字 好比要設置客戶端 client 爲 10.8.0.8 只要在 /etc/open***/ccd/client 文件中包含一行: ifconfig-push 10.8.0.8 255.255.255.0
Windows客戶端安裝
下載安裝Open×××客戶端工具
建立客戶端配置文件,默認../Open×××/sample-config/client.o***
複製一份 client.o*** 到 ../Open×××/config/client.o***
編輯client.o***
cat client.o*** client dev tun proto tcp remote 203.195.xxx.xxx 1194 # Open×××服務器的外網IP和端口 resolv-retry infinite nobind persist-key persist-tun ca ca.crt cert client1.crt # client1的證書 key client1.key # client1的密鑰 ns-cert-type server tls-auth ta.key 1 # 客戶端是1,服務器是0 comp-lzo verb 3
拷貝client.o***文件到地open***客戶端 ../Open×××/config/目錄下
從服務器上拷貝證書/祕鑰 「ca.crt、client.crt、client.key、ta.key」 到本地open***客戶端的config/目錄下
而後打開Open×××客戶端(切記,要用用管理員身份打開Open×××客戶端,不然客戶端將沒法執行服務端push推送過來的route路由添加指令)點擊鏈接。
ok,若是一切順利,就會看到 "Mon Apr 11 16:26:12 2016 MANAGEMENT: >STATE:1460363172,CONNECTED,SUCCESS,10.8.0.6,10.2.8.45",客戶端分配到的ip,10.8.0.6
打開CMD,ipconfig /all 能夠看到分配的虛擬ip
Linux 客戶端安裝
1) 下載客戶端工具 # yum install -y open*** 2) 建立客戶端配置文件 client.conf # cat /etc/open***/conf/client.conf 添加以下內容 client dev tun proto tcp remote 203.195.xxx.xxx 1194 # Open×××服務器的外網IP和端口 resolv-retry infinite nobind persist-key persist-tun ca ca.crt ns-cert-type server tls-auth ta.key 1 # 客戶端是1,服務器是0 comp-lzo verb 3 auth-user-pass # 啓動User/Pass登陸的方式 3) 啓動客戶端 # open*** --daemon --config /etc/open***/conf/client.conf > /var/log/open***_client.log # 後臺守護進程模式啓動 Username: test # 輸入用戶名 Password: 123456 # 輸入密碼 # ps -ef | grep -v grep | grep open*** # 查看啓動進程 4) 客戶端啓動OK
Linux客戶端啓動腳本
#!/usr/bin/expect # FileName: expect.sh # Auth: Loren # Date: 2016-04-26 10:00 # 定義帳號密碼 set user test set pass 123456 # 啓動命令 spawn /usr/local/sbin/open*** --daemon --config /etc/open***/config/client.conf > /var/log/open***_client.log set timeout 30 # 檢測到指定內容 expect "Username:" # 輸入帳號 send "$user\n" set timeout 30 # 檢測輸入密碼 expect "Password:" # 輸入密碼 send "$pass\n" set timeout 30 # 退出 expect eof # expect expect.sh # 執行腳本
客戶端證書管理
cd /etc/open***/easy-rsa/2.0/ ./revoke-full client1 # 註銷指定客戶端證書名稱
此時 /etc/open***/easy-rsa/2.0/keys/ 目錄下面會生成文件「crl.pem revoke-test.pem」,
其中 crl.pem 文件,是吊銷證書的名單,
index.txt文件中列出全部註冊過的用戶證書列表,其中標誌爲R的表示已註銷用戶
cat /etc/open***/easy-rsa/2.0/keys/index.txt V 260406062220Z 01 unknown /C=CN/ST=SH/L=SH/O=DDD/OU=IT/CN=server/emailAddress=me@DDD.com R 260406062410Z 160412075407Z 02 unknown /C=CN/ST=SH/L=SH/O=DDD/OU=IT/CN=client/emailAddress=me@DDD.com R 260410080030Z 160412084055Z 03 unknown /C=CN/ST=SH/L=SH/O=DDD/OU=IT/CN=client2/emailAddress=me@DDD.com R 260410084606Z 160412091701Z 04 unknown /C=CN/ST=SH/L=SH/O=DDD/OU=IT/CN=client3/emailAddress=me@DDD.com V 260410085953Z 05 unknown /C=CN/ST=SH/L=SH/O=DDD/OU=IT/CN=client4/emailAddress=me@DDD.com
拷貝註銷文件 crl.pem 到指定目錄,若直接指定默認的文件路徑,可能會出現報錯 「cannot read: crl.pem: Permission denied (errno=13)」
cp ./keys/crl.pem /etc/open***/keys/crl.pem # 指定原始默認絕對路徑
而後在服務端配置文件 /etc/open***/server.conf 中添加以下
crl-verify /etc/open***/easy-rsa/2.0/keys/crl.pem
最後重啓Open×××便可
service open*** reload
注意: 每次註銷禁用一個用戶的證書,就須要重複上面的步驟
配置使用帳戶/密碼驗證登陸服務器
1) 使用MySQL數據庫存儲***帳號密碼
yum install -y mysql-devel pam-devel pam_mysql gcc gcc-c++ # 基礎環境安裝
新建數據庫 ***,設置active字段值爲1時,無權使用***
mysql> create database ***; mysql> user ***; mysql> create table ***_users (id INT NOT NULL AUTO_INCREMENT primary key, name char(20) not null, password char(128) default null, mail char(50) default null, active int(10) nmun ('1','0') not null default 1); mysql> insert into ***_users(name,password,mail) values('test','test',''); 明文密碼 mysql> insert into ***_users(name,password,mail) values('test',ENCRYPT('test'),''); 使用 ENCRYPT 加密密碼(建議使用這種) 建立***用戶,對***這個庫有因此的操做權限 mysql> grant all privileges on ***.* to ***@'%' identified by '***_001'; mysql> flush privileges
2) 配置 pam_mysql 模塊
建立 /etc/pam.d/open***文件,內容以下
auth sufficient /lib64/security/pam_mysql.so user=*** passwd=***_001 host=10.10.8.94 db=*** table=***_users usercolumn=name passwdcolumn=password where=active=1 sqllog=0 crypt=0 account required /lib64/security/pam_mysql.so user=*** passwd=***_001 host=10.10.8.94 db=*** table=***_users usercolumn=name passwdcolumn=password where=active=1 sqllog=0 crypt=0 # active值0表示禁用,1正常 # crypt值 0 明文密碼;1 使用crypt(3)函數,至關於MySQL中的ENCRYPT()函數;2 使用MySQL的PASSWORD()函數。PAM可能與MySQL的函數不一樣;3 使用MD5;4 使用SHA1 # 若是使用1,則在數據庫中添加用戶password值的時候須要添加函數 ENCRYPT(),如 insert into ***_users(name,password) values('test',ENCRYPT('123456'));
生成 open***-auth-pam.so 動態庫,注意,若是是使用當前2.1.3版本的Open×××生成此動態庫,可能會出現錯誤,建議從新下載2.0.9版本的生成open***-auth-pam.so 動態庫
首先進入到Open×××源碼plugin解壓路徑下
tar -zxvf open***-2.0.9.tar.gz -C /data/open***-2.0.9 cd /data/open***-2.1.3/plugin/auth-pam make # 生成open***-auth-pam.so cp open***-auth-pam.so /etc/open***/
檢驗pam_mysql配置
啓動 saslauthd 服務 /etc/init.d/saslauthd start 或者 saslauthd -a pam testsaslauthd -u test -p test -s open*** # 測試數據庫裏設置的帳號密碼 0: OK "Success." # 能夠看到驗證成功的信息,反之則失敗,說明配置有問題,請根據 /var/log/salt/master 日誌查找緣由
3) 修改主配置文件 server.conf,添加以下代碼
port 1194 proto tcp dev tun ca /etc/open***/keys/ca.crt cert /etc/open***/keys/server.crt key /etc/open***/keys/server.key dh /etc/open***/keys/dh1024.pem server 10.8.0.0 255.255.255.0 ifconfig-pool-persist /etc/open***/ipp.txt push "route 10.2.8.0 255.255.255.0" push "route 192.168.2.0 255.255.255.0" push "dhcp-opton DNS 10.8.0.1" #client-config-dir /etc/open***/ccd #route 10.8.0.0 255.255.255.0 client-to-client duplicate-cn keepalive 10 120 tls-auth /etc/open***/keys/ta.key 0 # This file is secret comp-lzo user nobody group nobody persist-key persist-tun crl-verify /etc/open***/keys/crl.pem status /var/log/open***-status.log log /var/log/open***.log log-append /var/log/open***.log verb 3 mute 20 # 如下是新添加的內容 # User/Key client-cert-not-required # 只使用帳號密碼使用,若註釋掉則表明須要證書和用戶名密碼雙重驗證登陸 plugin /etc/open***/open***-auth-pam.so open*** # 說明使用的插件,open***爲插件的參數,使用pam的servicesname username-as-common-name # 不請求客戶的CA證書,使用User/Pass驗證
4) 修改客戶端配置文件 client.conf,註釋掉原來的客戶端的證書和密鑰
client dev tun proto tcp # Open×××服務器的外網IP和端口 remote 10.2.8.45 1194 resolv-retry infinite nobind user nobody group nobody persist-key persist-tun ca ca.crt #cert client1.crt # 註釋掉證書 #key client1.key # 註釋掉密鑰 remote-cert-tls server tls-auth ta.key 1 comp-lzo verb 3 # 新添加的代碼以下 auth-user-pass # 添加使用帳號密碼驗證
OK,重啓服務端
service open*** restart
從新鏈接客戶端(切記,要用用管理員身份打開Open×××客戶端)
問題記錄:
1)客戶端啓動提示:TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity)
解決方法: 修改客戶端的client.o***文件 proto tcp # 修改成tcp協議
2)AUTH-PAM: BACKGROUND: user 'test' failed to authenticate: Module is unknown
修改 /etc/pam.d/open*** 的驗證方式爲 "auth sufficient ... "
3)AUTH-PAM: BACKGROUND: user 'test' failed to authenticate: Permission denied
緣由:多是2.1.3版本的open***的生成動態庫和當前的應用版本不匹配,從新下載個2.0.9版本的源碼包, 而後進入../plugin/auth-pam/,make生成新的open***-auth-pam.so,而後替換替換掉原來的open***-auth-pam.so cd ../plugin/auth-pam/ && make