1. 程式人生 > >centos7 搭建openvpn伺服器

centos7 搭建openvpn伺服器

 

 OpenVPN是一個開原始碼的VPN應用程式,可讓您在公共網際網路上安全地建立和加入專用網路。相比pptp,openvpn更穩定、安全。

  本篇部落格主要介紹下面兩點:

  1. Centos 7下安裝與配置OpenVPN;

  2. 客戶端連線OpenVPN伺服器(window 、Ubuntu、 Ios、 Android)

Prerequisites

  1. 公網伺服器IP或者國外VPS及root許可權;

  2. 由於OpenVPN在預設的CentOS軟體庫中不可用,需要安裝EPEL;

yum install epel-release

1.安裝OpenVPN

yum install openvpn easy-rsa -y

2. 配置OpenVPN

OpenVPN在其文件目錄中有示例配置檔案,拷貝該示例配置檔案到配置目錄

 cp /usr/share/doc/openvpn-2.4.6/sample/sample-config-files/server.conf /etc/openvpn/

編輯配置檔案

vim /etc/openvpn/server.conf

#定義openvpn使用埠
port 1194

# TCP or UDP server?
#通過tcp協議連線,也可以使用udp協議 
proto tcp
#proto udp

#定義openvpn執行模式,openvpn有兩種執行模式一種是tap模式的乙太網通道,一種是tun模式的路由 IP 通道。
;dev tap
dev tun

#openvpn使用的CA證書檔案,CA證書主要用於驗證客戶證書的合法性,存放位置請依據實際情況自行改動
ca /etc/openvpn/easy-rsa/pki/ca.crt

#openvpn伺服器端使用的證書檔案,存放位置請依據實際情況自行改動
cert /etc/openvpn/easy-rsa/pki/issued/server.crt

#伺服器金鑰存放位置,請依據實際情況自行改動
key /etc/openvpn/easy-rsa/pki/private/server.key 

#Diffie hellman檔案,存放位置請依據實際情況自行改動
dh /etc/openvpn/easy-rsa/pki/dh.pem

#openvpn在使用tun路由模式時,分配給client端分配的IP地址段,虛擬區域網網段設定,請依據須要自行改動,不支援和拔號網絡卡位於同一網段
server 10.8.1.0 255.255.255.0

#在openvpn重新啟動時,再次連線的client將依舊被分配和曾經一樣的IP地址
ifconfig-pool-persist ipp.txt

# 為客戶端建立對應的路由,以另其通達公司網內部伺服器,但記住,公司網內部伺服器也需要有可用路由返回到客戶端
push "route 172.17.0.0 255.255.240.0" 
push "route 172.16.1.0 255.255.255.0" 
push "route 172.16.2.0 255.255.255.0" 

#向客戶端推送的DNS資訊,DNS配置,依據實際情況配置
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 114.114.114.114"

#活動連線保時期限
keepalive 10 120

tls-auth /etc/openvpn/ta.key 0

cipher AES-256-CBC

comp-lzo

max-clients 100

user nobody
group nobody

persist-key
persist-tun

status openvpn-status.log
log-append  openvpn.log
verb 3
mute 20

伺服器端配置檔案演示樣例:(server.conf)

#openvpn服務端網絡卡的IP,也能夠不寫
#local 192.168.3.1     

#定義openvpn使用埠
port 443    

#通過tcp協議連線,也可以使用udp協議              
proto tcp 
#proto udp     

#定義openvpn執行模式,openvpn有兩種執行模式一種是tap模式的乙太網通道,一種是tun模式的路由 IP 通道。
# 路由 IP 容易控制,所以推薦使用它;但如果如 IPX 等必須
# 使用第二層才能通過的通訊,則可以用 tap 方式,tap 也
# 就是乙太網橋接              
dev tun                      

#openvpn使用的CA證書檔案,CA證書主要用於驗證客戶證書的合法性,存放位置請依據實際情況自行改動
ca ca.crt  

#openvpn伺服器端使用的證書檔案,存放位置請依據實際情況自行改動                
cert server.crt  
         
#伺服器金鑰存放位置,請依據實際情況自行改動
key server.key           

#Diffie hellman檔案,存放位置請依據實際情況自行改動
dh dh1024.pem      

#openvpn在使用tun路由模式時,分配給client端分配的IP地址段
# 配置 VPN 使用的網段,OpenVPN 會自動提供基於該網段的 DHCP
# 服務,但不能和任何一方的區域網段重複,保證唯一
# server 端 ip 預設會設為.1 的地址。
server 10.8.0.0 255.255.255.0     

