Openvpn 实践之路
Openvpn 实践之路
战斗的小涵 发表于2个月前
Openvpn 实践之路
  • 发表于 2个月前
  • 阅读 8
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 十分钟定制你的第一个小程序>>>   

一 VPN基础讲解

1.1 什么是 VPN

IP 机制仿真出一个私有的广域网 " 是通过私有的隧道技术在公共数据网络上仿真一条点到点的专线技术。所谓虚拟,是指用户不再需要拥有实际的长途数据线路,而是使用 Internet 公众数据网络的长途数据线路。  1.2 OpenVPN 的功能  可以将两个不同的网段打通一条通道,可以互相访问,对于运维人员来说主要是为了安全,因为OpenVPNssl 加密机制,增加了密码的安全度,运维人员可以自定义 ip 段进行管理服务器,简单点说,安全方便。

1.3 SSL VPN 原理

如果把 SSL 和 VPN 两个概念分开,大家对他们的含义应该都非常清楚,但是作为一种新技术,它们之间是如何结合起来的大家也许还不是很了解。从学术和商业的角度来讲,因为他们代表的含义有所不同,因而常常会被曲解。       SSL (安全套接层)协议是一种在 Internet 上保证发送信息安全的通用协议。它处于应用层。SSL 用公钥加密通过 SSL 连接传输的数据来工作。 SSL 协议指定了在应用程序协议(如 HTTP、 Telnet 和 FTP 等)和 TCP/IP 协议之间进行数据交换的安全机制,为 TCP/IP 连接提供数据加密、服务器认证以及可选的客户机认证。 SSL 协议包括握手协议、记录协议以及警告协议三部分。握手协议负责确定用于客户机和服务器之间的会话加密参数。记录协议用于交换应用数据。警告协议用于在发生错误时终止两个主机之间的会话。       VPN (虚拟专用网)则主要应用于虚拟连接网络,它可以确保数据的机密性并且具有一定的访问控制功能。 VPN 是一项非常实用的技术,它可以扩展企业的内部网络,允许企业的员工、客户以及合作伙伴利用 Internet 访问企业网,而成本远远低于传统的专线接入。过去, VPN 总是和 IPSec 联系在一起,因为它是 VPN 加密信息实际用到的协议。 IPSec 运行于网络层, IPSec VPN则多用于连接两个网络或点到点之间的连接。

所谓的 SSL VPN ,其实是 VPN 设备厂商为了与 IPsec VPN 区别所创造出来的名词,指的是使用者利用浏览器内建的 SecureSocket Layer 封包处理功能,用浏览器连回公司内部 SSL VPN 服务器,然后透过网络封包转向的方式,让使用者可以在远程计算机执行应用程序,读取公司内部服务器数据。它采用标准的安全套接层( SSL )对传输中的数据包进行加密,从而在应用层保护了数据的安全性。高质量的 SSL VPN 解决方案可保证企业进行安全的全局访问。在不断扩展的互联网 Web 站点之间、远程办公室、传统交易大厅和客户端间, SSL VPN 克服了 IPSec VPN 的不足,用户可以轻松实现安全易用、无需客户端安装且配置简单的远程访问,从而降低用户的总成本并增加远程用户的工作效率。而同样在这些地方,设置传统的 IPSec VPN 非常困难,甚至是不可能的,这是由于必须更改网络地址转换( NAT )和防火墙设置。

1.4 验证 LINUX 是否支持安装 VPN

如果购买的 vps 是基于 OpenVZ 类型,无法配置标准的 VPN( 无测试过 ), 部分手机可能无法支持 , 但 OpenVZ 支持 pptp 和 openVPN

在安装之前请确认一下你购买的 vps 是否开启了 tun/tap 的支持, burst vps 默认是不开启 tun/tap 的,可以使用 cat /dev/net/tun 进行检查

如果是没有权限的话可以发个 ticket 要求客服为你开启 tun/tap

cat /dev/net/tun

