open***搭建筆記
- 2019 年 10 月 5 日
- 筆記
線上生產環境,出於安全考慮,有些伺服器是不需要公網IP,但是平常運維人員管理起來又不太方便。
這時候我們可以在伺服器集群中挑一個擁有公網IP的伺服器,搭建個Open×××就行了。
####### 坑爹的51cto,把我的文章里的空格都吃了。######
open***實驗演示
環境「:2台CentOS6.7 X86_64
node3:機房的後端web伺服器 eth0 192.168.3.13/24 Vmnet3
node4:Open××× Server
外網(eth0 192.168.2.14/24) Vmnet8(模擬公網的IP)
內網(eth1 192.168.3.14/24) Vmnet3
×××撥號獲取的地址為192.168.100.X/24
運維人員的地址: 192.168.2.10(模擬公網的IP)

1、配置××× Server 【在node4上操作】
安裝依賴包
yum install openssl openssl-devel lzo lzo-devel pam pam-devel automake pkgconfig
安裝open***server
yum install open*** # 實驗時候,aliyun最新的epel源提供的是2.3.12版本
生成Open×××需要的證書
使用easy-rsa腳本產生Open×××所需的CA證書、CA私鑰、服務端證書、服務端私鑰、客戶端證書、客戶端私鑰
yum install -y easy-rsa
cp -R /usr/share/easy-rsa/ /etc/open***/
cd /etc/open***/easy-rsa/2.0
cp vars vars_bak
vim vars 修改如下幾行內容:
exportKEY_COUNTRY="CN" 國家
exportKEY_PROVINCE="BJ" 省份
exportKEY_CITY="Beijing" 城市
export KEY_ORG="xxxx" 組織
exportKEY_EMAIL="[email protected]" 郵箱
exportKEY_OU="xxxx.com" 單位

保存退出。這樣做相當於設置了一個默認配置,下面建立證書時候就直接敲回車,不用再次輸入這些參數了。
初始化PKI
source vars
./clean-all 這步操作會清除所有證書(清空當前目錄下keys/下的全部文件)
./build-ca 重新生成證書

ls keys/ 可以看到有下面4個文件

ca.crt 證書
ca.key 私鑰
index.txt
serial
生成伺服器端證書和密鑰keys文件
./build-key-server server # 給服務端的相關文件取個名字,以server開頭,便於在keys很多的時候一眼就能識別出來。
設置一個"A challenge password"即可。【這裡我設置的是123456,注意以後全部的客戶端證書的這個密碼必須和這裡一致,不然驗證不通過的】
然後,an optional company name不填即可。
然後彈出下面的內容:

確認無誤後,輸入兩次y,即可在keys目錄下生成相關的證書文件。

生成1個客戶端證書和密鑰keys文件【登錄時候不帶密碼的方式】
通常情況下我們為了便於管理。每個×××客戶端都必須有一個證書,每個證書在同一時刻僅允許一個客戶端在使用。
因此每個客戶端都需要獨立生成證書。
./build-key client1 # 生產環境下,一般就是用員工姓名來創建的,而不是這裡的client1這種名字
同樣,設置一個"A challenge password"即可。 【這裡我設置的是123456】
連續兩個y,即可在keys目錄下生成相關的證書文件。

再生成1個客戶端證書和密鑰keys文件 【登錄時候需要輸入密碼的方式】生產環境下建議使用這種方式生成客戶端秘鑰
下面再使用另一種方式,生成帶密碼加密的client keys。
每次連接到×××server需要輸入密碼,這樣安全性更高些。
./build-key-pass lirulei
輸入密碼,我這裡設置為123456789

同樣,設置一個"A challenge password"即可。 【這裡我設置的是123456】

生成DH協議文件generatediffie hellman parameters
生成傳輸進行密鑰交換時使用到的交換密鑰協議文件。
執行./build-dh即可。
查看生成的證書