#在openvpn重新啟動時,再次連線的client將依舊被分配和曾經一樣的IP地址
ifconfig-pool-persist ipp.txt 

#向客戶端推送的路由資訊,假如客戶端的IP地址為10.8.0.2,要訪問172.17.48.0網段的話,使用這條命令就可以了。
# 為客戶端建立對應的路由,以另其通達公司網內部伺服器,但記住,公司網內部伺服器也需要有可用路由返回到客戶端,公司內網有幾個網段就推送幾個
push "route 172.17.48.0 255.255.240.0" 
push "route 172.16.1.0 255.255.255.0" 
push "route 172.16.2.0 255.255.255.0"  
             
#這條命令可以重定向客戶端的閘道器,在進行FQ時會使用,開啟此選項客戶端出口ip會成為openvpn伺服器IP
#此項不要開啟,會改變客戶端出口IP,導致客戶端無法正常訪問網路
#push "redirect-gateway def1 bypass-dhcp"    

#向客戶端推送的DNS資訊,DNS配置,依據實際情況配置
push "dhcp-option DNS 8.8.8.8"   

#向客戶端推送的DNS資訊,DNS配置,依據實際情況配置   
push "dhcp-option DNS 114.114.114.114"      

#活動連線保時期限,設定服務端檢測的間隔和超時時間 每 10 秒 ping 一次,如果 120 秒沒有迴應則認為對方已經 down
keepalive 10 120    

#使客戶端能相互訪問                         
client-to-client  

#這條經常使用於測試用途,凝視該條可實現限制一個證書在同一時刻僅僅能有一個client接入           
duplicate-cn      

#選擇一種加密演算法與client保持一致         
cipher AES-256-CBC

;cipher BF-CBC        # Blowfish (default)      //選擇一種加密演算法與client保持一致
;cipher AES-128-CBC  # AES
;cipher DES-EDE3-CBC  # Triple-DES

#啟用允許資料壓縮,客戶端配置檔案也需要有這項。
comp-lzo                          

#最大客戶端併發連線數量
;max-clients 100            

#定義執行openvpn的使用者用於使用者認證能夠不採用使用者認證
;user nobody                   
;group nobody

#通過keepalive檢測超時後,重新啟動VPN,不重新讀取keys,保留第一次使用的keys
persist-key  

#通過keepalive檢測超時後,重新啟動VPN,一直保持tun或者tap裝置是linkup的。否則網路連線,會先linkdown然後再linkup。
persist-tap   

#定期把openvpn的一些狀態資訊寫到檔案裡,以便自己敲程式碼計費或者進行其它操作
status openvpn-status.log

log /etc/openvpn/openvpn.log

log-append /etc/openvpn/openvpnappend.log

#設定日誌記錄冗長級別#設定日誌要記錄的級別。
#0 只記錄錯誤資訊。
#4 能記錄普通的資訊。
#5 和 6 在連接出現問題時能幫助除錯
#9 是極端的,所有資訊都會顯示,甚至連包頭等資訊都顯示(像 tcpdump)
verb 3  

#反覆日誌記錄限額            
mute 20      

#此選項開啟只能使用udp協議。Options error: --explicit-exit-notify can only be used with --proto udp 
explicit-exit-notify 1                            

客戶端檔案演示樣例:(client.ovpn)

client
dev tun
proto tcp
resolv-retry infinite
nobind
remote 115.159.56.240 1194 
remote-cert-tls server
#ns-cert-type server
#需與服務端保持一致
comp-lzo
#需與服務端保持一致  
verb 3
#需與服務端保持一致 
cipher AES-256-CBC 
#需與服務端保持一致
keepalive 10 120
#需與服務端保持一致
persist-key
#需與服務端保持一致
persist-tun

tls-auth ta.key 1
ca ca.crt
cert testname.crt
key testname.key
log-append testname.log
status testname-status.log

3、配置證書檔案

mkdir -p  /etc/openvpn/easy-rsa/keys

