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