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上连接正常