CentOS7 搭建openvpn

网友投稿 2580 2022-10-08

CentOS7 搭建openvpn

CentOS7 搭建openvpn

OpenVPN的部署及认证方式

OpenVPN相对与在网络设备上配置的VPN具有配置更加灵活方便,易于维护,不会受到硬件的和硬件上特定操作系统的限制;服务基于IP+端口的方式实现,只要是能够监听且能够在公网上访问到的主机都能够实现。

1.在生产中的使用场景

在生产中通常是运营商给的公网IP地址配置在防火墙或者是在路由器上面然后通过端口映射或者NAT转发的方式来暴露内网服务器的端口,从而把openvpn暴露的服务器端口转发到公网中。当客户端连接上vpn-server之后客户端会从vpn服务器上获得 一个服务器端分配的IP地址,在服务端上会有一张tun0的虚拟网卡,客户端与它进行通信,通过它来把数据包转发,所以在配置的时候要配置linux内核转发。要与内网中的其它网段通信,在保证vpn-server与内网的其它主机互通的情况下在openvpn-server配置文件中添加相应的路由即可。

2.场景模拟

在虚拟机中使用这样一种方式来模拟,主机10.4.7.1与虚拟机的10.4.7.2通信,通过他们来建立隧道网络10.8.0.0/24,然后再与内网主机172.16.1.2通信。

主机名

网卡

网卡模式

IP

openvpn

eth0

NAT

10.4.7.2

eth1

LAN区段

172.16.1.2

private

eth1

LAN区段

172.16.1.4

3.部署openvpn

操作系统cnetOS7关闭防火墙关闭selinux

# 安装常用工具yum -y install vim lrzsz wget

3.1 开启内核转发

grep 'net.ipv4.ip_forward = 1' /etc/sysctl.conf || echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.confsysctl -p

3.2 配置iptables

只需要配置不需要开启iptables

## 添加如下配置,注意想要哪个物理网卡转发数据就使用哪张物理网卡的名称。eth1对应的是172的网段那么就使用eth1做转发就好。iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth1 -j MASQUERADEiptables-save > /etc/sysconfig/iptables# 查看规则iptables -L -n -t nat# 删除iptables规则iptables -t nat -D POSTROUTING 1

3.2 配置时间同步

yum -y install chrony

3.3 安装openvpn

两种方式选择其中一种方式安装即可。

3.3(1) 源码编译安装

3.3.1 安装编辑工具

yum install -y lz4-devel lzo-devel pam-devel openssl-devel systemd-devel sqlite-devel autoconf automake libtool libtool-ltdl

3.3.2 编译安装

# -解压,如果-不了使用迅雷-好了之后再上传也是一样的。wget v2.4.9.tar.gz openvpn-2.4.9.tar.gz# 生成tar xf openvpn-2.4.9.tar.gz cd openvpn-2.4.9/autoreconf -i -v -f./configure --prefix=/usr/local/openvpn --enable-lzo --enable-lz4 --enable-crypto --enable-server --enable-plugins --enable-port-share --enable-iproute2 --enable-pf --enable-plugin-auth-pam --enable-pam-dlopen --enable-systemd# 编译安装make && make installln -s /usr/local/openvpn/sbin/openvpn /usr/local/sbin/openvpn

3.3.3 systemd管理

cp -a /usr/local/openvpn/lib/systemd/system/openvpn-server@.service /usr/lib/systemd/system/openvpn.service# 编辑systemd模板,只修改ExecStartvi /usr/lib/systemd/system/openvpn.serviceExecStart=/usr/local/openvpn/sbin/openvpn --config server.confsystemctl enable openvpn.service

3.3(2) YUM安装

yum install epel-release -yyum makecacheyum -y install openvpn# 需要更改systemd配置不然会报错。vi /usr/lib/systemd/system/openvpn\@.serviceExecStart=/usr/sbin/openvpn --cd /etc/openvpn/server --config server.confvi /usr/lib/systemd/system/openvpn-server\@.serviceExecStart=/usr/sbin/openvpn --config server.confsystemctl daemon-reload

