Centos的Open***安装配置

什么是open***?mysql

Open×××是一个基于OpenSSL库的应用层×××实现

open***可工做于两种模式:c++

tun 一种是IP遂道路由模式,主要应用于点对点
eth 一种是基于以太网的遂道桥模式, 应用于点对多点,有多个分支机构

open***提供两种安全模式:sql

Static Key
X509 PKI (Public Key Infrastructure)

1.基础环境安装:数据库

OS: CentOS_6.4   2.6.32-358.el6.x86_64
yum install -y openssl openssl-devel lzo gcc gcc-c++

 安装LZO 用于压缩通信数据加快传输速度安全

wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.09.tar.gz
tar zxvf lzo-2.09.tar.gz 
cd lzo-2.09.tar.gz
./configure 
make && make install

TUN/TAPbash

 Open***要使用到TUN/TAP做为接口创建隧道,但须要内核支持。TUN 接口建立的是三层路由隧道,创建方便;服务器

   TAP 是二层网卡桥接隧道,即建立一个以太网桥接,相对复杂。
   TUN 接口下全部的客户端处于一个彻底独立的子网内,与 ××× 服务器所在的子网没有关系;
   TAP 接口的好处相较之下则至关明显,客户端能够得到 ××× 服务器所处子网的 IP(即,忽略物理上的区别,能够彻底将客户端看作是于 ××× 服务器处于同一子网的另外一台机器)

  检查内核是否支持TUN/TAP设备驱动网络

 modinfo tun  若是有正常的输出,则支持

  肯定内核支持TUN/TAP模块以后,加载模块app

 modinfo tun    # 加载
 lsmod tun     # 检查
 ls /dev/net/tun  # 检查文件是否存在判断tun模块是否加载

2.安装open×××tcp

  a) RPM安装epel源

rpm -ivh http://mirrors.sohu.com/fedora-epel/6/x86_64/epel-release-6-8.noarch.rpm
sed -i 's/^mirrorlist=https/mirrorlist=http/' /etc/yum.repos.d/epel.repo

  b) 源码安装Open×××

  下载 http://open***.net/

tar zxvf open***-2.1.3.tar.gz
cd open***-2.1.3
./configure
make && make install

3.配置Open×××

a)初始化PKI
 设置环境变量
  # mkdir -pv /etc/open***
  # cp -r ../../open***-2.1.3/easy-rsa /etc/open***
  ×××变量 
  # cd /etc/open***/easy-rsa/2.0
  # cat var  # 自定义修改以下内容
    export KEY_COUNTRY="CN"        # 国家
    export KEY_PROVINCE="SH"       # 省
    export KEY_CITY="SH"           # 市
    export KEY_ORG="ZZT"           # 公司
    export KEY_OU="IT"             # 部门
    export KEY_EMAIL="me@zzt.com"  # 邮箱
 初始化环境变量
  # source vars
  # ./clean-all
  # ./build-ca   # 生成根证书ca.crt和根密钥ca.key(一路按回车便可),由于vars文件已经在上面自定义默认的变量值
  # ./build-key-server server # 为服务端生成证书和密钥(一路按回车,直到提示须要输入y/n时,输入y再按回车,一共两次)
  每个登录的×××客户端须要有一个证书,每一个证书在同一时刻只能供一个客户端链接,下面创建
  # ./build-key client  # 为客户端生成证书和密钥(一路按回车,直到提示须要输入y/n时,输入y再按回车,一共两次)
  # ./build-dh   # 建立迪菲·赫尔曼密钥,会生成dh2048.pem文件(生成过程比较慢,在此期间不要去中断它)
  # open*** --genkey --secret keys/ta.key  # 生成ta.key文件(防DDos***、UDP淹没等恶意***)

4.建立服务器端配置文件

  将须要用到的open***证书和密钥复制一份到刚建立好的keys目录中

mkdir -pv /etc/open***/keys
cp /etc/open***/easy-rsa/2.0/keys/{ca.crt,server.{crt,key},dh1024.pem,ta.key} /etc/open***/keys/

  复制一份服务器端配置文件模板server.conf到/etc/open***/

