本文主要讲述如何在Linux(以CentOS6.7为例)环境中搭建VPN(OpenVPN)服务器。
OpenVPN基本介绍:
OpenVPN是开源的VPN守护进程(daemon),easy-RSA提供一些简易的CA证书工具。
VPN原理:
简单讲就是客户端主机A通过与vpn服务器B建立连接(可以是TCP也可以是UDP),通过vpn客户端在客户端主机A上创建一个虚拟网卡a(VPN客户端与VPN服务器端连接建立后形成),这个虚拟网卡a通过VPN服务器开放的端口与VPN服务器B上的另一块虚拟网卡b(VPN服务启动后形成)建立所谓的“私有连接”通道,在连接成功后,根据VPN服务器B上的配置,在客户端主机A上建一条路由,根据这一条路由使得客户机A想访问某些特定网络(特定网络可以有多条)时就走这条VPN通道,实现网络VPN实际上就是一个代理的作用,相当于一个踏板。
搭建实验环境:
实验环境可以通过VMware等虚拟化软件软件模拟,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相关的依赖包
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等文件,编译安装
git clone [email protected]: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
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中的注释能帮助你很好的理解每一个字段的内容,在此就不详细讲解了,一看就懂。
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工具单独生成
cd git clone [email protected]:OpenVPN/easy-rsa.git git checkout -b 2.x remotes/origin/release/2.x cd easy-rsa/easy-rsa/2.0/
S4.2编辑证书配置信息
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="[email protected]" export KEY_OU="chris" export KEY_NAME="EasyRSA"
S4.3.生成服务器证书,包括CA和Server证书
source vars ./clean-all ./pkitool --initca ./pkitool --server server ./build-dh
S4.4.生成客户端证书
# ./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服务,准备测试
开启内核转发参数:
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服务
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)的内容,以便于参考:
# 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
查看OpenVPN服务器B上的日志
OpenVPN服务器B上的网卡信息
OpenVPN 服务器上显示的Client连接日志信息
服务器B上的网卡和IP信息
OpenVPN客户端上的IP信息(上面显示子网掩码为255.255.255.252先可以忽略,不影响连接)
S6.将S4.4步骤中生成的客户端证书传输到Windows客户端上,配置Windows的OpenVPN客户端使之能连接OpenVPN服务器
客户端的证书同样也在/root/easy-rsa/easy-rsa/2.0/keys路径下,只需要client-christhinkt430.p12这个证书即可。
Windows如何安装将证书放到OpenVPN安装路径下的config文件夹下即可,并创建一个.ovpn的配置文件。配置文件内容如下:
remote 192.168.1.182 1194 udp persist-key tls-client pull dev tun persist-tun comp-lzo adaptive nobind pkcs12 client-christhinkt430.p12
用管理员权限打开OpenVPN客户端,选择“connect”即可,如果连接成功,会有如下提示信息,原先的灰色小图标也会变成绿色。
此时就可以连接OpenVPN服务器后端的内网地址了,如下图所示,表示连接成功。
简单总结:
配置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的地址)这个地址出去的。
最后列举一些可供参考的文章:
1.Linux下OpenVPN配置 http://blog.chinaunix.net/uid-26835604-id-3484906.html
2.iptables中SNAT、DNAT和MASQUERADE的含义 http://blog.csdn.net/jk110333/article/details/8229828
3.Ubuntu Simple Client Configuration https://help.ubuntu.com/lts/serverguide/openvpn.html#openvpn-simple-client-configuration
tag: Linux配置OpenVPN,Linux安装OpenVPN,OpenVPN配置,OpenVPN防火墙配置,CentOS编译安装OpenVPN
--end--