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 ----- 公司內網主機