cp ./../open***-2.1.3/sample-config-files/server.conf  /etc/open***/  
cat /etc/open***/server.conf
  ;local a.b.c.d     # 申明本机使用的IP地址,也能够不说明
  port 1194   # 端口
  proto tcp   # 协议,默认使用udp,若是使用HTTP Proxy,必须使用tcp协议            
  dev tun     # 申明使用的设备可选tap和tun,tap是二层设备,支持链路层协议;tun是ip层的点对点协议,限制稍微多一些
  ca keys/ca.crt       # 全路径为/etc/open***/keys/ca.crt,用于验证客户是证书是否合法
  cert keys/server.crt # 全路径为/etc/open***/keys/server.crt,Server使用的证书文件
  key keys/server.key  # 全路径为/etc/open***/keys/server.key,Server使用的证书对应的key,注意文件的权限,防止被盗
  dh keys/dh1024.pem   # 全路径为/etc/open***/keys/dh1024.pem
  server 10.8.0.0 255.255.255.0  # 地址池,配置×××使用的网段,Open×××会自动提供基于该网段的DHCP服务,保证惟一,不要和实际的局域网冲突便可
  ifconfig-pool-persist ipp.txt  # 用于记录某个Client得到的IP地址,相似于dhcpd.lease文件,防止open***从新启动后“忘记”Client曾经使用过的IP地址
  ;client-config-dir /etc/open***/ccd # 定义每一个客户端的个性化配置文件
  # 推送路由信息到客户端,以容许客户端可以链接到服务器背后的其余私有子网
  # (简而言之,就是设置容许客户端访问×××服务器自身所在的其余局域网)
  push "route 10.2.8.0 255.255.255.0"     # 能够设置多个服务端所在的其余局域网地址范围
  push "route 192.168.0.0 255.255.255.0"
  ;push "dhcp-option DNS 10.8.0.1"     # 用Open×××的DHCP功能为客户端提供指定的DNS、WINS等
  ;route 10.9.0.0 255.255.255.252  # ×××启动后,在××× Server上增长的路由,×××中止后自动删除
  client-to-client  # 可让客户端之间相互访问直接经过open***程序转发,不用发送到tun或者tap设备后从新转发,优化Client to Client的访问效率
  duplicate-cn      # 若是客户端都使用相同的证书和密钥链接×××,必定要打开这个选项,不然每一个证书只容许一我的链接×××
  keepalive 10 120  # 每10秒经过×××的Control通道ping对方,若是连续120秒没法ping通,认为链接丢失,并从新启动×××,从新链接
  tls-auth keys/ta.key 0 # 全路径为/etc/open***/keys/ta.key,注意server端后面的数字确定使用0,client使用1 
  comp-lzo    # 对数据进行压缩,注意Server和Client一致
  user nobody #定义运行open***的用户
  group nobody
  persist-key  # 经过keepalive检测超时后,从新启动×××,不从新读取keys,保留第一次使用的keys
  persist-tun  # 经过keepalive检测超时后,从新启动×××,一直保持tun或者tap设备是linkup的,不然网络链接会先linkdown而后linkup
  status /var/log/open***-status.log   # 按期把open***的一些状态信息写到文件中,以便本身写程序计费或者进行其余操做
  log /var/log/***/open***.log         # 记录日志,每次从新启动open***后删除原有的log信息
  log-append /var/log/***/open***.log  # 和log一致,每次从新启动open***后保留原有的log信息,新信息追加到文件最后 
  verb 3    # 至关于debug level,改为verb 5能够多查看一些调试信息
  ;mute 20  # 重复信息的沉默度。相同类别的信息只有前20条会输出到日志文件中

5.配置内核和防火墙,启动服务

开启路由转发功能
  # echo 1 > /proc/sys/net/ipv4/ip_forward
  或者
  # sed -i '/net.ipv4.ip_forward/s/0/1/' /etc/sysctl.conf
  # sysctl -p