下表是上面所生成的證書及所用的場景
Filename |
Need by |
Purpose |
Secret |
---|---|---|---|
ca.crt |
伺服器端、客戶端都需要這個文件 |
Root CA certificate |
NO |
ca.key |
key signing macheine only |
Root CA key |
YES |
dh{n}.pem |
server only |
DH parameters |
NO |
server.crt |
server only |
Server certificate |
NO |
server.key |
server only |
Server key |
YES |
client1.crt |
client1 only |
Client1 certificate |
NO |
client1.key |
client1 only |
Client1 key |
YES |
為了防止惡意***(如DDOS、UDPport flooding),我們生成一個「HMAC firewall」
open*** –genkey –secretkeys/ta.key
這樣就會在keys目錄下生成一個2048bits 的 Open××× static key
內容小結:
var 存放用戶的變數資訊
clean-all 清理keys目錄下全部文件
build-ca 腳本生成CA證書(交互)
build-key-server 腳本生成伺服器端秘鑰(交互)
build-key 腳本生成客戶端秘鑰(交互)
build-key-pass 生成帶秘鑰的客戶端秘鑰(交互)
build-dh 腳本生成DH文件(交互)
配置伺服器端×××配置文件
mkdir /etc/open*** -pv
cp/usr/share/doc/open***-2.3.12/sample/sample-config-files/server.conf /etc/open***/
cd /etc/open***/
cp server.conf server.conf_bak
egrep -v '^$|^#|;' server.conf_bak > server.conf # 導出默認啟用的配置
vimserver.conf 我們自己修改的地方如下:
local 192.168.2.14 # 監聽的公網地址,這條可以注釋掉,沒什麼關係
port 1194 # 默認1194埠,建議修改成其他的埠
proto tcp # 建議使用TCP協議,更穩定些,客戶端o***文件中設置要與此一致
dev tun #基於路由的隧道
ca /etc/open***/easy-rsa/2.0/keys/ca.crt # 之前執行./build-ca建立的根證書,建議使用全路徑
cert /etc/open***/easy-rsa/2.0/keys/server.crt # 伺服器私有證書,建議使用全路徑
key /etc/open***/easy-rsa/2.0/keys/server.key # 伺服器私有密鑰,建議使用全路徑
dh /etc/open***/easy-rsa/2.0/keys/dh2048.pem # 之前執行./build-dh生成的文件
server 192.168.100.0 255.255.255.0 #要分配的×××網段(不能和伺服器上或者本機的IP段相同)
ifconfig-pool-persist ipp.txt # 記錄客戶端所獲得IP
push "route 192.168.3.0 255.255.255.0" # 在客戶端上推送並配置上這條路由,這是××× Server所在的內網網段,也是後端伺服器所在的內網網段
client-to-client # 允許客戶端之間相互通訊
duplicate-cn # 允許多個客戶端使用同一個帳號連接
keepalive 10 120 # 每10秒ping一次,若是120s未收到包,即認定客戶端短線;
comp-lzo # 開啟×××連接壓縮.客戶端必須做相同設置讀取
max-clients 100 # 允許客戶端並發連接的數量
persist-key # 當***超時後,重新啟動***後,保持上一次使用的私鑰,而不重新讀取私鑰
persist-tun # 通過keepalive 檢測***超時後,當重新啟動***後,保持tun或者tap設備自動連接狀態
status open***-status.log #定義open***連接狀態日誌
log /var/log/open***.log # 定義日誌路徑
log-append /var/log/open***.log
verb 3 # 指定日誌文件冗餘
crl-verify/etc/open***/easy-rsa/2.0/keys/crl.pem #證書吊銷列表的路徑
配置防火牆
# 放行1194埠
iptables -A INPUT -p tcp –dport 1194 -j ACCEPT
# 配置iptables nat (此處不配置的話客戶端連上×××後只能登陸服務端一台主機需要特別注意)
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -oeth1 -j MASQUERADE # 凡是來自×××IP網段的數據包出去的時候,都做地址轉換
# 說明:eth1 為*** server的內網網卡,192.168.100.0/24為×××伺服器的分配的地址段
service iptables save
chkconfig iptables on
開啟×××Server內核轉發
echo '1' > /proc/sys/net/ipv4/ip_forward
sed -i "s#net.ipv4.ip_forward = 0#net.ipv4.ip_forward= 1#g" >> /etc/sysctl.conf
grep net.ipv4.ip_forward/etc/sysctl.conf 確認下是否修改成功
sysctl -p
啟動×××服務
/usr/sbin/open*** –config/etc/open***/server.conf & 【先嘗試下能否啟動,沒問題的話,建議改成supervisor的方式監控它的運行】
ss -lntp|grep 1194
在open*** server(即node4)上執行ifconfig可以看到***server的網關地址

設置supervisor其監控運行
安裝supervisor的過程略過。
在/etc/supervisord.conf裡面添加如下內容:
[program:open***]
command=/usr/local/sbin/open*** –config /etc/open***/server.conf
autorstart=true
autorestart=true
user=root
stdout_logfile=/tmp/supervisor_open***.log
下載客戶端的證書文件
cd/etc/open***/easy-rsa/2.0/keys 將剛才生成的客戶端秘鑰下載到本地,此外還要下載ca.crt這個根證書文件。如下圖:

注意:csr文件可以不要,截圖時候忘記了。
可以看下現在***server上的路由條目

2、配置PC端的×××客戶端【在WinXP本機上操作】
在PC端安裝××× gui 客戶端,安裝的過程略過。
我筆記里安裝的是2.3版本的官網open*** gui客戶端。
默認安裝到了C:Program FilesOpen×××下。
切換到C:Program FilesOpen×××config
編寫一個客戶端的配置文件,名為client.o***(基本上和×××伺服器上的server.conf差不多)
client
dev tun
proto tcp # 協議要與伺服器埠配置文件定義一致
remote 192.168.2.14 1194 # 填的是open***伺服器的外網地址和埠
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert lirulei.crt
key lirulei.key
comp-lzo
verb 3
redirect-gateway def1
route-method exe
route-delay 2
然後,將剛才導出的一個用戶認證文件放到這個目錄下,如下圖:

Win10下必須用管理員許可權啟動open***GUI(不然撥號成功後沒有添加路由的許可權)。
在右下角的圖標上,右擊,點擊connect即可連接到*** server。截圖略。

從下圖的日誌status裡面,我們可以看到撥號成功後,添加了路由條目。

同時,我們在open*** server的/var/log/open***.log 里,也能看到誰撥號登錄進來。如下圖:

至此,×××實驗搭建完成。
然後,我們連接下後端的MySQL試試,如下圖:

連接成功後,在後端的DB伺服器上執行ss -tan,發現實際上客戶端是從192.168.3.14(Open××× Server)上連過來的。

也就是說,我們在mysql添加用戶授權的時候,只要給DB伺服器所在的內網IP段授權即可,不需要給××× 網段的IP授權。
tcpdump抓包分析
在後端的node3上抓包
tcpdump -i eth0 -nn

上圖能看到我們實際上是在WinXP上執行的SQL查詢語句,但是在node3上反映出來的卻是***server和node3在通訊。此外,還能看到ARP廣播包的廣播。
在***server上抓包
然後在WinXP上ping node3,下圖為***server上的抓包截圖:

可以看到,數據包是從192.168.100.6和192.168.3.13之間來回傳輸的,這是由於NAT映射的存在。
補充:
下圖是我在*** server上添加 nat 規則之前,在winxp上ping 後端的node3的抓包:

可以看到在node3上能收到 192.168.100.6(WinXP撥號後的IP)的ping包,但是node3上沒有到192.168.100.X的路由條目,導致無法回包給WinXP。
多用戶共用一個證書的方法
不建議這麼做,不便於用戶的管理。
如果確實有這個需求的話,只要編輯/etc/open***/server.conf 在裡面添加如下 duplicate-cn 然後重啟open***即可。
證書的撤銷
人員離職後,需要吊銷他的證書,禁止他再連入××× Server伺服器。
吊銷方法:
cd /etc/open***/easy-rsa/2.0
./revoke-full lirulei

上圖雖然報了error 23 ,但是我們到keys目錄下,可以看到crl.pem 這個吊銷的客戶端列表。
這樣的話,lirulei 用戶就無法再連接到××× Server了。
如果用戶再用被吊銷的證書連接open***伺服器的話,/var/log/open***.log記錄里記錄TLS握手失敗,無法登錄的條目。
3、配置linux下的open***客戶端
有時候linux伺服器也需要連接到其他的伺服器(如阿里雲的伺服器需要連接在美團雲的MySQL)
以node1(192.168.2.11) client3賬戶的key文件演示。
安裝依賴包
yum install openssl openssl-devel lzo lzo-devel pam pam-devel automake pkgconfig
安裝open***server
yum install -y open*** # 實驗時候,aliyun最新的epel源提供的是2.3.12版本
編輯client.conf客戶端連接文件
cd /etc/open***/
client
dev tun
proto tcp
remote 192.168.2.14 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client3.crt
key client3.key
comp-lzo
verb 3
redirect-gateway def1
route-method exe
route-delay 2
拷貝秘鑰文件
cd /etc/open***/
然後拷貝ca.crt client2.key client2.crt 到/etc/open***/這個目錄下。
啟動client端
/usr/sbin/open***/etc/open***/client.conf & 即可讓***客戶端在後台運行。
如果有需要的話,可以做成supervisor控制的方式。
測試連接
在node1上,ping 192.168.3.13 可以看到回包說明配置OK了。