Linux下Open×××密钥认证和用户名/密码认证笔记

  http://blog.chinaunix.net/uid-24250828-id-3536671.html

       Open×××是一个开源的虚拟专用通道工具,是基于OpenSSL 的SSL协议.可以实现在互联网中的点对点的安全连接.

Open×××优点:
1.安全,易用,稳定.
2.验证方式多样,包括:预享私钥,第三方证书以及用户名/密码组合.
3支持多种操作系统平台(Linux、 Unix、 Mac OS、 Windows).

原理:

在Open***中,如果用户访问一个远程的虚拟地址(属于虚拟网卡配用的地址系列,区别于真实地址),则操作系统会通过路由机制将数据包(TUN模式)或数据帧(TAP模式)发送到虚拟网卡上,服务程序接收该数据并进行相应的处理后,通过SOCKET从外网上发送出去,远程服务程序通过SOCKET从外网上接收数据,并进行相应的处理后,发送给虚拟网卡,则应用软件可以接收到,完成了一个单向传输的过程,反之亦然。

环境说明:
Open×××服务器内网ip:172.16.1.64 外网ip:111.207.244.100 (可以在本机,也可以在路由上做映射)
操作系统CentOS5.4 
软件包:
lzo-2.03.tar.gz
open***-2.0.9.tar.gz

准备工作:
Open××× 安装需要ssl 和gcc. 还需要TUN设备和iptables的nat模块支持.
首先同步一下时间服务器

 

  1. [root@lvs src]# ntpdate time.nist.gov

  2. [root@lvs src]# yum install openssl openssl-devel gcc (已安装的略过此步)


检查TUN模块,一般系统自带

 

  1. [root@lvs src]# modinfo tun

  2. filename: /lib/modules/2.6.18-164.el5/kernel/drivers/net/tun.ko

  3. alias: char-major-10-200

  4. license: GPL

  5. author:(C) 1999-2004 Max Krasnyansky <maxk@qualcomm.com>

  6. description: Universal TUN/TAP device driver

  7. srcversion: 9DE80B8421E85BE6D3B9E06

  8. depends:

  9. vermagic: 2.6.18-164.el5 SMP mod_unload 686 REGPARM 4KSTACKS gcc-4.1

  10. module_sig: 883f3504a9f782a581431131ff6a52711218ff0a0cb17a7f7462a56b587d3919a824faa39d2d786e0a0ee3f10e7a4b9f03efc5c87b418191eea5a66171 



编译软件包安装:
1) 安装LZO
LZO是一种数据压缩算法

 

  1. [root@lvs src]# cd lzo-2.03

  2. [root@lvs lzo-2.03]#./configure --prefix=/usr/local/lzo && make && make install

  3. [root@lvs lzo-2.03]# ls /usr/local/lzo/

  4. include lib 



2)安装Open×××

 

  1. [root@lvs src]# cd open***-2.0.9

  2. [root@lvs open***-2.0.9]#./configure --prefix=/usr/local/open*** --with-lzo-headers=/usr/local/lzo/include--with-lzo-lib=/usr/local/lzo/lib --with-ssl-headers=/usr/include/openssl --with-ssl-lib=/usr/lib && make && make install

  3. [root@lvs open***-2.0.9]#echo $?

  4. [root@lvs open***-2.0.9]# ls /usr/local/open***/

  5. man sbin 

 

 

  1. [root@lvs etc]# mkdir /usr/local/open***/etc

  2. [root@lvs etc]# cp -r /usr/local/src/software/open***-2.0.9/easy-rsa/ /usr/local/open***/etc/

  3. [root@lvs etc]# cp /usr/local/src/software/open***-2.0.9/sample-config-files/server.conf

  4. /usr/local/open***/etc/ 



