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了。