×××的分类:
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 #时间较长,不可强行停止。
生成一个防火墙的文件(为防止恶意***,如DOS、UDP)
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.