使用open***構建安全***
***概述
***(Virtual PrivateNetwork)虛擬專用網絡,是依靠ISP和其他的NSP在公共網絡中建立專用的數據通信網絡的技術,可以爲企業之間或者個人之間提供安全的數據傳輸隧道服務。在***中任意兩點之間的連接並沒有傳統專網所需要的端到端的物理鏈路,而是利用公共網絡資源動態組成的,可以理解爲通過私有的隧道技術在公共數據網絡上模擬出來的和專網有同樣功能的點到點的專線技術,所謂虛擬是指***不需要去拉實際的物理線路,而是借用了公共Internet網絡來實現。
***的作用
***功能可以幫助公司遠程用戶公司的分支機構、商業合作伙伴及供應商等公司和自己的公司內部網絡之間建立可信的安全連接或者是局域網連接,確保數據的加密安全傳輸和業務訪問,對於運維工程師來說,可以連接不同的機房作爲局域網,處理相關的業務。
open ***的加密通信原理過程
open ***使用TLS加密是通過使用公開密鑰(非對稱密鑰,加密解密使用不同的key,一個稱爲public key,另一個是private key)對數據進行加密的。對於open ***使用TLS mode,首先server和client要有相同的CA證書,雙方通過交換證書驗證對方的合法性以決定是否建立***通信,然後使用對方CA把自己目前使用的數據加密方法(類似密鑰)加密後發送給對方,由於使用對方的CA加密,所以只有對方CA的對應的private key才能解密該字串,保證此密鑰的安全性,並且此密鑰定期改變,對於***來說,可能還沒有破解出密鑰,通信雙方已經更換密鑰了。
open***的基本信息處理過程
理解了open***的基本概念,我們來做一個小實驗來實現open***的功能:
實驗
環境
***-server | eth0 IP:172.16.1.163 GW:172.16.1.2 | eth1 IP:10.0.0.246 |
***-client | eth0 IP:10.0.0.247 GW:10.0.0.246(可選) |
拓撲
***服務端的配置
同步時間
[root@***-server ~]# ntpdate pool.ntp.org
[root@***-server ~]# echo '*/5 * * * * /usr/sbin/ntpdate pool.ntp.org > /dev/null 2>&1' >>/var/spool/cron/root
[root@***-server ~]# crontab -l -uroot
*/5 * * * * /usr/bin/ntpdatepool.ntp.org > /dev/null 2>&1
安裝epel源,open***要在epel中下載安裝
[root@***-server ~]#yum -y install epel-release
安裝依賴包
[root@***-server~]#yum install -y openssl openssl-devel lzo lzo-devel pam pam-devel automake pkgconfig
安裝open***
[root@***-server~]# yum -y install open***
生成Open***需要的證書
[root@***-server~]# yum -y install easy-rsa #新版的***需要先下載easy-rsa
[root@***-server~]# cp -a /usr/share/easy-rsa/2.0/* /etc/open***/
[root@***-server~]# cd /etc/open***/
[root@***-serveropen***]# vi vars #修改vars配置如下使得生成證書時不用再次輸入只需一路回車即可
exportKEY_COUNTRY="CN"
exportKEY_PROVINCE="BJ"
exportKEY_CITY="Beijing"
exportKEY_ORG="***-test"
exportKEY_EMAIL="[email protected]"
exportKEY_OU="testdomain"
[root@***-serveropen***]# chmod +x vars #添加可執行權限
[root@***-serveropen***]# source vars #執行腳本
NOTE:If you run ./clean-all, I will be doing a rm -rf on /etc/open***/keys
[root@***-serveropen***]# source clean-all #初始化keys目錄並創建所需要的文件和目錄
[root@***-serveropen***]# source build-ca #生成CA證書,用於簽發server和client證書,完成後生成ca.crt ca.key index.txt serial文件
[root@***-serveropen***]# source build-key-server server #生成服務器端密鑰
[root@***-serveropen***]# source build-key client #生成客戶器端密鑰
[root@***-serveropen***]# source build-dh #生成Diffie Hellman文件,TLS server 需要使用的一個文件完成後生成dh1024.pem或dh2048.pem文件,大小在配置文件中定義。
編輯open***服務端配置文件
[root@***-server~]# cp /usr/share/doc/open***-2.3.13/sample/sample-config-files/server.conf/etc/open***/ #把配置文件模板拷貝到/etc/open***/
[root@***-serveropen***]# grep -Ev ";|#|^$" server.conf > 1 #去掉空行和註釋
[root@***-serveropen***]# cat 1 > server.conf #輸出重定向到server.conf文件
[root@***-serveropen***]# vi server.conf #編輯如下
port 1194 #監聽端口
proto tcp #使用的協議
dev tun #基於路由的隧道
push "route 10.0.0.0 255.255.255.0" #open***服務器所在局域網的網段
ca /etc/open***/keys/ca.crt #ca證書的路徑
cert /etc/open***/keys/server.crt #服務器端證書的路徑
key /etc/open***/keys/server.key #服務器端密鑰的路徑
dh /etc/open***/keys/dh2048.pem #DiffieHellman文件的路徑
server 10.8.0.0 255.255.255.0 #配置***客戶端使用的網段,Open***會自動提供基於該網段的DHCP服務但不能和任何一方的局域網段重複,必須保證唯一
ifconfig-pool-persist ipp.txt #維持一個客戶端和virtual IP的對應表以方便客戶端重新連接時可以獲得同樣的IP
keepalive 10 120 #設置服務端檢測的間隔和超時時間 每 10 秒 ping 一次如果 120 秒沒有迴應則認爲對方已經宕機
cipher AES-256-CBC #設置OPEN***密碼使用AES-256
persist-key #通過keepalive檢測超時後,重新啓動***,不重新讀取keys,保留第一次使用的keys
persist-tun #通過keepalive檢測超時後,重新啓動***,一直保持tun或者tap設備是linkup的,否則網絡連接會先linkdown然後linkup
status open***-status.log #輸出短日誌,每分鐘刷新一次,以顯示當前的客戶端
verb 3 #設置日誌記錄冗長級別
啓動OPEN***服務端
[root@***-server~]# systemctl start open***@server.service
[root@***-server~]# systemctl enable open***@server.service
查看是否獲得了一個VIP
[root@***-serveropen***]# ip add show
6:tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_faststate UNKNOWN qlen 100
link/none
inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0
valid_lft forever preferred_lft forever
配置防火牆和開啓內核轉發功能
[root@***-server~]# vi /etc/sysctl.conf
net.ipv4.ip_forward= 1
[root@***-server~]# sysctl -p
net.ipv4.ip_forward= 1
[root@***-server~]# firewall-cmd --permanent --add-port=1194/tcp
success
[root@***-server~]# firewall-cmd --permanent --add-masquerade
success
[root@***-server~]# firewall-cmd --reload
success
Window7_64客戶端配置
步驟:
先在win7上安裝open***客戶端
把open***服務器的ca.crt,client.crt,client.key,還有模板文件client.conf拷貝到open***的安裝目錄下的config目錄
修改client.conf如下,然後更改後綴名爲client.o***
client #定義這是一個client,配置從server端pull拉取過來,如IP地址,路由信息之類,Server使用push指令推送過來。
dev tun #定義open***運行的模式,這個地方需要嚴格和Server端保持一致
proto tcp #使用的協議
remote 172.16.1.163 1194 #服務端的IP和端口
resolv-retry infinite #始終重新解析Server的IP地址(如果remote後面跟的是域名),保證Server IP地址是動態的使用DDNS動態更新DNS後,Client在自動重新連接時重新解析Server的IP地址。這樣無需人爲重新啓動,即可重新接入***
nobind #定義在本機不邦定任何端口監聽incoming數據
persist-key
persist-tun
ca ca.crt #定義CA證書文件
cert client.crt #定義客戶端證書文件
key client.key #定義客戶端密鑰文件
remote-cert-tls server #指定採用服務器校驗方式
cipher AES-256-CBC
verb 3 #設置日誌記錄冗長級別
驗證
啓動客戶端,嘗試連接,成功之後會獲得一個IP以及open***服務器推送過來的路由、IP
路由
ping測試open***服務器所在內網的主機是否可以連通
查看服務器端的日誌
[root@***-server open***]# cat open***-status.log
Open*** CLIENT LIST
Updated,Thu Jun 22 23:24:26 2017
Common Name,Real Address,Bytes Received,Bytes Sent,Connected Since
client,172.16.1.1:57718,15899,7283,Thu Jun 22 23:23:31 2017
ROUTING TABLE
Virtual Address,Common Name,Real Address,Last Ref
10.8.0.6,client,172.16.1.1:57718,Thu Jun 22 23:23:33 2017
GLOBAL STATS
Max bcast/mcast queue length,0
END
linux客戶端配置
下載open***
[root@open***-client~]# yum -y install epel-release
[root@open***-client~]#yum install -y openssl openssl-devel lzo lzo-devel pam pam-devel automake pkgconfig
[root@open***-client~]#yum -y install open***
拉取在服務端的客戶端證書、密鑰、CA證書,還有配置文件
[root@open***-client~]#cd /etc/open***/
scp 172.16.1.163:/etc/open***/keys/{client.key,client.crt,ca.crt} .
scp /usr/share/doc/open***-2.3.13/sample/sample-config-files/client.conf .
[root@open***-client open***]# ll
total 20
-rw-r--r--.1 root root 1724 Dec 7 07:40 ca.crt
-rw-r--r--.1 root root 205 Dec 7 08:14 client.conf
-rw-r--r--.1 root root 5355 Dec 7 07:40 client.crt
-rw-r--r--.1 root root 1704 Dec 7 07:40 client.key
修改配置文件如下
[root@open***-client open***]# cat client.conf
client
dev tun
proto tcp
remote 172.16.1.163 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
remote-cert-tls server
cipher AES-256-CBC
以後臺方式啓動open***客戶端
[root@open***-clientopen***]# /usr/sbin/open*** --config /etc/open***/client.conf &
查看進程
[root@open***-clientopen***]# ps -ef|grep open***
avahi 920 1 0 09:07 ? 00:00:00 avahi-daemon: running[open***-client.local]
root 7759 3278 0 09:41 pts/0 00:00:00 /usr/sbin/open*** --config/etc/open***/client.conf
root 7836 3278 0 09:43 pts/0 00:00:00 grep --color=auto open***
驗證是否獲得一個open***所在網段的IP
[root@open***-clientopen***]# ip add show
6:tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_faststate UNKNOWN qlen 100
link/none
inet 10.8.0.6 peer 10.8.0.5/32 scope globaltun0
valid_lft forever preferred_lft forever
獲得的路由
[root@open***-clientopen***]# route -n
10.0.0.0 10.8.0.5 255.255.255.0 UG 0 0 0 tun0
測試連通性
[root@open***-clientopen***]# ping 10.0.0.247
PING10.0.0.247 (10.0.0.247) 56(84) bytes of data.
64bytes from 10.0.0.247: icmp_seq=1 ttl=63 time=3.19 ms
64bytes from 10.0.0.247: icmp_seq=2 ttl=63 time=1.73 ms
64bytes from 10.0.0.247: icmp_seq=3 ttl=63 time=1.63 ms
查看日誌
[root@***-server~]# cat /etc/open***/open***-status.log
Open***CLIENT LIST
Updated,Thu Jun 22 23:39:29 2017
CommonName,Real Address,Bytes Received,Bytes Sent,Connected Since
client,172.16.1.168:36040,5742,6154,Thu Jun 22 23:43:31 2017
ROUTINGTABLE
VirtualAddress,Common Name,Real Address,Last Ref
10.8.0.6,client,172.16.1.168:36040,Thu Jun 22 23:43:31 2017
GLOBALSTATS
Maxbcast/mcast queue length,0
END
增加證書
[root@***-serveropen***]# . vars 執行腳本
[root@***-serveropen***]# . build-key xiaoli 創建證書
[root@***-serveropen***]# ls keys/|grep xiaoli
xiaoli.crt
xiaoli.csr
xiaoli.key
然後把xiaoli.key,xiaoli.crt,還有模板配置文件client.conf拷貝到open***的安裝目錄下的config目錄,把client.conf改名爲爲xiaoli.o***,如下
吊銷證書
[root@***-serveropen***]# . vars 執行腳本
[root@***-serveropen***]# . revoke-full client 吊銷證書
Usingconfiguration from /etc/open***/openssl-1.0.0.cnf
RevokingCertificate 02.
DataBase Updated
Usingconfiguration from /etc/open***/openssl-1.0.0.cnf
client.crt:C = CN, ST = BJ, L = Beijing, O = ***-test, OU = testdomain, CN = client, name= EasyRSA, emailAddress = [email protected]
error23 at 0 depth lookup:certificate revoked
成功註銷某個證書之後,可以打開keys/index.txt文件,可以看到被註銷的證書前面,已標記爲R
[root@***-serverkeys]# cat index.txt
V 261205114539Z 01 unknown /C=CN/ST=BJ/L=Beijing/O=***-test/OU=testdomain/CN=server/name=EasyRSA/[email protected]
R 261205114553Z 161207153029Z 02 unknown /C=CN/ST=BJ/L=Beijing/O=***-test/OU=testdomain/CN=client/name=EasyRSA/[email protected]
V 261205150854Z 03 unknown /C=CN/ST=BJ/L=Beijing/O=***-test/OU=testdomain/CN=xiaoli/name=EasyRSA/[email protected]
在配置文件中告訴Open***服務器以後與客戶端連接的時候,通過crl.pem文件驗證該客戶端的證書是否已經被註銷。因此,我們需要在服務器端的配置文件加上相關配置然後重啓***服務
[root@***-serveropen***]# echo "crl-verify /etc/open***/keys/crl.pem" >>server.conf
[root@***-serverkeys]# systemctl restart open***@server.service
如有紕漏,歡迎指正。