3)自定义公钥变量,根据自己的信息添写

 

  1. [root@lvs etc]# cd /usr/local/open***/etc/easy-rsa/2.0/

  2. [root@lvs 2.0]# vim vars

  3. export KEY_COUNTRY="CN"

  4. export KEY_PROVINCE="BJ"

  5. export KEY_CITY="BeiJing"

  6. export KEY_ORG="manzuo.com"

  7. export KEY_EMAIL="lizonggang@manzuo.com"


使其变量生效

 

  1. [root@lvs 2.0]# source ./vars

  2. NOTE:If you run ./clean-all, I will be doing a rm -rf on /usr/local/open***/etc/easy-rsa/2.0/keys

  3. [root@lvs 2.0]#./clean-all 



生成ca证书:
[root@lvs 2.0]# ./build-ca

 

  1. [root@lvs 2.0]#./build-ca

由于之前设置过vars 文件,一路回车,

生成Diffie Hellman

 

  1. [root@lvs 2.0]#./build-dh

生成Diffie Hellman 密钥为必要步骤,不能省略.这一步根据选择密钥的长度,花费的时间不一样.会生成 1024位的 dh1024.pem文件.

生成服务器证书,server名字可以自定义

 

  1. [root@lvs 2.0]#./build-key-server server

  2. 遇到询问

  3. Sign the certificate?[y/n]:时输入y

  4. outof 1 certificate requests certified, commit?[y/n] 输入y 


生成客户端证书

 

  1. ./build-key lizonggang

 

 

  1. [root@lvs keys]# pwd

  2. /usr/local/open***/etc/easy-rsa/2.0/keys

  3. [root@lvs keys]# cp ca.crt dh1024.pem server.crt server.key /usr/local/open***/etc/keys/

  4. [root@lvs keys]# ls /usr/local/open***/etc/keys/

  5. ca.crt dh1024.pem server.crt server.key 


Open×××的配置文件:

 

  1. [root@lvs etc]# vim /usr/local/open***/etc/server.conf

  2. local 172.16.1.64

  3. port 1194

  4. proto tcp

  5. dev tun

  6. server 1.1.1.0 255.255.255.0

  7. push"route 111.207.244.0 255.255.255.0"

  8. push"route 192.168.0.0 255.255.255.0"

  9. push"route 172.16.0.0 255.255.255.0"

  10. push"dhcp-option DNS 202.106.0.20"

  11. ca /usr/local/open***/etc/keys/ca.crt

  12. cert /usr/local/open***/etc/keys/server.crt

  13. key /usr/local/open***/etc/keys/server.key

  14. dh /usr/local/open***/etc/keys/dh1024.pem

  15. ifconfig-pool-persist /usr/local/open***/etc/ipp.txt

  16. keepalive 10 7200

  17. comp-lzo

  18. max-clients 100

  19. persist-key

  20. persist-tun

  21. status /var/log/open***-status.log

  22.  

  23. log /var/log/open***.log

  24. log-append /var/log/open***.log

  25. verb 3 



启动:

 

  1. /usr/local/open***/sbin/open*** --daemon --config /usr/local/open***/etc/server.conf

开机自动启动:

 

  1. /usr/local/open***/sbin/open*** --daemon --config /usr/local/open***/etc/server.conf >>/etc/rc.local

note 
如果在启动里加上--cd 参数,那么server.conf 里可写相对路径
/usr/local/open***/sbin/open*** --daemon --config /usr/local/open***/etc/server.conf --cd /usr/local/open***/ 
那么server.conf里可这样写
ca ca.crt
cert server.crt
key server.key
dh dh1024.pem
ifconfig-pool-persist ipp.txt

这个tun0设备就是Open×××虚拟出来的网络接口,如果运行Open×××进程失败的话,是看不到这个设备的.

 

  1. [root@lvs etc]# ifconfig tun0

  2. tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00

  3. inet addr:1.1.1.1 P-t-P:1.1.1.Mask:255.255.255.255

  4. UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1

  5. RX packets:0 errors:0 dropped:0 overruns:0 frame:0

  6. TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

  7. collisions:0 txqueuelen:100

  8. RX bytes:(0.0 b) TX bytes:(0.0 b)