3.4 生成证书

3.4.1 -证书工具

wget v3.0.7.tar.gz easy-rsa-3.0.7.tar.gztar xf easy-rsa-3.0.7.tar.gz

3.4.2 生成证书

cd easy-rsa-3.0.7/easyrsa3/cp -a vars.example vars# 修改下面字段vim vars# 国家set_var EASYRSA_REQ_COUNTRY "CN"# 省set_var EASYRSA_REQ_PROVINCE "Chongqing"# 城市set_var EASYRSA_REQ_CITY "YuBei"# 组织set_var EASYRSA_REQ_ORG "Xiantaoyiyun"# 邮箱set_var EASYRSA_REQ_EMAIL "admin@ecloud.com-"# 拥有者set_var EASYRSA_REQ_OU "xiaoliao.gong"# 长度set_var EASYRSA_KEY_SIZE 2048# 算法set_var EASYRSA_ALGO rsa# CA证书过期时间,单位天set_var EASYRSA_CA_EXPIRE 36500# 签发证书的有效期是多少天,单位天set_var EASYRSA_CERT_EXPIRE 36500

3.4.3 生成服务端证书

这是必要的即使是使用用户名和密码认证的方式。

# 初始化vars文件中的变量,并生成pki目录[root@openvpn easyrsa3]# ./easyrsa init-pkiNote: using Easy-RSA configuration from: /root/easy-rsa-3.0.7/easyrsa3/varsinit-pki complete; you may now create a CA or requests.Your newly created PKI dir is: /root/easy-rsa-3.0.7/easyrsa3/pki# 生成根证书[root@openvpn easyrsa3]# ./easyrsa build-caNote: using Easy-RSA configuration from: /root/easy-rsa-3.0.7/easyrsa3/varsUsing SSL: openssl OpenSSL 1.0.2k-fips 26 Jan 2017Enter New CA Key Passphrase: # <==== 这里会给根证书创建一个密码,在生成客户端证书的时候需要用到Re-Enter New CA Key Passphrase: # <==== 再次确认Generating RSA private key, 2048 bit long modulus..........................................+++.....................................+++e is 65537 (0x10001)You are about to be asked to enter information that will be incorporatedinto 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 blankFor some fields there will be a default value,If you enter '.', the field will be left blank.-----Common Name (eg: your user, host, or server name) [Easy-RSA CA]:openvpnCA creation complete and you may now import and sign cert requests.Your new CA certificate file for publishing is at:# 生成文件的位置/root/easy-rsa-3.0.7/easyrsa3/pki/ca.crt# 服务端证书 nopass 表示不需要密码[root@openvpn easyrsa3]# ./easyrsa build-server-full server nopassNote: using Easy-RSA configuration from: /root/easy-rsa-3.0.7/easyrsa3/varsUsing SSL: openssl OpenSSL 1.0.2k-fips 26 Jan 2017Generating a 2048 bit RSA private key..........+++.+++writing new private key to '/root/easy-rsa-3.0.7/easyrsa3/pki/easy-rsa-10067.E9Bs1M/tmp.C7nJyp'-----Using configuration from /root/easy-rsa-3.0.7/easyrsa3/pki/easy-rsa-10067.E9Bs1M/tmp.k5sIGo# 这里要验证根证书的密码Enter pass phrase for /root/easy-rsa-3.0.7/easyrsa3/pki/private/ca.key:Check that the request matches the signatureSignature okThe Subject's Distinguished Name is as followscommonName :ASN.1 12:'server'Certificate is to be certified until Dec 13 03:31:48 2121 GMT (36500 days)Write out database with 1 new entriesData Base Updated# 创建Diffie-Hellman,确保key穿越不安全网络的命令,时间会有点长,耐心等待./easyrsa gen-dh

为了提高安全性,生成ta.key

openvpn --genkey --secret ta.key

