完整的openvpn 服务端搭建,小白也能搭建!!网上最全的openvpn 服务端搭建文档之一,附带客户端创建管理的脚本

openvpn 服务端部署

背景: 因为最近想尝试通过openvpn连接连接家里的nas和手机进行照片传输分享。加上之前从网上找教程,搞了很久才搞出服务端,但是但是当时不太了解,导致部署的openvpn server可以使用,但是感觉摇摇欲坠,像是一堆bug的软件,自己都不知道为啥可以用了。这次趁着有时间,也有需求就重新搭建了。由于网上各种教程参差不齐,所以自己写一个完成过程的笔记。以方便自己日后使用,也方便其他人参考。

ps:不知道为啥群晖上导入客户端证书会提示无效证书,已经找群晖技术支持,目前还没反馈。有大佬知道要怎么搞可以说一下吗。刚开始还会提示错误的秘钥,我把客户端秘钥转换成rsa格式之后就没了这个报错。目前证书问题依旧未解决–2023年11月19日晚

ssh-keygen -p -f [证书名] -P [证书密码] 通过这个命令转换的
先把firewalld和selinux关闭
这个很简单,小白可以百度看下怎么关闭,当然也可以针对端口进行开放。因为我的设备是在阿里云,所我直接卸载了firewalld
其他各种工具,不如lrzsz,zip,net-tools,vim等工具自己按习惯进行安装
可以使用yum安装。比如:yum -y install lrzsz