cat /dev/net/tun:Permissiondenied( 未开启 tun/tap)

出现 File descriptor in bad state 说明 tun/tap 已经开启,可以开始进行 openVPN 的安装配置

cat /dev/net/tun

cat:/dev/net/tun:Filedescriptor in bad state

二、服务端安装

服务端ip:192.168.2.100 为外网ip

192.168.5.100 为内网ip

2.2.2.0 为 tun虚拟IP网段

客户端ip:192.168.2.200

测试内网ip:192.168.5.155

192.168.5.151

现在开始在 vps 上安装和配置 openVPN ,需要的有下列的软件  gcc g++ [gcc g++ 为系统需要的编译工具 ]  lzo 库 [Lzo 库的功能是对虚拟链路进行压缩 ]  openssl [ 囊括了主要的密码算法、常用的密钥和证书封装管理功能以及 SSL 协议 ]  openvpn

2.1 检查并安装编译工具 gcc g++

# yum install gccgcc-c++ -y

2.2 安装 lzo 库

# cd/home/download/

# wgethttp://www.oberhumer.com/opensource/lzo/download/lzo-2.03.tar.gz

# tar -xvzflzo-2.03.tar.gz

# cd lzo-2.03

# ./configure-prefix=/usr/local/lzo && make && make install

# vi/etc/ld.so.conf