加强认证方式,防攻击。如果配置文件中启用此项(默认是启用的),就需要执行上述命令,并把ta.key放到/etc/openvpn/server目录。配置文件中服务端第二个参数为0,同时客户端也要有此文件,且client.conf中此指令的第二个参数需要为1。【服务端有该配置,那么客户端也必须要有】

整理服务端证书

mkdir -p /etc/openvpn/server/cp -a pki/ca.crt /etc/openvpn/server/cp -a pki/private/server.key /etc/openvpn/server/cp -a pki/issued/server.crt /etc/openvpn/server/cp -a pki/dh.pem /etc/openvpn/server/cp -a ta.key /etc/openvpn/server/

方式一:客户端使用证书方式验证

3.4.4 生成客户端证书

生成多个客户端证书

# ./easyrsa build-client-full client nopass # 无密码,实际应用中不推荐,客户端有密码可提高安全性# ./easyrsa build-client-full zhangsan # 让你输入密码,后续VPN连接时会使用# 生成黄林的用户[root@j11-16-2 easy-rsa-3.0.7]# ./easyrsa build-client-full huanglinNote: using Easy-RSA configuration from: /opt/easy-rsa-3.0.7/varsUsing SSL: openssl OpenSSL 1.0.2k-fips 26 Jan 2017Generating a 2048 bit RSA private key...............................+++............................................................+++writing new private key to '/opt/easy-rsa-3.0.7/pki/easy-rsa-41707.fuCJ9C/tmp.Wd1grW'Enter PEM pass phrase: #<======= 为黄林用户添加密码Verifying - Enter PEM pass phrase: #<======= 再次输入-----Using configuration from /opt/easy-rsa-3.0.7/pki/easy-rsa-41707.fuCJ9C/tmp.vmym1KEnter pass phrase for /opt/easy-rsa-3.0.7/pki/private/ca.key: # 输入ca的密码 openvpnCheck that the request matches the signatureSignature okThe Subject's Distinguished Name is as followscommonName :ASN.1 12:'huanglin'Certificate is to be certified until May 23 02:57:38 2121 GMT (36500 days)Write out database with 1 new entriesData Base Updated

为客户端生成证书对并在本地签名。nopass参数生成一个无密码的证书;在此过程中都会让你确认ca密码

3.5 创建服务端配置文件

参照openvpn-2.4.9/sample/sample-config-files/server.conf文件

# 如果是使用yum方式可以不用这个groupadd openvpn -g 666useradd openvpn -u 666 -M -g openvpn -s /sbin/nologincat>/etc/openvpn/server/server.conf<

参数解释