转发:

 

  1. [root@lvs etc]# vim /etc/sysctl.conf

  2. net.ipv4.ip_forward = 1

  3. [root@lvs etc]# sysctl -


iptables 脚本 这里的网卡要指定为服务器外网的接口

 

  1. [root@server1 ~]# cat iptables.sh 

  2. #!/bin/sh

  3. iptables -F

  4. iptables -Z

  5. iptables -X

  6. iptables -P INPUT ACCEPT

  7. iptables -P INPUT ACCEPT

  8. iptables -P FORWARD ACCEPT

  9. iptables -t nat -A POSTROUTING -s 1.1.1.0/24 -o eth0 -j MASQUERADE

  10. service iptables save 

 

 

  1. [root@server1 ~]# cat iptables.sh 

  2. #!/bin/sh

  3. iptables -F

  4. iptables -Z

  5. iptables -X

  6. iptables -P INPUT ACCEPT

  7. iptables -P INPUT ACCEPT

  8. iptables -P FORWARD ACCEPT

  9. iptables -t nat -A POSTROUTING -s 1.1.1.0/24 -o eth0 -j MASQUERADE

  10. service iptables save 

 

 


客户端设置:

这里将服务器上的ca.crt lizonggang.crt lizonggang.key 拷到本地的 Progam File(x86)/Open×××/config 文件夹下,再新建一个client.o***文件。

 

  1. 客户端client.o***

  2. client

  3. dev tun

  4. proto tcp

  5. remote 111.207.244.110 1194

  6. resolv-retry infinite

  7. nobind

  8. persist-key

  9. persist-tun

  10. ca ca.crt

  11. cert lizonggang.crt

  12. key lizonggang.key

  13. route-method exe

  14. route-delay 2

  15. ns-cert-type server

  16. comp-lzo

  17. verb 3

  18. redirect-gateway def1 

密钥测试成功.




下面介绍用户名/密码的验证方式。

1.在server.conf 文件里添加如下三行文件

 

  1. [root@lvs ~]# tail -3 /usr/local/open***/etc/server.conf

  2. auth-user-pass-verify /usr/local/open***/etc/checkpsw.sh via-env

  3. client-cert-not-required

  4. username-as-common-name

 

 

  1. [root@lvs ~]# cd /usr/local/open***/etc/ 

  2. [root@lvs ~]# wget http://open***.se/files/other/checkpsw.sh 

  3. [root@lvs ~]# chmod +x checkpsw.sh 


2.这个文件根据自己的环境修改PASSFILE和LOG_FILE变量.

 

  1. [root@lvs etc]# cat checkpsw.sh

  2. #!/bin/sh

  3. ###########################################################

  4. # checkpsw.sh (C) 2004 Mathias Sundman <mathias@open***.se>

  5. #

  6. This script will authenticate Open××× users against

  7. # a plain text file. The passfile should simply contain

  8. # one row per user with the username first followed by

  9. # one or more space(s)or tab(s)and then the password.

  10.  

  11. PASSFILE="/usr/local/open***/etc/psw-file"

  12. LOG_FILE="/usr/local/open***/log/open***-password.log"

  13. TIME_STAMP=`date "+%Y-%m-%d %T"`

  14.  

  15. ###########################################################

  16.  

  17. if[!-"${PASSFILE}"]; then

  18. echo"${TIME_STAMP}: Could not open password file \"${PASSFILE}\" for reading.">> ${LOG_FILE}

  19. exit 1

  20. fi

  21.  

  22. CORRECT_PASSWORD=`awk '!/^;/&&!/^#/&&$1=="'${username}'"{print $2;exit}' ${PASSFILE}`

  23.  

  24. if["${CORRECT_PASSWORD}"=""]; then

  25. echo"${TIME_STAMP}: User does not exist: username=\"${username}\", password=\"${password}\".">> ${LOG_FILE}

  26. exit 1

  27. fi

  28.  

  29. if["${password}"="${CORRECT_PASSWORD}"]; then

  30. echo"${TIME_STAMP}: Successful authentication: username=\"${username}\".">> ${LOG_FILE}

  31. exit 0

  32. fi

  33.  

  34. echo"${TIME_STAMP}: Incorrect password: username=\"${username}\", password=\"${password}\".">> ${LOG_FILE}

  35. exit 1 


3.用户名和密码文件fsw-file,用户名和密码之间用空格或者Tab键分隔

 

  1. [root@lvs ~]# cat /usr/local/open***/etc/psw-file

  2. lizonggang man1234567

  3. [root@lvs ~]# chmod 400 psw-file 


4.修改客户端配置文件client.o***
注释掉cert 和key
;cert lizonggang.crt
;key lizonggang.key

增加询问用户名的密码访问

 

  1. auth-user-pass


测试

 

  1. [root@lvs ~]# tail /usr/local/open***/log/open***-password.log

  2. 2013-03-21 09:54:40: Successful authentication: username="lizonggang".



==============================================================

遇到的问题
1)
Windows Client
日志里面提示有这样的错误:
ROUTE: route addition failed using CreateIpForwardEntry: 至少有一个参数不正确。
Route addition via IPAPI failed

解决办法是:
在配置文件里加入:
route-method exe
route-delay 2


2)
iptables: Saving firewall rules to /etc/sysconfig/iptables: /etc/init.d/iptables: line 268: restorecon: command not found

要安装一个软件包:
yum install policycoreutils


3)
客户端连接时报错:
There are no TAP-Win32 adapters on this system. You should be able to create a TAP-Win32 adapter by going to Start -> All Programs -> Open××× -> Add a new TAP-Win32 virtual ethernet adapter.

需要安装Add a new TAP-Win32 virtual ethernet adapter, 在Open×××的安装程序下有.

4)
Mon May 20 11:15:51 2013 WARNING: this configuration may cache passwords in memory -- use the auth-nocache option to prevent this
Mon May 20 11:15:52 2013 VERIFY ERROR: depth=1, error=self signed certificate in certificate chain: /C=CN/ST=BJ/L=BeiJing/O=manzuo.com/OU=manzuowang/CN=manzuo.com_CA/emailAddress=lizonggang@manzuo.com
Mon May 20 11:15:52 2013 TLS_ERROR: BIO read tls_read_plaintext error: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
Mon May 20 11:15:52 2013 TLS Error: TLS object -> incoming plaintext read error
Mon May 20 11:15:52 2013 TLS Error: TLS handshake failed
Mon May 20 11:15:52 2013 Fatal TLS error (check_tls_errors_co), restarting
Mon May 20 11:15:52 2013 TCP/UDP: Closing socket
Mon May 20 11:15:52 2013 SIGUSR1[soft,tls-error] received, process restarting
Mon May 20 11:15:52 2013 Restart pause, 5 second(s)


如果报这个错误,我知道两个原因
1, 证书错误
2,服务端和客户端时间相差5分钟以上。

 

 

======================= 2013/09/18 更新 open*** 使用技巧========================

 

1)记住密码设置

如果大家使用的open*** 是用户名和密码登陆的,每次登陆时都输入用户名和密码是不是很烦啊。下面介绍一个方法让大家解放双手。

步骤:

 

a.打开 client.o*** 文件在最后加入

auth-user-pass pass.txt

 

b.在同级文件夹下新建pass.txt文件。第一行写用户名,第二行写密码。这样就可以了。

例如:

lizonggang

123456

 

这样我们每次登陆只需要点Connect 就可以自己连接了。

 

 

2)多网段设置

如果我们有多个网段都需要***登陆,那怎么办呢?虽然每次只能登陆一个,但是我们手工替换config文件夹也不是个事啊。

步骤

a.在config 文件夹下新建文件夹,再把各自的文件放在各自的文件夹内

b.默认的都有自己的client.o*** ,记住,只能有一个client.o*** ,其它的修改成 xxx.o*** 各自的名字。