參考文章:
1.https://blog.csdn.net/hantaozi/article/details/125235752(安裝openvpn,主要)
2.https://blog.csdn.net/m0_69013817/article/details/124589686(安裝opemvpn,參考)
3.https://blog.csdn.net/m0_69013817/article/details/126088625(安裝opemvpn,參考)
設備:
1.云電腦:有公網ip,可以同來當server端
2.兩臺本地電腦:分別作為 client1 和 client2
安裝程序
yum install -y epel-release && yum -y update && yum install -y easy-rsa openvpn
#####################如果上面的不行,可以用下面的######################
#更新軟件包
yum -y update
#安裝epel源
yum install -y epel-release
#安裝依賴包
yum install -y openssl lzo pam openssl-devel lzo-devel pam-devel
yum install -y easy-rsa
#安裝openvpn
yum install -y openvpn
生成證書密鑰
創建PKI
mkdir /etc/openvpn/easy-rsa
cp -r /usr/share/easy-rsa/3.0.8/ /etc/openvpn/easy-rsa/ #1.注意版本及路徑。2.這里復制后會將3.0.8文件夾頁復制過去,需要把里面的文件拿出來
cd /etc/openvpn/easy-rsa/
./easyrsa init-pki #初始化kpi,生成kpi文件夾
生成CA證書
./easyrsa build-ca
輸出:
[root@izwz9idz1lgutvrfidg8inz easy-rsa]# ./easyrsa build-ca
Using SSL: openssl OpenSSL 1.0.2k-fips 26 Jan 2017
Enter New CA Key Passphrase: 設置CA密碼,下面有用
Re-Enter New CA Key Passphrase: 確認密碼
Generating RSA private key, 2048 bit long modulus
...........................+++
..+++
e is 65537 (0x10001)
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:openvpnCA 隨便輸入證書名
CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/etc/openvpn/easy-rsa/pki/ca.crt
為服務器生成證書密鑰
server 為證書名稱,可以自由替換
nopass 是免密碼,避免啟動openvpn服務需要輸入證書密碼
./easyrsa build-server-full server nopass
輸出:
[root@izwz9idz1lgutvrfidg8inz easy-rsa]# ./easyrsa build-server-full server nopass
Using SSL: openssl OpenSSL 1.0.2k-fips 26 Jan 2017
Generating a 2048 bit RSA private key
.................................................+++
.............+++
writing new private key to '/etc/openvpn/easy-rsa/pki/easy-rsa-14878.omWrcN/tmp.bsrEu4'
-----
Using configuration from /etc/openvpn/easy-rsa/pki/easy-rsa-14878.omWrcN/tmp.VTOMKj
Enter pass phrase for /etc/openvpn/easy-rsa/pki/private/ca.key: 輸入剛剛創建CA證書時設置的密碼
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'server'
Certificate is to be certified until Sep 13 15:11:37 2024 GMT (825 days)
Write out database with 1 new entries
Data Base Updated
為客戶端生成證書密鑰
根據需要的客戶端證書數量創建證書,client1為證書名,可自由替換
# 創建名為client1的證書密鑰
./easyrsa build-client-full client1
#不想客戶端需要輸入密碼可以使用下面命令,建議使用密碼
# ./easyrsa build-client-full client1 nopass
輸出:
[root@izwz9idz1lgutvrfidg8inz easy-rsa]# ./easyrsa build-client-full client1
Using SSL: openssl OpenSSL 1.0.2k-fips 26 Jan 2017
Generating a 2048 bit RSA private key
....................+++
........+++
writing new private key to '/etc/openvpn/easy-rsa/pki/easy-rsa-15014.QOzFN6/tmp.uQz8Xk'
Enter PEM pass phrase: 為客戶端證書設置密碼
Verifying - Enter PEM pass phrase: 確認密碼
-----
Using configuration from /etc/openvpn/easy-rsa/pki/easy-rsa-15014.QOzFN6/tmp.YgmEO6
Enter pass phrase for /etc/openvpn/easy-rsa/pki/private/ca.key: 輸入剛剛創建CA證書時設置的密碼
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'client1'
Certificate is to be certified until Sep 13 15:21:24 2024 GMT (825 days)
Write out database with 1 new entries
Data Base Updated
生成Diffie hellman 參數
./easyrsa gen-dh
生成TLS認證密鑰
openvpn --genkey --secret ta.key
編輯openvpn服務器配置文件
1.復制配置示例文件(可以不用復制,直接創建一個server.conf新文件就行了)
# 注意路徑openvpn-2.4.12,文件夾的名字不是這個
cp /usr/share/doc/openvpn-2.4.12/sample/sample-config-files/server.conf /etc/openvpn/server/server.conf
2.編輯配置文件
如果上面復制了sample文件,需要一處處的去改,可以直接把文件內容清空,填寫新內容
vim /etc/openvpn/server/server.conf
我使用的配置:
port 1194
proto tcp
dev tun
ca /etc/openvpn/easy-rsa/pki/ca.crt
cert /etc/openvpn/easy-rsa/pki/issued/server.crt
key /etc/openvpn/easy-rsa/pki/private/server.key
dh /etc/openvpn/easy-rsa/pki/dh.pem
topology subnet
tls-auth /etc/openvpn/easy-rsa/ta.key 0
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
;push "redirect-gateway def1 bypass-dhcp" #加了這個客戶端所有流量都走vpn,對于1m的云服務器帶寬來說就很卡,還是單獨設置好些,所以用;注掉。具體看下面的配置解釋。
push "dhcp-option DNS 223.5.5.5"
push "dhcp-option DNS 223.6.6.6"
client-to-client
keepalive 10 120
cipher AES-256-CBC
user nobody
group nobody
persist-key
persist-tun
status openvpn-status.log
log-append openvpn.log
verb 3
配置解釋:
本文將介紹如何配置OpenVPN服務器端的配置文件。在Windows系統中,該配置文件一般叫做server.ovpn;在Linux/BSD系統中,該配置文件一般叫做server.conf。雖然配置文件名稱不同,但其中的配置內容與配置方法卻是相同的。
本文根據官方提供的server.ovpn示例文件直接翻譯得出。Windows、Linux、BSD等系統的服務器端配置文件均可參考本文。
#################################################
# 針對多客戶端的OpenVPN 2.0 的服務器端配置文件示例
#
# 本文件用于多客戶端<->單服務器端的OpenVPN服務器端配置
#
# OpenVPN也支持單機<->單機的配置(更多信息請查看網站上的示例頁面)
#
# 該配置支持Windows或者Linux/BSD系統。此外,在Windows上,記得將路徑加上雙引號,
# 并且使用兩個反斜杠,例如:"C:\\Program Files\\OpenVPN\\config\\foo.key"
#
# '#' or ';'開頭的均為注釋內容
#################################################
#OpenVPN應該監聽本機的哪些IP地址?
#該命令是可選的,如果不設置,則默認監聽本機的所有IP地址。
;local a.b.c.d
# OpenVPN應該監聽哪個TCP/UDP端口?
# 如果你想在同一臺計算機上運行多個OpenVPN實例,你可以使用不同的端口號來區分它們。
# 此外,你需要在防火墻上開放這些端口。
port
#OpenVPN使用TCP還是UDP協議?
;proto tcp
proto udp
# 指定OpenVPN創建的通信隧道類型。
# "dev tun"將會創建一個路由IP隧道,
# "dev tap"將會創建一個以太網隧道。
#
# 如果你是以太網橋接模式,并且提前創建了一個名為"tap0"的與以太網接口進行橋接的虛擬接口,則你可以使用"dev tap0"
#
# 如果你想控制VPN的訪問策略,你必須為TUN/TAP接口創建防火墻規則。
#
# 在非Windows系統中,你可以給出明確的單位編號(unit number),例如"tun0"。
# 在Windows中,你也可以使用"dev-node"。
# 在多數系統中,除非你部分禁用或者完全禁用了TUN/TAP接口的防火墻,否則VPN將不起作用。
;dev tap
dev tun
# 如果你想配置多個隧道,你需要用到網絡連接面板中TAP-Win32適配器的名稱(例如"MyTap")。
# 在XP SP2或更高版本的系統中,你可能需要有選擇地禁用掉針對TAP適配器的防火墻
# 通常情況下,非Windows系統則不需要該指令。
;dev-node MyTap
# 設置SSL/TLS根證書(ca)、證書(cert)和私鑰(key)。
# 每個客戶端和服務器端都需要它們各自的證書和私鑰文件。
# 服務器端和所有的客戶端都將使用相同的CA證書文件。
#
# 通過easy-rsa目錄下的一系列腳本可以生成所需的證書和私鑰。
# 記住,服務器端和每個客戶端的證書必須使用唯一的Common Name。
#
# 你也可以使用遵循X509標準的任何密鑰管理系統來生成證書和私鑰。
# OpenVPN 也支持使用一個PKCS #12格式的密鑰文件(詳情查看站點手冊頁面的"pkcs12"指令)
ca ca.crt
cert server.crt
key server.key # 該文件應該保密
# 指定迪菲·赫爾曼參數。
# 你可以使用如下名稱命令生成你的參數:
# openssl dhparam -out dh1024.pem
# 如果你使用的是2048位密鑰,使用2048替換其中的1024。
dh dh1024.pem
# 設置服務器端模式,并提供一個VPN子網,以便于從中為客戶端分配IP地址。
# 在此處的示例中,服務器端自身將占用10.,其他的將提供客戶端使用。
# 如果你使用的是以太網橋接模式,請注釋掉該行。更多信息請查看官方手冊頁面。
server 10.8.0.0 255.255.255.0
# 指定用于記錄客戶端和虛擬IP地址的關聯關系的文件。
# 當重啟OpenVPN時,再次連接的客戶端將分配到與上一次分配相同的虛擬IP地址
ifconfig-pool-persist ipp.txt
# 該指令僅針對以太網橋接模式。
# 首先,你必須使用操作系統的橋接能力將以太網網卡接口和TAP接口進行橋接。
# 然后,你需要手動設置橋接接口的IP地址、子網掩碼;
# 在這里,我們假設為10.。
# 最后,我們必須指定子網的一個IP范圍(例如從10.8.0.50開始,到10.8.0.100結束),以便于分配給連接的客戶端。
# 如果你不是以太網橋接模式,直接注釋掉這行指令即可。
;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100
# 該指令僅針對使用DHCP代理的以太網橋接模式,
# 此時客戶端將請求服務器端的DHCP服務器,從而獲得分配給它的IP地址和DNS服務器地址。
#
# 在此之前,你也需要先將以太網網卡接口和TAP接口進行橋接。
# 注意:該指令僅用于OpenVPN客戶端,并且該客戶端的TAP適配器需要綁定到一個DHCP客戶端上。
;server-bridge
# 推送路由信息到客戶端,以允許客戶端能夠連接到服務器背后的其他私有子網。
# (簡而言之,就是允許客戶端訪問VPN服務器自身所在的其他局域網)
# 記住,這些私有子網也要將OpenVPN客戶端的地址池(10.8.0.0/255.255.255.0)反饋回OpenVPN服務器。
;push "route 192.168.10.0 255.255.255.0"
;push "route 192.168.20.0 255.255.255.0"
# 為指定的客戶端分配指定的IP地址,或者客戶端背后也有一個私有子網想要訪問VPN,
# 那么你可以針對該客戶端的配置文件使用ccd子目錄。
# (簡而言之,就是允許客戶端所在的局域網成員也能夠訪問VPN)
# 舉個例子:假設有個Common Name為/255.255.255.248。
# 首先,你需要去掉下面兩行指令的注釋:
;client-config-dir ccd
;route 192.168.40.128 255.255.255.248
# 然后創建一個文件ccd/Thelonious,該文件的內容為:
# iroute 192.168.40.128 255.255.255.248
#這樣客戶端所在的局域網就可以訪問VPN了。
# 注意,這個指令只能在你是基于路由、而不是基于橋接的模式下才能生效。
# 比如,你使用了"dev tun"和"server"指令。
# 再舉個例子:假設你想給Thelonious分配一個固定的IP地址10.。
# 首先,你需要去掉下面兩行指令的注釋:
;client-config-dir ccd
;route 10.9.0.0 255.255.255.252
# 然后在文件ccd/Thelonious中添加如下指令:
# ifconfig-push 10.9.0.1 10.9.0.2
# 如果你想要為不同群組的客戶端啟用不同的防火墻訪問策略,你可以使用如下兩種方法:
# ()運行多個OpenVPN守護進程,每個進程對應一個群組,并為每個進程(群組)啟用適當的防火墻規則。
# () (進階)創建一個腳本來動態地修改響應于來自不同客戶的防火墻規則。
# 關于learn-address腳本的更多信息請參考官方手冊頁面。
;learn-address ./script
# 如果啟用該指令,所有客戶端的默認網關都將重定向到VPN,這將導致諸如web瀏覽器、DNS查詢等所有客戶端流量都經過VPN。
# (為確保能正常工作,OpenVPN服務器所在計算機可能需要在TUN/TAP接口與以太網之間使用NAT或橋接技術進行連接)
;push "redirect-gateway def1 bypass-dhcp"
# 某些具體的Windows網絡設置可以被推送到客戶端,例如DNS或WINS服務器地址。
# 下列地址來自opendns.com提供的Public DNS 服務器。
;push "dhcp-option DNS 208.67.222.222"
;push "dhcp-option DNS 208.67.220.220"
# 去掉該指令的注釋將允許不同的客戶端之間相互"可見"(允許客戶端之間互相訪問)。
# 默認情況下,客戶端只能"看見"服務器。為了確保客戶端只能看見服務器,你還可以在服務器端的TUN/TAP接口上設置適當的防火墻規則。
;client-to-client
# 如果多個客戶端可能使用相同的證書/私鑰文件或Common Name進行連接,那么你可以取消該指令的注釋。
# 建議該指令僅用于測試目的。對于生產使用環境而言,每個客戶端都應該擁有自己的證書和私鑰。
# 如果你沒有為每個客戶端分別生成Common Name唯一的證書/私鑰,你可以取消該行的注釋(但不推薦這樣做)。
;duplicate-cn
# keepalive指令將導致類似于ping命令的消息被來回發送,以便于服務器端和客戶端知道對方何時被關閉。
# 每10秒鐘ping一次,如果120秒內都沒有收到對方的回復,則表示遠程連接已經關閉。
keepalive
# 出于SSL/TLS之外更多的安全考慮,創建一個"HMAC 防火墻"可以幫助抵御DoS攻擊和UDP端口淹沒攻擊。
# 你可以使用以下命令來生成:
# openvpn --genkey --secret ta.key
#
# 服務器和每個客戶端都需要擁有該密鑰的一個拷貝。
# 第二個參數在服務器端應該為'。
;tls-auth ta.key # 該文件應該保密
# 選擇一個密碼加密算法。
# 該配置項也必須復制到每個客戶端配置文件中。
;cipher BF-CBC # Blowfish (默認)
;cipher AES--CBC # AES
;cipher DES-EDE3-CBC # Triple-DES
# 在VPN連接上啟用壓縮。
# 如果你在此處啟用了該指令,那么也應該在每個客戶端配置文件中啟用它。
comp-lzo
# 允許并發連接的客戶端的最大數量
;max-clients
# 在完成初始化工作之后,降低OpenVPN守護進程的權限是個不錯的主意。
# 該指令僅限于非Windows系統中使用。
;user nobody
;group nobody
# 持久化選項可以盡量避免訪問那些在重啟之后由于用戶權限降低而無法訪問的某些資源。
persist-key
persist-tun
# 輸出一個簡短的狀態文件,用于顯示當前的連接狀態,該文件每分鐘都會清空并重寫一次。
status openvpn-status.log
# 默認情況下,日志消息將寫入syslog(在Windows系統中,如果以服務方式運行,日志消息將寫入OpenVPN安裝目錄的log文件夾中)。
# 你可以使用log或者log-append來改變這種默認情況。
# "log"方式在每次啟動時都會清空之前的日志文件。
# "log-append"這是在之前的日志內容后進行追加。
# 你可以使用兩種方式之一(但不要同時使用)。
;log openvpn.log
;log-append openvpn.log
# 為日志文件設置適當的冗余級別(~)。冗余級別越高,輸出的信息越詳細。
#
# 表示靜默運行,只記錄致命錯誤。
# 表示合理的常規用法。
# 和 可以幫助調試連接錯誤。
# 表示極度冗余,輸出非常詳細的日志信息。
verb
# 重復信息的沉默度。
# 相同類別的信息只有前20條會輸出到日志文件中。
;mute
設置NAT及防火墻
禁用防火墻
systemctl stop firewalld
systemctl disable firewalld
關閉selinux(selinux是Linux特有的安全機制,因為配置太麻煩,幾乎沒有人真正的應用它。安裝完系統后我們一般會選擇關閉selinux。)
#這是臨時關閉,永久關閉在 /etc/selinux/config
setenforce 0
開啟ipv4轉發
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p
安裝iptables
yum install iptables-services
設置網卡nat
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE
保存設置
service iptables save
iptable的教程可以看:https://blog.csdn.net/weixin_38166318/article/details/127344897
啟動openvpn
設置并啟動openvpn
systemctl enable openvpn-server@server
systemctl start openvpn-server@server.service
檢查狀態
netstat -tlunp
systemctl status openvpn-server@server
準備客戶端文件
復制證書密鑰到一個文件夾下
如果有多個客戶端,就將下面所有的client1改成相應的client
mkdir /etc/openvpn/client/client1
cp /etc/openvpn/easy-rsa/pki/ca.crt /etc/openvpn/client/client1/
cp /etc/openvpn/easy-rsa/pki/issued/client1.crt /etc/openvpn/client/client1/
cp /etc/openvpn/easy-rsa/pki/private/client1.key /etc/openvpn/client/client1/
cp /etc/openvpn/easy-rsa/ta.key /etc/openvpn/client/client1/
編輯客戶端配置文件
#windows、macOS
vim /etc/openvpn/client/client1/client1.ovpn
#linux
vim /etc/openvpn/client/client1/client1.conf
client
dev tun
proto tcp
remote 111.111.111.111 1194 #修改111.111.111.111為服務器公網ip地址;1194為openvpn端口
nobind
persist-key
persist-tun
ca ca.crt
cert client1.crt
key client1.key
tls-auth ta.key 1
remote-cert-tls server
cipher AES-256-CBC
verb 3
windos客戶端使用
1.下載安裝OpenVPN GUI :
官方github地址:
https://github.com/OpenVPN/openvpn-gui
然后進行安裝,不能修改安裝路徑
2.將剛剛服務器上準備的客戶端文件夾【/etc/openvpn/client/client1/】復制到客戶端【C:\Program Files\OpenVPN\config】目錄下面。
3.打開OpenVPN
4.輸入client1證書生成時設置的密碼即可連接成功
連接成功后,此時已經可以在客戶端電腦中ping通服務端云電腦的內網ip以及10.8.0.0那個網段的ip了。但是此時兩個客戶端之間并不能相互ping通,這是因為windows防火墻攔截了,如果直接關閉防火墻,那么就能相互ping通了。
常見問題
連接成功但流量不走openvpn
檢查服務器配置文件是否設置了那些流量經過openvpn
#設置客戶端那些ip段走openvpn通道
;push "route 192.168.10.0 255.255.255.0"
;push "route 192.168.20.0 255.255.255.0"
# 設置客戶端所有流量都通過openvpn
push "redirect-gateway def1 bypass-dhcp"
TCP: connect to [AF_INET]111.111.111.111:1194 failed: Unknown error
檢查端口是否可以訪問
#telnet命令需要在 控制面板 > 程序 > 啟用或關閉windows功能中勾選 telnet客戶端 打開
telnet 111.111.111.111 1194
檢查防火墻設置,可能被iptables阻攔了
#清空iptables規則
iptables -F
#設置nat規則
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE