OpenVPN实现安全的内网互通

萱蘇的运维日常 2024-03-25 15:37:30
引言什么是OpenVPN

维基百科是这么介绍的:OpenVPN是一个用于创建虚拟私人网络加密通道的软件包,最早由James Yonan编写。OpenVPN允许创建的VPN使用公开密钥、电子证书、或者用户名/密码来进行身份验证。它大量使用了OpenSSL加密库中的SSL/TLS协议函数库。

原作者:James Yonan

开发者:OpenVPN 项目 / OpenVPN Inc

当前版本:: 2.6.9 (2024年2月13日;稳定版本);

源代码库:github.com/OpenVPN

类型:VPN

系统平台:WindowsXP或以上;OS X10.8或以上;Android4.0或以上;iOS6或以上;Linux; *BSD;

网站:openvpn.net

安装OpenVPN

安装客户端

安装套件

服务端安装OpenVPN、EasyRSA

使用命令安装OpenVPNapt-get install openvpn -y

获取EasyRSA

wgethttps://github.com/OpenVPN/easy-rsa/releases/download/v3.1.7/EasyRSA-3.1.7.tgz

若无网络,也可以下载之后,再上传到服务器。要是访问github失败,也可以通过百度云下载

百度云链接:https://pan.baidu.com/s/1T3SoiDwsP6cE9UaRXnSjww提取码:r141--来自百度网盘超级会员V6的分享

若连接失效,请在评论回复

生成证书server----

进入EasyRSA-3.1.7,并修改相关参数

[root@aliyun /etc/openvpn]$ cd EasyRSA-3.1.7[root@aliyun /etc/openvpn/EasyRSA-3.1.7]$ cp vars.example vars[root@aliyun /etc/openvpn/EasyRSA-3.1.7]$ vim vars...省略部分内容...# In how many days should the root CA key expire?# 设置根证书有效期为100年set_var EASYRSA_CA_EXPIRE       36500# In how many days should certificates expire?# 设置服务端证书有效期为10年set_var EASYRSA_CERT_EXPIRE     3650...省略部分内容...

创建新的pki

[root@aliyun /etc/openvpn/EasyRSA-3.1.7]$./easyrsa init-pki

生成CA根证书

[root@aliyun /etc/openvpn/EasyRSA-3.1.7]$ ./easyrsa build-ca nopass

证书文件:/etc/openvpn/EasyRSA-3.1.7/pki/ca.crt

生成server端证书和私钥

# 生成签名请求和私钥[root@aliyun /etc/openvpn/EasyRSA-3.1.7]$./easyrsa gen-req server nopass# 签发证书[root@aliyun /etc/openvpn/EasyRSA-3.1.7]$./easyrsa sign server server

req: /etc/openvpn/EasyRSA-3.1.7/pki/reqs/server.req

key: /etc/openvpn/EasyRSA-3.1.7/pki/private/server.key

crt: /etc/openvpn/EasyRSA-3.1.7/pki/issued/server.crt

在OpenVPN环境中的EasyRSA工具集中,./easyrsa gen-req和./easyrsa build-server-full这两个命令执行的任务不同,它们分别用于不同的证书管理阶段:

./easyrsa gen-req [name]:

这个命令是用来生成一个证书签名请求(CSR)和相应的私钥文件。

当你需要为某个实体(如服务器或客户端)创建一个新的证书时,会运行这个命令,并提供一个唯一的名称(例如,vnserver)。

它不会直接生成证书,而是产生一个 CSR 文件,这个文件可以被 CA(证书颁发机构)用来签发证书,同时也会生成与之对应的私钥文件,私钥由请求者保留并保密。

./easyrsa build-server-full [name]:

生成服务器私钥

创建 CSR

签发服务器证书(由本地或已配置的CA签署)

可能还包括创建DH参数文件或者生成CA证书及相关的中级证书(取决于EasyRSA版本和配置)

这个命令则是用于在一个步骤中快速创建一个完整的服务器证书链,包括:

相对于单独的gen-req命令,build-server-full提供了一个更便捷的方式,它一步到位地完成了从生成密钥对到获得签名证书的所有流程,特别适用于新建OpenVPN服务器场景。

总结来说,如果你只是想生成一个CSR以便提交给外部CA签名,那么使用gen-req;而如果你想在本地完成整个服务器证书的生成和签名过程,直接使用build-server-full更为方便。在OpenVPN环境中,通常会使用build-server-full来快速创建用于OpenVPN服务的自签名服务器证书。

生成Diffie-Hellman算法需要的密钥文件

[root@aliyun /etc/openvpn/EasyRSA-3.1.7]$ ./easyrsa gen-dh

dh: /etc/openvpn/EasyRSA-3.1.7/pki/dh.pem

生成用于防DDOS攻击和TLS攻击文件

[root@aliyun /etc/openvpn/EasyRSA-3.1.7]$ openvpn --genkey tls-auth ta.key

复制证书文件到server目录下

[root@aliyun /etc/openvpn/server]$ cp /etc/openvpn/EasyRSA-3.1.7/pki/dh.pem /etc/openvpn/server/cp /etc/openvpn/EasyRSA-3.1.7/pki/reqs/server.req /etc/openvpn/server/cp /etc/openvpn/EasyRSA-3.1.7/pki/private/server.key /etc/openvpn/server/cp /etc/openvpn/EasyRSA-3.1.7/pki/issued/server.crt /etc/openvpn/server/cp /etc/openvpn/EasyRSA-3.1.7/pki/ca.crt /etc/openvpn/server/cp /etc/openvpn/EasyRSA-3.1.7/ta.key /etc/openvpn/server

client

生成客户端证书

有几个客户端就需要创建几个证书,tom是我客户端的名称

[root@aliyun /etc/openvpn/EasyRSA-3.1.7]$./easyrsa gen-req tom nopass[root@aliyun /etc/openvpn/EasyRSA-3.1.7]$./easyrsa sign client tom

req: /etc/openvpn/EasyRSA-3.1.7/pki/reqs/tom.req

key: /etc/openvpn/EasyRSA-3.1.7/pki/private/tom.key

crt: /etc/openvpn/EasyRSA-3.1.7/pki/issued/tom.crt

复制证书到tom目录下

[root@aliyun /etc/openvpn]$ mkdir tom[root@aliyun /etc/openvpn]$ cp /etc/openvpn/EasyRSA-3.1.7/pki/reqs/tom.req /etc/openvpn/tomcp /etc/openvpn/EasyRSA-3.1.7/pki/private/tom.key /etc/openvpn/tomcp /etc/openvpn/EasyRSA-3.1.7/pki/issued/tom.crt /etc/openvpn/tomcp /etc/openvpn/EasyRSA-3.1.7/pki/ca.crt /etc/openvpn/tomcp /etc/openvpn/EasyRSA-3.1.7/ta.key /etc/openvpn/tom

配置文件

生成OpenVPN服务端配置文件

[root@aliyun /etc/openvpn]$ cat > /etc/openvpn/server/server.conf <<-EOF#端口号port 1194#开启TCP协议,关闭UDP协议proto tcp#dev tun创建路由隧道,dev tap将创建一个以太网隧道dev tun#修改CA证书、服务端证书和服务端私钥key的文件名ca ca.crtcert server.crtkey server.key#Diifle hellman文件指向。如果在建立证书时使用2048的话就用2048dh dh.pem#给接入的Client分配的IP地址段,注意不要和服务内网网段重合server 10.8.0.0 255.255.255.0#客户端与客户端之间支持通信client-to-client#维持客户端和虚拟IP的联系。在OpenVPN重启时,再次连接的客户端依然被分配和以前一样的IP地址ifconfig-pool-persist ipp.txt#以下这句使得客户端能访问服务器后面的子网机器。比如服务器子网为172.29.242.142,则添加如下内容push "route 172.29.242.0 255.255.255.0"#分别指定发送间隔和接收间隔。用于设置OpenVPN的心跳包。此参数可保持OpenVPN连接的稳定性keepalive 10 120#最多允许200个客户端连接max-clients 200#为防止遭到DDoS攻击,生成ta.key文件,并拷贝到服务端和每个客户端#服务端0,客户端1tls-auth ta.key 0#设置重新连接时保留密钥。可避免重新连接时重新生成密钥persist-key#检测超时后,重新启动VPN,一直保持tun是linkup的。否则网络会先linkdown然后再linkuppersist-tun#指定OpenVPN输出连接状态的文件,可查看OpenVPN的连接状态status /etc/openvpn/logs/openvpn-status.log#记录日志,每次重启OpenVPN后追加log信息log-append /etc/openvpn/logs/openvpn.log#重复日志记录限额mute 20#指定日志文件的记录详细级别,0-9,等级越高日志内容越详细verb 3#和keys连接VPN,一定要打开这个选项,否则只允许一 个人连接VPNduplicate-cn#支持密码认证-允许使用自定义脚本script-security 3#支持密码认证-指定认证脚本auth-user-pass-verify /etc/openvpn/check.sh via-env#支持密码认证-用户密码登陆方式验证username-as-common-nameEOF

编写脚本检查文件和密码文件

# 创建认证文件[root@aliyun /etc/openvpn]$ cat > /etc/openvpn/check.sh <<-EOF#!/bin/bashPASSFILE="/etc/openvpn/user_passwd.txt"   #密码文件 用户名 密码明文LOG_FILE="/etc/openvpn/logs/openvpn-password.log"  #用户登录情况的日志TIME_STAMP=`date "+%Y-%m-%d %T"`if [ ! -r "${PASSFILE}" ]; thenecho "${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}" = "" ]; thenecho "${TIME_STAMP}: User does not exist: username=\"${username}\",password=\"${password}\"." >> ${LOG_FILE}exit 1fiif [ "${password}" = "${CORRECT_PASSWORD}" ]; thenecho "${TIME_STAMP}: Successful authentication: username=\"${username}\"." >> ${LOG_FILE}exit 0fiecho "${TIME_STAMP}: Incorrect password: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}exit 1EOF# 对check.sh授予执行权限[root@aliyun /etc/openvpn]$ chmod u+x check.sh# 创建密码文件[root@aliyun /etc/openvpn]$ cat > /etc/openvpn/user_passwd.txt <<-EOFtom 123456EOF

服务端开启ip转发

启动server端

[root@aliyun /etc/openvpn/server]$ openvpn --config server.conf

客户端安装OpenVPN

安装OpenVPN

yum install openvpn -ycd /etc/openvpn# 将服务端创建的证书文件拉取过来scp -P ** -r root@8.130.96.170:/etc/openvpn/tom ./

创建配置文件client.conf

[root@k3s-main openvpn]# cat > /etc/openvpn/tom/client.conf <<-EOF#指定当前VPN是客户端client#使用tun隧道传输协议dev tun#使用tcp协议传输数据proto tcp#OpenVPN服务器IP地址端口号remote 8.130.96.170 1194#指定CA证书的文件路径ca ca.crt#指定当前客户端的证书文件路径cert tom.crt#指定当前客户端的私钥文件路径key tom.key#断线自动重新连接,在网络不稳定的情况下非常有用resolv-retry infinite#不绑定本地特定的端口号nobind#通过keepalive检测超时后,重新启动PN,不重新读取keys,保留第一次使用的keypersist-key#检测超时后,重新启动PN,一直保持tun是linkup的。否则网络会先linkdown然后再linkuppersist-tun#生成防御DDos破坏的文件。客户端配置为tls-auth ta.key 1#指定日志文件的记录详细级别,0-9,等级越高日志内容越详细verb 3#使用用户名密码登录openvpn服务器auth-user-passEOF

3. 启动客户端

[root@k3s-main tom]# openvpn --config client.conf

4. 客户端ping服务端测试

问题反馈

若对文中有任何的疑问,或者需要帮助可以通过以下方式进行反馈

直接进行评论或者单独私聊

发送邮件到:mr_xuansu@163.com

更多内容请关注微信公众号:萱蘇的运维日常

2 阅读:340