线上生产环境,出于安全考虑,有些服务器是不需要公网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 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
然后,将刚才导出的一个用户认证文件放到这个目录下,如下图:
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了。