前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >open***搭建笔记

open***搭建笔记

作者头像
保持热爱奔赴山海
发布2019-09-18 15:08:14
1.3K0
发布2019-09-18 15:08:14
举报
文章被收录于专栏:饮水机管理员饮水机管理员

线上生产环境,出于安全考虑,有些服务器是不需要公网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)

wKiom1gQm-2ypY4kAACAMvJik-Q627.png
wKiom1gQm-2ypY4kAACAMvJik-Q627.png

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="xxxx@xxxx.com"  邮箱

exportKEY_OU="xxxx.com"  单位

wKiom1gQnGmBIwtbAAAXLyIuLx0256.png
wKiom1gQnGmBIwtbAAAXLyIuLx0256.png

保存退出。这样做相当于设置了一个默认配置,下面建立证书时候就直接敲回车,不用再次输入这些参数了。

初始化PKI

source vars

./clean-all   这步操作会清除所有证书(清空当前目录下keys/下的全部文件)

./build-ca    重新生成证书

wKiom1gQnGmzSzHLAAAm6V-hVmw275.png
wKiom1gQnGmzSzHLAAAm6V-hVmw275.png

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

wKioL1gQnIrxyqt0AAAf-2hL_ms209.png
wKioL1gQnIrxyqt0AAAf-2hL_ms209.png

ca.crt 证书

ca.key 私钥

index.txt 

serial

生成服务器端证书和密钥keys文件

./build-key-server server       # 给服务端的相关文件取个名字,以server开头,便于在keys很多的时候一眼就能识别出来。

设置一个"A challenge password"即可。【这里我设置的是123456,注意以后全部的客户端证书的这个密码必须和这里一致,不然验证不通过的】

然后,an optional company name不填即可。

然后弹出下面的内容:

wKioL1gQnMChhOH2AAA26MLvZO8485.png
wKioL1gQnMChhOH2AAA26MLvZO8485.png

确认无误后,输入两次y,即可在keys目录下生成相关的证书文件。

wKiom1gQnNiRxuxnAAAdSwJq7qs869.png
wKiom1gQnNiRxuxnAAAdSwJq7qs869.png

生成1个客户端证书和密钥keys文件【登录时候不带密码的方式】

通常情况下我们为了便于管理。每个×××客户端都必须有一个证书,每个证书在同一时刻仅允许一个客户端在使用。

因此每个客户端都需要独立生成证书。

./build-key client1   # 生产环境下,一般就是用员工姓名来创建的,而不是这里的client1这种名字

同样,设置一个"A challenge password"即可。 【这里我设置的是123456】

连续两个y,即可在keys目录下生成相关的证书文件。

wKioL1gQnQbjWCRhAAAfR6YcDSA819.png
wKioL1gQnQbjWCRhAAAfR6YcDSA819.png

再生成1个客户端证书和密钥keys文件 【登录时候需要输入密码的方式】生产环境下建议使用这种方式生成客户端秘钥

下面再使用另一种方式,生成带密码加密的client keys。

每次连接到×××server需要输入密码,这样安全性更高些。

./build-key-pass lirulei

输入密码,我这里设置为123456789

wKiom1gQnQbwnO66AAAxXzRn7CE694.png
wKiom1gQnQbwnO66AAAxXzRn7CE694.png

同样,设置一个"A challenge password"即可。 【这里我设置的是123456】

wKioL1gQnQbS5x6wAAAePRtQKhU614.png
wKioL1gQnQbS5x6wAAAePRtQKhU614.png

生成DH协议文件generatediffie hellman parameters

生成传输进行密钥交换时使用到的交换密钥协议文件。

执行./build-dh即可。

查看生成的证书

wKiom1gQnVrjh4kPAABnVouhwrs836.png
wKiom1gQnVrjh4kPAABnVouhwrs836.png

下表是上面所生成的证书及所用的场景

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的网关地址

wKiom1gQnaejODegAAAw_H3YxRo990.png
wKiom1gQnaejODegAAAw_H3YxRo990.png

设置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这个根证书文件。如下图:

