什麼是open***?
Open***是一個基於OpenSSL庫的應用層***實現
open***可工作於兩種模式:
tun 一種是IP遂道路由模式,主要應用於點對點 eth 一種是基於以太網的遂道橋模式, 應用於點對多點,有多個分支機構
open***提供兩種安全模式:
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/TAP
Open***要使用到TUN/TAP作爲接口建立隧道,但需要內核支持。TUN 接口創建的是三層路由隧道,建立方便;
TAP 是二層網卡橋接隧道,即創建一個以太網橋接,相對複雜。 TUN 接口下所有的客戶端處於一個完全獨立的子網內,與 *** 服務器所在的子網沒有關係; TAP 接口的好處相較之下則相當明顯,客戶端可以獲得 *** 服務器所處子網的 IP(即,忽略物理上的區別,可以完全將客戶端看做是於 *** 服務器處於同一子網的另一臺機器)
檢查內核是否支持TUN/TAP設備驅動
modinfo tun 如果有正常的輸出,則支持
確定內核支持TUN/TAP模塊之後,加載模塊
modinfo tun # 加載 lsmod tun # 檢查 ls /dev/net/tun # 檢查文件是否存在判斷tun模塊是否加載
2.安裝open***
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="[email protected]" # 郵箱 初始化環境變量 # 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/[email protected] R 260406062410Z 160412075407Z 02 unknown /C=CN/ST=SH/L=SH/O=DDD/OU=IT/CN=client/[email protected] R 260410080030Z 160412084055Z 03 unknown /C=CN/ST=SH/L=SH/O=DDD/OU=IT/CN=client2/[email protected] R 260410084606Z 160412091701Z 04 unknown /C=CN/ST=SH/L=SH/O=DDD/OU=IT/CN=client3/[email protected] V 260410085953Z 05 unknown /C=CN/ST=SH/L=SH/O=DDD/OU=IT/CN=client4/[email protected]
拷貝註銷文件 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