搭建基於證書認證登錄的Open***2.4.6服務器部署

參考連接:搭建基於證書認證登錄的Open***服務器

                 用easyrsa3來製作證書

                Open***項目組

推薦閱讀:open***服務器&客戶端配置

                 Open***2.4.3 安裝部署文檔(實戰)

                 Open***的配置和使用

                 Open***常見錯誤

                 利open***自帶的http-proxy突破防火牆的封鎖

                

一、Open***簡介

    Open*** 是一個基於 OpenSSL 庫的應用層 *** 實現。和傳統 *** 相比,它的優點是簡單易用。

    Open***允許參與建立***的單點使用共享金鑰,電子證書,或者用戶名/密碼來進行身份驗證。它大量使用了OpenSSL加密庫中的SSLv3/TLSv1 協議函式庫。Open***能在Solaris、Linux、OpenBSD、FreeBSD、NetBSD、Mac OS X與Windows 2000/XP/Vista上運行,幷包含了許多安全性的功能。它並不是一個基於Web的***軟件,也不與IPsec及其他***軟件包兼容。

    Open***2.0後引入了用戶名/口令組合的身份驗證方式,它可以省略客戶端證書,但是仍有一份服務器證書需要被用作加密。 Open***所有的通信都基於一個單一的IP端口, 默認且推薦使用UDP協議通訊,同時TCP也被支持。Open***連接能通過大多數的代理服務器,並且能夠在NAT的環境中很好地工作。服務端具有向客 戶端“推送”某些網絡配置信息的功能,這些信息包括:IP地址、路由設置等。Open***提供了兩種虛擬網絡接口:通用Tun/Tap驅動,通過它們, 可以建立三層IP隧道,或者虛擬二層以太網,後者可以傳送任何類型的二層以太網絡數據。傳送的數據可通過LZO算法壓縮。在選擇協議時候,需要注意2個加密隧道之間的網絡狀況,如有高延遲或者丟包較多的情況下,請選擇TCP協議作爲底層協議,UDP協議由於存在無連接和重傳機制,導致要隧道上層的協議進行重傳,效率非常低下。


二、Open***的安裝

    

    Open***服務器

       內網地址:10.124.151.251

       外網地址:***.apicloud.com

        ***網段:10.124.163.0/24

        系統環境:Centos6.9

    本地客戶端

       網段:192.168.0.0

       本機IP:192.168.13.5


image.png


    1. 安裝前準備工作:

setenforce 0 #關閉SELinux
yum install epel-release-6-8.noarch -y #安裝epel第三方源
sysctl -w net.ipv4.ip_forward=1 #開啓服務器端路由轉發功能

    2. 配置防火牆iptables:

#開通open***監聽端口對外開放
-A INPUT -p udp -m multiport --dports 1194 -j ACCEPT
#設置NAT轉發,保證***地址池可路由出外網(二選一,第一個是按照本地監聽地址配置,第二個是按照本地網卡名稱配置)
-A POSTROUTING -s 10.124.163.0/24 -j SNAT --to-source 10.124.151.251 
#-A POSTROUTING -s 10.124.163.0/24 -o eth0 -j MASQUERADE

    3. 使用yum安裝open***:

yum install open*** open***-devel -y #這裏使用yum最新版2.4.6

    4. 查看yum安裝open***具體安裝的文件列表

rpm -ql open***

