vpn之openvpn实战搭建

3年前 (2017-09-11) gtj linux, WEB应用 0评论 已收录 195℃

一:openvpn简介

1.OpenVPN是一个用于创建虚拟专用网络(Virtual Private Network)加密通道的免费开源软件。使用OpenVPN可以方便地在家庭、办公场所、住宿酒店等不同网络访问场所之间搭建类似于局域网的专用网络通道。OpenVPN使用方便,运行性能优秀,支持Solaris、Linux 2.2+(Linux 2.2+表示Linux 2.2及以上版本,下同)、OpenBSD 3.0+、FreeBSD、NetBSD、Mac OS X、Android和Windows 2000+的操作系统,并且采用了高强度的数据加密,再加上其开源免费的特性,使得OpenVPN成为中小型企业及个人的VPN首选产品。
使用OpenVPN配合特定的代理服务器,可用于访问Youtube、FaceBook、Twitter等受限网站,也可用于突破公司的网络限制。由于OpenVPN支持UDP协议,还可以配合HTTP代理(HTTP Proxy)使用,使得只要是能够打开网站或上QQ的地方,就可以访问外部的任何网站或其他网络资源。

2.openvpn基于ssl vpn的软件

使用了openssl及sslv3/Tlsv1协议
c/s架构的软件,需要单独安装openvpn客户端

3.openvpn和其他vpn的场景选择

a.个人拨号选择openvpn,功能强大,稳定可靠。
b.如果不希望单独安装客户端拨号,则可选择pptp.(pptp好多地方不支持)
c.多个企业之间或者多个IDC机房直接互联,选择ipsecvpn或者openvpn.

二.openvpn搭建架构图及环境准备

1.实验架构图


2.模拟环境ip准备

vpserver:
eth0      Link encap:Ethernet  HWaddr 00:0C:29:09:9C:5F  
          inet addr:10.0.0.72 
GW:10.0.0.2
eth1      Link encap:Ethernet  HWaddr 00:0C:29:09:9C:69  
          inet addr:192.168.112.129
app client server
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.112.130
本机windows客户端ip:10.20.23.24

3.开启路由转发

[root@client ~]# echo "net.ipv4.ip_forward=1" >>/etc/sysctl.conf
[root@client ~]# sysctl -p
net.ipv4.ip_forward = 1

4.linux系统环境

[root@master ~]# cat /etc/redhat-release 
CentOS release 6.5 (Final)
[root@master ~]# uname -r
2.6.32-696.10.1.el6.x86_64
[root@master ~]# uname -m
x86_64
时间同步:
ntpdate 10.0.2.2

二:openvpn生产环境部署

1.安装openvpn

cd  /usr/local/src
wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.10.tar.gz
tar  zxf  lzo-2.10.tar.gz 
yum install -y gcc
cd lzo-2.10
./configure 
make &&make install 
cd ..
[root@master openvpn-2.3.6]# rpm -qa openssl
openssl-1.0.1e-15.el6.x86_64
yum install -y openssl* 
yum install -y lzo lzo-devel
yum install -y  gcc gcc-c++ openssl openssl-devel lzo lzo-devel pam pam-devel automake 
wget https://swupdate.openvpn.org/community/releases/openvpn-2.3.6.tar.gz
tar -zxf  openvpn-2.3.6.tar.gz
cd openvpn-2.3.6
./configure  --with-lzo-headers=/usr/local/lzo/include    --with-lzo-lib=/usr/local/lzo/lib  --with-ssl-headers=/usr/include/openssl --with-ssl-lib=/usr/lib
 make &&make install

2.OpenVPN 配置文件配置:

yum install -y git 
git clone https://github.com/OpenVPN/easy-rsa
mkdir /etc/openvpn 
cp sample/sample-config-files/server.conf /etc/openvpn/

3.密钥生成工具

wget https://github.com/OpenVPN/easy-rsa/archive/release/2.x.zip
 unzip 2.x.zip 
cp -ra easy-rsa-release-2.x/easy-rsa/2.0 /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa

修改vars

vi vars
export KEY_COUNTRY="CN"
export KEY_PROVINCE="Shanghai"
export KEY_CITY="Shanghai"
export KEY_ORG="gtj"
export KEY_EMAIL="258818040@qq.com"
export KEY_OU="IT"

# X509 Subject Field
export KEY_NAME="gtj"


root@master easy-rsa]# source vars 
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys
清除没用的 keys 文件,确认当前目录下已经没有可用的 key 文件
 ./clean-all 
建立根 CA 证书
 ./build-ca 




4.建立 server key

./build-key-server server


参考:

