- 5. 配置 Open××× windows 客户端
a)安装 openvpn-2.0.9-gui-1.0.3-install.exe
编辑安装目录config 文件中的 client.ovpn 文件
内容如下:
client
dev tun
proto udp
remote 192.168.80.129 2194
persist-key
persist-tun
ca ca.crt
cert client1.crt
key client1.key
ns-cert-type server
comp-lzo
verb 3
;redirect-gateway def1
tls-auth ta.key 1
安照配置文件 cp 相应的 .key .crt .pem 文件到 config 文件夹
运行openvpn 客户端,并从windows客户机ping 公司局域网pc 172.18.2.202
再 tracert 和 pathping 一下,确认数据流向
OK 实验成功
- 6. 再做一个小测试 吊销客户端证书
root@localhost ~]# cd Scripts/openvpn-2.0.9/easy-rsa/
[root@localhost easy-rsa]# ./revoke-full client1 吊销client1的证书
这条命令执行完成之后, 会在 keys 目录下面, 生成一个 crl.pem 文件,这个文件中包含了吊销证书的名单。 成功注销某个证书之后,可以打开 keys/index.txt 文件,可以看到被注销的证书前面,已标记为R.
- a. 复制easy-rsa 目录下keys目录中的 crl.pem 到/usr/local/etc/keys 目录中
- b. 确保 server.conf 中包含这样一句
crl-verify /usr/local/etc/keys/crl.pem
- c. 重新启动openvpn 。并测试
Client 连接失败 测试成功
7.使用 tap 设备的路由模式
把服务器和客户端配置文件中 dev tun 改为 dev tap 即可
关于使用tap 和 tun 设备的区别,见附录 tun 和 tap 区别。
- (二) 搭建Open××× Server 桥接模式
还是(一)的网络环境
目的:客户端还是连接到公司局域网中,但出于一些目的必须使用桥接模式。
如客户端要获得公司局域网ip,某些应用只能使用桥接模式,节省ip。
不管什么原因,反正就是必须使用桥接模式
Open××× Server 基本设定:连接方式采用桥接,认证方式采用证书认证,虚拟设备使用tap
- 1. 将Open××× 服务器的LAN 网卡和虚拟网卡桥接
关闭Open××× 服务 killall openvpn
- a) 确认你已经安装了bridge-utils软件包。
可以 vi /root/install.log 或rpm –qa ,没有安装可以去安装光盘找或者直接yum安装
- b) 编辑下面的bridge-start脚本。依照你要桥接的物理以太网接口设置br, tap, eth, eth_ip,eth_netmask和eth_broadcast参数。确保使用的接口是私有的且它连接的局域网由防火墙保护其到internet的连接。可以使用ifconfig命令获得要填入bridege-start参数的网络接口的信息
- c) 这个脚本可以从
- d) http://openvpn.net/index.php/documentation/miscellaneous/ethernet-bridging.html#linuxscript获得,或者 openvpn 的模版文件目录中也有
- e) 运行bridge-start脚本。它将创建一个永久( 服务器重起前 )的tap0接口并将它和活跃的以太网接口桥接。
- f) 把这个脚本也加入到 /etc/rc.local
- 2. 编辑服务器配置文件
- a) 在 “(一)”步骤地服务器配置文件基础上
- i. 更改 dev tun 为 dev tap0
- ii. 注释 server 开头的行
- iii. 添加如下行
- iv. 网桥ip 分给vpn 客户端的ip范围 server-bridge 172.18.2.30 255.255.255.0 172.18.2.128 172.18.2.254
- v. push "route 172.18.2.0 255.255.255.0" 这句也可以注释掉,当然只要知道这句是push 一条路由给 vpn client 就可以灵活掌握。
- vi.
- 3. 设置防火墙使数据包在新建的tap0 和 br0 借口上自由传送
vi /etc/sysconfig/iptables
添加如下几条
-A RH-Firewall-1-INPUT -i tap0 -j ACCEPT
-A RH-Firewall-1-INPUT -i br0 -j ACCEPT
那条 NAT 的规则也可以去掉。
开启openvpn
/usr/local/sbin/openvpn --daemon --config /usr/local/etc/server.conf
从 winxp client 连接到服务器
测试 ok ipconfig /all tracert pathping
Open××× 服务器启动和停止
运行 bridge-start 运行 openvpn 停止 openvpn 运行 bridge-stop
Ok Open××× 桥接设置完毕
-
- (三) 搭建Open××× Server 路由模式 + 口令认证+ MYSQL
还是(一)的网络环境
目的:客户端还是连接到公司局域网中,但为了用户管理方便,认证数据从mysql 数据库中提取。
Open××× Server 基本设定:连接方式采用路由,认证方式采用mysql认证,虚拟设备使用tun
- 1. 首先检查pam-devel包是否安装,否则从系统盘安装改软件包
- a) rpm –qa | grep pam
- 2.检查Mysql是否安装,确认mysql-devel包已经安装,否则从系统盘安装改软件包
rpm –qa | grep msql
mysql-5.0.45-7.el5
mysql-devel-5.0.45-7.el5
mysql-server-5.0.45-7.el5
注:从系统盘安装改软件包时有一系列的依赖问题,我晕
可以把系统盘设置为yum源,使用yum安装这样依赖问题就会自动解决
3.我们安装pam_mysql使用MySQL数据库存储用户数据,其它数据库可以找相应的PAM验证模块(我是在cu下载的 pam_mysql-0.7RC1.tar.gz)
[root@localhost ~]# gzip -cd pam_mysql-0.7RC1.tar.gz | tar xvf –
[root@localhost ~]# cd pam_mysql-0.7RC1
[root@localhost pam_mysql-0.7RC1]# ./configure
[root@localhost pam_mysql-0.7RC1]# make
[root@localhost pam_mysql-0.7RC1]# cp .libs/pam_mysql.so /lib/security/
- 4. 配置 mysql 数据库 和 pam
Server mysqld start
使用 chkconfig 命令让 mysql 数据库,开机自启动
配置数据库
以管理员身份登录数据库:
mysql>; create database vpn;
mysql>; GRANT ALL ON vpn.* TO vpn@localhost IDENTIFIED BY 'vpn123';
mysql>; flush privileges;
mysql>; use vpn;
mysql>; CREATE TABLE vpnuser (
->; name char(20) NOT NULL,
->; password char(128) default NULL,
->; active int(10) NOT NULL DEFAULT 1,
->; PRIMARY KEY (name)
->; );
mysql>; insert into vpnuser (name,password) values('elm',‘elm’);
#创建vpn用户,对vpn这个database有所有操作权限,密码为vpn123
#active不为1,无权使用×××
#增加用户 用户名:elm 密码:elm
配置pam_mysql模块
创建/etc/pam.d/openvpn文件,文件内容如下:
===================CUT Here================
auth sufficient pam_mysql.so user=vpn passwd=vpn123 host=localhost db=vpn \
table=vpnuser usercolumn=name passwdcolumn=password \
where=active=1 sqllog=0 crypt=0
account required pam_mysql.so user=vpn passwd=vpn123 host=localhost db=vpn \
table=vpnuser usercolumn=name passwdcolumn=password \
where=active=1 sqllog=0 crypt=0
==================Cut Here=================
crypt(0) -- Used to decide to use MySQL's PASSWORD() function or crypt()
0 = No encryption. Passwords in database in plaintext. NOT recommended!
1 = Use crypt
2 = Use MySQL PASSWORD() function
下面可以测试pam_mysql是否工作正常,先检查saslauthd是否安装:
[root@localhost pam_mysql-0.7RC1]# rpm -qa | grep sasl
cyrus-sasl-plain-2.1.22-4
cyrus-sasl-devel-2.1.22-4
cyrus-sasl-2.1.22-4
cyrus-sasl-lib-2.1.22-4
有cyrus-sasl-2.1.22-4应该就可以了,如果没有请安装相应的软件包,不安装也行,可以通过其它方法测试
[root@vpn ~]# saslauthd -a pam
把这句加入到 /etc/rc.local 记得写全路径 用 whereis 或 locate 找
[root@vpn ~]# testsaslauthd -u elm -p elm -s openvpn
0: OK "Success."
恭喜,pam_mysql工作正常了,下面可以开始配置Open×××服务器了。
这里我第一次测试时失败了
编辑 /etc/pam.d/openvpn
两句最后都加上
verbose=1 详细日志
[root@localhost pam_mysql-0.7RC1]# ls -ltr /var/log
看哪个日志文件被更新了
再开两个窗口监视这两个文件
[root@localhost pam_mysql-0.7RC1]# tail –f /var/log/messages
[root@localhost pam_mysql-0.7RC1]# tail -f /var/log/secure
重新 做一次 saslauthd 的启动 和 testsaslauthd
日志也没有看到明显错误
最后才记起来
Mysql 的 password 函数因为mysql 的加密函数和pam_mysql-0.7RC1 的加密函数不相同。
crypt (plain)
The method to encrypt the user's password:
0 (or "plain") = No encryption. Passwords stored in plaintext.
HIGHLY DISCOURAGED.
1 (or "Y") = Use crypt(3) function.
2 (or "mysql") = Use MySQL PASSWORD() function. It is possible
that the encryption function used by PAM-MySQL
is different from that of the MySQL server, as
PAM-MySQL uses the function defined in MySQL's
C-client API instead of using PASSWORD() SQL function
in the query.
3 (or "md5") = Use plain hex MD5.
4 (or "sha1") = Use plain hex SHA1.
于是 把crypt 设置为0 ,新建一个密码不加密的帐户。再测试就通过了
- 5. 生成 openvpn-auth-pam.so
[root@localhost etc]# cd /root/Scripts/openvpn-2.0.9/plugin/auth-pam/
[root@localhost auth-pam]# make
[root@localhost auth-pam]# cp openvpn-auth-pam.so /usr/local/etc/lib/
6.配置服务器配置文件, 在(一)的基础上
添加如下几行:
#说明使用的插件,openvpn为插件的参数,使用pam的servicesname
plugin /usr/local/etc/lib/openvpn-auth-pam.so openvpn
#不请求客户的CA证书,使用User/Pass验证
client-cert-not-required
#使用客户提供的UserName作为Common Name
username-as-common-name
7.配置客户端配置文件
注释掉
;cert client1.crt
;key client1.key
增加
#询问用户名和密码
auth-user-pass
使用客户端连接服务器 测试 ok