CentOS6.7 搭建OpenVPN服务器。
本文主要讲述如何在Linux(以CentOS6.7为例)环境中搭建VPN(OpenVPN)服务器。
搭建实验环境:
实验环境可以通过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相关的依赖包
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 |
查看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的配置文件。配置文件内容如下:
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 |
用管理员权限打开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的地址)这个地址出去的。
目录 返回
首页