local 0.0.0.0# 表示openvpn服务端的监听地址port 1194# 监听的端口,默认是1194proto tcp# 使用的协议,有udp和tcp。建议选择tcpdev tun# 使用三层路由IP隧道(tun)还是二层以太网隧道(tap)。一般都使用tunca ca.crtcert server.crtkey server.keydh dh2048.pem# ca证书、服务端证书、服务端密钥和密钥交换文件。如果它们和server.conf在同一个目录下则可以不写绝对路径,否则需要写绝对路径调用server 10.8.0.0 255.255.255.0# vpn服务端为自己和客户端分配IP的地址池。# 服务端自己获取网段的第一个地址(此处为10.8.0.1),后为客户端分配其他的可用地址。以后客户端就可以和10.8.0.1进行通信。# 注意:该网段地址池不要和已有网段冲突或重复。其实一般来说是不用改的。除非当前内网使用了10.8.0.0/24的网段。ifconfig-pool-persist ipp.txt# 使用一个文件记录已分配虚拟IP的客户端和虚拟IP的对应关系,# 以后openvpn重启时,将可以按照此文件继续为对应的客户端分配此前相同的IP。也就是自动续借IP的意思。server-bridge XXXXXX# 使用tap模式的时候考虑此选项。push "route 10.0.10.0 255.255.255.0"push "route 192.168.10.0 255.255.255.0"# vpn服务端向客户端推送vpn服务端内网网段的路由配置,以便让客户端能够找到服务端内网。多条路由就写多个Push指令client-to-client# 让vpn客户端之间可以互相看见对方,即能互相通信。默认情况客户端只能看到服务端一个人;# 默认是注释的,不能客户端之间相互看见duplicate-cn# 允许多个客户端使用同一个VPN帐号连接服务端# 默认是注释的,不支持多个客户登录一个账号keepalive 10 120# 每10秒ping一次,120秒后没收到ping就说明对方挂了tls-auth ta.key 0# 加强认证方式,防攻击。如果配置文件中启用此项(默认是启用的)# 需要执行openvpn --genkey --secret ta.key,并把ta.key放到/etc/openvpn/server目录# 服务端第二个参数为0;同时客户端也要有此文件,且client.conf中此指令的第二个参数需要为1。# 如果不想让客户端认证此参数直接吧这个参数注释即可。cipher AES-256-CBC# 选择一个密码。如果在服务器上使用了cipher选项,那么您也必须在这里指定它。注意,v2.4客户端/服务器将在TLS模式下自动协商AES-256-GCM。compress lz4-v2push "compress lz4-v2"# openvpn 2.4版本的vpn才能设置此选项。表示服务端启用lz4的压缩功能,传输数据给客户端时会压缩数据包。# Push后在客户端也配置启用lz4的压缩功能,向服务端发数据时也会压缩。如果是2.4版本以下的老版本,则使用用comp-lzo指令comp-lzo# 启用lzo数据压缩格式。此指令用于低于2.4版本的老版本。且如果服务端配置了该指令,客户端也必须要配置max-clients 100# 并发客户端的连接数persist-keypersist-tun# 通过ping得知超时时,当重启vpn后将使用同一个密钥文件以及保持tun连接状态status openvpn-status.log# 在文件中输出当前的连接信息,每分钟截断并重写一次该文件;log openvpn.log;log-append openvpn.log# 默认vpn的日志会记录到rsyslog中,使用这两个选项可以改变。# log指令表示每次启动vpn时覆盖式记录到指定日志文件中,# log-append则表示每次启动vpn时追加式的记录到指定日志中。# 但两者只能选其一,或者不选时记录到rsyslog中verb 3# 日志记录的详细级别。;mute 20# 沉默的重复信息。最多20条相同消息类别的连续消息将输出到日志。explicit-exit-notify 1# 当服务器重新启动时,通知客户端,以便它可以自动重新连接。仅在UDP协议是可用

3.6 启动openvpn服务

# 编译安装方式[root@openvpn easyrsa3]# systemctl start openvpn.service# yum安装方式systemctl start openvpn@server[root@openvpn easyrsa3]# ss -lntup|grep 1194tcp LISTEN 0 32 *:1194 *:* users:(("openvpn",pid=10259,fd=6))

方式二:使用用户名密码的方式认证

编辑服务器端配置文件,添加下面的参数。

#客户端不进行证书认证,如果不加将实现证书和用户密码双重认证client-cert-not-required#用户和密码验证脚本auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env#使用用户名密码登录认证username-as-common-name#脚本安全级别script-security 3

配置好的配置文件

cat /etc/openvpn/server/server.conflocal 0.0.0.0port 1194proto tcpdev tunca /etc/openvpn/server/ca.crtcert /etc/openvpn/server/server.crtkey /etc/openvpn/server/server.keydh /etc/openvpn/server/dh.pemclient-cert-not-requiredauth-user-pass-verify /etc/openvpn/checkpsw.sh via-envusername-as-common-namescript-security 3server 10.8.0.0 255.255.255.0ifconfig-pool-persist ipp.txtpush "route 172.16.1.0 255.255.255.0"keepalive 10 120tls-auth /etc/openvpn/server/ta.key 0cipher AES-256-CBCcompress lz4-v2push "compress lz4-v2"max-clients 1000user openvpngroup openvpnpersist-keypersist-tunstatus /var/log/openvpn/openvpn-status.loglog /var/log/openvpn/openvpn.logverb 3mkdir -p /var/log/openvpn