一、安装软件
yum install easy-rsa
yum list installed easy-rsa
yum install openvpn
yum list installed openvpn
二、配置EASY-RSA 3.0
mkdir /etc/openvpn/easy-rsa
cp -r /usr/share/easy-rsa/3/* /etc/openvpn/easy-rsa/
cp -r /usr/share/doc/easy-rsa/vars.example /etc/openvpn/easy-rsa/vars

cp -r /usr/share/doc/easy-rsa/vars.example /etc/openvpn/easy-rsa/vars可能会执行不成功,有些版本的easy-rsa不是easy-rsa这个文件夹,需要改成对应的名字

三、创建OpenVPN相关的密钥
cd /etc/openvpn/easy-rsa/   #切换目录
./easyrsa init-pki     #初始化PKI目录

生成ca证书前可以改一下配置,也可以使用默认

[root@aliyun-relay easy-rsa]# vim vars 
export KEY_COUNTRY="CN"
export KEY_PROVINCE="ShangHai"
export KEY_CITY="shenzhen"
export KEY_ORG="home-nas"
export KEY_EMAIL="example@domain.com"
set_var EASYRSA_CA_EXPIRE       3650
set_var EASYRSA_CERT_EXPIRE     3650
set_var EASYRSA_CRL_DAYS        3650

**注:**设置的时间最好是按照默认,3650天,即10年。时间太短到时候过期要重新签发才能使用。

生成证书密码:123456

写好文件开始生成CA证书,默认是有密码,也可以选择nopass参书,不要密码加密

./easyrsa build-ca   #创建ca证书。默认是要密码。不要密码可以自己在后面加上 nopass,如需要密码请记住密码。注意看生成后会有证书文件路径,可以整理一下,记录好。到时候要收集这些文件的。这里就不放出来了

创建生成一个包含证书请求的文件,用于生成服务端证书

./easyrsa gen-req server1 nopass  

创建服务端证书,好像ca证书有密码这里也会需要输入ca证书的密码

./easyrsa sign-req server server1

创建生成一个包含证书请求的文件,用于生成客端证书

./easyrsa gen-req client1 nopass

创建客户端证书

./easyrsa sign-req client client1

根据之前创建的vars配置文件生成2048位的密钥

./easyrsa gen-dh

创建TLS认证密钥

openvpn --genkey --secret /etc/openvpn/easy-rsa/ta.key

CRL(证书撤销列表)密钥用于撤销客户端密钥。如果服务器上有多个客户端证书,希望删除某个密钥,那么只需使用./easyrsa revoke NAME这个命令撤销即可。
生成CRL密钥(这个有没有都是可以使用的,详细要自己看官方文档)

./easyrsa gen-crl

收集整理文件。当前执行命令的位置是/etc/openvpn/easy-rsa/,可以自己改命令。客户端和服务端的证书和密钥分开放,方便以后管理

cp -p pki/ca.crt /etc/openvpn/server
cp -p pki/issued/server1.crt /etc/openvpn/server
cp -p pki/private/server1.key /etc/openvpn/server
cp -p ta.key /etc/openvpn/server
cp -p pki/ca.crt /etc/openvpn/client/
cp -p pki/issued/client1.crt /etc/openvpn/client/
cp -p pki/private/client1.key /etc/openvpn/client/
cp -p ta.key /etc/openvpn/client/
cp pki/dh.pem /etc/openvpn/server
cp pki/crl.pem /etc/openvpn/server
四、编辑配置文件

去到openvpn的目录,编辑server.conf文件

cd /etc/openvpn
vim sever.conf

这是我的配置

port 1194
proto udp
dev tun
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/server1.crt
key /etc/openvpn/server/server1.key
dh /etc/openvpn/server/dh.pem
crl-verify /etc/openvpn/server/crl.pem
tls-auth /etc/openvpn/server/ta.key 0
server 192.168.254.0 255.255.255.0
push "172.23.201.0 255.255.255.0"
ifconfig-pool-persist /etc/openvpn/server/ipp.txt
#auth-user-pass /etc/openvpn/server/auth.txt
keepalive 10 120
cipher AES-256-CBC
client-to-client
max-clients 1000
persist-key
persist-tun
log /var/log/openvpn/server.log
log-append /var/log/server.log
status /var/log/openvpn-status.log
verb 3
explicit-exit-notify 1

创建相关文件

echo 1 > /var/log/openvpn-status.log
echo 1 > /var/log/server.log
echo 1 > /var/log/openvpn/server.log
echo 1 > /etc/openvpn/server/ipp.txt
五、启动服务

检查一下。没什么就可以启动服务端了

尝试使用systemctl enbale openvpn-server@servie.service启动失败
转用命令启动,
openvpn --cd /etc/openvpn/ --daemon --config server.conf
启动完成检查下,比如使用ip ad查看有没有新的tun0网卡出现,netstat -lunp | grep 1194 查看1194端口是不是被监听了。一切正常,下一步

开始iptables转发功能。如果服务端只是用来中转,其实可以不开启的。

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

服务端配置到此结束。
注意在云上的设备还要在管理台对1194端口进行开放,否则会被云防火墙拦截

客户端创建

这是一个创建和管理客户端的脚本。需自行修改一点才能使用

#!/bin/bash
# Date: 2018-3-26
# Create By Mr.Chen
#Date:2023-11-18
#Modify:Little Peng
# Describe: Create Openven User

USER=$2
PASS=$(echo "${USER}@phj.plus $(date)"|md5sum |cut -b 1-12)
CA_PASS="这里写你的证书密码"
OVDIR="/etc/openvpn"
SER_ERSA="${OVDIR}/easy-rsa/"
CLI_ERSA="${OVDIR}/easy-rsa/"
KEYS_DIR="${OVDIR}/client"
DB_FILE="${SER_ERSA}/pki/index.txt"

if [ ! -f /bin/expect ];then
  echo "expect is not installed, start the installation..."
  yum -y install expect
  if [ $? != 0 ];then
     echo "Installation failed, please install manually"
     exit 1
  fi
fi



function GenerateAkey(){
  rlist=$(find /etc/openvpn/ -name "${USER}*")
  if [ -n "$rlist" ];then
    echo "用户: ${USER} 已存在"
    exit 1
  fi
  cd ${CLI_ERSA}/
/bin/expect <<EOF
  spawn ./easyrsa gen-req $USER
  expect "Enter PEM pass phrase:"
  send "${PASS}\r"
  expect "Verifying - Enter PEM pass phrase"
  send "${PASS}\r"
  expect "Common Name"
  send "\r"
  expect eof
EOF
}

function GenerateAconf(){
cat > ${KEYS_DIR}/${USER}/${USER}.ovpn <<EOF
client
dev tun
proto udp
remote 这里写你的服务端公网IP 1194(1194是你映射在公网的端口,)
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert ${USER}.crt
key ${USER}.key
remote-cert-tls server
tls-auth ta.key 1
auth-user-pass
cipher AES-256-CBC
verb 3
EOF
}

function ImportAkey(){
  cd ${SER_ERSA}/
  ./easyrsa import-req ${CLI_ERSA}/pki/reqs/${USER}.req ${USER}
/bin/expect <<EOF
  spawn ./easyrsa sign client $USER
  expect "Confirm request details:"
  send "yes\r"
  expect "Enter pass phrase for"
  send "${CA_PASS}\r"
  expect eof
EOF
}
function CreateUserPass(){
	echo -e "$user:$pass" >> $OVDIR/server/auth.txt
}
function CreateUser(){
  GenerateAkey
  ImportAkey
  #CreateUserPass
  mkdir ${KEYS_DIR}/${USER}
  cp ${SER_ERSA}/pki/issued/${USER}.crt ${KEYS_DIR}/${USER}/
  cp ${CLI_ERSA}/pki/private/${USER}.key ${KEYS_DIR}/${USER}/
  cp ${OVDIR}/server/{ca.crt,ta.key} ${KEYS_DIR}/${USER}/
  echo "${PASS}" > ${KEYS_DIR}/${USER}/${USER}.pass
  cd ${KEYS_DIR}/
  GenerateAconf
  zip -r ${USER}.zip ${USER}/
  if [ -d ${USER} ];then
    rm -rf ${USER}
  fi
  echo -e "\033[32mPlease Download ${KEYS_DIR}/${USER}.zip\033[0m"
  echo -e ""
  if [ -f ${SER_ERSA}/pki/issued/${USER}.crt ];then
	echo -e "${USER} create success!!!"  
  else
    echo -e "\033[31mUser creation failed\033[0m"
  fi
}

function RemoveUser(){
  rlist=$(find /etc/openvpn/ -name "${USER}*")
  if [ ! -n "$rlist" ];then
    echo "用户: ${USER} 不存在"
    exit 1
  fi
  echo -e "\033[31m${rlist}\033[0m"
  read -p "上述文件将被移除,请确认(yes/no): " yn
  if [ "$yn" = "yes" ];then
    for f in $rlist;do
      rm -rf $f
      if [ $? = 0 ];then
        echo -e "\033[31m$f\033[0m       \033[32m[del]\033[0m"
      else
        echo -e "\033[31m$f\033[0m       \033[31m[fail]\033[0m"
      fi
    done
    sed -i "/=${USER}$/d" ${DB_FILE}
    if [ $? = 0 ];then
      cd ${SER_ERSA}/
/bin/expect <<EOF
  spawn ./easyrsa update-db
  expect "Enter pass phrase for"
  send "${CA_PASS}\r"
  expect eof
EOF
      echo -e "\033[31m${DB_FILE}\033[0m       \033[32m[update]\033[0m"
    else
      echo -e "\033[31m${DB_FILE}\033[0m       \033[32m[fail]\033[0m"
    fi   
  else
    exit 0
  fi
}

function RevokeUser(){
  rlist=$(find /etc/openvpn/ -name "${USER}*")
  if [ ! -n "$rlist" ];then
    echo "用户: ${USER} 不存在"
    exit 1
  fi
  cd ${SER_ERSA}/
/bin/expect <<EOF
  spawn ./easyrsa revoke ${USER}
  expect "Continue with revocation"
  send "yes\r"
  expect "Enter pass phrase for"
  send "${CA_PASS}\r"
  expect eof
EOF
}

function Gencrl(){
  cd ${SER_ERSA}/
/bin/expect <<EOF
  spawn ./easyrsa gen-crl
  expect "Enter pass phrase for"
  send "${CA_PASS}\r"
  expect eof
EOF
}

case "$1" in
    start)
        /usr/sbin/openvpn --daemon --config /etc/openvpn/server.conf --log-append /var/log/openvpn.log
    ;;
    restart)
        /usr/bin/pkill --signal SIGHUP --exact openvpn
    ;;
    add)
        if [ -n "$2" ];then
          CreateUser
        else
          echo $"Usage: $0 add username"
        fi
    ;;
    remove)
        if [ -n "$2" ];then
          RevokeUser
          Gencrl
          RemoveUser
        else
          echo $"Usage: $0 remove username"
        fi
    ;;
    *)
        echo $"Usage: $0 {start|restart|add|remove} username"
        exit 1
esac 

给脚本添加执行权限

chmod +x vpnctl.sh
./ vpnctl.sh add aikuai

部分日志

Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'aikuai'
Certificate is to be certified until Nov 16 03:13:25 2033 GMT (3650 days)

Write out database with 1 new entries
Data Base Updated

Certificate created at: /etc/openvpn/easy-rsa/pki/issued/aikuai.crt


  adding: aikuai/ (stored 0%)
  adding: aikuai/aikuai.key (deflated 24%)
  adding: aikuai/ta.key (deflated 40%)
  adding: aikuai/aikuai.crt (deflated 45%)
  adding: aikuai/ca.crt (deflated 25%)
  adding: aikuai/aikuai.ovpn (deflated 29%)
  adding: aikuai/aikuai.pass (stored 0%)
Please Download /etc/openvpn/client/aikuai.zip

aikuai create success!!!

使用工具lrzsz下载/etc/openvpn/client/aikuai.zip的文件,使用即可!
到此完成!
Windows上连接正常在这里插入图片描述

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
GatewayWorker 是一款基于PHP语言开发的高性能的TCP长连接框架,可以通过它来实现高并发的网络应用。而ThinkPHP是一款流行的PHP开发框架,提供了丰富的功能,包括MVC架构、ORM、模板引擎等等。 下面介绍如何使用ThinkPHP搭建GatewayWorker TCP客户端服务端。 ### 环境准备 - PHP 5.3以上版本(推荐PHP7) - GatewayWorker 3.0以上版本 - ThinkPHP 5.0以上版本 ### 客户端实现 在ThinkPHP的控制器中,我们可以使用GatewayClient类来实现对GatewayWorker服务端的连接和通信。以下是一个简单的示例: ```php use GatewayClient\Gateway; class IndexController extends \think\Controller { public function index() { Gateway::$registerAddress = '127.0.0.1:1238'; $client_id = Gateway::getClientIdByUid(1); Gateway::sendToClient($client_id, 'hello world'); } } ``` 在上面的代码中,我们首先设置了GatewayWorker服务端的注册地址,然后通过getClientIdByUid方法来获取客户端的连接ID,最后通过sendToClient方法向客户端发送消息。 ### 服务端实现 在ThinkPHP的控制器中,我们可以使用GatewayWorker的Gateway类来实现TCP服务端搭建和消息处理。以下是一个简单的示例: ```php use GatewayWorker\Gateway; class Test extends \think\Controller { public function index() { $gateway = new Gateway("websocket://0.0.0.0:7272"); $gateway->name = 'MyWebsocketGateway'; $gateway->count = 4; $gateway->onConnect = function($connection){ echo "new client connected\n"; }; $gateway->onMessage = function($connection, $data){ $connection->send('hello ' . $data); }; $gateway->onClose = function($connection){ echo "client closed\n"; }; $gateway->start(); } } ``` 在上面的代码中,我们首先创建了一个Gateway实例,并设置了监听地址和端口、名称、进程数等参数。然后我们定义了三个回调函数:onConnect、onMessage和onClose,分别处理客户端连接、消息接收和连接关闭的事件。最后我们调用start方法启动服务端。 ### 总结 本文介绍了如何使用ThinkPHP搭建GatewayWorker TCP客户端服务端。通过这种方式,我们可以很方便地实现高并发的网络应用。当然,GatewayWorker还提供了很多其他的功能,例如支持WebSocket协议、支持分布式部署等等。如果您想深入了解GatewayWorker的使用,可以参考官方文档

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值