環境示意圖

安裝openvpn
1、環境
系統版本:CentOS 7.9
防火墻: 關閉狀態
2、安裝EPEL套件庫,更新
yum -y install epel-release && yum -y update
3、安裝 OpenVPN和證書工具
yum install -y openvpn easy-rsa
4、準備相關配置文件
cp /usr/share/doc/openvpn-2.4.12/sample/sample-config-files/server.conf /etc/openvpn/
cp -r /usr/share/easy-rsa/ /etc/openvpn/easy-rsa-server
cp /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/openvpn/easy-rsa-server/3/vars
vim /etc/openvpn/easy-rsa-server/3/vars
#CA的證書有效期默為為10年,可以適當延長,比如:36500天
#set_var EASYRSA_CA_EXPIRE 3650
set_var EASYRSA_CA_EXPIRE 36500
#服務器證書默為為825天,可適當加長,比如:3650天
#set_var EASYRSA_CERT_EXPIRE 825
set_var EASYRSA_CERT_EXPIRE 3650
準備證書相關文件
初始化 PKI 和 CA 簽發機構環境
初始化 PKI 生成 PKI 相關目錄和文件
cd /etc/openvpn/easy-rsa-server/3
./easyrsa init-pki
創建 CA 機構
./easyrsa build-ca nopass
回車即可
創建服務端證書申請
./easyrsa gen-req server nopass
接受Common Name默認
簽發服務端證書
./easyrsa sign server server
#輸入yes回車
創建 Diifie-Hellman 密鑰
./easyrsa gen-dh
準備客戶端證書環境
cp -r /usr/share/easy-rsa/ /etc/openvpn/easy-rsa-client
cp /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/openvpn/easy-rsa-client/3/vars
cd /etc/openvpn/easy-rsa-client/3
./easyrsa init-pki
創建客戶端證書申請
./easyrsa gen-req myclient nopass
# 創建client密碼
接受默認回車
簽發客戶端證書
cd /etc/openvpn/easy-rsa-server/3
./easyrsa import-req /etc/openvpn/easy-rsa-client/3/pki/reqs/myclient.req myclient
./easyrsa sign client myclient
# 輸入yes后回車
將 CA 和服務器證書相關文件復制到服務器相應的目錄
mkdir /etc/openvpn/certs
cp /etc/openvpn/easy-rsa-server/3/pki/ca.crt /etc/openvpn/certs/
cp /etc/openvpn/easy-rsa-server/3/pki/issued/server.crt /etc/openvpn/certs/
cp /etc/openvpn/easy-rsa-server/3/pki/private/server.key /etc/openvpn/certs/
cp /etc/openvpn/easy-rsa-server/3/pki/dh.pem /etc/openvpn/certs/
將客戶端私鑰與證書相關文件復制到服務器相關的目錄
mkdir /etc/openvpn/client/myclient
find /etc/openvpn/ \( -name "myclient.key" -o -name "myclient.crt" -o -name "ca.crt" \) -exec cp {} /etc/openvpn/client/myclient \;
準備用戶認證的腳本
vim /etc/openvpn/checkpsw.sh
#!/bin/sh
###########################################################
# 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="/etc/openvpn/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 1
fi
CORRECT_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 1
fi
if [ "${password}" = "${CORRECT_PASSWORD}" ]; then
echo "${TIME_STAMP}: Successful authentication: username=\"${username}\"." >> ${LOG_FILE}
exit 0
fi
echo "${TIME_STAMP}: Incorrect password: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
exit 1
腳本執行權限
chmod 755 /etc/openvpn/checkpsw.sh
配置用戶密碼文件
vim /etc/openvpn/psw-file
abcdocker 123456
abc 123456
test test
#前面為用戶名,后面為密碼。 中間使用空格分開
準備 OpenVPN 服務器配置文件
vim /etc/openvpn/server.conf
port 1194 #端口
proto tcp #協議,生產推薦使用TCP
dev tun
ca /etc/openvpn/certs/ca.crt #ca證書文件
cert /etc/openvpn/certs/server.crt #服務器證書文件
key /etc/openvpn/certs/server.key #服務器私鑰文件
dh /etc/openvpn/certs/dh.pem #dh參數文件
server 192.168.0.0 255.255.255.0 #客戶端連接后分配IP的地址池,服務器默認會占用第一個IP192.168.0.1將做為客戶端的網關,注意:不能和VPN服務器內網網段有相同
#ifconfig-pool-persist ipp.txt #為客戶端分配固定IP,不需要配置,建議注釋
push "route 172.16.0.0 255.255.255.0" #推送路由信息到客戶端,以允許客戶端能夠連接到服務器背后的其它私有子網
keepalive 10 120 #設置服務端檢測的間隔和超時時間,默認為每10秒ping一次,如果 120秒沒有回應則認為對方已經down
cipher AES-256-CBC #加密算法
compress lz4-v2 #啟用Openvpn2.4.X新版壓縮算法
push "compress lz4-v2" #推送客戶端使用新版壓縮算法
max-clients 100 #最大客戶端數
#user openvpn #運行openvpn服務的用戶和組
#group openvpn
status /var/log/openvpn-status.log #openVPN狀態記錄文件,每分鐘會記錄一次
log-append /var/log/openvpn.log #指定日志路徑,重啟openvpn后在之前的日志后面追加新的日志,生產環境建議使用
verb 3 #設置日志級別,0-9,級別越高記錄的內容越詳細,0 表示靜默運行,只記錄致命錯誤,4 表示合理的常規用法,5 和 6 可以幫助調試連接錯誤。9 表示極度冗余,輸出非常詳細的日志信息
mute 20 #相同類別的信息只有前20條會輸出到日志文件中
script-security 3
auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env #指定用戶認證腳本
username-as-common-name
verify-client-cert none
準備 iptables 規則和內核參數
echo net.ipv4.ip_forward = 1 >>/etc/sysctl.conf
sysctl -p
echo "iptables -t nat -APOSTROUTING -s 192.168.0.0/24 -j MASQUERADE" >>/etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local
/etc/rc.d/rc.local
啟動 OpenVPN 服務
systemctl enable openvpn@server
systemctl start openvpn@server
準備 OpenVPN 客戶端配置文件
生成客戶端文件,文件后綴必須為.ovpn
vim /etc/openvpn/client/myclient/client.ovpn
client #聲明自己是個客戶端
dev tun #接口類型,必須和服務端保持一致
proto tcp #協議類型,必須和服務端保持一致
remote 10.190.171.41 1194 #server端的ip和端口,可以寫域名但是需要可以解析成IP,這里是虛擬機的eip
resolv-retry infinite #如果是寫的server端的域名,那么就始終解析,如果域名發生變化,會重新連接到新的域名對應的IP
nobind #本機不綁定監聽端口,客戶端是隨機打開端口連接到服務端的1194
ca ca.crt
cert myclient.crt
key myclient.key
remote-cert-tls server #指定采用服務器證書校驗方式
cipher AES-256-CBC
verb 3
compress lz4-v2
auth-user-pass
將/etc/openvpn/client/myclient/ 下文件拷貝出來
OpenVPN 客戶端使用
安裝openvpn 客戶端并導入client.ovpn 配置文件,輸入client密碼。