赞
踩
背景: 因为最近想尝试通过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
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这个文件夹,需要改成对应的名字
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上连接正常
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。