參考 :
在CentOS 7環(huán)境下搭建OpenVPN服務(wù),Windows客戶端、Linux客戶端通過OpenVPN服務(wù)訪問后端機(jī)器。
主機(jī)規(guī)劃與架構(gòu)
服務(wù)器名稱(hostname) | 操作系統(tǒng)版本 | 內(nèi)網(wǎng)IP | 外網(wǎng)IP(模擬) | 角色 |
---|---|---|---|---|
web01 | CentOS7.7 | 172.16.10.191 | 無 | 被訪問機(jī)器 |
web02 | CentOS7.7 | 172.16.10.192 | 無 | 被訪問機(jī)器 |
openvpn-server | CentOS7.7 | 172.16.10.190 | 10.0.0.190 | Openvpn-Server |
openvpn-client | CentOS7.7 | 無 | 10.0.0.180 | Openvpn-Client |
本地筆記本電腦 | Windows10 | 無 | 10.0.0.X | Openvpn-Client |
OpenVPN軟件版本
Linux 安裝:openvpn-2.4.9.tar.gz # GitHub地址:https://github.com/OpenVPN/openvpn
Linux 安裝:easy-rsa-3.0.7.tar.gz # GitHub地址:https://github.com/OpenVPN/easy-rsa
widows安裝:openvpn-install-2.4.9-I601-Win10.exe # OpenVPN官網(wǎng)
如果widows安裝軟件在官方訪問失敗游盲,那么可以從如下地址下載:
https://www.techspot.com/downloads/5182-openvpn.html
OpenVPN機(jī)器配置必要修改
開啟轉(zhuǎn)發(fā)功能并生效
## 不存在該配置則添加
# grep 'net.ipv4.ip_forward = 1' /etc/sysctl.conf || echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
# sysctl -p
原因:從客戶端訪問web01或web02機(jī)器需要通過VPN機(jī)器中轉(zhuǎn)。
iptables配置
只需添加配置窍荧,不需要啟動(dòng)iptables服務(wù)
## 添加如下配置
# iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
# iptables-save > /etc/sysconfig/iptables
# iptables -L -n -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 10.8.0.0/24 0.0.0.0/0
原因:客戶端連接VPN后如庭,默認(rèn)分配的10.8.0.0/24網(wǎng)段地址茂附,不能直接訪問web01或web02機(jī)器【這兩臺(tái)是172.16.10.0/24網(wǎng)段】拍顷,因此需要在iptables進(jìn)行nat配置抚太。
刪除上面的iptables配置信息命令如下。作用:對(duì)比正常的訪問和異常的訪問
# iptables -t nat -D POSTROUTING 1
說明:如果時(shí)間不同步,那么VPN登錄訪問就可能存在問題尿贫。
安裝openvpn
根據(jù)主機(jī)規(guī)劃电媳,在openvpn-server【172.16.10.190、10.0.0.190】部署openvpn帅霜。
安裝依賴包
# yum install -y lz4-devel lzo-devel pam-devel openssl-devel systemd-devel sqlite-devel
[備注如果是阿里云機(jī)器匆背,可能還需要裝如下包:]
yum install -y autoconf
yum install -y automake
yum install -y libtool libtool-ltdl
從github上下載openvpn源代碼包并解壓后編譯安裝呼伸,最后建立軟連接
# wget https://github.com/OpenVPN/openvpn/archive/v2.4.9.tar.gz
# mv v2.4.9.tar.gz openvpn-2.4.9.tar.gz
# tar xf openvpn-2.4.9.tar.gz
# cd openvpn-2.4.9/
# autoreconf -i -v -f
# ./configure --prefix=/usr/local/openvpn --enable-lzo --enable-lz4 --enable-crypto --enable-server --enable-plugins --enable-port-share --enable-iproute2 --enable-pf --enable-plugin-auth-pam --enable-pam-dlopen --enable-systemd
# make && make install
# ln -s /usr/local/openvpn/sbin/openvpn /usr/local/sbin/openvpn
配置文件修改
# vim /usr/local/openvpn/lib/systemd/system/openvpn-server@.service
### 找到 ExecStart 這行身冀,改為如下
ExecStart=/usr/local/openvpn/sbin/openvpn --config server.conf
配置系統(tǒng)服務(wù),并開機(jī)自啟動(dòng)
# cp -a /usr/local/openvpn/lib/systemd/system/openvpn-server@.service /usr/lib/systemd/system/openvpn.service
# systemctl enable openvpn.service
生成證書
easy-rsa下載與配置修改
下載easy-rsa并解壓
# wget https://github.com/OpenVPN/easy-rsa/archive/v3.0.7.tar.gz
# mv v3.0.7.tar.gz easy-rsa-3.0.7.tar.gz
# tar xf easy-rsa-3.0.7.tar.gz
根據(jù)easy-rsa-3.0.7/easyrsa3/vars.example文件生成全局配置文件vars
# cd easy-rsa-3.0.7/easyrsa3
# cp -a vars.example vars
修改vars文件括享,根據(jù)需要去掉注釋搂根,并修改對(duì)應(yīng)值;或者直接在文件末尾追加如下信息:
# 國(guó)家
set_var EASYRSA_REQ_COUNTRY "CN"
# 省
set_var EASYRSA_REQ_PROVINCE "BJ"
# 城市
set_var EASYRSA_REQ_CITY "BeiJing"
# 組織
set_var EASYRSA_REQ_ORG "zhang"
# 郵箱
set_var EASYRSA_REQ_EMAIL "zhang@test.com"
# 擁有者
set_var EASYRSA_REQ_OU "ZJ"
# 長(zhǎng)度
set_var EASYRSA_KEY_SIZE 2048
# 算法
set_var EASYRSA_ALGO rsa
# CA證書過期時(shí)間铃辖,單位天
set_var EASYRSA_CA_EXPIRE 36500
# 簽發(fā)證書的有效期是多少天剩愧,單位天
set_var EASYRSA_CERT_EXPIRE 36500
生成服務(wù)端和客戶端證書
初始化與創(chuàng)建CA根證書
# ./easyrsa init-pki
初始化,會(huì)在當(dāng)前目錄創(chuàng)建PKI目錄娇斩,用于存儲(chǔ)一些中間變量及最終生成的證書
# ./easyrsa build-ca
在這部分需要輸入PEM密碼 PEM pass phrase仁卷,輸入兩次,此密碼必須記住犬第,不然以后不能為證書簽名锦积。
還需要輸入common name 通用名,如:openvpen歉嗓,這個(gè)你自己隨便設(shè)置個(gè)獨(dú)一無二的丰介。
生成服務(wù)端證書
# ./easyrsa build-server-full server nopass
為服務(wù)端生成證書對(duì)并在本地簽名。nopass參數(shù)生成一個(gè)無密碼的證書鉴分;在此過程中會(huì)讓你確認(rèn)ca密碼
# ./easyrsa gen-dh
創(chuàng)建Diffie-Hellman哮幢,確保key穿越不安全網(wǎng)絡(luò)的命令,時(shí)間會(huì)有點(diǎn)長(zhǎng)志珍,耐心等待
生成客戶端證書
生成多個(gè)客戶端證書
# ./easyrsa build-client-full client nopass # 無密碼橙垢,實(shí)際應(yīng)用中不推薦,客戶端有密碼可提高安全性
# ./easyrsa build-client-full zhangsan # 讓你輸入密碼伦糯,后續(xù)VPN連接時(shí)會(huì)使用
# ./easyrsa build-client-full lisi # 讓你輸入密碼柜某,后續(xù)VPN連接時(shí)會(huì)使用
# ./easyrsa build-client-full wangwu # 讓你輸入密碼,后續(xù)VPN連接時(shí)會(huì)使用
為客戶端生成證書對(duì)并在本地簽名舔株。nopass參數(shù)生成一個(gè)無密碼的證書莺琳;在此過程中都會(huì)讓你確認(rèn)ca密碼
為了提高安全性,生成ta.key
# openvpn --genkey --secret ta.key
加強(qiáng)認(rèn)證方式载慈,防攻擊惭等。如果配置文件中啟用此項(xiàng)(默認(rèn)是啟用的),就需要執(zhí)行上述命令办铡,并把ta.key放到/etc/openvpn/server目錄辞做。配置文件中服務(wù)端第二個(gè)參數(shù)為0琳要,同時(shí)客戶端也要有此文件,且client.conf中此指令的第二個(gè)參數(shù)需要為1秤茅≈刹梗【服務(wù)端有該配置,那么客戶端也必須要有】
整理服務(wù)端證書
mkdir -p /etc/openvpn/server/
cp -a pki/ca.crt /etc/openvpn/server/
cp -a pki/private/server.key /etc/openvpn/server/
cp -a pki/issued/server.crt /etc/openvpn/server/
cp -a pki/dh.pem /etc/openvpn/server/
cp -a ta.key /etc/openvpn/server/
創(chuàng)建服務(wù)端配置文件
參照openvpn-2.4.9/sample/sample-config-files/server.conf文件
服務(wù)端配置文件
# cat /etc/openvpn/server/server.conf # 配置文件內(nèi)容
local 0.0.0.0
port 1194
proto tcp
dev tun
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/server.crt
key /etc/openvpn/server/server.key
dh /etc/openvpn/server/dh.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "route 172.16.10.0 255.255.255.0"
;client-to-client
;duplicate-cn
keepalive 10 120
tls-auth /etc/openvpn/server/ta.key 0
cipher AES-256-CBC
compress lz4-v2
push "compress lz4-v2"
;comp-lzo
max-clients 1000
user nobody
group nobody
persist-key
persist-tun
status openvpn-status.log
log /var/log/openvpn.log
verb 3
;explicit-exit-notify 1
配置文件參數(shù)說明
參考:openvpn-2.4.9/sample/sample-config-files/server.conf
local 0.0.0.0
表示openvpn服務(wù)端的監(jiān)聽地址
port 1194
監(jiān)聽的端口框喳,默認(rèn)是1194
proto tcp
使用的協(xié)議课幕,有udp和tcp。建議選擇tcp
dev tun
使用三層路由IP隧道(tun)還是二層以太網(wǎng)隧道(tap)五垮。一般都使用tun
ca ca.crt
cert server.crt
key server.key
dh dh2048.pem
ca證書乍惊、服務(wù)端證書、服務(wù)端密鑰和密鑰交換文件放仗。如果它們和server.conf在同一個(gè)目錄下則可以不寫絕對(duì)路徑润绎,否則需要寫絕對(duì)路徑調(diào)用
server 10.8.0.0 255.255.255.0
vpn服務(wù)端為自己和客戶端分配IP的地址池。
服務(wù)端自己獲取網(wǎng)段的第一個(gè)地址(此處為10.8.0.1)诞挨,后為客戶端分配其他的可用地址莉撇。以后客戶端就可以和10.8.0.1進(jìn)行通信。
注意:該網(wǎng)段地址池不要和已有網(wǎng)段沖突或重復(fù)惶傻。其實(shí)一般來說是不用改的棍郎。除非當(dāng)前內(nèi)網(wǎng)使用了10.8.0.0/24的網(wǎng)段。
ifconfig-pool-persist ipp.txt
使用一個(gè)文件記錄已分配虛擬IP的客戶端和虛擬IP的對(duì)應(yīng)關(guān)系达罗,
以后openvpn重啟時(shí)坝撑,將可以按照此文件繼續(xù)為對(duì)應(yīng)的客戶端分配此前相同的IP。也就是自動(dòng)續(xù)借IP的意思粮揉。
server-bridge XXXXXX
使用tap模式的時(shí)候考慮此選項(xiàng)巡李。
push "route 10.0.10.0 255.255.255.0"
push "route 192.168.10.0 255.255.255.0"
vpn服務(wù)端向客戶端推送vpn服務(wù)端內(nèi)網(wǎng)網(wǎng)段的路由配置,以便讓客戶端能夠找到服務(wù)端內(nèi)網(wǎng)扶认。多條路由就寫多個(gè)Push指令
client-to-client
讓vpn客戶端之間可以互相看見對(duì)方侨拦,即能互相通信。默認(rèn)情況客戶端只能看到服務(wù)端一個(gè)人辐宾;
默認(rèn)是注釋的狱从,不能客戶端之間相互看見
duplicate-cn
允許多個(gè)客戶端使用同一個(gè)VPN帳號(hào)連接服務(wù)端
默認(rèn)是注釋的,不支持多個(gè)客戶登錄一個(gè)賬號(hào)
keepalive 10 120
每10秒ping一次叠纹,120秒后沒收到ping就說明對(duì)方掛了
tls-auth ta.key 0
加強(qiáng)認(rèn)證方式季研,防攻擊。如果配置文件中啟用此項(xiàng)(默認(rèn)是啟用的)
需要執(zhí)行openvpn --genkey --secret ta.key誉察,并把ta.key放到/etc/openvpn/server目錄
服務(wù)端第二個(gè)參數(shù)為0与涡;同時(shí)客戶端也要有此文件,且client.conf中此指令的第二個(gè)參數(shù)需要為1。
cipher AES-256-CBC
# 選擇一個(gè)密碼驼卖。如果在服務(wù)器上使用了cipher選項(xiàng)氨肌,那么您也必須在這里指定它。注意酌畜,v2.4客戶端/服務(wù)器將在TLS模式下自動(dòng)協(xié)商AES-256-GCM怎囚。
compress lz4-v2
push "compress lz4-v2"
openvpn 2.4版本的vpn才能設(shè)置此選項(xiàng)。表示服務(wù)端啟用lz4的壓縮功能桥胞,傳輸數(shù)據(jù)給客戶端時(shí)會(huì)壓縮數(shù)據(jù)包恳守。
Push后在客戶端也配置啟用lz4的壓縮功能,向服務(wù)端發(fā)數(shù)據(jù)時(shí)也會(huì)壓縮埠戳。如果是2.4版本以下的老版本井誉,則使用用comp-lzo指令
comp-lzo
啟用lzo數(shù)據(jù)壓縮格式。此指令用于低于2.4版本的老版本整胃。且如果服務(wù)端配置了該指令,客戶端也必須要配置
max-clients 100
并發(fā)客戶端的連接數(shù)
persist-key
persist-tun
通過ping得知超時(shí)時(shí)喳钟,當(dāng)重啟vpn后將使用同一個(gè)密鑰文件以及保持tun連接狀態(tài)
status openvpn-status.log
在文件中輸出當(dāng)前的連接信息屁使,每分鐘截?cái)嗖⒅貙懸淮卧撐募?
;log openvpn.log
;log-append openvpn.log
默認(rèn)vpn的日志會(huì)記錄到rsyslog中,使用這兩個(gè)選項(xiàng)可以改變奔则。
log指令表示每次啟動(dòng)vpn時(shí)覆蓋式記錄到指定日志文件中蛮寂,
log-append則表示每次啟動(dòng)vpn時(shí)追加式的記錄到指定日志中。
但兩者只能選其一易茬,或者不選時(shí)記錄到rsyslog中
verb 3
日志記錄的詳細(xì)級(jí)別酬蹋。
;mute 20
沉默的重復(fù)信息。最多20條相同消息類別的連續(xù)消息將輸出到日志抽莱。
explicit-exit-notify 1
當(dāng)服務(wù)器重新啟動(dòng)時(shí)范抓,通知客戶端,以便它可以自動(dòng)重新連接食铐。僅在UDP協(xié)議是可用
啟動(dòng)openvpn服務(wù)并查看進(jìn)程與端口
# systemctl start openvpn.service
# ps -ef | grep 'open'
nobody 19095 1 0 01:19 ? 00:00:00 /usr/local/openvpn/sbin/openvpn --config server.conf
# netstat -lntup | grep '19095'
tcp 0 0 0.0.0.0:1194 0.0.0.0:* LISTEN 19095/openvpn
通過ifconfig命令匕垫,也可見多個(gè)tun0網(wǎng)卡信息
Windows客戶端配置與訪問
客戶端安裝
安裝完畢后會(huì)在「網(wǎng)絡(luò)連接」中會(huì)多出一個(gè)連接
客戶端client用戶配置文件
備注:文件名 windows為client.ovpn,Linux為client.conf
需要的證書與配置文件如下圖:
說明:
1虐呻、注意路徑象泵,在OpenVPN/config目錄下建立了client目錄
2、ca.crt斟叼、client.crt偶惠、client.key、ta.key都是之前創(chuàng)建好的朗涩,只有client.ovpn需要單獨(dú)下載并修改忽孽。
client.ovpn內(nèi)容如下:
參照openvpn-2.4.9/sample/sample-config-files/client.conf文件
;# 文件名 windows為client.ovpn,Linux為client.conf
client
dev tun
proto tcp
remote 10.0.0.190 1194
resolv-retry infinite
nobind
;user nobody
;group nobody
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
remote-cert-tls server
tls-auth ta.key 1
cipher AES-256-CBC
compress lz4-v2
verb 3
;mute 20
客戶端zhangsan用戶配置文件
備注:文件名 windows為zhangsan.ovpn,Linux為zhangsan.conf
需要的證書與配置文件如下圖:
說明:
1扒腕、注意路徑绢淀,在OpenVPN/config目錄下建立了zhangsan目錄
2、ca.crt瘾腰、zhangsan.crt皆的、zhangsan.key、ta.key都是之前創(chuàng)建好的蹋盆,只有zhangsan.ovpn需要單獨(dú)下載并修改费薄。
zhangsan.ovpn內(nèi)容如下:
參照openvpn-2.4.9/sample/sample-config-files/client.conf文件
;# 文件名 windows為client.ovpn,Linux為client.conf
client
dev tun
proto tcp
remote 10.0.0.190 1194
resolv-retry infinite
nobind
;user nobody
;group nobody
persist-key
persist-tun
ca ca.crt
cert zhangsan.crt
key zhangsan.key
remote-cert-tls server
tls-auth ta.key 1
cipher AES-256-CBC
compress lz4-v2
verb 3
;mute 20
其他用戶如:lisi栖雾,wangwu參考上述進(jìn)行配置即可楞抡。
配置文件參數(shù)說明
參考:openvpn-2.4.9/sample/sample-config-files/client.conf
# 文件名 windows為client.ovpn,Linux為client.conf
client
# 標(biāo)識(shí)這是個(gè)客戶端
dev tun
# 使用三層路由IP隧道(tun)還是二層以太網(wǎng)隧道(tap)析藕。服務(wù)端是什么客戶端就是什么
proto tcp
# 使用的協(xié)議召廷,有udp和tcp。服務(wù)端是什么客戶端就是什么
remote 10.0.0.190 1194
# 服務(wù)端的地址和端口
resolv-retry infinite
# 一直嘗試解析OpenVPN服務(wù)器的主機(jī)名账胧。
# 在機(jī)器上非常有用竞慢,不是永久連接到互聯(lián)網(wǎng),如筆記本電腦治泥。
nobind
# 大多數(shù)客戶機(jī)不需要綁定到特定的本地端口號(hào)筹煮。
;user nobody
;group nobody
# 初始化后的降級(jí)特權(quán)(僅非windows)
persist-key
persist-tun
# 嘗試在重新啟動(dòng)時(shí)保留某些狀態(tài)。
ca ca.crt
cert client.crt
key client.key
# ca證書居夹、客戶端證書败潦、客戶端密鑰
# 如果它們和client.conf或client.ovpn在同一個(gè)目錄下則可以不寫絕對(duì)路徑,否則需要寫絕對(duì)路徑調(diào)用
remote-cert-tls server
# 通過檢查certicate是否具有正確的密鑰使用設(shè)置來驗(yàn)證服務(wù)器證書准脂。
tls-auth ta.key 1
# 加強(qiáng)認(rèn)證方式劫扒,防攻擊。服務(wù)端有配置意狠,則客戶端必須有
cipher AES-256-CBC
# 選擇一個(gè)密碼粟关。如果在服務(wù)器上使用了cipher選項(xiàng),那么您也必須在這里指定它环戈。注意闷板,v2.4客戶端/服務(wù)器將在TLS模式下自動(dòng)協(xié)商AES-256-GCM。
compress lz4-v2
# 服務(wù)端用的什么院塞,客戶端就用的什么
# 表示客戶端啟用lz4的壓縮功能遮晚,傳輸數(shù)據(jù)給客戶端時(shí)會(huì)壓縮數(shù)據(jù)包。
verb 3
# 日志級(jí)別
;mute 20
# 沉默的重復(fù)信息拦止。最多20條相同消息類別的連續(xù)消息將輸出到日志县遣。
Linux客戶端配置與訪問
安裝openvpn
安裝參見上文糜颠,上面說過了Linux安裝OpenVPN,這里不單獨(dú)說了萧求。我們這里使用之前創(chuàng)建的wangwu客戶端用戶進(jìn)行驗(yàn)證其兴。
配置文件修改
[root@openvpn-client ~]# vim /usr/local/openvpn/lib/systemd/system/openvpn-server@.service
[Service]
Type=notify
PrivateTmp=true
#WorkingDirectory=/etc/openvpn/server
WorkingDirectory=/etc/openvpn/wangwu
#ExecStart=/usr/local/openvpn/sbin/openvpn --status %t/openvpn-server/status-%i.log --status-version 2 --suppress-timestamps --config %i.conf
ExecStart=/usr/local/openvpn/sbin/openvpn --config wangwu.conf
配置系統(tǒng)服務(wù),并開機(jī)自啟動(dòng)【請(qǐng)根據(jù)需要加入開機(jī)自啟動(dòng)】
# cp -a /usr/local/openvpn/lib/systemd/system/openvpn-server@.service /usr/lib/systemd/system/openvpn.service
# systemctl enable openvpn.service
客戶端wangwu客戶配置
備注:文件名 windows為wangwu.ovpn夸政,Linux為wangwu.conf
需要的證書與配置文件如下:
說明:
1元旬、注意路徑,在/etc/openvpn/目錄下建立了wangwu目錄
2守问、ca.crt匀归、wangwu.crt、wangwu.key耗帕、ta.key都是之前創(chuàng)建好的穆端,只有wangwu.ovpn需要單獨(dú)下載并修改。
[root@openvpn-client wangwu]# pwd
/etc/openvpn/wangwu
[root@openvpn-client wangwu]# ll
total 24
-rw-r--r-- 1 root root 1164 May 2 23:08 ca.crt
-rw-r--r-- 1 root root 636 May 2 23:46 ta.key
-rw-r--r-- 1 root root 318 May 3 21:54 wangwu.conf
-rw-r--r-- 1 root root 4422 May 2 23:14 wangwu.crt
-rw-r--r-- 1 root root 1834 May 2 23:14 wangwu.key
wangwu.conf內(nèi)容如下:
參照openvpn-2.4.9/sample/sample-config-files/client.conf文件
[root@openvpn-client wangwu]# cat wangwu.conf
;# 文件名 windows為client.ovpn仿便,Linux為client.conf
client
dev tun
proto tcp
remote 10.0.0.190 1194
resolv-retry infinite
nobind
user nobody
group nobody
persist-key
persist-tun
ca ca.crt
cert wangwu.crt
key wangwu.key
remote-cert-tls server
tls-auth ta.key 1
cipher AES-256-CBC
compress lz4-v2
verb 3
;mute 20
我自己的服務(wù)器端啟動(dòng)
/usr/local/openvpn/sbin/openvpn --config /etc/openvpn/server/server.conf --daemon
吊銷證書,讓用戶無法訪問
# 進(jìn)入目錄
cd /usr/local/easy-rsa-3.0.7/easyrsa3
# 吊銷證書
./easyrsa revoke zhangsan
#查看寫入的文件
./easyrsa gen-crl
# 在server.conf加入一行 crl-verify crl.pem
vim /etc/openvpn/server/server.conf
最后加入一行:
crl-verify /usr/local/easy-rsa-3.0.7/easyrsa3/pki/crl.pem
重啟openvpn