配置防火墙,别忘记保存
    # iptables -A INPUT -s 10.8.0.0/24 -j ACCEPT   # 开启虚拟网段
  # iptables -A INPUT -s 10.8.0.0/24 -m state --state NEW -m tcp -p tcp -j ACCEPT # 
  # iptables -A INPUT -m state --state NEW -m udp -p udp --dport 1194 -j ACCEPT # 
  # iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
  # iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -d 10.2.8.0/24 -o eho0 -j SNAT --to-source 10.2.8.10 # 将虚拟网段10.8.0.0/24访问内网10.2.8.0/24都经过内网网卡eth0而且将源地址转换成10.2.8.10转发
  # service iptables save
  # service iptables restart # 重启

# 启动open***并设置为开机启动

 建立open***启动脚本

cp ../../open***-2.1.3/sample-scripts/open***.init /etc/init.d/open***
/etc/init.d/open*** start
service open*** start
或者
/usr/local/sbin/open*** --daemon --config /etc/open***/server.conf # 守护进程模式启动
echo "/usr/local/sbin/open*** --daemon --config /etc/open***/server.conf"  >> /etc/rc.local  # 开机启动

为客户端分配静态IP:(可选)

在/etc/open***/server.conf中增长
 client-config-dir /etc/open***/ccd
而后在 /etc/open***/ccd目录中放针对每一个客户端的个性化配置文件。
文件名就用客户端名 生成key的时候输入的 "Common Name" 名字
好比要设置客户端 client 为 10.8.0.8 
只要在 /etc/open***/ccd/client 文件中包含一行:
 ifconfig-push 10.8.0.8 255.255.255.0


Windows客户端安装

  下载安装Open×××客户端工具

 建立客户端配置文件,默认../Open×××/sample-config/client.o***

  复制一份 client.o*** 到 ../Open×××/config/client.o***

  编辑client.o***

cat client.o***
client
dev tun
proto tcp
remote 203.195.xxx.xxx 1194  # Open×××服务器的外网IP和端口
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client1.crt  # client1的证书
key client1.key   # client1的密钥
ns-cert-type server 
tls-auth ta.key 1  # 客户端是1,服务器是0
comp-lzo
verb 3

拷贝client.o***文件到地open***客户端 ../Open×××/config/目录下 

从服务器上拷贝证书/秘钥 “ca.crt、client.crt、client.key、ta.key” 到本地open***客户端的config/目录下

而后打开Open×××客户端(切记,要用用管理员身份打开Open×××客户端,不然客户端将没法执行服务端push推送过来的route路由添加指令)点击链接。

ok,若是一切顺利,就会看到 "Mon Apr 11 16:26:12 2016 MANAGEMENT: >STATE:1460363172,CONNECTED,SUCCESS,10.8.0.6,10.2.8.45",客户端分配到的ip,10.8.0.6

打开CMD,ipconfig /all 能够看到分配的虚拟ip


Linux 客户端安装

1) 下载客户端工具
# yum install -y open*** 
2) 建立客户端配置文件 client.conf
# cat /etc/open***/conf/client.conf  添加以下内容
      client
      dev tun
      proto tcp
      remote 203.195.xxx.xxx 1194  # Open×××服务器的外网IP和端口
      resolv-retry infinite
      nobind
      persist-key
      persist-tun
      ca ca.crt
      ns-cert-type server 
      tls-auth ta.key 1  # 客户端是1,服务器是0
      comp-lzo
      verb 3
        auth-user-pass     # 启动User/Pass登陆的方式
3) 启动客户端
# open*** --daemon --config /etc/open***/conf/client.conf > /var/log/open***_client.log # 后台守护进程模式启动
   Username: test     # 输入用户名
   Password: 123456   # 输入密码
# ps -ef | grep -v grep | grep open***  # 查看启动进程
4) 客户端启动OK

Linux客户端启动脚本