# ./build-key-server server
………省略一些输出……………,以下全部是一些交互,大部分直接回车就好了
Country Name (2 letter code) [CN]:CN # 国家字母代码,也就是 CN 了
State or Province Name (full name) [FJ]:FJ # 省或者州名,其实这些交互信息我们已经在 var 文件编写过了
Locality Name (eg, city) [FZ]:FZ # 城市名
Organization Name (eg, company) [netgaming]:netgaming # 组织名称,例如公司
Organizational Unit Name (eg, section) []:766 # 单位名称
Common Name (eg, your name or your server's hostname) [server]:server
Email Address [support@766.com]:support@766.com # E-mail 地址
A challenge password []:xxxoopwd^Hc1 # 密码,配置 client 要用
An optional company name []:766 # 公司名,可选
Using configuration from /usr/local/src/software/openvpn-2.0.9/easy-rsa/2.0/openssl.cnf
Check that the request matches the signature
Signature ok
### 以下是对交互内容的结果
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'CN'
stateOrProvinceName :PRINTABLE:'FJ'
localityName :PRINTABLE:'FZ'
organizationName :PRINTABLE:'netgaming'
organizationalUnitName:PRINTABLE:'766'
commonName :PRINTABLE:'server'
emailAddress :IA5STRING:'support@766.com'
Certificate is to be certified until Sep 1 06:11:47 2019 GMT (3650 days)
Sign the certificate? [y/n]:y # 确认是否签证
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

5.生成客户端 key,和 server key 类似

非加密认证的产生key的方式。

6.build-dh 生成 dh 文件

生成传输进行秘钥交换时用到的交换秘钥协议文件
./build-dh

7.生产防ddos攻击文件:

openvpn --genkey --secret keys/ta.key
[root@master easy-rsa]# ls keys/ta.key 
keys/ta.key
cp -ap keys ./../

8.服务端 server.conf 配置如下:

mkdir /etc/openvpn 
cp sample/sample-config-files/server.conf /etc/openvpn/
cp /usr/local/src/openvpn-2.3.6/sample/sample-config-files/client.conf /etc/openvpn/
[root@master openvpn]# tree
├── keys
│   ├── 01.pem
│   ├── 02.pem
│   ├── 03.pem
│   ├── ca.crt
│   ├── ca.key
│   ├── client.crt
│   ├── client.csr
│   ├── client.key
│   ├── dh2048.pem
│   ├── gtj.crt
│   ├── gtj.csr
│   ├── gtj.key
│   ├── index.txt
│   ├── index.txt.attr
│   ├── index.txt.attr.old
│   ├── index.txt.old
│   ├── serial
│   ├── serial.old
│   ├── server.crt
│   ├── server.csr
│   ├── server.key
│   └── ta.key
└── server.conf

cp server.conf server.conf.ori 

参考:

grep -Ev '^($|#)' server.conf
;local a.b.c.d #指定监听的本机IP(因为有些计算机具备多个IP地址),该命令是可选的,默认监听所有IP地址。
port 22033 #服务端端口号,根据需要自行修改
proto tcp #通过tcp协议来连接,也可以通过udp,看实际的需求
;proto udp
;dev tap
dev tun #路由模式,注意windows下必须使用dev tap
;dev-node MyTap #非Windows系统通常不需要设置这个
ca ca.crt #ca证书存放位置,这边是放在默认路径下的不需要修改,如果放在其他路径下,后面要加上绝对路径,根据实际情况更改
cert server.crt #服务器证书存放位置,这边是放在默认路径下的不需要修改,如果放在其他路径下,后面要加上绝对路径,根据实际情况更改
key server.key #服务器密钥存放位置,这边是放在默认路径下的不需要修改,如果放在其他路径下,后面要加上绝对路径,根据实际情况更改
dh dh2048.pem #dh2048.pem存放位置,这边是放在默认路径下的不需要修改,如果放在其他路径下,后面要加上绝对路径,根据实际情况更改
;topology subnet
server 10.188.0.0 255.255.0.0 #虚拟局域网网段设置,请根据需要自行修改
ifconfig-pool-persist ipp.txt #在openvpn重启时,再次连接的客户端将依然被分配和以前一样的IP地址
;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100
;server-bridge
;push "route 192.168.10.0 255.255.255.0"
;push "route 192.168.20.0 255.255.255.0"
push "route 0.0.0.0 0.0.0.0" #全网走openvpn
;client-config-dir ccd
;route 192.168.40.128 255.255.255.248
;client-config-dir ccd
;route 10.9.0.0 255.255.255.252
;learn-address ./script
push "redirect-gateway def1 bypass-dhcp" #客户端所有网络通信通过vpn,这个可以选择的,如果注释掉的话那就是本地的数据包还是从本地出去,不强制走VPN
push "dhcp-option DNS 8.8.8.8" #指定客户端使用的主DNS
push "dhcp-option DNS 8.8.4.4" #指定客户端使用的备DNS
client-to-client #开启客户端互访
duplicate-cn #支持一个证书多个客户端登录使用,建议不启用
keepalive 5 30 #服务端5面监测一次,如果30秒没响应就认定客户端down了
tls-auth ta.key 0 #防DDOS攻击,服务器端0,客户端1
;cipher BF-CBC # Blowfish (default) #这是默认的加密算法
;cipher AES-128-CBC # AES
;cipher DES-EDE3-CBC # Triple-DES
comp-lzo #允许数据压缩,如果启用了客户端配置文件也需要有这项
max-clients 100 #最大客户端并发连接数量
user nobody #定义运行openvpn的用户
group nobody #定义运行openvpn的用户组
persist-key #通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys
persist-tun #通过keepalive检测超时后,重新启动VPN,一直保持tun或者tap设备是linkup的,否则网络连接会先linkdown然后linkup
status /tmp/openvpn-status.log #定期把openvpn的一些状态信息写到文件中,以便自己写程序计费或者进行其他操作
;log openvpn.log #记录日志,每次重新启动openvpn后删除原有的log信息
log-append /tmp/openvpn.log #记录日志,每次重新启动openvpn后追加原有的log信息
verb 3 #设置日志要记录的级别,可选0-9,0 只记录错误信息,4 能记录普通的信息,5 和 6 在连接出现问题时能帮助调试,9 是极端的,所有信息都会显示,甚至连包头等信息都显示(像tcpdump)
mute 20 #相同信息的数量,如果连续出现 20 条相同的信息,将不记录到日志中。
[root@master openvpn]# grep -vE '^#|^;|^$' /etc/openvpn/server.conf 
local 10.0.0.72
port 1194
proto tcp
dev tun
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key  
dh /etc/openvpn/keys/dh2048.pem
server 10.8.0.0 255.255.255.0
push "route 192.168.122.0  255.255.255.0"
ifconfig-pool-persist ipp.txt
keepalive 10 120
comp-lzo
persist-key
persist-tun
status openvpn-status.log
verb 3
client-to-client
duplicate-cn
log /var/log/openvpn.log
9.设置 OpenVPN 服务器 reboot 后自动启动 openvpn
 vi /etc/rc.local
 /usr/local/sbin/openvpn --config /etc/openvpn/server.conf &
启动 OpenVPN
 /usr/local/sbin/openvpn --config /etc/openvpn/server.conf &



[root@master openvpn]# ifconfig

三:openvpn客户端

1.安装windows客户端

http://swupdate.openvpn.org/community/releases/openvpn-install-2.3.6-I603-x86_64.exe

双击安装,默认即可。

[root@master keys]# sz -y ca.crt ./../client.conf client.crt  client.key 
放在C:\Program Files\OpenVPN\config下
[root@master openvpn]# egrep -v "^#|^;|^$" client.conf 
client
dev tun
proto tcp
remote 10.0.0.72 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
remote-cert-tls server
comp-lzo
verb 3

配置文件client.ovpn





客户端已经连上



2.测试

目前本机ip是ping能ping到内容192.168.112.130,但是没有返回。
tcpdump -nnn -s 10000 |grep -i icmp
现在可以在appserver上添加默认网关为vpnserver内网地址的方式
[root@client ~]# route add default gw 192.168.112.129


第二种方式:
当vpn客户端的gw不是vpnserver内网地址的时候,所有的vpn客户端都要加网络路由,命令如下
route add -net 10.8.0.0/24 gw 192.168.122.129,如果当vpn客户端的gw是vpnserver内网地址的时候,无需加路由了。
第三种方式(推荐这种方式):
适用于APPclient的网关不是vpnserver的场景。
可以在vpnserver上把10.8.0.6的地址转化为192.168.122.129地址,然后就可以访问了,

/etc/init.d/iptables stop
/etc/init.d/iptables stop
/sbin/iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth1 -j SNAT --to-source 192.168.122.129
/sbin/iptables -t nat  -I POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth1 -j MASQUERADE  #动态ip转化为静态IP
iptables -t nat -L -n

window客户端10.20.23.24可以直接ping 192.168.112.130的地址。


通过tcpdump -nnn -s 10000 |grep -i icmp查看ping的过程


搭建成功。
四:本次架构关于linux端演示就不在描述了。相关OpenVPN实现双IDC互联,及多机房互联架构和本实验类似,调整下参数等就能实现了。

博主

这货来去如风,什么鬼都没留下!!!

相关推荐

嗨、骚年、快来消灭0回复。

×
订阅图标按钮
Less is more!!!