VPN詳解
一、VPN介紹
- 什么是vpn?
# VPN是虛擬專(zhuān)用網(wǎng)絡(luò)的縮寫(xiě),它是兩個(gè)或多個(gè)物理網(wǎng)絡(luò)(或設(shè)備)之間溝通互聯(lián)網(wǎng)/公共網(wǎng)絡(luò)創(chuàng)建的虛擬網(wǎng)絡(luò),可以為企業(yè)之間或者個(gè)人與企業(yè)之間提供安全(加密)的數(shù)據(jù)傳輸隧道服務(wù)。
- vpn的作用是什么?
# vpn的功能主要就是幫助不在公司內(nèi)部局域網(wǎng)內(nèi)的人員可以通過(guò)數(shù)據(jù)加密的方式遠(yuǎn)程訪問(wèn)公司內(nèi)部資源
- 兩種基本的vpn類(lèi)型
1. 遠(yuǎn)程訪問(wèn)vpn
允許用戶遠(yuǎn)程連接到專(zhuān)用網(wǎng)絡(luò),通過(guò)完全安全的internet連接進(jìn)行連接
2. 站點(diǎn)到站點(diǎn)vpn
最常用的為公司與公司之間使用vpn,即可實(shí)現(xiàn)設(shè)在不同地點(diǎn)的公司之間進(jìn)行數(shù)據(jù)共享
- 常見(jiàn)的vpn協(xié)議
PPTP(點(diǎn)對(duì)點(diǎn)隧道協(xié)議)
優(yōu):windows自帶,無(wú)需安裝,網(wǎng)絡(luò)連接較為穩(wěn)定
缺:安全性低,可以被防火墻阻止(不建議用于公司或商業(yè)用途)
L2TP/IPsec------PPTP升級(jí)版
優(yōu):安全性較之pptp高,windows自帶,無(wú)需安裝,可用于具有相同vpn配置的多個(gè)設(shè)備
缺:速度較慢(加密算法導(dǎo)致),不建議用于cpu性能較低的計(jì)算機(jī)。
IKEv2/IPsec
優(yōu):速度加快;安全性較高;重連速度較快;與手機(jī)兼容性也較強(qiáng)(較適合用于手機(jī))
缺:搭建較為困難,暫時(shí)支持的平臺(tái)不是很多
OpenVPN
優(yōu):安全性較高;可配置性較強(qiáng);可以繞過(guò)防火墻
缺:需要安裝第三方軟件;安裝過(guò)程較為復(fù)雜;移動(dòng)端支持較差(手機(jī))
二、VPN部署
實(shí)驗(yàn)環(huán)境如下
公網(wǎng)IP:192.168.5.3
內(nèi)網(wǎng)IP:172.16.5.3
主機(jī)名:server
---------------------------'openvpn安裝'-------------------------------
# 下載安裝OpenVPN以及證書(shū)管理工具
[root@server ~]# yum -y install openvpn
[root@server ~]# yum -y install easy-rsa
---------------------------'準(zhǔn)備相關(guān)配置文件'-------------------------------
# 生成服務(wù)器配置文件
[root@server ~]# cp /usr/share/doc/openvpn-2.4.11/sample/sample-config-files/server.conf /etc/openvpn/
# 準(zhǔn)備證書(shū)簽發(fā)相關(guān)文件
[root@server ~]# cp -r /usr/share/easy-rsa/ /etc/openvpn/easy-rsa-server
# 準(zhǔn)備簽發(fā)證書(shū)相關(guān)變量的配置文件
[root@server ~]# cp /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/openvpn/easy-rsa-server/vars
# 注意默認(rèn)ca證書(shū)以及服務(wù)器證書(shū)有效期分別為3650天以及825天,可修改以下文件
# ca證書(shū)修改
#set_var EASYRSA_CA_EXPIRE 3650
set_var EASYRSA_CA_EXPIRE 36500
# 服務(wù)器證書(shū)修改
#set_var EASYRSA_CERT_EXPIRE 825
set_var EASYRSA_CERT_EXPIRE 3650
---------------------------'初始化PKI并生成PKi相關(guān)目錄和文件'-------------------------------
[root@server ~]# cd /etc/openvpn/easy-rsa-server/3
[root@server 3]# ./easyrsa init-pki
---------------------------'生成CA證書(shū)'-------------------------------
[root@server 3]# pwd
/etc/openvpn/easy-rsa-server/3
# nopass代表不加密私鑰,主要方便后面導(dǎo)出公鑰與頒發(fā)服務(wù)器證書(shū)
# 此步驟做完即在/etc/openvpn/easy-rsa-server/3/pki下生成了ca.crt證書(shū)
[root@server 3]# ./easyrsa build-ca nopass
# openssl x509主要用于輸出證書(shū)信息,也能簽署證書(shū)請(qǐng)求文件、自簽署、轉(zhuǎn)換證書(shū)格式等
# -in 指定證書(shū)輸入文件
# -noount 默認(rèn)out選項(xiàng)為指定輸出文件,noout為默認(rèn)不輸出到文件
# -text 以text格式輸出證書(shū)內(nèi)容,即以最全格式輸出
# 所以此項(xiàng)的內(nèi)容為 格式化輸出證書(shū)內(nèi)容..
[root@server 3]# openssl x509 -in pki/ca.crt -noout -text
---------------------------'創(chuàng)建服務(wù)端證書(shū)申請(qǐng)'-------------------------------
[root@server 3]# ./easyrsa gen-req server nopass
'會(huì)有以下輸出'
Common Name (eg: your user, host, or server name) [server]: # 直接回車(chē)
req: /etc/openvpn/easy-rsa-server/3/pki/reqs/server.req # 生成請(qǐng)求文件
key: /etc/openvpn/easy-rsa-server/3/pki/private/server.key # 生成私鑰文件
---------------------------'簽發(fā)服務(wù)端證書(shū)'-------------------------------
[root@server 3]# ./easyrsa sign server server
'會(huì)有以下輸出'
Confirm request details: # 輸入yes回車(chē)
# 生成服務(wù)器證書(shū)文件(server.crt)
Certificate created at: /etc/openvpn/easy-rsa-server/3/pki/issued/server.crt
[root@server 3]# diff pki/certs_by_serial/C27FBCEF83E7E2370D5E923F48618049.pem pki/issued/server.crt
---------------------------'創(chuàng)建Diffie-Hellman密鑰'-------------------------------
'以下方法二選一'
方法一:
[root@server 3]# pwd
/etc/openvpn/easy-rsa-server/3
# 此命令會(huì)生成/etc/openvpn/easy-rsa-server/3/pki/dh.pem文件
[root@server 3]# ./easyrsa gen-dh
方法二:
# 此命令會(huì)生成/etc/openvpn/dh2048.pem文件
[root@server 3]# openssl dhparam -out /etc/openvpn/dh2048.pem 2048
---------------------------'客戶端證書(shū)環(huán)境'-------------------------------
[root@server pki]# cp -r /usr/share/easy-rsa/ /etc/openvpn/easy-rsa-client
[root@server pki]# cp /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/openvpn/easy-rsa-client/3/varsa
[root@server pki]# cd /etc/openvpn/easy-rsa-client/3
# 初始化證書(shū)目錄----client環(huán)境下
[root@server 3]# pwd
/etc/openvpn/easy-rsa-client/3
[root@server 3]# ./easyrsa init-pki
# 生成證書(shū)
# 生成用戶shilin的req以及key文件
[root@server 3]# ./easyrsa gen-req shilin nopass
'會(huì)有以下輸出'
Common Name (eg: your user, host, or server name) [shilin]: # 直接默認(rèn)回車(chē)即可
req: /etc/openvpn/easy-rsa-client/3/pki/reqs/shilin.req # 生成shilin.req文件
key: /etc/openvpn/easy-rsa-client/3/pki/private/shilin.key # 生成shilin.key文件
# 將客戶端證書(shū)請(qǐng)求文件復(fù)制到CA的工作目錄
[root@server 3]# cd /etc/openvpn/easy-rsa-server/3
[root@server 3]# ./easyrsa import-req /etc/openvpn/easy-rsa-client/3/pki/reqs/shilin.req shilin
[root@server 3]# pwd
/etc/openvpn/easy-rsa-server/3
# 簽發(fā)客戶端證書(shū),會(huì)生成/etc/openvpn/easy-rsa-server/3/pki/issued/shilin.crt文件,需輸入yes
[root@server 3]# ./easyrsa sign client shilin
---------------------------'將ca和服務(wù)器證書(shū)相關(guān)文件復(fù)制到服務(wù)器響應(yīng)目錄'-------------------------------
[root@server 3]# mkdir /etc/openvpn/certs
[root@server 3]# cp /etc/openvpn/easy-rsa-server/3/pki/ca.crt /etc/openvpn/certs/
[root@server 3]# cp /etc/openvpn/easy-rsa-server/3/pki/issued/server.crt /etc/openvpn/certs/
[root@server 3]# cp /etc/openvpn/easy-rsa-server/3/pki/private/server.key /etc/openvpn/certs/
[root@server 3]# cp /etc/openvpn/easy-rsa-server/3/pki/dh.pem /etc/openvpn/certs/
[root@server 3]# ls /etc/openvpn/certs/
ca.crt dh.pem server.crt server.key
---------------------------'將客戶端私鑰與證書(shū)相關(guān)文件復(fù)制到服務(wù)器相關(guān)的目錄'-------------------------------
[root@server 3]# mkdir /etc/openvpn/client/shilin
[root@server 3]# find /etc/openvpn/ ( -name "shilin.key" -o -name "shilin.crt" -o -name ca.crt ) -exec cp {} /etc/openvpn/client/shilin ;
[root@server 3]# cd /etc/openvpn/client/shilin/
[root@server shilin]# ls
ca.crt shilin.crt shilin.key
三、OpenVPN服務(wù)端配置文件
以下為默認(rèn)配置文件說(shuō)明信息
#server.conf文件中以#或;開(kāi)頭的行都為注釋
[root@server ~]# grep -Ev "^#|^$" /etc/openvpn/server.conf
;local a.b.c.d #本機(jī)監(jiān)聽(tīng)I(yíng)P,默認(rèn)為本機(jī)所有IP
port 1194 #端口
;proto tcp #協(xié)議,生產(chǎn)推薦使用TCP
proto udp #默認(rèn)協(xié)議
;dev tap #創(chuàng)建一個(gè)以太網(wǎng)隧道,以太網(wǎng)使用tap,一個(gè)tap設(shè)備允許完整的以太網(wǎng)幀通過(guò)Openvpn隧道,可提供非ip協(xié)議的支持,比如IPX協(xié)議和AppleTalk協(xié)議,tap等同于一個(gè)以太網(wǎng)設(shè)備,它操作第二層數(shù)據(jù)包如以太網(wǎng)數(shù)據(jù)幀。
dev tun #創(chuàng)建一個(gè)路由IP隧道,生產(chǎn)推存使用tun.互聯(lián)網(wǎng)使用tun,一個(gè)tun設(shè)備大多時(shí)候,被用于基于IP協(xié)議的通訊。tun模擬了網(wǎng)絡(luò)層設(shè)備,操作第三層數(shù)據(jù)包比如IP數(shù)據(jù)封包。
;dev-node MyTap #TAP-Win32適配器。非windows不需要配置
ca ca.crt #ca證書(shū)文件
cert server.crt #服務(wù)器證書(shū)文件
key server.key #服務(wù)器私鑰文件
dh dh2048.pem #dh參數(shù)文件
;topology subnet
server 10.8.0.0 255.255.255.0 #客戶端連接后分配IP的地址池,服務(wù)器默認(rèn)會(huì)占用第一個(gè)IP 10.8.0.1將做為客戶端的網(wǎng)關(guān)
ifconfig-pool-persist ipp.txt #為客戶端分配固定IP,不需要配置,建議注釋
;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100 #配置網(wǎng)橋模式,不需要配置,建議注釋
;server-bridge
;push "route 192.168.10.0 255.255.255.0" #給客戶端生成的到達(dá)服務(wù)器后面網(wǎng)段的靜態(tài)路由,下一跳為openvpn服務(wù)器的10.8.0.1
;push "route 192.168.20.0 255.255.255.0" #推送路由信息到客戶端,以允許客戶端能夠連接到服務(wù)器背后的其它私有子網(wǎng)
;client-config-dir ccd #為指定的客戶端添加路由,此路由通常是客戶端后面的內(nèi)網(wǎng)網(wǎng)段而不是服務(wù)端的,也不需要設(shè)置
;route 192.168.40.128 255.255.255.248
;client-config-dir ccd
;route 10.9.0.0 255.255.255.252
;learn-address ./script #運(yùn)行外部腳本,創(chuàng)建不同組的iptables規(guī)則,無(wú)需配置
;push "redirect-gateway def1 bypass-dhcp" #啟用后,客戶端所有流量都將通過(guò)VPN服務(wù)器,因此生產(chǎn)一般無(wú)需配置此項(xiàng)
;push "dhcp-option DNS 208.67.222.222" #推送DNS服務(wù)器,不需要配置
;push "dhcp-option DNS 208.67.220.220"
;client-to-client #允許不同的client直接通信,不安全,生產(chǎn)環(huán)境一般無(wú)需要配置
;duplicate-cn #多個(gè)用戶共用一個(gè)證書(shū),一般用于測(cè)試環(huán)境,生產(chǎn)環(huán)境都是一個(gè)用戶一個(gè)證書(shū),無(wú)需開(kāi)啟
keepalive 10 120 #設(shè)置服務(wù)端檢測(cè)的間隔和超時(shí)時(shí)間,默認(rèn)為每10秒ping一次,如果 120 秒沒(méi)有回應(yīng)則認(rèn)為對(duì)方已經(jīng)down
tls-auth ta.key 0 #訪止DoS等攻擊的安全增強(qiáng)配置,可以使用以下命令來(lái)生成:openvpn --
genkey --secret ta.key #服務(wù)器和每個(gè)客戶端都需要擁有該密鑰的一個(gè)拷貝。第二個(gè)參數(shù)在服務(wù)器端應(yīng)該為’0’,在客戶端應(yīng)該為’1’
cipher AES-256-CBC #加密算法
;compress lz4-v2 #啟用Openvpn2.4.X新版壓縮算法
;push "compress lz4-v2" #推送客戶端使用新版壓縮算法,和下面的comp-lzo不要同時(shí)使用
;comp-lzo #舊戶端兼容的壓縮配置,需要客戶端配置開(kāi)啟壓縮,openvpn2.4.X等新版可以不用開(kāi)啟
;max-clients 100 #最大客戶端數(shù)
;user nobody #運(yùn)行openvpn服務(wù)的用戶和組
;group nobody
persist-key #重啟VPN服務(wù)時(shí)默認(rèn)會(huì)重新讀取key文件,開(kāi)啟此配置后保留使用第一次的key文件,生產(chǎn)環(huán)境無(wú)需開(kāi)啟
persist-tun #啟用此配置后,當(dāng)重啟vpn服務(wù)時(shí),一直保持tun或者tap設(shè)備是up的,否則會(huì)先down然后再u(mài)p,生產(chǎn)環(huán)境無(wú)需開(kāi)啟
status openvpn-status.log #openVPN狀態(tài)記錄文件,每分鐘會(huì)記錄一次
;log openvpn.log #第一種日志記錄方式,并指定日志路徑,log會(huì)在openvpn啟動(dòng)的時(shí)候清空日志文件,不建議使用
;log-append openvpn.log #第二種日志記錄方式,并指定日志路徑,重啟openvpn后在之前的日志后面追加新的日志,生產(chǎn)環(huán)境建議使用
verb 3 #設(shè)置日志級(jí)別,0-9,級(jí)別越高記錄的內(nèi)容越詳細(xì),0 表示靜默運(yùn)行,只記錄致命錯(cuò)誤,4 表示合理的常規(guī)用法,5 和 6 可以幫助調(diào)試連接錯(cuò)誤。9 表示極度冗余,輸出非常詳細(xì)的日志信息
;mute 20 #相同類(lèi)別的信息只有前20條會(huì)輸出到日志文件中
explicit-exit-notify 1 #通知客戶端,在服務(wù)端重啟后自動(dòng)重新連接,僅能用于udp模式,tcp模式不需要配置即可實(shí)現(xiàn)斷開(kāi)重新連接,且開(kāi)啟此項(xiàng)后tcp配置后將導(dǎo)致openvpn服務(wù)無(wú)法啟動(dòng),所以tcp時(shí)必須不能開(kāi)啟此項(xiàng)
以下為實(shí)驗(yàn)環(huán)境配置文件信息
[root@server ~]# cat /etc/openvpn/server.conf
# 指定默認(rèn)端口號(hào)
port 1194
# 指定vpn使用的協(xié)議為tcp,生產(chǎn)環(huán)境推薦使用
proto tcp
# 創(chuàng)建一個(gè)路由IP隧道,生產(chǎn)環(huán)境推薦使用tun
dev tun
# 指定證書(shū)文件
ca /etc/openvpn/certs/ca.crt
# 指定服務(wù)器證書(shū)文件
cert /etc/openvpn/certs/server.crt
# 指定服務(wù)器私鑰文件
key /etc/openvpn/certs/server.key
# 指定dh參數(shù)文件
dh /etc/openvpn/certs/dh.pem
# 指定客戶端連接后分配ip的地址池,服務(wù)器默認(rèn)會(huì)占用第一個(gè)ip作為網(wǎng)關(guān)
server 10.8.0.0 255.255.255.0
# 推送路由信息到客戶端,以允許客戶端能夠連接到服務(wù)器背后的其他私有子網(wǎng)
push "route 172.30.0.0 255.255.255.0"
# 設(shè)置服務(wù)端檢測(cè)的間隔和超時(shí)時(shí)間,10秒ping一次,120秒沒(méi)回應(yīng)則認(rèn)為對(duì)方down
keepalive 10 120
# 加密算法
cipher AES-256-CBC
# 啟用openvpn新版壓縮算法
compress lz4-v2
# 推送客戶端使用新版壓縮算法,不能和comp-lzo同時(shí)使用
push "compress lz4-v2"
# 最大客戶端數(shù)
max-clients 2048
# 運(yùn)行openvpn服務(wù)的用戶和組
user openvpn
group openvpn
# openvpn狀態(tài)記錄文件,每分鐘記錄一次
status /var/log/openvpn/openvpn-status.log
# 指定日志路徑,生產(chǎn)環(huán)境建議使用
log-append /var/log/openvpn/openvpn.log
# 設(shè)置日志級(jí)別,數(shù)字越大記錄的內(nèi)容越詳細(xì)
verb 3
# 相同類(lèi)別信息只有前20條會(huì)輸出到日志文件中
mute 20
--------------------------'以上為server.conf配置'-----------------------------
[root@server ~]# getent passwd openvpn
[root@server ~]# mkdir -p /var/log/openvpn/
[root@server ~]# chown openvpn.openvpn /var/log/openvpn
四、服務(wù)器端其他配置
# 修改內(nèi)核參數(shù)
[root@server ~]# cat /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@server ~]# sysctl -p
# 安裝防火墻
[root@server ~]# yum -y install iptables-services
# 清空防火墻默認(rèn)規(guī)則
[root@server ~]# iptables -F
# 關(guān)閉firewalld防火墻
[root@server ~]# systemctl disable --now firewalld
# 啟動(dòng)iptables防火墻
[root@server ~]# systemctl start iptables
# 添加vpn網(wǎng)絡(luò)轉(zhuǎn)發(fā)規(guī)則
[root@server ~]# iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE
# 查看iptables規(guī)則
[root@server ~]# iptables -nvL -t nat
------------------------------'啟動(dòng)openvn'---------------------------------
[root@server ~]# systemctl daemon-reload
# 啟動(dòng)openvpn并設(shè)置開(kāi)機(jī)自啟
[root@server certs]# systemctl enable --now openvpn@server
五、OpenVPN客戶端配置文件
[root@server ~]# cat > /etc/openvpn/client/shilin/client.ovpn <<EOF
client
dev tun
proto tcp
remote 192.168.5.3 1194
resolv-retry infinite
nobind
# persist-key
# persist-tun
ca ca.crt
cert shilin.crt
key shilin.key
remote-cert-tls server
# tls-auth ta.key 1
cipher AES-256-CBC
verb 3
compress lz4-v2
EOF
六、 客戶端安裝使用OpenVPN
1. # 將此目錄下的四個(gè)文件傳輸?shù)絯indows客戶端
[root@server ~]# ls /etc/openvpn/client/shilin/
ca.crt client.ovpn shilin.crt shilin.key
2. # windows客戶端安裝openvpn軟件
3. # 將從服務(wù)器傳輸下來(lái)的四個(gè)文件copy到windows下 %USERPROFILE%/openvpn/config 目錄下(默認(rèn)安裝)
4. # 啟動(dòng)客戶端
七、排錯(cuò)方法
1. 服務(wù)器openvpn啟動(dòng)異常
server:
cat /etc/openvpn/server.conf # 查看此文件內(nèi)的指定的路徑文件是否存在
2. windows客戶端軟件鏈接異常
client:
查看client.ovpn文件中ip地址、端口、以及文件名是否正常 并與服務(wù)端的server.conf進(jìn)行比對(duì)
查看client.ovpn文件之中是否有空格,可能會(huì)導(dǎo)致(管理接口)這種報(bào)錯(cuò)
server:
(1) netstat -lntp # 查看端口(服務(wù))是否開(kāi)啟
(2) cat /etc/sysctl.conf # 查看路由轉(zhuǎn)發(fā)功能是否開(kāi)啟
net.ipv4.ip_forward = 1
(3) iptables -nvL -t nat # 查看iptables是否放行規(guī)則
..............