include/etc/ld.so.conf.d/*.conf

/lib

/lib64

/usr/lib

/usr/lib64

/usr/local/lib

/usr/local/lib64

编辑完 ld.so.conf, 执行

# ldconfig

使动态库生效

2.3 安装 openssl

# cd/home/download/

# wgethttp://www.openssl.org/source/openssl-1.0.1c.tar.gz

# tar -xvzf openssl-1.0.1c.tar.gz

# ./config&& make && make install

2.4 安装 openvpn

# cd/home/download/

# wgethttp://swupdate.openvpn.org/community/releases/openvpn-2.2.1.tar.gz

# tar -xvzf openvpn-2.2.1.tar.gz

# cd openvpn-2.2.1

./configure--prefix=/usr/local/openvpn --with-lzo-lib=/usr/local/lzo/lib/--with-ssl-lib=/usr/local/ssl/lib/ --with-lzo-headers=/usr/local/lzo/include/--with-ssl-headers=/usr/local/ssl/include/

make &&make install

三 服务器配置

3.1 创建配置环境

# mkdir/etc/openvpn

# cp -R/home/download/openvpn-2.2.1/easy-rsa/ /etc/openvpn

# cd/etc/openvpn/easy-rsa/2.0/

# ls

total 112

-rwxr-xr-x 1 rootroot 121 Oct 26 03:14 build-ca

-rwxr-xr-x 1 rootroot 354 Oct 26 03:14 build-dh

-rwxr-xr-x 1 rootroot 190 Oct 26 03:14 build-inter

-rwxr-xr-x 1 rootroot 165 Oct 26 03:14 build-key

-rwxr-xr-x 1 rootroot 159 Oct 26 03:14 build-key-pass

-rwxr-xr-x 1 rootroot 251 Oct 26 03:14 build-key-pkcs12

-rwxr-xr-x 1 rootroot 270 Oct 26 03:14 build-key-server

-rwxr-xr-x 1 rootroot 215 Oct 26 03:14 build-req

-rwxr-xr-x 1 rootroot 160 Oct 26 03:14 build-req-pass

-rwxr-xr-x 1 rootroot 430 Oct 26 03:14 clean-all

-rwxr-xr-x 1 rootroot 1459 Oct 26 03:14 inherit-inter

-rwxr-xr-x 1 rootroot 297 Oct 26 03:14 list-crl

-rw-r--r-- 1 rootroot 422 Oct 26 03:14 Makefile

-rwxr-xr-x 1 rootroot 7768 Oct 26 03:14 openssl-0.9.6.cnf

-rwxr-xr-x 1 rootroot 8230 Oct 26 03:14 openssl.cnf

-rwxr-xr-x 1 rootroot 12068 Oct 26 03:14 pkitool

-rw-r--r-- 1 rootroot 8864 Oct 26 03:14 README

-rwxr-xr-x 1 rootroot 894 Oct 26 03:14 revoke-full

-rwxr-xr-x 1 rootroot 180 Oct 26 03:14 sign-req

-rwxr-xr-x 1 rootroot 1602 Oct 26 03:14 vars

-rwxr-xr-x 1 rootroot 190 Oct 26 03:14 whichopensslcnf

结果是程序以及脚本,这个简要的说明一下

vars 脚本,是用来创建环境变量,设置所需要的变量的脚本  clean-all 脚本,是创建生成 CA 证书及密钥 文件所需要的文件和目录  build-ca 脚本,生成 CA 证书 ( 交互 )  build-dh 脚本,生成 Diffie-Hellman 文件 ( 交互 )  build-key-server 脚本,生成服务器端密钥 ( 交互 )  build-key 脚本,生成客户端密钥 ( 交互 )  pkitool 脚本,直接使用 vars 的环境变量设置直接生成证书 ( 非交互 )

3.2 生成 CA 证书及密钥

mv openssl-1.0.0.cnfopenssl.cnf

mkdir/etc/openvpn/easy-rsa/2.0/keys

# cd/etc/openvpn/easy-rsa/2.0/

source ./vars (初始化)

# ./vars( 不使用 )

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

注 : 如果你执行了 ./clean-all, 系统将删除 /etc/openvpn/easy-rsa/2.0/keys 下的文件

修改 vars 文件

# 定义你所在的国家, 2 个字符  export KEY_COUNTRY=CN  # 你所在的省份  export KEY_PROVINCE=”JS”  # 你所在的城市  export KEY_CITY=”SUZHOU”  # 你所在的组织  export KEY_ORG="bcgogo.com"  # 你的单位  export KEY_OU="bcgogo.com"  # 你的邮件地址  export KEY_EMAIL="xiaokaibo@bcgogo.com"

#. ./vars ( 注意有两个点,两个点之间有空格 )

初始化 keys 文件

# ./clean-all #[ 注 : 删除 /etc/openvpn/easy-rsa/2.0/keys 下的文件 ]

# ./build-ca #[ 注 : 生成一个 a 1024 bit RSA 的密钥 ,writing new private key to 'ca.key']

一路按回车就可以

# cd keys

# ls

ca.crt ca.keyindex.txt serial 可以看到生成的 ca.crtca.key 文件

可以看到生成的 ca.crt ca.key 文件

3.3 生成 Diffie-Hellman 文件

# cd ..

# ./build-dh #[ 注 :Generating DH parameters, 1024 bitlong safe prime]

# ls keys

ca.crt ca.keydh1024.pem index.txt serial

注 : 可以看到生成了 1024 为的 Diffie-Hellman 文件

3.4 生成服务器使用的 VPN server ca 证书

#./build-key-server chenyz #[ 注 : 其中 chenyz 是 CA 证书的一个名字 ]

一路回车 ,Sign the certificate? [y/n]:y 选择 y

然后把刚才生成的 CA 证书和密钥 copy 到 /etc/openvpn/ 下

# cd keys  # cp ca.crt ca.key chenyz.crt chenyz.key dh1024.pem /etc/openvpn/

3.5 生成客户端 CA 证书及密钥

#./build-key client-chenyz  一路回车 ,Sign thecertificate? [y/n]:y 选择 y

在 keys 目录下生成了 client-chenyz.crtclient-chenyz.csr client-chenyz.key 三个客户端证书  并且将 ca.crtca.key client-chenyz.crt client-chenyz.csr client-chenyz.key 五个文件打包 , 以便客户端vpn

tar -zcvfbcgogovpn.tar.gzca.crt ca.keyclient-chenyz.crt client-chenyz.csr client-chenyz.key

3.6 修改 openvpn 配置文件

# cp/home/download/openvpn-2.0.9/sample-config-files/server.conf /etc/openvpn/server.conf  将 vpenvpn 的原始样例文件复制到 /etc/openvpn 下 , 并改名为 openvpn.conf, 我们将在样例文件上进行修改

local 192.168.2.100 //服务器外网地址,保证客户端能够ping通

 

port 1194 监听端口

 

proto tcp 使用的协议

dev tun

 

ca /etc/openvpn/ca.crt //证书的位置

cert /etc/openvpn/server.crt

key /etc/openvpn/server.key # This file should be kept secret

 

dh /etc/openvpn/dh1024.pem //dh文件的位置

 

server 2.2.2.0 255.255.255.0 //tun隧道虚拟ip网段

 

ifconfig-pool-persist ipp.txt

 

;push "route 192.168.10.0 255.255.255.0"

;push "route 192.168.20.0 255.255.255.0"

push "route 192.168.5.0 255.255.255.0" //内网ip网段

 

push "redirect-gateway def1 bypass-dhcp" //给客户端推送内网路由

Client-to-client //可以让客户端之间相互访问直接通过 openvpn 程序转发

duplicate-cn //这个是允许同是连接多个客户端

keepalive 10 120 //链接超时时间

Comp-lzo //对数据进行压缩

user nobody

group nobody

 

persist-key

persist-tun

max-clients 100 //允许连接客户端的最大数量

status /usr/local/logs/openvpn-status.log

log /usr/local/logs/openvpn.log

log-append /usr/local/logs/openvpn.log

// 日志存放地方,这里我自己创建的地址 mkdir /usr/local/logs

verb 3

 

mute 20

3.7 启动 OpenVPN

修改完毕后 , 即可以启动 vpn,--daemon 为后台守护进程模型启动  /usr/local/openvpn/sbin/openvpn--daemon --config /etc/openvpn/server.conf

用netstat查看端口监听状态

3.8 把程序加载到开机启动项中

echo "/usr/local/openvpn/sbin/openvpn--daemon --config /etc/openvpn/server.conf " >> /etc/rc.local

4.2 LINUX 客户端配置

4.2.1 安装 openvpn 、 openssl 及 lzo 库 安装方案同 LINUX 服务器安装方法相同

4.2.2 配置客户端程序

4.2.3 复制从服务器下载过来的 bcgogovpn.tar.gz 到 /etc/openvpn

tar zxvf bcgogovpn.tar.gz/etc/openvpn

4.2.4 创建一个连接配置文件

vim /etc/openvpn/test.ovpclient 内容如下:

;dev tap

dev tun

;dev-node MyTap

;proto tcp

proto tcp

remote 192.168.2.100 1194

;remote-random

resolv-retry infinite

nobind

user nobody

group nobody

persist-key

persist-tun

;http-proxy-retry # retry on connection failures

;http-proxy [proxy server] [proxy port #]

;mute-replay-warnings

ca /etc/openvpn/ca.crt

cert /etc/openvpn/client.crt

key /etc/openvpn/client.key

ns-cert-type server

;tls-auth ta.key 1

;cipher x

comp-lzo

verb 3

;mute 20

4.2.5 检查并启动

/usr/local/openvpn/sbin/openvpn--config /etc/openvpn/test.ovpn (会显示所有启动信息)

/usr/local/openvpn/sbin/openvpn--daemon —config /etc/openvpn/test.ovpn (正式启动程序会加载到后台执行)

启动后如下图:

服务器端添加

增加路由

route add -net 2.2.2.0 netmask 255.255.255.0 dev eth2

route add -net 2.2.2.0 netmask 255.255.255.0 gw 2.2.2.1

修改 /etc/sysctl.conf forword =1

添加防火墙路由规则

iptables -t nat -A POSTROUTING -s 2.2.2.0/24 -o eth2 -j SNAT —to-source 192.168.5.100

这样就可以愉快的直接ssh到内网了。

五 备注

备注 1 :(客户端配置)

up ‘/jffs/openvpn/vpnup.sh openvpn’ #vpn tunnel up 时执行autoddvpn脚本
down ‘/jffs/openvpn/vpndown.sh openvpn’ #vpn tunnel down 时执行autoddvpn脚本
daemon # 驻留后台
client # 配置为客户端
dev tun11 # 指定tun接口名称,需跟openvpndd的配置对应,to mato firmware默认即使用tun11
proto udp # 使用udp协议,和服务器对应
remote < 服务器IP 地址>  1194 # 服务器IP地址和端口号
nobind # 客户端使用动态接口,写不写应该都一样
persist-key #vpn 通道重启时不用重新读密匙
#persist-tun # 这句不能有或要comment掉,否则vpn down的时候脚本不会生效
comp-lzo yes # 使用LZO压缩
# redirect-gateway def1 # 这句同样不能有,否则会多一条到openvpn server的默认路由,移动设备要直接连vpn把这句uncomment就好
verb 3 # 日志详细程度
ca ca.crt # 指定证书所在
cert client.crt # 指定证书所在
key client.key # 指定证书所在
log-append /tmp/openvpn.log # 日志文件所在
fragment 1300 # 指定分片设置,和服务器对应
resolv-retry infinite # 断线后始终尝试重连
keepalive 10 30 #keepavlive polling interval

备注 2 (服务器配置)

Server 使用的配置文件 server.conf

----------------CUTHere-------------

# 申明本机使用的 IP 地址,也可以不说明

;local a.b.c.d

# 申明使用的端口,默认 1194

port 1194

# 申明使用的协议,默认使用 UDP ,如果使用 HTTP proxy ,必须使用 TCP 协议

;proto tcp

proto udp

# 申明使用的设备可选 tap 和 tun , tap 是二层设备,支持链路层协议。

#tun 是 ip 层的点对点协议,限制稍微多一些,本人习惯使用 TAP 设备

dev tap

;dev tun

#OpenVPN 使用的 ROOT CA ,使用 build-ca 生成的,用于验证客户是证书是否合法

ca ca.crt

#Server 使用的证书文件

cert server.crt

#Server 使用的证书对应的 key ,注意文件的权限,防止被盗

keyserver.key# This file should be keptsecret

#CRL 文件的申明,被吊销的证书链,这些证书将无法登录

crl-verifyvpncrl.pem

# 上面提到的生成的 Diffie-Hellman 文件

dh dh1024.pem

# 这是一条命令的合集,如果你是 OpenVPN 的老用户,就知道这条命令的来由

# 这条命令等效于:

# mode server#OpenVPN 工作在 Server 模式,可以支持多 client 同时动态接入

# tls-server# 使用 TLS 加密传输,本端为 Server , Client 端为 tls-client

#

# if dev tun:# 如果使用 tun 设备,等效于以下配置

#ifconfig 10.8.0.1 10.8.0.2# 设置本地 tun 设备的地址

#ifconfig-pool 10.8.0.4 10.8.0.251# 说明 OpenVPN 使用的地址池(用于分配给客户),分别是起始地址、结束地址

#route 10.8.0.0 255.255.255.0# 增加一条静态路由,省略下一跳地址,下一跳为对端地址,这里是 :10.8.0.2

#if client-to-client:# 如果使用 client-to-client 这个选项

#push "route 10.8.0.0255.255.255.0"# 把这条路由发送给客户端,客户连接成功后自动加入路由表,省略了下一跳地址 :10.8.0.1

#else

#push "route 10.8.0.1" # 否则发送本条路由,这是一个主机路由,省略了子网掩码和下一跳地址,分别为 :255.255.255.255 10.8.0.1

#

# if dev tap:# 如果使用 tap 设备,则等效于以下命令

#ifconfig 10.8.0.1 255.255.255.0# 配置 tap 设备的地址

#ifconfig-pool 10.8.0.2 10.8.0.254 255.255.255.0# 客户端使用的地址池,分别是起始地址、结束地址、子网掩码

#push "route-gateway 10.8.0.1"# 把环境变量 route-gateway 传递给客户机

#

server 10.8.0.0255.255.255.0# 等效于以上命令

# 用于记录某个 Client 获得的 IP 地址,类似于 dhcpd.lease 文件,

# 防止 openvpn 重新启动后“忘记” Client 曾经使用过的 IP 地址

ifconfig-pool-persistipp.txt

#Bridge 状态下类似 DHCPD 的配置,为客户分配地址,由于这里工作在路由模式,所以不使用

;server-bridge10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100

# 通过 VPN Server 往 Client push 路由, client 通过 pull 指令获得 Server push 的所有选项并应用

;push "route192.168.10.0 255.255.255.0"

;push "route192.168.20.0 255.255.255.0"

#VPN 启动后,在 VPN Server 上增加的路由, VPN 停止后自动删除

;route 10.9.0.0255.255.255.252

#Run script orshell command cmd to validate client

#virtual addressesor routes. 具体查看 manual

;learn-address./script

# 其他的一些需要 PUSH 给 Client 的选项

#

# 使 Client 的默认网关指向 VPN ,让 Client 的所有 Traffic 都通过 VPN 走

;push"redirect-gateway"

#DHCP 的一些选项,具体查看 Manual

;push"dhcp-option DNS 10.8.0.1"

;push"dhcp-option WINS 10.8.0.1"

# 如果可以让 VPN Client 之间相互访问直接通过 openvpn 程序转发,

# 不用发送到 tun 或者 tap 设备后重新转发,优化 Client to Client 的访问效率

client-to-client

# 如果Client使用的CA的Common Name 有重复了,或者说客户都使用相同的CA和keys 连接 VPN ,一定要打开这个选项,否则只允许一个人连接 VPN

;duplicate-cn

#NAT 后面使用 VPN ,如果 VPN 长时间不通信, NAT Session 可能会失效,

# 导致 VPN 连接丢失,为防止之类事情的发生, keepalive 提供一个类似于 ping 的机制,

# 下面表示每 10 秒通过 VPN 的 Control 通道 ping 对方,如果连续 120 秒无法 ping 通,

# 认为连接丢失,并重新启动 VPN ,重新连接

# (对于 mode server 模式下的 openvpn 不会重新连接)。

keepalive 10 120

# 上面提到的 HMAC 防火墙,防止 DOS 攻击,对于所有的控制信息,都使用 HMAC signature,

# 没有 HMAC signature 的控制信息不予处理,注意 server 端后面的数字肯定使用 0 , client 使用 1

tls-auth ta.key 0# This file is secret

# 对数据进行压缩,注意 Server 和 Client 一致

comp-lzo

# 定义最大连接数

;max-clients 100

# 定义运行 openvpn 的用户

user nobody

group nobody

# 通过 keepalive 检测超时后,重新启动 VPN ,不重新读取 keys ,保留第一次使用的 keys

persist-key

# 通过 keepalive 检测超时后,重新启动 VPN ,一直保持 tun 或者 tap 设备是 linkup 的,

# 否则网络连接会先 linkdown 然后 linkup

persist-tun

# 定期把 openvpn 的一些状态信息写到文件中,以便自己写程序计费或者进行其他操作

statusopenvpn-status.log

# 记录日志,每次重新启动 openvpn 后删除原有的 log 信息

log/var/log/openvpn.log

# 和 log 一致,每次重新启动 openvpn 后保留原有的 log 信息,新信息追加到文件最后

;log-appendopenvpn.log

# 相当于 debug level ,具体查看 manual

verb 3

详情见本人有道笔记:

http://note.youdao.com/noteshare?id=03a21511cd0f3627eefc91acaa24034d&sub=93491E9CA21D40B0B271697AFF227C24

本文参考原文:http://timemaster.blog.51cto.com/30055/1223275

共有 人打赏支持
粉丝 9
博文 2
码字总数 4739
×
战斗的小涵
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: