Centos的Open***安裝配置

什麼是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






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