cp -rf /usr/share/easy-rsa/3.0.3/* /etc/openvpn/easy-rsa/
cp /usr/share/doc/easy-rsa-3.0.3/vars.example /etc/openvpn/easy-rsa/

cp vars.example vars

vi   /etc/openvpn/easy-rsa/vars

修改以下配置的內容,自定義設定各項值就可以。

set_var EASYRSA	"$PWD"
set_var EASYRSA_PKI		"$EASYRSA/pki"
set_var EASYRSA_DN	"cn_only"

set_var EASYRSA_REQ_COUNTRY	"CN"
set_var EASYRSA_REQ_PROVINCE	"SH"
set_var EASYRSA_REQ_CITY	"Shanghai"
set_var EASYRSA_REQ_ORG	"DMSD Certificate"
set_var EASYRSA_REQ_EMAIL	"[email protected]"
set_var EASYRSA_REQ_OU		"Dynamic Times"

set_var EASYRSA_KEY_SIZE	2048
set_var EASYRSA_ALGO		rsa
set_var EASYRSA_CA_EXPIRE	3650
set_var EASYRSA_CERT_EXPIRE	3650
set_var EASYRSA_NS_SUPPORT	"no"
set_var EASYRSA_NS_COMMENT	"Easy-RSA Generated Certificate"
set_var EASYRSA_EXT_DIR	"$EASYRSA/x509-types"
set_var EASYRSA_SSL_CONF	"$EASYRSA/openssl-1.0.cnf"
set_var EASYRSA_DIGEST		"sha256"

服務端vars檔案配置詳解:(vars) 

#定義key的生成目錄
set_var EASYRSA_PKI	"$EASYRSA/pki" 

#定義生成私鑰的大小,一般為1024或2048,預設為2048位。這個就是我們在執行build-dh命令生成dh2048檔案的依據。
set_var EASYRSA_KEY_SIZE 2048

set_var EASYRSA_ALGO rsa

#ca證書有效期,預設為3650天,即十年            
set_var EASYRSA_CA_EXPIRE 3650

#定義祕鑰的有效期,預設為3650天,即十年             
set_var EASYRSA_CERT_EXPIRE	3650   

#定義所在的國家       
set_var EASYRSA_REQ_COUNTRY "CN"  

#定義所在的省         
set_var EASYRSA_REQ_PROVINCE "BJ"      

#定義所在的城市    
set_var EASYRSA_REQ_CITY "BeiJing" 

#定義所在的組織        
set_var EASYRSA_REQ_ORG "xxxx"  

#定義郵箱           
set_var EASYRSA_REQ_EMAIL "[email protected]"  

#定義所在單位  
set_var EASYRSA_REQ_OU "xxxx"       
         

4.證書建立

  4.1建立根證書ca.rt

cd /etc/openvpn/easy-rsa/

## 初始化,會在當前目錄建立PKI目錄,用於儲存一些中間變數及最終生成的證書 
./easyrsa init-pki

# 建立根證書
./easyrsa build-ca

建立根證書,首先會提示設定密碼,用於ca對之後生成的server和client證書籤名時使用,然後會提示設定Country Name,State or Province Name,Locality Name,Organization Name,Organizational Unit Name,Common Name,Email Address,可以鍵入回車使用預設的,也可以手動更改 

設定ca密碼(輸入兩次):ca.com

會生成根證書:ca.crt,路徑如下:

/etc/openvpn/easy-rsa/pki/ca.crt

 

 4.2 建立ta.key

[[email protected]_0_4_centos easy-rsa]# ./easyrsa gen-dh

Note: using Easy-RSA configuration from: ./vars
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
...............................................................................................................................................+...........+...................................+.........................................+...................................................................+..................................................................................+..............................................................................................................+.....................................................................................................................................................+..................................................................................................................................+..................................................................................................................................................................................................................+...........................+.........................................................................+..........................................................................................................................................................................+.........+..........................+..................................................................................................................................................................................................+............................................................................................................................+...............................................+................................+..........................................................................................+.......................+............................................................................................................................+...........+..................................................+......................................+.........................................................................................................................................+...........................................................................................................+.........................................................................................+.........+............................................+..........................................................................................................+.......................................................................................................................................................................................................................................................................................................................................................................................................................................+..............+.................................................................................................................+..........................................................................................................................................................+....................................................+...........................+...........+........................................................................................................................................................................................................................................................................................................................................................................................................................................................+...................................................................................................................................................................................................+.............................................+.................+......................+..........................+.........................................................................................................................................................................................................................................................................+.................................................................................................................................++*++*

DH parameters of size 2048 created at /etc/openvpn/easy-rsa/pki/dh.pem

[[email protected]_0_4_centos easy-rsa]# openvpn --genkey --secret ta.key
[[email protected]_0_4_centos easy-rsa]# cp -r ta.key /etc/openvpn/

 

4.3 建立服務端證書

建立服務端證書,生成請求,使用gen-req來生成req,建立server端證書和private key,可以使用nopass表示不加密private key,然後會提示設定Country Name,State or Province Name,Locality Name,Organization Name,Organizational Unit Name,Common Name,Email Address,可以鍵入回車使用預設的,也可以手動更改

./easyrsa  gen-req server

設定server密碼(輸入兩次):openserver.com

會生成服務端證書:server.req和server.key,路徑如下:

/etc/openvpn/easy-rsa/pki/private/server.key

/etc/openvpn/easy-rsa/pki/reqs/server.req

 

4.4 簽發服務端證書

簽發證書,簽約服務端證書,給server端證書做簽名,首先是對一些資訊的確認,可以輸入yes,然後輸入build-ca時設定的那個密碼 

[[email protected]_0_4_centos easy-rsa]# ./easyrsa sign-req server server

生成服務端簽名證書:server.crt,路徑如下:

/etc/openvpn/easy-rsa/pki/issued/server.crt

至此服務端證書全部生成完畢,分別為:server.req、server.key和server.crt。

/etc/openvpn/easy-rsa/pki/private/server.key

/etc/openvpn/easy-rsa/pki/reqs/server.req

/etc/openvpn/easy-rsa/pki/issued/server.crt

4.5 生成客戶端使用者證書

# 例如:生成客戶端使用者:testname 的證書
[[email protected]_0_4_centos easy-rsa]# ./easyrsa build-client-full testname

生成客戶端證書,並設定密碼(客戶端連線時用)

生成客戶端使用者簽名證書:

/etc/openvpn/easy-rsa/pki/issued/testname.crt

/etc/openvpn/easy-rsa/pki/private/tesstname.key

/etc/openvpn/easy-rsa/pki/reqs/testname.req

5.啟動openvpn服務

systemctl start [email protected]
啟動時輸入服務端證書密碼:openserver.com

systemctl stop [email protected]  // 停用
systemctl start [email protected]  //啟用

6.新增路由策略

新增一條SNAT規則,讓源地址是10.8.1.0/24網段的地址進來轉換成vpn伺服器的內網地址(例如:172.16.0.100,此IP內網未使用),這樣vpn客戶端訪問公司內網伺服器的時候偽裝成vpn伺服器去訪問.

iptables -t nat -A POSTROUTING -s 10.8.1.0/24 -j SNAT --to-source 172.16.0.100 
firewall-cmd --reload

目的:偽裝成內網IP,正常訪問內網的各臺機器。

 

7.客戶端配置

客戶端下載openvpn版本2.4.5 

上官網下載Windows客戶端:https://openvpn.net/index.php/open-source/downloads.html

客戶端需要的證書:

testname.crt、testname.key、ca.crt、ta.key

客戶端配置config.ovpn說明:(ip換為openvpn伺服器外網ip)

client
dev tun
proto tcp
resolv-retry infinite
nobind
remote 115.159.56.240 1194 
remote-cert-tls server
#ns-cert-type server
#需與服務端保持一致
comp-lzo
#需與服務端保持一致  
verb 3
#需與服務端保持一致 
cipher AES-256-CBC 
#需與服務端保持一致
keepalive 10 120
#需與服務端保持一致
persist-key
#需與服務端保持一致
persist-tun

tls-auth ta.key 1
ca ca.crt
cert testname.crt
key testname.key
log-append testname.log
status testname-status.log

安裝OpenVPN 2.4.5 x86_64後,清空config資料夾,將testname.crt、testname.key、ca.crt、ta.key、testname.ovpn放入config目錄中, 
配置完成後啟動,如果有設定密碼的話輸入密碼即可。

然後連線openvpn,點選執行 選 Connect  ,如果出現綠色圖示說明vpn連線成功了.

連線成功後會啟一個網路連線,可以看到分配的ip地址是10.8.1.6 / 30

客戶端會新增路由,可以看下路由表,下面這些是服務端配置推送給客戶端的路由,其實就是告訴客戶端去這些網段都通過vpn伺服器,類似於靜態路由

route PRINT -4

測試,ping下公司內網中的主機,看下是否能夠訪問,如果可以說明ok了,我公司內網某臺機器IP: 172.17.0.4

ping 172.17.0.4

OK,說明能如在公司內網一樣訪問各臺機器了。

如內網的web服務,也可通過內網地址連線資料庫、redis等各種服務

資料包的走向是:客戶端訪問公司內網主機 ----- 通過路由轉發 ---- vpn伺服器(tun0) ---- SNAT -----  公司內網主機