#!/usr/bin/expect 
# FileName: expect.sh
# Auth: Loren
# Date: 2016-04-26 10:00
# 定义帐号密码
set user test
set pass 123456
# 启动命令
spawn /usr/local/sbin/open*** --daemon --config /etc/open***/config/client.conf > /var/log/open***_client.log
set timeout 30
# 检测到指定内容
expect "Username:"
# 输入帐号
send "$user\n"
set timeout 30
# 检测输入密码
expect "Password:"
# 输入密码
send "$pass\n"
set timeout 30
# 退出
expect eof

# expect expect.sh # 执行脚本



客户端证书管理

cd /etc/open***/easy-rsa/2.0/
./revoke-full client1  # 注销指定客户端证书名称

  此时 /etc/open***/easy-rsa/2.0/keys/ 目录下面会生成文件“crl.pem revoke-test.pem”,

  其中 crl.pem 文件,是吊销证书的名单,

  index.txt文件中列出全部注册过的用户证书列表,其中标志为R的表示已注销用户

cat /etc/open***/easy-rsa/2.0/keys/index.txt
V	260406062220Z		01	unknown	/C=CN/ST=SH/L=SH/O=DDD/OU=IT/CN=server/emailAddress=me@DDD.com
R	260406062410Z	160412075407Z	02	unknown	/C=CN/ST=SH/L=SH/O=DDD/OU=IT/CN=client/emailAddress=me@DDD.com
R	260410080030Z	160412084055Z	03	unknown	/C=CN/ST=SH/L=SH/O=DDD/OU=IT/CN=client2/emailAddress=me@DDD.com
R	260410084606Z	160412091701Z	04	unknown	/C=CN/ST=SH/L=SH/O=DDD/OU=IT/CN=client3/emailAddress=me@DDD.com
V	260410085953Z		05	unknown	/C=CN/ST=SH/L=SH/O=DDD/OU=IT/CN=client4/emailAddress=me@DDD.com

  拷贝注销文件 crl.pem 到指定目录,若直接指定默认的文件路径,可能会出现报错 “cannot read: crl.pem: Permission denied (errno=13)”

cp ./keys/crl.pem /etc/open***/keys/crl.pem   # 指定原始默认绝对路径

  而后在服务端配置文件 /etc/open***/server.conf 中添加以下

    crl-verify /etc/open***/easy-rsa/2.0/keys/crl.pem

  最后重启Open×××便可

service open*** reload

  注意: 每次注销禁用一个用户的证书,就须要重复上面的步骤


配置使用帐户/密码验证登陆服务器

1) 使用MySQL数据库存储***帐号密码

yum install -y mysql-devel pam-devel pam_mysql gcc gcc-c++  # 基础环境安装

  新建数据库 ***,设置active字段值为1时,无权使用***

mysql> create database ***;
mysql> user ***;
mysql> create table ***_users (id INT NOT NULL AUTO_INCREMENT primary key, name char(20) not null, password char(128) default null, mail char(50) default null, active int(10) nmun ('1','0') not null default 1);
mysql> insert into ***_users(name,password,mail) values('test','test','');       明文密码
mysql> insert into ***_users(name,password,mail) values('test',ENCRYPT('test'),'');   使用 ENCRYPT 加密密码(建议使用这种)
建立***用户,对***这个库有因此的操做权限
mysql> grant all privileges on ***.* to ***@'%' identified by '***_001';
mysql> flush privileges

2) 配置 pam_mysql 模块

  建立 /etc/pam.d/open***文件,内容以下

