企业级Open VPN实践

最近公司的VPN-PPTP出问题了,老是连接到VPN客户端就不能上网,上网就不能和其他内网节点通讯,最后逼的没办法了,换了Openvpn,整了两天,期间让峰哥给我补习了一大堆的网络知识,终于OK了;话不多说,开撸。。。

Openvpn是什么

将两个不同的网段打通一条通道,可以互相访问,对于运维人员来说主要是为了安全,因为OpenVPNssl加密机制,增加了密码的安全度,运维人员可以自定义ip段进行管理服务器,简单点说,安全方便。


 

查看系统环境

CentOS release 6.7 (Final) 2.6.32-573.26.1.el6.x86_64

cat /dev/net/tun

File descriptor in bad state

安装基本的包:

yum install gcc gcc-c++
yum install -y lzo lzo-devel
yum install -y openssl openssl-devel

下载openven

mkdir /home/download
cd /home/download/
wget http://www.openvpn.net/release/openvpn-2.0.9.tar.gz
tar xf openvpn-2.0.9.tar.gz 
cd openvpn-2.0.9
./configure -prefix=/usr/local/openvpn && make && make install
mkdir /etc/openvpn
cp -R /home/download/openvpn-2.0.9/easy-rsa/ /etc/openvpn
cd /etc/openvpn/easy-rsa/2.0/
vim vars
#修改最后一段 
export KEY_COUNTRY="CN"
export KEY_PROVINCE="BJ"    
export KEY_CITY="beijing"
export KEY_ORG="OpenVPN ORG"
export KEY_EMAIL="bob@qq.com"

脚本的作用

vars 初始化用的

clean-all #初始化key,将会删除所有keys所有文件

build-ca #生成ca证书,服务端专用

build-dh #生成Diffie-Hellman文件,服务端专有

build-key-server #生成服务器端密钥(交互)

build-key #生成客户端密钥(交互)

pkitool #脚本,直接使用vars的环境变量设置直接生成证书(非交互)

. ./vars                                    #注意有空格
./clean-all     
./build-ca      
./build-dh      
./build-key-server bob
cd keys
cp ca.crt ca.key bob.crt bob.key dh1024.pem /etc/openvpn/
./build-key client-bob                      #这两个key一定要统一

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

打包,以便客户端vpn使用

cd keys/
mkdir test-key
cp ca.crt ca.key client-bob.* test-key/
tar -zcvf test-key.tar.gz test-key/
userkey/
userkey/ca.key
userkey/client-bob.key
userkey/client-bob.crt
userkey/ca.crt
userkey/client-bob.csr

配置文件

 cp /home/download/openvpn-2.0.9/sample-config-files/server.conf /etc/openvpn/openvpn.conf

vim /etc/openvpn/openvpn.conf

local 192.168.56.1
proto tcp
port 1194       
ca /etc/openvpn/ca.crt
cert /etc/openvpn/bob.crt
key /etc/openvpn/bob.key  # This file should be kept secret
dh /etc/openvpn/easy-rsa/2.0/keys/dh1024.pem
push "route 172.16.1.0 255.255.255.0"       #添加一条内网的路由,即可访问172
server 172.16.0.0 255.255.255.0             #分配给客户的地址池
client-to-client
user nobody
group nobody
status /var/log/openvpn-status.log
log         /var/log/openvpn.log
log-append  /var/log/openvpn.log

启动

/usr/local/openvpn/sbin/openvpn --daemon --config /etc/openvpn/openvpn.conf
netstat -lntup|grep 1194
tcp        0      0 192.168.56.11:1194          0.0.0.0:*                   LISTEN      21506/openvpn

客户端

客户端主要就是安装一个exe文件,下一步下一步,把之前打包的客户端文件放入安装目录即可

客户端 配置文件改动不是很多:

proto tcp
remote  192.168.56.11 1194
user nobody
group nobody
ca ca.crt
cert client-bob.crt
key client-bob.key

设置访问局域网

目前为止,现在的客户端还是不能访问局域网的,因为没有回去的网关,大家可以用tcpdump抓一下包。要想可以访问局域网的机器有两种办法:

添加返回路由/网关

1)如果局域网客户端的默认网关是VPNserver的内网地址的话就不用设置,如果默认网关不是VPNsever那么需要添加一条命令

route add -net 10.8.0.0/24 gw 172.16.1.11(VPNserver内网网卡)

去10.8.0.0目的地址的包从172.16.1.11走

优点:配置完立竿见影
缺点:如果有多台,每个VPN客户端都需要配置网络路由(重启后失效)

2)NAT模式

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth1 -j SNAT --to 172.16.1.11

将地址池里的地址在离开防火墙的时候转成172.16.1.11,这样访问后端的节点就成了VPNserver内网与局域网内网IP之间的访问

优点:不需在每个局域网内的机器内配置网关等操作;比较便捷
缺点:需要iptables的生效(2-5分钟),不是即时稳定的,对于iptables不是很熟的话,不推荐


server 172.16.0.0 255.255.255.0             #分配的地址池
push "route 172.16.0.0 255.255.255.0"       #push路由
push "redirect-gateway"                     #push网关
push "dhcp-option DNS 8.8.8.8"              #pushDNS
push "dhcp-option DNS 192.168.56.2"             

iptables -t nat -A POSTROUTING -s 172.16.0.0/24 -d 10.0.0.0/8 -j SNAT --to 内网地址
iptables -t nat -A POSTROUTING -s 172.16.0.0/24 -j SNAT --to 外网地址

代理功能

目前为止,客户机虽然能上网,但是走的却是本地自己的网络,如果想要通过VPN上网还需要在配置文件中打开以下功能,很简单,就三行


参考与这位仁兄,很详细http://blog.sina.com.cn/s/blog_5790709f0101nce3.html

发表评论