×××的分类:

PPTP ×××:小区宽带,家庭路由器会有连接不上的情况。

IPsec ×××:主要开源软件有openswan,适用于点对点网络,比如公司总部和分部。

open ×××:主要适用出差办公连接公司内部网络,以及跨机房连接,远程维护。

 ---------------------------------------------------------------------------------------------------------------------------------------
 

Open×××部署:

open××× yum安装:
1.关闭防火墙和selinux

chkconfig iptables off
/etc/init.d/iptables stop


2.配置时间同步:

ntpdate pool.ntp.org
echo '*/5 * * * *  /usr/sbin/ntpdate pool.ntp.org >/dev/null 2>&1' >>/var/spool/cron/root


3.开启内核转发

sed -i 's/ net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/g' /etc/sysctl.conf

4.更改yum源:

rpm -Uvh http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm

5.安装open×××

yum install open*** -y
yum install easy-rsa -y

6.备份配置文件:

cp server.conf server.conf.bak

vi /etc/open***/server.conf

local 10.86.10.18     
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/dh2048.pem     #注意2.3版本以后是2048.pem不再是1024.pem
server 10.8.0.0 255.255.255.0
push "route 192.168.100.0 255.255.255.0"
client-to-client
duplicate-cn
keepalive 10 120 
comp-lzo
max-clients 100
persist-key
persist-tun
tls-auth ta.key 0           #开启TLS,使用ta.key防御***。服务器端的第二个参数值为0,客户端的为1。
status open***-status.log
log /var/log/open***.log
verb 3


7.创建CA、服务器key、客户端key

cd /usr/share/easy-rsa/2.0/
cp vars vars.bak

vi vars     #找到以下改成这样既可

export KEY_COUNTRY="CN"
export KEY_PROVINCE="ShanDong"
export KEY_CITY="QingDao"
export KEY_ORG="Darren"
export KEY_EMAIL="[email protected]"
export KEY_OU="darren-unit"
source vars
./clean-all

创建ca:

 
./build-ca   #一路回车既可

创建server:

./build-key-server server

创建客户端test:

./build-key test

创建dh:

./build-dh

创建防ddos***:

open*** --genkey --secret keys/ta.key


拷贝key到服务端和客户端:

cp -ap keys/ /etc/open***/

客户端配置:

#####################
client
dev tun
proto tcp
remote 192.168.1.115 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert test.crt
key test.key
tls-auth ta.key 1
ns-cert-type server
comp-lzo
verb 3
#########################################


open××× 源码安装: 

实验环境:

open××× server:eth0  10.86.10.18   eth1 10.1.1.18

配置时间同步:

echo '*/5 * * ** /usr/sbin/ntpdate pool.ntp.org' >>/var/spool/cron/root

开启内核转发功能:

net.ipv4.ip_forward= 1

安装open***所需要的插件:

yum install -y lzo lzo-devel pam pam-devel

安装open×××软件:

mkdir -p /home/darren/toolshttp://swupdate.open***.org/community/releases/open***-2.2.2.tar.gz 
cd /home/darren/tools/
tar zxf open***-2.2.2.tar.gz
./configure --with-lzo-headers=/usr/local/include/  --with-lzo-lib=/usr/local/lib
make
make install

#如果出错,则安装:
yum install openssl openssl-devel       #安装依赖包


配置open××× server建立CA证书:

服务端和客户端共用一个CA证书,客户端有自己的秘钥,服务端也有自己的秘钥。后面会生成服务端和客户端的秘钥。此处是生成公共的CA证书。

cd /home/darren/tools/
cd open***-2.2.2/easy-rsa/2.0/
cp vars vars.bak

----------------------- 

vi vars
export KEY_COUNTRY="CN"
exportKEY_PROVINCE="shandong"
exportKEY_CITY="qingdao"
exportKEY_ORG="darren"
exportKEY_EMAIL="[email protected]"
[email protected]
exportKEY_CN=CN
exportKEY_NAME=darren
exportKEY_OU=darren
exportPKCS11_MODULE_PATH=changeme
exportPKCS11_PIN=1234
--------------

source vars   #使上面的配置文件生效

./clean-all    #此命令会删除2.0下的keys

重新建立证书:

./build-ca   #生成新的ca证书的命令,一路回车即可。

生成服务端证书和秘钥key文件:

./build-key-serverserver  #生成服务端秘钥的命令,一路回车。


生成客户端证书和秘钥key文件:

open***中,每一个登录open×××的客户端都要生成一个client证书和key文件,每个证书在同一时刻只允许一个客户端连接,若建立多个客户端证书,则重复执行如下步骤即可

./build-key cuijie    #生成客户端秘钥的命令,如果想要客户端连接时需要密码,则用./build-key-pass cuijie 代替,同样一路回车即可。

生成一个带密码的客户端:

./build-key-pass  cuijie   
EnterPEM pass phrase:      #此处的密码就是客户端连接***时需要输入的密码,其余一路回车即可。

生成传输进行秘钥交换时用到的交换秘钥协议文件:

./build-dh    #时间较长,不可强行停止。

生成一个防火墙的文件(为防止恶意***,如DOSUDP

open*** --genkey  --secret keys/ta.key

服务端××× server.conf重要参数:

拷贝keys及配置文件:

mkdir /etc/open***
cd /home/darren/tools/
cd open***-2.2.2/easy-rsa/2.0/
cp -ap  keys/ /etc/open***/     #拷贝所有的keys
cd  ../../sample-config-files/
cp client.conf server.conf /etc/open***/

编辑配置文件:

vi  /etc/open***/server.conf

local  10.86.10.18     #本地监听的地址,一般为eth0网卡IP地址。
port  1194         #默认端口号,改成别的更安全。
proto tcp          #默认使用udp协议,生产中建议改为tcp协议。
dev  tun            #采用路由的模式,可选tap或tun,这里设为默认。
ca   keys/ca.crt   #公共的ca证书,keys要和server.conf在一个目录下。
cert keys/server.crt         #这里使用全局路径,不然启动时总是自动退出。
key keys/server.key    
dh keys/dh2048.pem
server 10.8.0.0 255.255.255.0   #这是server分配给client的虚拟地址池,不能与其他网段冲突。
push  "route 192.168.100.0 255.255.255.0"    #此处设为server内网网段,能够确保客户端和×××所在内网网段通信。
client-to-client     #允许拨号的多个client之间相互通信
duplicate-cn       #允许多个客户端使用同一账号连接。
keepalive10 120     #每10秒ping一次,120秒未收到则断开连接。
comp-lzo         #开启压缩功能
max-clients100      #设置最大允许的client数量,默认是不限制。
persist-key       #***超时后,当重启***时,保持上一次使用的私钥,而不需重新读取私钥。
persist-tun       #如果连接超时,重新启动后,保持tun设备自动连接状态。
status  open***-status.log
log      open***.log  #日志文件。
verb  3          #指定日志文件冗余。

启动open×××

/usr/local/sbin/open*** --config /etc/open***/server.conf &  
echo '/usr/local/sbin/open*** --config /etc/open***/server.conf &' >>/etc/rc.local

错误:启动时总是自动退出:然后在相对路径下去没有问题。
我第一怀疑的是 配置文件证书和秘钥的路径问题,果然改成全局路径就好了。

或者

cd /home/darren/tools/
cp open***-2.2.2/sample-scripts/open***.init/etc/init.d/open***
chmod 755  /etc/init.d/open***
chkconfig --add open***
chkconfig open*** on
/etc/init.d/open***  start

 

window安装open×××软件:

下载windows客户端软件然后安装:

https://open***.net/index.php/open-source/downloads.html

下载server端证书和秘钥:

ca.crt   test.key  test.crt

 

拷贝下载的秘钥文件到安装open×××config目录下:

C:\ProgramFiles\Open×××\config

 

config新建一个文件,命令为test.o***(注意文件的扩展名不能有其他的)

client
dev tun
proto tcp
remote 10.86.10.18 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert test.crt
key test.key
ns-cert-type server
comp-lzo
verb 3

window右下角点击connect,成功!

注意:一不小心碰到许多大坑,一定要细心耐心排查。安装open×××时,要选择对应的版本下载,windows打开软件时要右键以管理员身份运行,不然后报错。push路由的时候,一定要检查是否为×××server内网的网段。再就是网关不能有多个,可以添加默认路由,但一般不要这么做。遇到问题时,一定要思路清晰,冷静下来看日志,日志中出错的部分可以google大部分问题自己都能解决,不要问别人,靠别人永远不如靠自己来的可靠。

 

解决客户端ping不通服务端所在的内网段地址:

1)更改所有和open××× server同一局域网的网关,网关改为open×××的内网ip地址(此种不太现实)route add default gw 10.1.1.18
2)添加一个网段路由(所有内网服务器都需要添加,也不太现实):route add –net 10.8.0.0/24 gw 10.1.1.18
3)nat方式把10.8.0.0的网段转换为10.1.1.0网段:iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth1 -j SNAT --to-source 10.1.1.18


