记录日常工作关于系统运维,虚拟化云计算,数据库,网络安全等各方面问题。
 
0

本文主要讲述如何在Linux(以CentOS6.7为例)环境中搭建VPN(OpenVPN)服务器。

 

搭建实验环境:

实验环境可以通过VMware等虚拟化软件软件模拟,OpenVPN服务端可以单网卡也可以双网卡,单网卡无非就是在原先网卡的基础上配置一个虚拟网卡,此处以双网卡为例。

实验环境拓扑图如下:

OpenVPN

(1)VPN客户端A:

Windows 8 + OpenVPN 2.3.4 x86_64-w64-mingw32 [SSL (OpenSSL)] [LZO] [PKCS11] [IPv6] built on Jun  5 2014

网卡1:192.168.1.228

(2)VPN服务器B:

CentOS release 6.7 (Final)

Linux localhost.localdomain 2.6.32-573.3.1.el6.x86_64 #1 SMP Thu Aug 13 22:55:16 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

OpenVPN版本:OpenVPN 2.3.8 (git source)

网卡1:192.168.1.182

网卡2:10.20.0.129

(3)服务器C(用于进一步测试VPN连通性):

网卡1:192.168.1.113(假设没有此地址,此地址与本次实验无关,之所以列出是为了不使读者阅读下面的内容时感到困惑)

网卡2:10.20.0.130

OpenVPN安装步骤:

S1.安装基本软件包,用于编译安装openvpn和解决openvpn相关的依赖包

1
2
3
4
5
6
7
yum -y install gcc gcc-c++    
yum -y install autoconf     
yum -y install automake     
yum -y install libtool     
yum -y install gettext     
yum -y install lzo lzo-devel     
yum -y install pam-devel

S2.从github获得OpenVPN的源码,选择一个稳定版本的分支,生成configure等文件,编译安装

1
2
3
4
5
6
git clone git@github.com:OpenVPN/openvpn.git    
git checkout -b 2.3 remotes/origin/release/2.3     
autoreconf -i -v -f     
./configure --prefix=/usr/local/openvpn     
make     
make install

S3.配置OpenVPN服务端

S3.1配置OpenVPN

1
2
3
4
5
cp distro/rpm/openvpn.init.d.rhel /etc/init.d/openvpn    
ln -s /usr/local/openvpn/sbin/openvpn /usr/sbin/openvpn     
mkdir /usr/local/openvpn/etc     
ln -s /usr/local/openvpn/etc /etc/openvpn     
cp sample/sample-config-files/server.conf /etc/openvpn/

S3.2编辑OpenVPN主配置文件,上一步的配置文件sample-config中的注释能帮助你很好的理解每一个字段的内容,在此就不详细讲解了,一看就懂。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
vim /etc/openvpn/server.conf    
    # grep -v ^# /etc/openvpn/server.conf | grep -v ^$ | grep -v ^\;     
    port 1194     
    proto udp     
    dev tun     
    ca ca.crt     
    cert server.crt     
    key server.key  # This file should be kept secret     
    dh dh2048.pem     
    server 10.8.0.0 255.255.255.0     
    ifconfig-pool-persist ipp.txt     
    push "route 10.20.0.0 255.255.255.0"  
    push "dhcp-option DNS 114.114.114.114"     
    push "dhcp-option DNS 8.8.4.4"     
    client-to-client     
    duplicate-cn     
    keepalive 10 120     
    comp-lzo     
    persist-key     
    persist-tun     
    status openvpn-status.log     
    log         openvpn.log     
    verb 3

S4.配置OpenVPN服务器和客户端证书,使客户端通过证书登录OpenVPN

S4.1从github获得easy-RSA的源码,用于生成服务端、客户端证书,可以用openssl工具单独生成

1
2
3
4
cd    
git clone git@github.com:OpenVPN/easy-rsa.git     
git checkout -b 2.x remotes/origin/release/2.x     
cd easy-rsa/easy-rsa/2.0/

S4.2编辑证书配置信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
vim vars    
    # grep -v ^# vars | grep -v ^$     
    export EASY_RSA="`pwd`"     
    export OPENSSL="openssl"     
    export PKCS11TOOL="pkcs11-tool"     
    export GREP="grep"     
    export KEY_CONFIG=`$EASY_RSA/whichopensslcnf $EASY_RSA`     
    export KEY_DIR="$EASY_RSA/keys"     
    echo NOTE: If you run ./clean-all, I will be doing a rm -rf on $KEY_DIR     
    export PKCS11_MODULE_PATH="dummy"     
    export PKCS11_PIN="dummy"     
    export KEY_SIZE=2048     
    export CA_EXPIRE=3650     
    export KEY_EXPIRE=3650     
    export KEY_COUNTRY="CN"     
    export KEY_PROVINCE="Shandong"     
    export KEY_CITY="Qingdao"     
    export KEY_ORG="51devops"     
    export KEY_EMAIL="chris@51devops.com"     
    export KEY_OU="chris"     
    export KEY_NAME="EasyRSA"

