多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
环境: openserver服务器: 操作系统:CentOS Linux release 7.4 (Core) 外网IP:103.45.10.148/255.255.255.192 内网IP: 10.45.10.148/255.255.255.192 内网服务器: slave01: 操作系统:CentOS Linux release 7.4 (Core) 内网IP: 10.45.10.151/255.255.255.192 slave02: 操作系统:CentOS Linux release 7.4 (Core) 内网IP: 10.45.29.216/255.255.255.192 第一部分:安装openvpn服务器 1、配置yum源 ~~~ [root@openvpn ~]# cd /etc/yum.repos.d/ [root@openvpn yum.repos.d]# ll total 8 -rw-r--r-- 1 root root 1624 Oct 25 14:14 CentOS-Base.repo -rw-r--r-- 1 root root 927 Mar 8 12:00 epel.repo (这里配置了yum源,就不需要配置咯) ~~~ 2、配置时间同步 ![](https://box.kancloud.cn/497aaa28f9b2e6f43181b47f2100834a_929x239.png) 如果不同步,配置如下 ~~~ [root@openvpn ~]# ntpdate time1.aliyun.com 14 Mar 20:18:15 ntpdate[27719]: adjust time server 203.107.6.88 offset 0.301728 sec [root@manager ~]# crontab -e #sync data */2 * * * * /usr/sbin/ntpdate time1.aliyun.com &>/dev/null 2>&1 ~~~ 3、安装依赖关系及下载openvpn2.3.16软件 * 安装依赖包 [root@openvpn ~]# yum -y install openssh-server lzo openssl openssl-devel pam-devel lzo-devel * 下载相应软件包 ~~~ [root@openvpn ~]# cd /opt/tools/ [root@openvpn tools]# wget http://soft.51yuki.cn/openvpn-2.3.16.tar.gz [root@openvpn tools]# wget http://soft.51yuki.cn/EasyRSA-2.2.2.tgz ~~~ * 编译安装openvpn2.3.16 ~~~ [root@openvpn tools]# tar xf openvpn-2.3.16.tar.gz [root@openvpn tools]# cd openvpn-2.3.16/ [root@openvpn openvpn-2.3.16]# ./configure --prefix=/usr/local/openvpn && make && make install 进入/usr/local/openvpn,然后新建2个目录server和client [root@openvpn openvpn]# pwd /usr/local/openvpn [root@openvpn openvpn]# mkdir server [root@openvpn openvpn]# mkdir client [root@openvpn server]# ln -sv /usr/local/openvpn/sbin/openvpn /usr/sbin/openvpn ‘/usr/sbin/openvpn’ -> ‘/usr/local/openvpn/sbin/openvpn’ ~~~ * 通过EasyRSA中的各脚本生成证书 ~~~ 1)解压EasyRSA-2.2.2.tgz,并把解压后的目录拷贝到/usr/local/openvpn [root@openvpn openvpn]# cd /opt/tools/ [root@openvpn tools]# tar xf EasyRSA-2.2.2.tgz [root@openvpn tools]# cp -rf EasyRSA-2.2.2 /usr/local/openvpn/ [root@openvpn tools]# cd /usr/local/openvpn/EasyRSA-2.2.2/ [root@openvpn EasyRSA-2.2.2]# 2)编辑vars文件(以后生成证书的时候,就会读取这个文件) [root@openvpn EasyRSA-2.2.2]# cp vars{,.ori} [root@openvpn EasyRSA-2.2.2]# vim vars export KEY_COUNTRY="CN" export KEY_PROVINCE="SH" export KEY_CITY="shanghai" export KEY_ORG="Pet" export KEY_EMAIL="xhh_198605@163.com" export KEY_OU="Ops" [root@openvpn EasyRSA-2.2.2]# source vars NOTE: If you run ./clean-all, I will be doing a rm -rf on /usr/local/openvpn/EasyRSA-2.2.2/keys [root@openvpn EasyRSA-2.2.2]# ./clean-all 3)生成ca证书 [root@openvpn EasyRSA-2.2.2]# ./build-ca Generating a 2048 bit RSA private key ................+++ .....................................+++ writing new private key to 'ca.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [CN]: State or Province Name (full name) [SH]: Locality Name (eg, city) [shanghai]: Organization Name (eg, company) [Pet]: Organizational Unit Name (eg, section) [Ops]: Common Name (eg, your name or your server's hostname) [Pet CA]: Name [EasyRSA]: Email Address [xhh_198605@163.com]: 4)生成交换密钥 [root@openvpn EasyRSA-2.2.2]# ./build-dh Generating DH parameters, 2048 bit long safe prime, generator 2 This is going to take a long time 5)生成服务器端证书 [root@openvpn EasyRSA-2.2.2]# ./build-key-server server Generating a 2048 bit RSA private key .........................................................+++ ...................................................................................................................................+++ writing new private key to 'server.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [CN]: State or Province Name (full name) [SH]: Locality Name (eg, city) [shanghai]: Organization Name (eg, company) [Pet]: Organizational Unit Name (eg, section) [Ops]: Common Name (eg, your name or your server's hostname) [server]: Name [EasyRSA]: Email Address [xhh_198605@163.com]: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Using configuration from /usr/local/openvpn/EasyRSA-2.2.2/openssl-1.0.0.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'CN' stateOrProvinceName :PRINTABLE:'SH' localityName :PRINTABLE:'shanghai' organizationName :PRINTABLE:'Pet' organizationalUnitName:PRINTABLE:'Ops' commonName :PRINTABLE:'server' name :PRINTABLE:'EasyRSA' emailAddress :IA5STRING:'xhh_198605@163.com' Certificate is to be certified until Mar 12 05:40:43 2028 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 6)生成客户端证书(一般这个有很多,一般根据员工的名字来命名证书,例如如下) [root@openvpn EasyRSA-2.2.2]# ./build-key-pass louis (louis表示员工的命名) Generating a 2048 bit RSA private key ..........................................+++ ...............................................................................................................................+++ writing new private key to 'louis.key' Enter PEM pass phrase: 输入密码 Verifying - Enter PEM pass phrase: 输入密码 (这个密码是客户端拨vpn的时候,需要输入这个密码) ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [CN]: State or Province Name (full name) [SH]: Locality Name (eg, city) [shanghai]: Organization Name (eg, company) [Pet]: Organizational Unit Name (eg, section) [Ops]: Common Name (eg, your name or your server's hostname) [louis]: Name [EasyRSA]: Email Address [xhh_198605@163.com]: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Using configuration from /usr/local/openvpn/EasyRSA-2.2.2/openssl-1.0.0.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'CN' stateOrProvinceName :PRINTABLE:'SH' localityName :PRINTABLE:'shanghai' organizationName :PRINTABLE:'Pet' organizationalUnitName:PRINTABLE:'Ops' commonName :PRINTABLE:'louis' name :PRINTABLE:'EasyRSA' emailAddress :IA5STRING:'xhh_198605@163.com' Certificate is to be certified until Mar 12 05:42:22 2028 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 查看生成了哪些证书 [root@openvpn EasyRSA-2.2.2]# ll keys/ total 84 -rw-r--r-- 1 root root 5372 Mar 15 13:40 01.pem -rw-r--r-- 1 root root 5250 Mar 15 13:42 02.pem -rw-r--r-- 1 root root 1659 Mar 15 13:36 ca.crt -rw------- 1 root root 1704 Mar 15 13:36 ca.key -rw-r--r-- 1 root root 424 Mar 15 13:38 dh2048.pem -rw-r--r-- 1 root root 237 Mar 15 13:42 index.txt -rw-r--r-- 1 root root 21 Mar 15 13:42 index.txt.attr -rw-r--r-- 1 root root 21 Mar 15 13:40 index.txt.attr.old -rw-r--r-- 1 root root 119 Mar 15 13:40 index.txt.old -rw-r--r-- 1 root root 5250 Mar 15 13:42 louis.crt -rw-r--r-- 1 root root 1058 Mar 15 13:42 louis.csr -rw------- 1 root root 1834 Mar 15 13:42 louis.key -rw-r--r-- 1 root root 3 Mar 15 13:42 serial -rw-r--r-- 1 root root 3 Mar 15 13:40 serial.old -rw-r--r-- 1 root root 5372 Mar 15 13:40 server.crt -rw-r--r-- 1 root root 1058 Mar 15 13:40 server.csr -rw------- 1 root root 1704 Mar 15 13:40 server.key ~~~ * 在openvpn服务器上配置server端 ~~~ [root@openvpn server]# openvpn --genkey --secret ta.key [root@openvpn server]# pwd /usr/local/openvpn/server [root@openvpn server]# cp ../EasyRSA-2.2.2/keys/{ca.crt,ca.key,server.crt,server.key,dh2048.pem} . [root@openvpn server]# ll total 24 -rw-r--r-- 1 root root 1659 Mar 15 13:45 ca.crt -rw------- 1 root root 1704 Mar 15 13:45 ca.key -rw-r--r-- 1 root root 424 Mar 15 13:45 dh2048.pem -rw-r--r-- 1 root root 5372 Mar 15 13:45 server.crt -rw------- 1 root root 1704 Mar 15 13:45 server.key [root@openvpn server]# cp /opt/tools/openvpn-2.3.16/sample/sample-config-files/server.conf . [root@openvpn server]# ll total 36 -rw-r--r-- 1 root root 1659 Mar 15 13:45 ca.crt -rw------- 1 root root 1704 Mar 15 13:45 ca.key -rw-r--r-- 1 root root 424 Mar 15 13:45 dh2048.pem -rw-r--r-- 1 root root 10784 Mar 15 13:45 server.conf -rw-r--r-- 1 root root 5372 Mar 15 13:45 server.crt -rw------- 1 root root 1704 Mar 15 13:45 server.key -rw------- 1 root root 636 Mar 15 13:50 ta.key * 编辑server.conf [root@openvpn server]# grep -vE "^$|^#|^;" server.conf local 103.45.10.148 port 52115 proto tcp dev tun ca /usr/local/openvpn/server/ca.crt cert /usr/local/openvpn/server/server.crt key /usr/local/openvpn/server/server.key # This file should be kept secret dh /usr/local/openvpn/server/dh2048.pem server 172.25.200.0 255.255.255.0 ifconfig-pool-persist ipp.txt push "route 10.45.10.128 255.255.255.192" client-to-client duplicate-cn keepalive 10 120 tls-auth ta.key 0 # This file is secret cipher AES-256-CBC comp-lzo persist-key persist-tun status openvpn-status.log log /var/log/openvpn verb 3 ~~~ * 在openvpn服务器上配置client端 ~~~ [root@openvpn client]# cp ../EasyRSA-2.2.2/keys/{ca.crt,louis.crt,louis.key} . [root@openvpn client]# cp ../server/ta.key . [root@openvpn client]# cp /opt/tools/openvpn-2.3.16/sample/sample-config-files/client.conf . [root@openvpn client]# ll total 24 -rw-r--r-- 1 root root 1659 Mar 15 13:52 ca.crt -rw-r--r-- 1 root root 3586 Mar 15 13:53 client.conf -rw-r--r-- 1 root root 5250 Mar 15 13:52 louis.crt -rw------- 1 root root 1834 Mar 15 13:52 louis.key -rw------- 1 root root 636 Mar 15 13:53 ta.key (以后每增加一个客户端,就把客户端的公钥和私钥拷贝到这个目录,然后把client.conf,ca.crt,ta.key以及对应用户的公钥和私钥,一并发送给对象的用户,该用户就可以在相应的设备上登录咯,下面会介绍) * 配置client.conf [root@openvpn client]# grep -vE "^$|^#|^;" client.conf client dev tun proto tcp remote 103.45.10.148 52115 resolv-retry infinite nobind persist-key persist-tun ca ca.crt cert louis.crt key louis.key remote-cert-tls server tls-auth ta.key 1 cipher AES-256-CBC comp-lzo verb 3 ~~~ * 拷贝软件自带的服务脚本到/etc/init.d/目录下 ~~~ [root@openvpn client]# cp /opt/tools/openvpn-2.3.16/distro/rpm/openvpn.init.d.rhel /etc/init.d/openvpn [root@openvpn client]# chmod 700 /etc/init.d/openvpn [root@openvpn client]# chkconfig --add openvpn [root@openvpn client]# chkconfig openvpn on [root@openvpn client]# sed -i "s@work=/etc/openvpn@work=/usr/local/openvpn/server@g" /etc/init.d/openvpn [root@openvpn client]# systemctl daemon-reload [root@openvpn client]# service openvpn start Starting openvpn (via systemctl): [ OK ] [root@openvpn client]# ss -tunlp|grep 52115 tcp LISTEN 0 1 103.45.10.148:52115 *:* users:(("openvpn",pid=12335,fd=5)) ~~~ * 在openvpn服务器上配置防火墙 ~~~ [root@openvpn ~]# setenforce 0 setenforce: SELinux is disabled 开通端口转发 [root@openvpn ~]# vim /etc/sysctl.conf [root@openvpn ~]# sysctl -p net.ipv4.ip_forward = 1 [root@openvpn client]# systemctl stop firewalld [root@openvpn client]# systemctl disable firewalld [root@openvpn client]# yum -y install iptables-* 放行52115端口 [root@openvpn ~]# iptables -I INPUT -p tcp --dport 52115 -j ACCEPT [root@openvpn ~]# iptables -I INPUT -p udp --dport 52115 -j ACCEPT [root@openvpn ~]# service iptables save iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ] [root@openvpn ~]# service iptables restart Redirecting to /bin/systemctl restart iptables.service ~~~ 第二部分:客户端配置 1)windows系统 然后通过xftp把服务器上的客户端的几个文件拷贝到本地电脑 ![](https://box.kancloud.cn/094e8f68a815f0c8f26aaead5d824e7b_1128x427.png) 2)安装openvpn gui软件 http://soft.51yuki.cn/openvpn-install-2.3.14-I601-x86_64.exe 3)比如默认安装在C:\Program Files\OpenVPN这个目录,如果这个目录下没有config,那么就新建一个config目录,然后相关文件(ca.crt,client.conf,louis.crt,louis.key,ta.key)拷贝到config目录下,并且把client.conf重命名为client.ovpn) ![](https://box.kancloud.cn/2bcc7cd8f8c52e28769b3cf4ee9469ac_715x362.png) 4)以管理员身份打开openvpn gui软件,然后点击connect ![](https://box.kancloud.cn/b52341f3555a0be31153d7fcfb79f00b_310x301.png) ![](https://box.kancloud.cn/3791eceae60dd4f836d50466ced1183a_590x380.png)(这里弹出框,就是输入刚刚./build-key-pass生成客户端证书时输入的密码) ![](https://box.kancloud.cn/d06310c26d31875044df249c32a9cee5_324x178.png) 2)linux系统(以centos7.3为例) 第一步:先在openvpn服务器上生成一张客户端证书 ~~~ [root@openvpn EasyRSA-2.2.2]# ./build-key node1.51yuki.cn [root@openvpn EasyRSA-2.2.2]# cp keys/node1.51yuki.cn.crt keys/node1.51yuki.cn.key ../client/ [root@openvpn EasyRSA-2.2.2]# cd ../client/ [root@openvpn client]# ll total 36 -rw-r--r-- 1 root root 1659 Mar 15 13:52 ca.crt -rw-r--r-- 1 root root 3549 Mar 15 13:56 client.conf -rw-r--r-- 1 root root 5250 Mar 15 13:52 louis.crt -rw------- 1 root root 1834 Mar 15 13:52 louis.key -rw-r--r-- 1 root root 5276 Mar 15 14:20 node1.51yuki.cn.crt -rw------- 1 root root 1704 Mar 15 14:20 node1.51yuki.cn.key -rw------- 1 root root 636 Mar 15 13:53 ta.key [root@openvpn client]# cp client.conf node1.51yuki.cn.conf [root@openvpn client]# vim node1.51yuki.cn.conf [root@openvpn client]# mv node1.51yuki.cn.conf node1.conf [root@openvpn client]# ll total 40 -rw-r--r-- 1 root root 1659 Mar 15 13:52 ca.crt -rw-r--r-- 1 root root 3549 Mar 15 13:56 client.conf -rw-r--r-- 1 root root 5250 Mar 15 13:52 louis.crt -rw------- 1 root root 1834 Mar 15 13:52 louis.key -rw-r--r-- 1 root root 5276 Mar 15 14:20 node1.51yuki.cn.crt -rw------- 1 root root 1704 Mar 15 14:20 node1.51yuki.cn.key -rw-r--r-- 1 root root 3569 Mar 15 14:21 node1.conf -rw------- 1 root root 636 Mar 15 13:53 ta.key ~~~ linux客户端上操作 * 安装openvpn软件(yum安装即可) [root@node1 ~]# yum -y install openvpn [root@node1 client]# ll total 24 -rw-r--r--. 1 root root 1659 Mar 15 14:23 ca.crt -rw-r--r--. 1 root root 5276 Mar 15 14:23 node1.51yuki.cn.crt -rw-r--r--. 1 root root 1704 Mar 15 14:23 node1.51yuki.cn.key -rw-r--r--. 1 root root 3569 Mar 15 14:23 node1.conf -rw-r--r--. 1 root root 636 Mar 15 14:23 ta.key [root@node1 client]# pwd /etc/openvpn/client * 启动服务 [root@node1 system]# systemctl start openvpn-client@node1 (这里的node1,就是你上面配置文件.conf,我这里是node1.conf,所以启动就是) ~~~ [root@node1 system]# ifconfig tun0 tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1500 inet 172.25.200.10 netmask 255.255.255.255 destination 172.25.200.9 unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 100 (UNSPEC) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ~~~ * 然后测试是否可以ping通tun0和openvpn内网IP ~~~ [root@node1 system]# ping 172.25.200.1 PING 172.25.200.1 (172.25.200.1) 56(84) bytes of data. 64 bytes from 172.25.200.1: icmp_seq=1 ttl=64 time=27.8 ms 64 bytes from 172.25.200.1: icmp_seq=2 ttl=64 time=27.7 ms 64 bytes from 172.25.200.1: icmp_seq=3 ttl=64 time=27.0 ms 64 bytes from 172.25.200.1: icmp_seq=4 ttl=64 time=27.4 ms 64 bytes from 172.25.200.1: icmp_seq=5 ttl=64 time=27.5 ms 64 bytes from 172.25.200.1: icmp_seq=6 ttl=64 time=36.2 ms ^C --- 172.25.200.1 ping statistics --- 6 packets transmitted, 6 received, 0% packet loss, time 5008ms rtt min/avg/max/mdev = 27.052/28.987/36.235/3.252 ms [root@node1 system]# ping 10.45.10.148 PING 10.45.10.148 (10.45.10.148) 56(84) bytes of data. 64 bytes from 10.45.10.148: icmp_seq=1 ttl=64 time=26.9 ms 64 bytes from 10.45.10.148: icmp_seq=2 ttl=64 time=27.4 ms 64 bytes from 10.45.10.148: icmp_seq=3 ttl=64 time=27.6 ms 64 bytes from 10.45.10.148: icmp_seq=4 ttl=64 time=28.0 ms 64 bytes from 10.45.10.148: icmp_seq=5 ttl=64 time=27.5 ms ^C --- 10.45.10.148 ping statistics --- 5 packets transmitted, 5 received, 0% packet loss, time 4003ms rtt min/avg/max/mdev = 26.978/27.545/28.096/0.356 ms [root@node1 system]# scp /etc/hosts root@10.45.10.148:/tmp The authenticity of host '10.45.10.148 (10.45.10.148)' can't be established. ECDSA key fingerprint is SHA256:2LDr2C1IMRfrRTj8d0Djs6JMZdGWmw4hSFqvAObRHYc. ECDSA key fingerprint is MD5:d1:6e:12:94:b7:bd:91:30:1a:ee:ea:a9:0d:1f:c7:f0. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '10.45.10.148' (ECDSA) to the list of known hosts. root@10.45.10.148's password: Permission denied, please try again. root@10.45.10.148's password: hosts 100% 158 5.5KB/s 00:00 [root@node1 system]# (通过以上操作,发现从拨通vpn的客户端上,可以ping通vpn服务器tun0接口和内网口ip,并且可以拷贝文件到openvpn服务器上) ~~~ 第三部分:测试从拨通vpn的电脑上,访问slave01和slave02电脑上内网ip ~~~ C:\Users\Administrator>ping 10.45.10.151 正在 Ping 10.45.10.151 具有 32 字节的数据: 请求超时。 请求超时。 ~~~ 第一种方法: [root@slave02 ~]# route add -net 172.25.200.0/24 gw 10.45.10.148 [root@slave02 ~]# echo "route add -net 172.25.200.0/24 gw 10.45.10.148" >> /etc/rc.local 然后测试 ~~~ C:\Users\Administrator>ping 10.45.10.151 正在 Ping 10.45.10.151 具有 32 字节的数据: 来自 10.45.10.151 的回复: 字节=32 时间=28ms TTL=63 来自 10.45.10.151 的回复: 字节=32 时间=28ms TTL=63 来自 10.45.10.151 的回复: 字节=32 时间=28ms TTL=63 来自 10.45.10.151 的回复: 字节=32 时间=28ms TTL=63 在linux客户端上操作 [root@node1 system]# ssh root@10.45.10.151 The authenticity of host '10.45.10.151 (10.45.10.151)' can't be established. ECDSA key fingerprint is SHA256:2LDr2C1IMRfrRTj8d0Djs6JMZdGWmw4hSFqvAObRHYc. ECDSA key fingerprint is MD5:d1:6e:12:94:b7:bd:91:30:1a:ee:ea:a9:0d:1f:c7:f0. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '10.45.10.151' (ECDSA) to the list of known hosts. root@10.45.10.151's password: Permission denied, please try again. root@10.45.10.151's password: Last failed login: Thu Mar 15 14:37:34 CST 2018 from 172.25.200.10 on ssh:notty There was 1 failed login attempt since the last successful login. Last login: Thu Mar 15 14:33:55 2018 from 180.169.194.190 [root@slave02 ~]# ~~~ 第二种方法:配置NAT地址转换(在openvpn上操作) ~~~ [root@openvpn ~]# iptables -t nat -A POSTROUTING -s 172.25.200.0/24 -o eth1 -j SNAT --to-s [root@openvpn ~]# iptables -t nat -I POSTROUTING -s 172.25.200.0/24 -o eth1 -j MASQUERADE ~~~