客户端增加证书:

为每一个client增加证书:

cd /home/darren/tools/
cd open***-2.2.2/easy-rsa/2.0/
source vars
./build-key-passclient……N
注意:此处不要执行./clean-all

客户端吊销证书:

吊销单个证书:

cd /home/darren/tools/
cdopen***-2.2.2/easy-rsa/2.0/
sourcevars
viopenssl-1.0.0.cnf  #新版本不用管,旧版本需要注释后7行。
./revoke-fulltest    #吊销用户test证书
llkeys/crl.pem      #查看吊销的证书
catkeys/index.txt   #查看吊销的结果
cpkeys/crl.pem /etc/open***/keys/   #拷贝吊销的证书到配置文件目录下
echo ‘crl-verify   /etc/open***/keys/crl.pem’>>/etc/open***/server.conf   #把吊销的证书路径放到配置文件中。  
#重启生效!

吊销多个证书:

#重复以上步骤即可,覆盖式类型。


 

Linux版客户端安装:

和服务端安装步骤一样,配置如下:

mkdir –p/etc/open***/
vi /etc/open***/client.conf
client
devtun
prototcp
remote10.86.10.18 1194
resolv-retryinfinite
nobind
persist-key
persist-tun
ca  /etc/open***/keys/ca.crt              #注意,客户端此处要接全路径
cert  /etc/open***/keys/test.crt
key /etc/open***/keys/test.key    
ns-cert-typeserver
comp-lzo
verb 3

拷贝证书:

cp ca.crt test.key test.crt  /etc/open***/

启动client

/usr/local/sbin/open***--config /etc/open***/client.conf &  
echo '/usr/local/sbin/open***--config /etc/open***/client.conf &' >>/etc/rc.local

或者:

cd /home/darren/tools/
cp open***-2.2.2/sample-scripts/open***.init/etc/init.d/open***
chmod755 /etc/init.d/open***
chkconfig–add open***
chkconfigopen*** on
/etc/init.d/open***start

########################################################################

#############################open *** 结束###############################

########################################################################

 

 open***跨机房连接:

要求两端所在的内网相互之间ping通。  
       A--------------->client   .............................server <----------------B
 

1.两端内网不能在相同的网段:A: 172.16.10.10  , B :192.168.10.10
2.编辑配置文件,增加一行:echo 'client-config-dir /etc/open***/ccd' >>/etc/open***/server.conf
3.找到open×××客户端的key名字,test.key 把客户端内网的网段加入到test中:
echo 'iroute 172.16.10.0 255.255.255.0 ' >/etc/open***/test
4.在open*** server.conf中添加一条路由:
echo 'route 172.16.10.0 255.255.255.0' >>/etc/open***/server.conf
5.确保open*** server.conf中打开以下两项:
client-to-client
push "route 172.16.10.0 255.255.255.0"   #此处有疑问,感觉应该是服务端所在内网的路由。
6.在open*** server.conf中需要注释一行:
#duplicate-cn 