S4.3.生成服务器证书,包括CA和Server证书  

1
2
3
4
5
source vars     
./clean-all     
./pkitool --initca     
./pkitool --server server     
./build-dh

S4.4.生成客户端证书  

1
2
3
4
5
6
# ./pkitool client-christhinkt430     
./pkitool --pkcs12 client-christhinkt430
\cp -f keys/ca.crt /etc/openvpn/    
\cp -f keys/server.crt /etc/openvpn/     
\cp -f keys/server.key /etc/openvpn/     
\cp -f keys/dh2048.pem /etc/openvpn/

S5.启动OpenVPN服务,准备测试

开启内核转发参数:

1
2
3
4
vim /etc/sysctl.conf
net.ipv4.conf.default.accept_source_route = 1
net.ipv4.conf.default.rp_filter = 0
net.ipv4.ip_forward = 1

配置iptables内网转发并启动OpenVPN服务

1
2
3
4
iptables -I INPUT -m state --state NEW -m udp -p udp --dport 1194 -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth1 -j MASQUERADE
service iptables save || iptables-save > /etc/sysconfig/iptables
service openvpn start

如果iptables提示nat有问题(具体问题当时没有截图和文字记录),可能是因为模块没有加载,可以通过“modprobe iptable_nat”命令加载nat模块,再通过“lsmod  | grep nat”命令确认它已经正确加载到内核中。

此处额外列一下iptables文件(/etc/sysconfig/iptables)的内容,以便于参考:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Generated by iptables-save v1.4.7 on Tue Sep 15 09:50:41 2015   
*filter    
:INPUT ACCEPT [95751:71225675]    
:FORWARD ACCEPT [2:120]    
:OUTPUT ACCEPT [18830:1205082]    
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT    
-A INPUT -p icmp -j ACCEPT    
-A INPUT -i lo -j ACCEPT    
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT    
-A INPUT -p udp -m state --state NEW -m udp --dport 1194 -j ACCEPT    
#-A INPUT -j REJECT --reject-with icmp-host-prohibited    
#-A FORWARD -j REJECT --reject-with icmp-host-prohibited    
COMMIT    
# Completed on Tue Sep 15 09:50:41 2015    
# Generated by iptables-save v1.4.7 on Tue Sep 15 09:50:41 2015    
*nat    
:PREROUTING ACCEPT [8758:1233668]    
:POSTROUTING ACCEPT [467:144522]    
:OUTPUT ACCEPT [466:144462]    
-A POSTROUTING -s 10.8.0.0/24 -o eth1 -j MASQUERADE    
COMMIT    
# Completed on Tue Sep 15 09:50:41 2015

image

查看OpenVPN服务器B上的日志

image

OpenVPN服务器B上的网卡信息

image

OpenVPN 服务器上显示的Client连接日志信息

image

服务器B上的网卡和IP信息

2015-09-07_181952

OpenVPN客户端上的IP信息(上面显示子网掩码为255.255.255.252先可以忽略,不影响连接)

image

S6.将S4.4步骤中生成的客户端证书传输到Windows客户端上,配置Windows的OpenVPN客户端使之能连接OpenVPN服务器

客户端的证书同样也在/root/easy-rsa/easy-rsa/2.0/keys路径下,只需要client-christhinkt430.p12这个证书即可。

Windows如何安装将证书放到OpenVPN安装路径下的config文件夹下即可,并创建一个.ovpn的配置文件。配置文件内容如下:

1
2
3
4
5
6
7
8
9
remote 192.168.1.182 1194 udp   
persist-key    
tls-client    
pull    
dev tun    
persist-tun    
comp-lzo adaptive    
nobind    
pkcs12 client-christhinkt430.p12

image

用管理员权限打开OpenVPN客户端,选择“connect”即可,如果连接成功,会有如下提示信息,原先的灰色小图标也会变成绿色。

image

image

此时就可以连接OpenVPN服务器后端的内网地址了,如下图所示,表示连接成功。

image

简单总结:

配置OpenVPN的一些难点或技巧:

1.如果不翻墙,获取OpenVPN安装包和文档支持比较困难,可以通过github的方式解决,要通过合适的branch选择合适的release以及客户端等

2.iptables防火墙的POSTROUTING、MASQUERADE需要理解,它的原理就是通过SNAT将某一段网络的地址转化(封装、伪装)成某一个网卡上的地址,以达到内网穿透的目的

例如iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth1 -j MASQUERADE,它的意思是源地址为10.8.0.0/24网段时,将这些地址伪装成eth1网卡的地址,实现内网穿透,例如10.8.0.6(OpenVPN客户端地址)这个地址要访问10.20.0.130(服务器B地址)时,实际是通过10.20.0.129(OpenVPN服务器eth1的地址)这个地址出去的。



转载请标明出处【CentOS6.7 搭建OpenVPN服务器。】。

《www.micoder.cc》 虚拟化云计算,系统运维,安全技术服务.

网站已经关闭评论