/etc/open***
/etc/rc.d/init.d/open***
/usr/lib64/open***
/usr/lib64/open***/plugin
/usr/lib64/open***/plugin/lib
/usr/lib64/open***/plugin/lib/open***-auth-pam.so
/usr/lib64/open***/plugin/lib/open***-down-root.so
/usr/lib64/open***/plugins
/usr/lib64/open***/plugins/open***-plugin-auth-pam.so
/usr/lib64/open***/plugins/open***-plugin-down-root.so
/usr/sbin/open***
/usr/share/doc/open***-2.4.6
/usr/share/doc/open***-2.4.6/AUTHORS
/usr/share/doc/open***-2.4.6/COPYING
/usr/share/doc/open***-2.4.6/COPYRIGHT.GPL
/usr/share/doc/open***-2.4.6/ChangeLog
/usr/share/doc/open***-2.4.6/Changes.rst
/usr/share/doc/open***-2.4.6/README
/usr/share/doc/open***-2.4.6/README.auth-pam
/usr/share/doc/open***-2.4.6/README.down-root
/usr/share/doc/open***-2.4.6/contrib
/usr/share/doc/open***-2.4.6/contrib/OCSP_check
/usr/share/doc/open***-2.4.6/contrib/OCSP_check/OCSP_check.sh
/usr/share/doc/open***-2.4.6/contrib/README
/usr/share/doc/open***-2.4.6/contrib/open***-fwmarkroute-1.00
/usr/share/doc/open***-2.4.6/contrib/open***-fwmarkroute-1.00/README
/usr/share/doc/open***-2.4.6/contrib/open***-fwmarkroute-1.00/fwmarkroute.down
/usr/share/doc/open***-2.4.6/contrib/open***-fwmarkroute-1.00/fwmarkroute.up
/usr/share/doc/open***-2.4.6/contrib/pull-resolv-conf
/usr/share/doc/open***-2.4.6/contrib/pull-resolv-conf/client.down
/usr/share/doc/open***-2.4.6/contrib/pull-resolv-conf/client.up
/usr/share/doc/open***-2.4.6/management-notes.txt
/usr/share/doc/open***-2.4.6/sample
/usr/share/doc/open***-2.4.6/sample/sample-config-files
/usr/share/doc/open***-2.4.6/sample/sample-config-files/README
/usr/share/doc/open***-2.4.6/sample/sample-config-files/client.conf
/usr/share/doc/open***-2.4.6/sample/sample-config-files/firewall.sh
/usr/share/doc/open***-2.4.6/sample/sample-config-files/home.up
/usr/share/doc/open***-2.4.6/sample/sample-config-files/loopback-client
/usr/share/doc/open***-2.4.6/sample/sample-config-files/loopback-server
/usr/share/doc/open***-2.4.6/sample/sample-config-files/office.up
/usr/share/doc/open***-2.4.6/sample/sample-config-files/open***-shutdown.sh
/usr/share/doc/open***-2.4.6/sample/sample-config-files/open***-startup.sh
/usr/share/doc/open***-2.4.6/sample/sample-config-files/roadwarrior-client.conf
/usr/share/doc/open***-2.4.6/sample/sample-config-files/roadwarrior-server.conf
/usr/share/doc/open***-2.4.6/sample/sample-config-files/server.conf
/usr/share/doc/open***-2.4.6/sample/sample-config-files/static-home.conf
/usr/share/doc/open***-2.4.6/sample/sample-config-files/static-office.conf
/usr/share/doc/open***-2.4.6/sample/sample-config-files/tls-home.conf
/usr/share/doc/open***-2.4.6/sample/sample-config-files/tls-office.conf
/usr/share/doc/open***-2.4.6/sample/sample-config-files/xinetd-client-config
/usr/share/doc/open***-2.4.6/sample/sample-config-files/xinetd-server-config
/usr/share/doc/open***-2.4.6/sample/sample-scripts
/usr/share/doc/open***-2.4.6/sample/sample-scripts/auth-pam.pl
/usr/share/doc/open***-2.4.6/sample/sample-scripts/bridge-start
/usr/share/doc/open***-2.4.6/sample/sample-scripts/bridge-stop
/usr/share/doc/open***-2.4.6/sample/sample-scripts/ucn.pl
/usr/share/doc/open***-2.4.6/sample/sample-scripts/verify-cn
/usr/share/doc/open***-2.4.6/sample/sample-windows
/usr/share/doc/open***-2.4.6/sample/sample-windows/sample.o***
/usr/share/man/man8/open***.8.gz
/var/lib/open***
/var/run/open***