wKioL1gQnb6wKbUNAAA1FeTPAnA613.png
wKioL1gQnb6wKbUNAAA1FeTPAnA613.png

注意:csr文件可以不要,截图时候忘记了。

可以看下现在***server上的路由条目

wKioL1gQnefwzydjAAA8_K-88uo584.png
wKioL1gQnefwzydjAAA8_K-88uo584.png

2、配置PC端的×××客户端【在WinXP本机上操作】

在PC端安装××× gui 客户端,安装的过程略过。

我笔记里安装的是2.3版本的官网open*** gui客户端。

默认安装到了C:\Program Files\Open×××\下。

切换到C:\Program Files\Open×××\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

然后,将刚才导出的一个用户认证文件放到这个目录下,如下图:

wKiom1gQnjnxc6JkAAA-QIsFVIw552.png
wKiom1gQnjnxc6JkAAA-QIsFVIw552.png

Win10下必须用管理员权限启动open***GUI(不然拨号成功后没有添加路由的权限)。

在右下角的图标上,右击,点击connect即可连接到*** server。截图略。

wKioL1gQnjrBma7VAACoAV0f6cU244.png
wKioL1gQnjrBma7VAACoAV0f6cU244.png

从下图的日志status里面,我们可以看到拨号成功后,添加了路由条目。

wKiom1gQnjrBneCBAACrkk7qQkE143.png
wKiom1gQnjrBneCBAACrkk7qQkE143.png

同时,我们在open*** server的/var/log/open***.log 里,也能看到谁拨号登录进来。如下图:

wKiom1gQnjqxnlmoAABgumgMfm0530.png
wKiom1gQnjqxnlmoAABgumgMfm0530.png

至此,×××实验搭建完成。

然后,我们连接下后端的MySQL试试,如下图:

wKiom1gQnnGyQ3TaAABl2uZImT8600.png
wKiom1gQnnGyQ3TaAABl2uZImT8600.png

连接成功后,在后端的DB服务器上执行ss -tan,发现实际上客户端是从192.168.3.14(Open××× Server)上连过来的。

wKioL1gQnoPgqSPvAAAzL2duZyE987.png
wKioL1gQnoPgqSPvAAAzL2duZyE987.png

也就是说,我们在mysql添加用户授权的时候,只要给DB服务器所在的内网IP段授权即可,不需要给××× 网段的IP授权。

tcpdump抓包分析

在后端的node3上抓包

tcpdump -i eth0 -nn 

wKioL1gQnqPDG8MiAAA-5TuzDQU509.png
wKioL1gQnqPDG8MiAAA-5TuzDQU509.png

上图能看到我们实际上是在WinXP上执行的SQL查询语句,但是在node3上反映出来的却是***server和node3在通信。此外,还能看到ARP广播包的广播。

在***server上抓包

然后在WinXP上ping node3,下图为***server上的抓包截图:

wKiom1gQnrjyyjwKAABPvmotgRo323.png
wKiom1gQnrjyyjwKAABPvmotgRo323.png

可以看到,数据包是从192.168.100.6和192.168.3.13之间来回传输的,这是由于NAT映射的存在。

补充:

下图是我在*** server上添加 nat 规则之前,在winxp上ping 后端的node3的抓包:

wKioL1gQntOBQlOHAAA-Kb_Uopg630.png
wKioL1gQntOBQlOHAAA-Kb_Uopg630.png

可以看到在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

wKiom1gQnvPzE68YAAA_LZ4OFRk750.png
wKiom1gQnvPzE68YAAA_LZ4OFRk750.png

上图虽然报了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了。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-10-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • open***实验演示
    • 1、配置××× Server 【在node4上操作】
      • 2、配置PC端的×××客户端【在WinXP本机上操作】
      • tcpdump抓包分析
      • 多用户共用一个证书的方法
      • 证书的撤销
      • 3、配置linux下的open***客户端
      相关产品与服务
      SSL 证书
      腾讯云 SSL 证书(SSL Certificates)为您提供 SSL 证书的申请、管理、部署等服务,为您提供一站式 HTTPS 解决方案。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档