(1) 创建认证脚本

vim /etc/openvpn/checkpsw.sh#!/bin/bash############################################################ checkpsw.sh (C) 2004 Mathias Sundman ## This script will authenticate OpenVPN users against# a plain text file. The passfile should simply contain# one row per user with the username first followed by# one or more space(s) or tab(s) and then the password.PASSFILE="/etc/openvpn/psw-file"LOG_FILE="/var/log/openvpn-password.log"TIME_STAMP=`date "+%Y-%m-%d %T"`###########################################################if [ ! -r "${PASSFILE}" ]; then echo "${TIME_STAMP}: Could not open password file \"${PASSFILE}\" for reading." >> ${LOG_FILE} exit 1fiCORRECT_PASSWORD=`awk '!/^;/&&!/^#/&&$1=="'${username}'"{print $2;exit}' ${PASSFILE}`if [ "${CORRECT_PASSWORD}" = "" ]; then echo "${TIME_STAMP}: User does not exist: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE} exit 1fiif [ "${password}" = "${CORRECT_PASSWORD}" ]; then echo "${TIME_STAMP}: Successful authentication: username=\"${username}\"." >> ${LOG_FILE} exit 0fiecho "${TIME_STAMP}: Incorrect password: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}exit 1#增加执行权限 (2020-12-17标注:不加权限,连接会用户密码认证失败,因为执行不了脚本)chmod +x /etc/openvpn/checkpsw.sh

(2) 配置密码文件

#用户密码文件,格式:一行对应一个用户vim /etc/openvpn/psw-filegong 123456#修改权限chmod 600 /etc/openvpn/psw-filechown openvpn.openvpn /etc/openvpn/psw-file -R#重启openvpn服务systemctl restart openvpn@server

4.windows客户端配置文件

4.1 使用证书的方式

# 文件名 windows为gong.ovpn,Linux为client.confclientdev tunproto tcpremote 10.4.7.2 1194resolv-retry infinitenobindpersist-keypersist-tunca ca.crtcert gong.crtkey gong.keyremote-cert-tls servertls-auth ta.key 1cipher AES-256-CBCcompress lz4-v2verb 3# 对应文件的生成路径[root@openvpn easyrsa3]# pwd/root/easy-rsa-3.0.7/easyrsa3./ta.keypki/ca.crtpki/issued/gong.crtpki/private/gong.key

放在同一个文件夹下面。

配置客户端吧配置文件路径改为你的配置文件和密钥存放的路径。

openvpn分配的地址。

现在在windows 上面直接ping LAN区段的网络能能够直接ping通。

配置文件参数说明

参考:openvpn-2.4.9/sample/sample-config-files/client.conf

# 文件名 windows为client.ovpn,Linux为client.confclient# 标识这是个客户端dev tun# 使用三层路由IP隧道(tun)还是二层以太网隧道(tap)。服务端是什么客户端就是什么proto tcp# 使用的协议,有udp和tcp。服务端是什么客户端就是什么remote 10.0.0.190 1194# 服务端的地址和端口resolv-retry infinite# 一直尝试解析OpenVPN服务器的主机名。# 在机器上非常有用,不是永久连接到互联网,如笔记本电脑。nobind# 大多数客户机不需要绑定到特定的本地端口号。;user nobody;group nobody# 初始化后的降级特权(仅非windows)persist-keypersist-tun# 尝试在重新启动时保留某些状态。ca ca.crtcert client.crtkey client.key# ca证书、客户端证书、客户端密钥# 如果它们和client.conf或client.ovpn在同一个目录下则可以不写绝对路径,否则需要写绝对路径调用remote-cert-tls server# 通过检查certicate是否具有正确的密钥使用设置来验证服务器证书。tls-auth ta.key 1# 加强认证方式,防攻击。服务端有配置,则客户端必须有cipher AES-256-CBC# 选择一个密码。如果在服务器上使用了cipher选项,那么您也必须在这里指定它。注意,v2.4客户端/服务器将在TLS模式下自动协商AES-256-GCM。compress lz4-v2# 服务端用的什么,客户端就用的什么# 表示客户端启用lz4的压缩功能,传输数据给客户端时会压缩数据包。verb 3# 日志级别;mute 20# 沉默的重复信息。最多20条相同消息类别的连续消息将输出到日志。