其中:

/usr/share/doc/open***-2.4.6/sample/sample-config-files/server.conf   #服務端配置文件模板
/usr/share/doc/open***-2.4.6/sample/sample-config-files/client.conf   #Linux平臺客戶端配置模板
/usr/share/doc/open***-2.4.6/sample/sample-windows/sample.o***        #Windows平臺客戶端配置模板

下面兩行是運行在預共享的靜態密鑰下的示例配置文件:

/usr/share/doc/open***-2.4.6/sample/sample-config-files/static-home.conf
/usr/share/doc/open***-2.4.6/sample/sample-config-files/static-office.conf

下面兩行是運行在SSL/TLS模式下的示例配置文件:

/usr/share/doc/open***-2.4.6/sample/sample-config-files/tls-home.conf
/usr/share/doc/open***-2.4.6/sample/sample-config-files/tls-office.conf

三、Open***的配置    

    1. 首先把主要配置文件複製到/etc/open***:

cp /usr/share/doc/open***-2.4.6/sample/sample-config-files/server.conf /etc/open***
# grep -Ev "^$|^[#;]" /etc/open***/server.conf 

port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key  # This file should be kept secret
dh dh2048.pem
server 10.124.163.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "route 10.0.0.0 255.0.0.0"
push "dhcp-option DNS 223.5.5.5"
push "dhcp-option DNS 223.6.6.6"
client-to-client
keepalive 10 120
tls-auth ta.key 0 # This file is secret
cipher AES-256-CBC
comp-lzo
user nobody
group nobody
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 3
explicit-exit-notify 1

附註:

配置文件參數解析

注:可按照默認模板配置,本例爲自定義配置文件,";"還有"#"開頭的是註釋
--------------------------
# 設置監聽IP,默認是監聽所有IP
;local a.b.c.d
# 設置監聽端口,必須要對應的在防火牆裏面打開
port 1194
# 設置用TCP還是UDP協議?(用UDP會比較快些)
;proto tcp
proto tcp
# 設置創建tun的路由IP通道,還是創建tap的以太網通道路,由於IP容易控制,所以推薦使用tun;但如果IPX等必須使用第二層才能通過的通訊,則可以用tap方式,tap也就是以太網橋接
;dev tap
dev tun
# Windows服務端需要給網卡一個名稱,linux不需要
;dev-node MyTap
# 這裏是重點,必須指定SSL/TLS root certificate (ca),certificate(cert), and private key (key),ca文件是服務端和客戶端都必須使用的,但不需要ca.key,服務端和客戶端指定各自的.crt和.key,請注意路徑,可以使用以配置文件開始爲根的相對路徑,也可以使用絕對路徑,請小心存放.key密鑰文件
ca /usr/share/doc/open***-2.3.7/sample/sample-keys/ca.crt
cert /usr/share/doc/open***-2.3.7/sample/sample-keys/server.crt
key /usr/share/doc/open***-2.3.7/sample/sample-keys/server.key
# 指定Diffie hellman parameters.
dh /usr/share/doc/open***-2.3.7/sample/sample-keys/dh2048.pem
# 配置服務器模式和***使用的網段,Open***會自動提供基於該網段的DHCP服務,但不能和任何一方的局域網段重複,***服務器將會把10.8.0.1留給自己,其餘的分配給***客戶端,每一個客戶端都會從10.8.0.1這個IP到達Open***服務端,如果使用dev tap模式,則需要註釋掉該指令。
server 10.8.0.0 255.255.255.0
# 維持一個客戶端和virtual IP的對應表,以方便客戶端重新連接可以獲得同樣的IP
ifconfig-pool-persist ipp.txt
# 配置爲以太網橋模式(dev tap),但需要使用系統的橋接功能,這裏不需要使用
;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100
# 爲客戶端創建對應的路由,以另其通達公司網內部服務器,但記住,公司網內部服務器也需要有可用路由返回到客戶端,這裏主要填寫open***所在局域網的網段,我的open***所在的局域網是10.0.0.0,如果你的open***所在的局域網是其他的網段,下面請填寫其他網段,可以填寫多個網段。
;push "route 192.168.20.0 255.255.255.0"
push "route 10.0.0.0 255.255.255.0"
# 若客戶端希望所有的流量都通過***傳輸,則可以使用該語句,其會自動改變客戶端的網關爲***服務器,推薦關閉,一旦設置,請小心服務端的DHCP設置問題,如果需要抓取所以連接***客戶端的流量信息,需要開啓,這就是網絡上面所說的×××。
;push "redirect-gateway def1 bypass-dhcp"   所有數據都通過***
# 用Open***的DHCP功能爲客戶端提供指定的DNS、WINS等
push "dhcp-option DNS 114.114.114.114"
;push "dhcp-option WINS 10.8.0.1"
# 默認客戶端之間是不能直接通訊的,除非把下面的語句註釋掉
client-to-client
# 如果您希望有相同Common Name的客戶端都可以登陸,也可以註釋下面的語句,推薦每個客戶端都使用不用的Common Name,開啓的話,一個證書可以多個客戶端連接
;duplicate-cn
# 設置服務端檢測的間隔和超時時間
keepalive 10 120
# 使用lzo壓縮的通訊,服務端和客戶端都必須配置
comp-lzo
# 設置最大用戶數
;max-clients 100
# 讓Open***以nobody用戶和組來運行(安全)
;user nobody
;group nobody
#持續選項會盡量避免訪問某些資源的重新啓動可能不可以因爲特權的降級。
persist-key
persist-tun
# 輸出短日誌,每分鐘刷新一次,以顯示當前的客戶端
status /var/log/open***/open***-status.log
# 缺省日誌會記錄在系統日誌中,但也可以導向到其他地方建議調試的使用先不要設置,調試完成後再定義,只能使用其中的一個,log會每次啓動前先清楚日誌,log-append會對數據追加
;log /var/log/open***/open***.log
log-append /var/log/open***/open***.log
# 設置日誌的級別
verb 3

    2. 生成證書