这样就实现了客户端内网和服务端内网相互之间可以访问。
----------------------------------------------------------------------------------


 
open***代理访问:

配置***通过服务器代理出网实践:
和之前的server.conf配置相比,需要增加的内容:

push "redirect-gateway def1 bypass-dhcp bypass-dns"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"

添加一条nat映射:

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

这样访问网站走的就是***线路。
 ----------------------------------------------------------------------------------------------------------------------------

 

 open***负载均衡和高可用:
 
1) 首先需要把服务器端keys拷贝到另一台机器上,然后再将客户端本地的xxx.o***复制一份,可以命令为xxx-1.o***、xxx-2.o***,这两个配置文件需要指定不同的server ip地址。(服务端server.conf中也需要修改ip地址)
注意:如果服务起不来可以尝试用全局路径: 
/usr/local/sbin/open*** --config /etc/open***/server.conf & 如果还不行,把所有open***的服务kill。

2) 首先拷贝服务端keys到另一台机器上,然后修改客户端的配置文件:
编辑tracy.o***,添加如下内容:

remote 10.86.10.11 1194
remote 10.86.10.13 1194
remote 10.86.10.14 1194
remote-random          #轮询连接
resolv-retry 60         #60秒重试一次。

 
 

 open***通过用户名和密码登陆:

编辑配置文件server.conf添加如下3行:

auth-user-pass-verify  /etc/open***/checkpsw.sh via-env          #认证用户通过脚本
client-cert-not-required                      #不使用客户端证书,用户名和密码验证
username-as-common-name           #使用客户端的name做为common name

获取checkpsw.sh脚本:

cd /etc/open*** 
wget http://open***.se/files/other/checkpsw.sh
vi checkpsw.sh
 #!/bin/sh
###########################################################
# checkpsw.sh (C) 2004 Mathias Sundman 
#
# This script will authenticate Open××× users against
# a plain text file. The passfile should simply contain
# one row per user with the username first followed by
# one or more space(s) or tab(s) and then the password.
 
PASSFILE="/etc/open***/psw-file"
LOG_FILE="/var/log/open***-password.log"
TIME_STAMP=`date "+%Y-%m-%d %T"`
 
###########################################################
 
if [ ! -r "${PASSFILE}" ]; then
  echo "${TIME_STAMP}: Could not open password file \"${PASSFILE}\" for reading." >> ${LOG_FILE}
  exit 1
fi
 
CORRECT_PASSWORD=`awk '!/^;/&&!/^#/&&$1=="'${username}'"{print $2;exit}' ${PASSFILE}`
 
if [ "${CORRECT_PASSWORD}" = "" ]; then
  echo "${TIME_STAMP}: User does not exist: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
  exit 1
fi
 
if [ "${password}" = "${CORRECT_PASSWORD}" ]; then
  echo "${TIME_STAMP}: Successful authentication: username=\"${username}\"." >> ${LOG_FILE}
  exit 0
fi
 
echo "${TIME_STAMP}: Incorrect password: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
exit 1

---------------------------------------------------------------- 

chmod +x checkpsw.sh

 
创建密码文件:

 
vi psw-file

darren     darren123
test       test123

 

在客户端注释证书相关的配置,添加如下:

auth-user-pass

完整版客户端配置:

client
dev tun
proto tcp
remote 10.86.10.14 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca /etc/open***/keys/ca.crt
#cert /etc/open***/keys/tracy.crt         #去掉此项
#key /etc/open***/keys/tracy.key        #去掉此项
ns-cert-type server
comp-lzo
verb 3
auth-user-pass


open××× 2.2.2故障:客户端总是弹出用户名和密码。
解决:在服务端配置文件中添加:--script-security 3

--------------------------------------------------------------------------------
记录一次排错思路:电脑连接***以后,能访问*** server的内网段,但不能访问外网段。
解决:首先想到的是push 路由的问题,验证发现已经push了内网段的路由,外网段不push,client就无法访问外网段。如果push的路由不正确也会出现无法访问外网段的问题。比如外网段是10.86.10.0/23,而push的却是10.86.10./24.