4.2 使用用户名身份验证方式

clientdev tunproto tcpremote 10.4.7.2 1194resolv-retry infinitenobindpersist-keypersist-tunauth-user-pass;ca ca.crt;cert gong.crt;key gong.keyremote-cert-tls server;这里如果不用ta.key认证,需要把服务端当中的tls-auth注释掉。;把ca写到了最下面如果不写在下面,用上面文件的方式也是一样;这样的好处是配置文件只有一个。;tls-auth ta.key 1cipher AES-256-CBCcompress lz4-v2verb 3-----BEGIN CERTIFICATE-----MIIDKjCCAhKgAwIBAgIJAMcWaK+XSmO0MA0GCSqGSIb3DQEBCwUAMBIxEDAOBgNVBAMMB29wZW52cG4wIBcNMjIwMTA2MDY0NTE2WhgPMjEyMTEyMTMwNjQ1MTZaMBIxEDAOBgNVBAMMB29wZW52cG4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCksNRqd7ZmLG43BW/vFoqvSeUDKgycayVwcbP/QNjrbr2fx6rIzcVHrig2bTJbzProhomE/KgljbdOxI3msEAthC71FyPW3VRqdsgY07V8Kp5GiCFfRwRIW54JXinhaVs6Uq/daU6VqYLpqMbtj9/HBlSHAvAt2cN0C63D1mMpC+hAK8q8XHdBCim9k8BP1+ZRFAaHypsFQAgxyTam8VTziwVe3blK/U7cdGxTB1lLtbV8x0AUHa77J615rydUaODFo9mvDrLlrXPYJVTqIchvxsz8d/OxaPqH6Q9JBB9EilvhnZ9QqGRgZLh9MlGZ5/x7wSgz/hFsEINliWcYMVhxAgMBAAGjgYAwfjAdBgNVHQ4EFgQUZCz3/7dcBIG+r4akCeyySLJXCJ8wQgYDVR0jBDswOYAUZCz3/7dcBIG+r4akCeyySLJXCJ+hFqQUMBIxEDAOBgNVBAMMB29wZW52cG6CCQDHFmivl0pjtDAMBgNVHRMEBTADAQH/MAsGA1UdDwQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAQEAbVq7t6Rah8YqpAS8bfaTjZb8/hXvLIf5HdM6WdkYNyv4B4MCSic72qgIOqGJCw9d2rxU94z33TT9OeRuuT5gNqHX6KaDlwnD3+gHdNNg7dlIINkD7/+Ins2wei2IJnQREendwJw/p3ddcmat3CtEYQHWCL7Llz/X8DURhd568jQMvXodmofZoaIjAdYAKnorLZpaZwqEqqc9A2EmW5fX8EKpmqzXrDy0dKUBuE4NF2KW54q1mRRrSqL7SYTHZZD6lSVeEGAJDdfql+wOEbDRmouzHDbh04f8hEKxHIa01lrNrl1PTD8V+q5zScZhPAJSuhnptkOVHw7nDWtrWaNoJQ==-----END CERTIFICATE-----

输入在密码文件中配置的用户名和密码即可。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:基于 mpvue 框架的小程序选择控件,支持单列,多列,联动。(基于英语)
下一篇:brutal.js:一个疯狂的小框架,用于构建野蛮的Web应用程序
相关文章

 发表评论

暂时没有评论,来抢沙发吧~