涉及到證書生成,請參考下面的文章:

    使用easyrsa來製作證書

四、Open***的啓動

    1.啓動命令

service open*** {start|stop|restart|condrestart|reload|reopen|status}

    2.日誌路徑:如果/var/log/open***/ 不存在,可能需要創建

mkdir -p /var/log/open***/
/var/log/open***/
├── open***.log  #啓動運行日誌
└── open***-status.log #記錄當前哪一個客戶端連接的狀態

五、客戶端的安裝

    這裏記錄Windows客戶端的安裝和配置

    1. 2.4.6客戶端安裝包下載地址:

https://softpedia-secure-download.com/dl/c140a1a4e8771e05455151d1ec61e793/5b029341/100090870/software/security/open***-install-2.4.6-I601.exe

    2. 安裝過程:

    image.png  image.png  

這裏只安裝客戶端和網絡,見下圖:

image.png image.png 

剩下的步驟默認即可。

    3. 將服務端內ca.crt、client.crt、client.key、client.conf複製到客戶端D:\Program Files\Open***\config下。

D:\Program Files\Open***>tree /f
卷 軟件 的文件夾 PATH 列表
卷序列號爲 0000008F 04B4:1271
D:.
│  icon.ico
│  Uninstall.exe
│
├─bin
│      libcrypto-1_1-x64.dll
│      liblzo2-2.dll
│      libpkcs11-helper-1.dll
│      libssl-1_1-x64.dll
│      openssl.exe
│      open***-gui.exe
│      open***.exe
│      open***serv.exe
│
├─config
│      ca.crt
│      client.crt
│      client.key
│      client.o***
│      README.txt
│      ta.key
│
├─doc
│      INSTALL-win32.txt
│      license.txt
│      open***.8.html
│
├─log
│      README.txt
│
└─sample-config
        client.o***
        sample.o***
        server.o***

    4. 配置文件:

#D:\Program Files\Open***\config>grep -Ev "^$|^[#;]" client.o***

client
dev tun
proto udp
remote ***.apicloud.com 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
remote-cert-tls server
tls-auth ta.key 1
cipher AES-256-CBC
comp-lzo
verb 3

    配置文件解析:

# 定義是一個客戶端
client
# 定義使用路由IP模式,與服務端一致
;dev tap
dev tun
# 定義Windows下使用的網卡名稱,linux不需要
;dev-node MyTap
# 定義使用的協議,與服務端一致
;proto tcp
proto tcp
# 指定服務端地址和端口,可以用多行指定多臺服務器實現負載均衡高可用(從上往下嘗試)
remote 211.152.x.x 1194
;remote my-server-2 1194
# 若上面配置了多臺服務器,讓客戶端隨機連接,以便實現負載均衡
;remote-random
# 解析服務器域名
resolv-retry infinite
# 客戶端不需要綁定端口
nobind
# Try to preserve some state across restarts.
persist-key
persist-tun
# 重點,就是指定ca和客戶端的證書
ca ca.crt
cert client.crt
key client.key
# 使用lzo壓縮,與服務端一致
comp-lzo
# Set log file verbosity.
verb 3

    5. 連接:

image.png

image.png

image.png


六、客戶端IP地址的使用

    在--topology mode選項中,mode有三種取值,即net30、subnet和p2p。

    當運行在--dev tun模式下時,可以通過--topology mode選項來配置虛擬地址的拓撲結構。而對於--dev tap而言,該選項沒有任何意義,因爲在--dev tap模式下,總是使用子網拓撲如果在服務器端設置了--topology mode選項,那麼--server和--server-bridge選項將會很好地自動地把拓撲模式推送到客戶端。該選項也可以被手動的推送到客戶端,類似於--dev選項,另外,還要求服務器端和客戶端必須支持該選項。

1、net30

   Open***默認的子網掩碼是/30,也就是255.255.225.252。在這樣的情況下,每組網絡四個地址,只有兩個地址可以使用,一個給服務端,一個給客戶端,另外一個是網絡地址,一個是廣播地址,這樣地址是很浪費的,這是Open*** 2.0的默認模式。

   在Open***的2.0版本中,Open***能通過虛擬一個TUN虛擬接口處理多個客戶端,要處理這種技術,可以把服務器上看到的PtP連接看作是一個操作系統和Open***之間的連接,而在Open***內部還需要爲每一個客戶端創建另一個PtP。如何所有的O/S在TUN接口上真正的支持PtP連接,那麼這將會是的Open***服務器僅使用一個IP地址,並且一個客戶端也使用一個IP地址。

    在OS系統和Open***之間首先要有一個10.8.0.1<->10.8.0.2的PtP連接。

wKioL1adnKvBhepkAABDys5fwbg238.png   於是Open***爲每一個連接的客戶端指定一個/30的子網,第一個可以使用的/30的子網是:

  • 10.8.0.4:網絡地址;

  • 10.8.0.5:在Open***中的“虛擬”IP地址;

  • 10.8.0.6:指定給客戶端的IP地址;

  • 10.8.0.7:廣播地址。

    然後將路由推到客戶端,這樣便使所有IP地址爲10.8.0.5的流量都必須通過“網關”10.8.0.5纔可以出去或者進入。

    由於10.8.0.5僅是Open***內部的一個虛擬IP地址,它被用作末端路由,對應這個地址,Open***不會接受ping,而10.8.0.6對於服務器的操作系統來說卻是一個真正的IP地址,因此它可以接受ping,我們讓客戶端連接查看一下。

以此類推,第二個客戶端連接分配的IP地址對就是10.8.0.9<->10.8.0.10,從這個IP分配來看,對IP的使用造成的浪費。但是對於Open***服務器端僅使用一個配置來爲所有類型的客戶端分配地址來說這是最好的一種方式。