auth sufficient /lib64/security/pam_mysql.so user=*** passwd=***_001 host=10.10.8.94 db=*** table=***_users usercolumn=name passwdcolumn=password where=active=1 sqllog=0 crypt=0
account required /lib64/security/pam_mysql.so user=*** passwd=***_001 host=10.10.8.94 db=*** table=***_users usercolumn=name passwdcolumn=password where=active=1 sqllog=0 crypt=0
# active值0表示禁用,1正常
# crypt值 0 明文密码;1 使用crypt(3)函数,至关于MySQL中的ENCRYPT()函数;2 使用MySQL的PASSWORD()函数。PAM可能与MySQL的函数不一样;3 使用MD5;4 使用SHA1
# 若是使用1,则在数据库中添加用户password值的时候须要添加函数 ENCRYPT(),如 insert into ***_users(name,password) values('test',ENCRYPT('123456'));

  生成 open***-auth-pam.so 动态库,注意,若是是使用当前2.1.3版本的Open×××生成此动态库,可能会出现错误,建议从新下载2.0.9版本的生成open***-auth-pam.so 动态库

    首先进入到Open×××源码plugin解压路径下

tar -zxvf open***-2.0.9.tar.gz -C /data/open***-2.0.9
cd /data/open***-2.1.3/plugin/auth-pam
make    # 生成open***-auth-pam.so
cp open***-auth-pam.so /etc/open***/

  检验pam_mysql配置

启动 saslauthd 服务
/etc/init.d/saslauthd start 或者 saslauthd -a pam
testsaslauthd -u test -p test -s open***  # 测试数据库里设置的帐号密码
  0: OK "Success."    #  能够看到验证成功的信息,反之则失败,说明配置有问题,请根据 /var/log/salt/master 日志查找缘由

3) 修改主配置文件 server.conf,添加以下代码

port 1194
proto tcp
dev tun
ca /etc/open***/keys/ca.crt
cert /etc/open***/keys/server.crt
key /etc/open***/keys/server.key
dh /etc/open***/keys/dh1024.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist /etc/open***/ipp.txt
push "route 10.2.8.0 255.255.255.0"
push "route 192.168.2.0 255.255.255.0"
push "dhcp-opton DNS 10.8.0.1"
#client-config-dir /etc/open***/ccd
#route 10.8.0.0 255.255.255.0
client-to-client
duplicate-cn
keepalive 10 120
tls-auth /etc/open***/keys/ta.key 0 # This file is secret
comp-lzo
user nobody
group nobody
persist-key
persist-tun
crl-verify /etc/open***/keys/crl.pem
status /var/log/open***-status.log
log         /var/log/open***.log
log-append  /var/log/open***.log
verb 3
mute 20
# 如下是新添加的内容
# User/Key
client-cert-not-required    # 只使用帐号密码使用,若注释掉则表明须要证书和用户名密码双重验证登陆
plugin /etc/open***/open***-auth-pam.so open***  # 说明使用的插件,open***为插件的参数,使用pam的servicesname
username-as-common-name     # 不请求客户的CA证书,使用User/Pass验证

4) 修改客户端配置文件 client.conf,注释掉原来的客户端的证书和密钥

client
dev tun
proto tcp
# Open×××服务器的外网IP和端口
remote 10.2.8.45 1194
resolv-retry infinite
nobind
user nobody
group nobody
persist-key
persist-tun
ca ca.crt
#cert client1.crt   # 注释掉证书
#key client1.key    # 注释掉密钥
remote-cert-tls server
tls-auth ta.key 1
comp-lzo
verb 3  
# 新添加的代码以下
auth-user-pass     # 添加使用帐号密码验证

OK,重启服务端

service open*** restart


从新链接客户端(切记,要用用管理员身份打开Open×××客户端)



问题记录:

1)客户端启动提示:TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity)

  解决方法: 修改客户端的client.o***文件
           proto tcp  # 修改成tcp协议


2)AUTH-PAM: BACKGROUND: user 'test' failed to authenticate: Module is unknown

  修改 /etc/pam.d/open*** 的验证方式为 "auth sufficient ... "


3)AUTH-PAM: BACKGROUND: user 'test' failed to authenticate: Permission denied

  缘由:多是2.1.3版本的open***的生成动态库和当前的应用版本不匹配,从新下载个2.0.9版本的源码包,
      而后进入../plugin/auth-pam/,make生成新的open***-auth-pam.so,而后替换替换掉原来的open***-auth-pam.so
      cd ../plugin/auth-pam/ && make
相关文章
相关标签/搜索