2、subnet

   subnet通過配置TUN接口的本地IP地址和子網掩碼來使用一個子網,而不是點對點的拓撲結構,類似於使用--dev tap和以太網橋模式的拓撲結構。這種模式爲每個客戶端分配單個IP地址。

3、p2p

   p2p模式使用點對點拓撲,僅適用於Windows系統下,現在已經不再贊成使用。

七、遇到的問題

    1. 安裝所有步驟配置完成後, 啓動服務器, 啓動客戶端,發現連接失敗, 錯誤如下:

Wed May 23 14:07:08 2018 117.107.209.233:11840 [client-user-test1] Peer Connection Initiated with [AF_INET]117.107.209.233:11840
Wed May 23 14:07:08 2018 MULTI: new connection by client 'client-user-test1' will cause previous active sessions by this client to be dropped.  Remember to use the --duplicate-cn option if you want multiple clients using the same certificate or username to concurrently connect.
Wed May 23 14:07:08 2018 MULTI_sva: pool returned IPv4=10.124.163.6, IPv6=(Not enabled)
Wed May 23 14:07:08 2018 MULTI: Learn: 10.124.163.6 -> client-user-test1/117.107.209.233:11840
Wed May 23 14:07:08 2018 MULTI: primary virtual IP for client-user-test1/117.107.209.233:11840: 10.124.163.6
Wed May 23 14:07:09 2018 client-user-test1/117.107.209.233:11840 PUSH: Received control message: 'PUSH_REQUEST'
Wed May 23 14:07:09 2018 client-user-test1/117.107.209.233:11840 SENT CONTROL [client-user-test1]: 'PUSH_REPLY,route 10.0.0.0 255.0.0.0,dhcp-option DNS 223.5.5.5,dhcp-option DNS 223.6.6.6,route 10.124.163.0 255.255.255.0,topology net30,ping 10,ping-restart 120,ifconfig 10.124.163.6 10.124.163.5,peer-id 0,cipher AES-256-GCM' (status=1)
Wed May 23 14:07:09 2018 client-user-test1/117.107.209.233:11840 Data Channel: using negotiated cipher 'AES-256-GCM'
Wed May 23 14:07:09 2018 client-user-test1/117.107.209.233:11840 Outgoing Data Channel: Cipher 'AES-256-GCM' initialized with 256 bit key
Wed May 23 14:07:09 2018 client-user-test1/117.107.209.233:11840 Incoming Data Channel: Cipher 'AES-256-GCM' initialized with 256 bit key

        原因: windows客戶端在安裝的時候沒有安裝TAP Virtual Ethernet Adapter。導致客戶端open***對應的網絡連接處於禁用狀態。

    2. 在 Linux Open*** 服務端吊銷(revoke)客戶端證書

1)進入easy-rsa的安裝路徑。
2)執行 source vars
3)假設吊銷的客戶端名稱爲client1 則執行./revoke-full client1
注:這條命令執行完成之後, 會在 keys 目錄下面, 生成一個 crl.pem 文件,這個文件中包含了吊銷證書的名單。成功註銷某個證書之後,可以打開 keys/index.txt 文件,可以看到被註銷的證書前面,已標記爲R
4)確保服務器配置文件存在 crl-verify選項。
在server.conf 中加入 
 crl-verify crl.pem  //crl.pem 根據實際路徑寫
5)重啓open***服務器

    3. 報錯:Authenticate/Decrypt packet error: packet HMAC authentication failed

    嘗試將服務端和客戶端的tls-auth相關配置去掉試試

    4. 報錯:

TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity)  
TLS Error: TLS handshake failed

    查閱資料,說是網絡有可能有問題,路由器沒有開nat,或者其它的網絡問題。 想來可能是防火牆限制了,是否是防火牆的問題,需要試一下。有兩種方式,第一種方式,使用不受限的SSL端口443和TCP協議 。實際遇到的問題是TLS 認證服務器端和客戶端配置不一致導致。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章