本文目錄:1.vpn概述 1.1 vpn應用場景 1.2 隧道協議 1.3 SSL VPN和IPSEC VPN2.openvpn搭建client-to-site的vpn 2.1 安裝lzo和openvpn 2.2 創建CA和SSL證書 2.3 配置服務端 2.4 配置客戶端 2.5 查看vpn的連接 ...
本文目錄:
1.vpn概述
1.1 vpn應用場景
1.2 隧道協議
1.3 SSL VPN和IPSEC VPN
2.openvpn搭建client-to-site的vpn
2.1 安裝lzo和openvpn
2.2 創建CA和SSL證書
2.3 配置服務端
2.4 配置客戶端
2.5 查看vpn的連接狀態
2.6 讓客戶端和vpn所在內網通信
2.7 使用NAT讓客戶端和VPN所在內網通信
3.使用密碼撥號以及帳號吊銷
4.Linux主機上配置openvpn客戶端
1.vpn概述
VPN(virtual Private network)即虛擬專用網路,是通過建立一條專用通道進行通信的技術,可以理解為通過建立一條獨有的隧道讓兩邊通信。
1.1 vpn應用場景
假設臺北總公司有一個上海分公司,兩個辦公地點都設置了防火牆,內部網路也都使用的私有地址。由於總公司老闆經常外出出差,他能直接正常的訪問到臺北總公司內網的伺服器嗎?不能。同理上海分公司也不能正常訪問到臺北總公司內網的伺服器。
使用VPN就是為瞭解決這樣問題的。在以前要實現這樣的需求,需要找運營商申請幀中繼的服務,幀中繼就像是找他們拉一條專有的網線,然後兩邊通過這條專有的線進行通信。但是幀中繼是不是萬能的,它有優點和缺點。優點是申請多少帶寬的服務通信時就一定有多少帶寬,不會受到公網的網路阻塞;缺點是很貴,且不方便,試想如果到外國各地出差,如何解決它的流動性以及距離的問題。
VPN就像是把整個網際網路虛擬成一個路由器,無論出差的老闆身處何處,都能通過這個“路由器”來訪問內網的機器。就像是隨身帶了一根無長度限制、無地理位置限制的網線,隨時連接到內網中。而且,現在網速不斷增速,加密技術也不斷進步,使用VPN已經能夠很好的實現上面的需求了。
從上面的描述中,可以總結出VPN的幾個用途。
- (1)client-to-site,個人對企業,就像上面的老闆訪問企業內部伺服器。是客戶端對vpn伺服器的隧道傳輸。
- (2)site-to-site,企業對企業,就像上面上海分公司訪問臺北總公司的內部伺服器。是兩邊vpn伺服器之間的隧道傳輸。
即如下圖中標註的兩種用途。
1.2 隧道協議
有三種隧道協議:PPTP、L2TP、IPSec。
L2TP是第2層隧道協議,是一種工業標準Internet隧道協議。L2TP和PPTP都使用PPP協議對數據進行封裝,然後添加獨特的包頭,之後在在網路上進行傳輸。PPTP只能在兩端點之間建立單一隧道,L2TP支持兩端之間使用多隧道,用戶可以針對不同的服務質量創建不同的隧道。L2TP可以提供隧道驗證,而PPTP不可以。當L2TP或PPTP結合IPSEC共同使用的時候,可以由IPSEC提供隧道驗證。
IPSEC(IP Security)是一套協議包而不是一個單獨的協議。IPSEC隧道模式是封裝、路由與解封的過程。隧道將原始數據包封裝在新的數據包內部,新的數據包可能會有新的定址和路由信息,從而使其能夠通過網路進行傳輸。封裝後的數據包到達目的地後,會解除封裝然後獲得其中的數據內容。
1.3 SSL VPN和IPSEC VPN
ssl vpn是使用SSL數字證書來實現數據加密的VPN。最典型的就是openvpn。它能用於client-to-site,也能用於site-to-site。由於openvpn是C/S架構的工具,所以要求使用vpn服務的客戶端安裝openvpn客戶端程式。
IPSEC VPN主要用於site-to-site,即公司對公司的這種場景,兩邊公司都佈置vpn伺服器,兩個vpn伺服器之間進行隧道傳輸。常見的ipsec vpn的開源軟體是openswan。
對於site-to-site的互聯:
- (1)使用openvpn的實現是在兩邊都安裝openvpn服務和openvpn的客戶端,要和對端通信時使用本地的客戶端撥號過去;
- (2)使用openswan的實現只需要兩邊安裝openswan服務就可以,兩邊的通信是服務與服務的通信。
2.openvpn搭建client-to-site的vpn
openvpn的所有數據通信都基於一個單一的埠(預設是1194),預設使用UDP協議,也可以使用且建議使用TCP協議。
openvpn的核心是虛擬網卡。安裝openvpn後會在主機上多出一個網卡,可以像其他的網卡一樣進行配置。這個虛擬網卡可以接收和發送數據。
openvpn提供了兩種虛擬網路介面:Tun和Tap。通過它們分別可以建立三層IP隧道和虛擬2層乙太網,即分別在虛擬介面上分別實現數據包(tun)格式的傳輸和數據幀(tap)格式的傳輸。
傳輸的數據可以通過壓縮演算法進行數據壓縮後傳輸。
openvpn2.0以後的版本都能實現一個進程管理多個併發的隧道。
openvpn的身份驗證方式支持預享密鑰、第三方證書、用戶名密碼三種方式。
以下圖為例,將防火牆當作vpnserver,其中eth0是對外的網卡,eth1是內網地址。
由於10.0.10.6處於內網目前無法和外網直接通信,可以通過防火牆的NAT或者將10.6的預設路由指向防火牆使其和外界通信。但此處使用VPN來實現和外界某些主機通信,所以不做任何NAT也不設置預設路由。
現在的環境下,vpn sever能ping通win主機,能ping通10.0.10.6,win不能ping通vpn server的內網地址,10.6也不能ping通win主機。
2.1 安裝lzo和openvpn
由於vpn很可能要在公網上傳輸數據,不壓縮的話傳輸的數據量就太大,導致傳輸速度較慢。所以建議安裝一種壓縮插件。可以使用lzo和lz4。
2.4版本的openvpn已經支持lz4壓縮演算法,這種壓縮演算法性能遠強於lzo,而且lzo已經停止更新了。以下是幾種壓縮演算法壓力測試的結果。
但是此處還是先使用lzo的演算法來演示示例。
tar xf lzo-2.09.tar.gz
cd lzo-2.09
./configure
make && make install
安裝openvpn。
yum -y install openssl-devel pam-devel
wget https://openvpn.net/index.php/open-source/downloads.html
tar xf openvpn-2.4.0.tar.gz
cd openvpn-2.4.0
./configure --enable-lzo
make && make install
一定要使用./configure --help查看下安裝方法,因為不同版本的openvpn有點不同。預設情況下lzo是被禁用的,所以要啟用。
2.2 創建CA和SSL證書
(1).自建CA(為了方便,在服務端建立)
(umask 077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem
(2).為vpn服務端頒發證書(服務端持有)
為openvpn提供一個目錄/etc/openvpn,路徑隨意,因為在啟動openvpn時會使用--config
選項指定配置文件路徑,以後密鑰、證書文件以及配置文件都放在此目錄下。當然這是非必須的,只是為了方便以及統一化。
mkdir -p /etc/openvpn/certs
由於VPN server端要使用ca的證書,所以複製ca證書到此目錄中,並重命名為ca.crt。
cp -a /etc/pki/CA/cacert.pem /etc/openvpn/certs/ca.crt
(3).vpn服務端需要生成證書申請,並使用ca為其頒發證書
(umask 077;openssl genrsa -out /etc/openvpn/certs/server.key 2048)
openssl req -new -key /etc/openvpn/certs/server.key -out /etc/openvpn/certs/server.csr
openssl ca -in /etc/openvpn/certs/server.csr -out /etc/openvpn/certs/server.crt -days 365
(4).為客戶端頒發證書(客戶端持有)
(umask 077;openssl genrsa -out /etc/openvpn/certs/boss.key 2048)
openssl req -new -key /etc/openvpn/certs/boss.key -out /etc/openvpn/certs/boss.csr
openssl ca -in /etc/openvpn/certs/boss.csr -out /etc/openvpn/certs/boss.crt -days 365
(5).生成密鑰交換協議文件(服務端持有)
openssl dhparam -out /etc/openvpn/certs/dh2048.pem 2048
2.3 配置服務端
(1).為vpn提供配置文件
openvpn的樣例配置文件在openvpn解壓目錄下的sample目錄下的sample-config-files目錄下。
cd ~/openvpn-2.4.0/sample/sample-config-files/
cp -a server.conf client.conf /etc/openvpn/
配置文件參數說明:
local 192.168.100.5
:表示openvpn服務端的監聽地址port 1194
:監聽的埠,預設是1194proto tcp
:使用的協議,有udp和tcp。建議選擇tcpdev tun
:使用三層路由IP隧道(tun)還是二層乙太網隧道(tap)。一般都使用tunca ca.crt
cert server.crt
key server.key
dh dh2048.pem
:ca證書、服務端證書、服務端密鑰和密鑰交換文件。如果它們和server.conf在同一個目錄下則可以不寫絕對路徑,否則需要寫絕對路徑調用server 10.8.0.0 255.255.255.0
:vpn服務端為自己和客戶端分配IP的地址池。服務端自己獲取網段的第一個地址(此處為10.8.0.1),後為客戶端分配其他的可用地址。以後客戶端就可以和10.8.0.1進行通信。註意:該網段地址池不要和已有網段衝突或重覆。其實一般來說是不用改的。除非當前內網使用了10.8.0.0/24的網段。ifconfig-pool-persist ipp.txt
:使用一個文件記錄已分配虛擬IP的客戶端和虛擬IP的對應關係,以後openvpn重啟時,將可以按照此文件繼續為對應的客戶端分配此前相同的IP。也就是自動續借IP的意思。server-bridge XXXXXX
:使用tap模式的時候考慮此選項。push "route 10.0.10.0 255.255.255.0"
:vpn服務端向客戶端推送一條客戶端到vpn內網網段的路由配置,以便讓客戶端能夠找到內網。多條路由就寫多個Push指令client-to-client
:讓vpn客戶端之間可以互相看見對方,即能互相通信。預設情況客戶端只能看到服務端一個人duplicate-cn
:允許多個客戶端使用同一個VPN帳號連接服務端keepalive 10 120
:每10秒ping一次,120秒後沒收到ping就說明對方掛了tls-auth ta.key 0
:加強認證方式,防攻擊。如果配置文件中啟用此項(預設是啟用的),需要執行openvpn --genkey --secret ta.key
,並把ta.key放到/etc/openvpn目錄,服務端第二個參數為0。同時客戶端也要有此文件,且client.conf中此指令的第二個參數需要為1。compress lz4-v2
push "compress lz4-v2"
:openvpn 2.4版本的vpn才能設置此選項。表示服務端啟用lz4的壓縮功能,傳輸數據給客戶端時會壓縮數據包,Push後在客戶端也配置啟用lz4的壓縮功能,向服務端發數據時也會壓縮。如果是2.4版本以下的老版本,則使用用comp-lzo指令comp-lzo
:啟用lzo數據壓縮格式。此指令用於低於2.4版本的老版本。且如果服務端配置了該指令,客戶端也必須要配置max-clients 100
:併發客戶端的連接數persist-key
:persist-tun
:通過ping得知超時時,當重啟vpn後將使用同一個密鑰文件以及保持tun連接狀態status openvpn-status.log
:在文件中輸出當前的連接信息,每分鐘截斷並重寫一次該文件log openvpn.log
:log-append openvpn.log
:預設vpn的日誌會記錄到rsyslog中,使用這兩個選項可以改變。log指令表示每次啟動vpn時覆蓋式記錄到指定日誌文件中,log-append則表示每次啟動vpn時追加式的記錄到指定日誌中。但兩者只能選其一,或者不選時記錄到rsyslog中verb 3
:日誌記錄的詳細級別。
以下是完整的配置文件的內容。
cat /etc/openvpn/server.conf
local 192.168.100.5
port 1194
proto tcp
dev tun
ca /etc/openvpn/certs/ca.crt
cert /etc/openvpn/certs/server.crt
key /etc/openvpn/certs/server.key
dh /etc/openvpn/certs/dh2048.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "route 10.0.10.0 255.255.255.0"
client-to-client
keepalive 10 120
tls-auth ta.key 0
comp-lzo
persist-key
persist-tun
status /var/log/openvpn-status.log
log /var/log/openvpn.log
verb 3
由於使用了tls-auth功能,所以要生成ta.key。(客戶端和服務端都持有)
openvpn --genkey --secret /etc/openvpn/ta.key
(2).開啟服務端內核轉發功能
因為數據包要在vpn內部交換網卡進出,所以要開啟轉發功能。
echo 1 >/proc/sys/net/ipv4/ip_forward
sed -i "s/ip_forward.*$/ip_forward = 1/" /etc/sysctl.conf
(3).啟動openvpn
[root@node1 certs]# openvpn --config /etc/openvpn/server.conf &
[1] 32673
[root@node1 certs]# netstat -tnlp | grep 1194
tcp 0 0 192.168.100.5:1194 0.0.0.0:* LISTEN 32673/openvpn
將其放入到rc.local中讓它下次開機自啟動。
echo "`which openvpn` --config /etc/openvpn/server.conf &" >>/etc/rc.d/rc.local
2.4 配置客戶端
windows版客戶端下載地址:https://openvpn.net/index.php/open-source/downloads.html
安裝的時候有一個是否信任的選項,選擇信任。假設安裝路徑為e:/openvpn目錄下。安裝完成後,從"開始菜單"那裡打開客戶端。
點開它,可能會提示缺少配置文件,暫時不用管。這時在win的通知區域會出現一個小圖標。
要真正能夠連接到服務端,需要提供客戶端配置文件、ca證書、客戶端證書、客戶端密鑰。如果在服務端配置文件中啟用了tls-auth認證防攻擊,則還需要提供ta.key文件。
sz -y /etc/openvpn/{client.conf,ta.key,certs/boss.key,certs/boss.crt,certs/ca.crt}
將這些文件放到安裝目錄的config目錄下,可以為它們建立一個單獨的目錄,如boss。
修改配置文件,客戶端的配置文件使用如下的配置。
egrep -v "^$|^;|^#" client.conf
client
dev tun
proto tcp
remote 192.168.100.5 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert boss.crt
key boss.key
remote-cert-tls server
tls-auth ta.key 1
cipher AES-256-CBC
verb 3
其中只修改了以下的4項:
proto tcp
remote 192.168.100.5 1194 # vpn server的監聽地址和埠
cert boss.crt
key boss.key
並刪除了remote-cert-tls server項,此項是為了防止黑客攻擊的。所以完整的客戶端配置文件為:
client
dev tun
proto tcp
remote 192.168.100.5 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
tls-auth ta.key 1
cert boss.crt
key boss.key
cipher AES-256-CBC
verb 3
然後將配置文件重命名為".ovpn"尾碼,如改為boss.ovpn。然後在通知區域vpn的小圖標上右鍵選擇connect。
連接成功的話會出現如下圖分配地址的情形。如果始終連接不上,查看下vpn server是不是開啟了防火牆,如果是,就暫時關閉它。
儘管成功了,但是還是要檢驗下是否能夠ping通vpn服務端的虛擬地址10.8.0.1。
2.5 查看vpn的連接狀態
在status日誌中記錄了連接狀態信息。
[root@xuexi openvpn]# cat /var/log/openvpn-status.log
OpenVPN CLIENT LIST
Updated,Mon Feb 27 18:44:38 2017
Common Name,Real Address,Bytes Received,Bytes Sent,Connected Since
boss.longshuai.com,192.168.100.1:4554,14902,7872,Mon Feb 27 18:28:04 2017
ROUTING TABLE
Virtual Address,Common Name,Real Address,Last Ref
10.8.0.6,boss.longshuai.com,192.168.100.1:4554,Mon Feb 27 18:43:36 2017
GLOBAL STATS
Max bcast/mcast queue length,0
END
2.6 讓客戶端和vpn所在內網通信
雖然上面已經能夠ping通vpn服務端了,但是並不代表能Ping通vpn伺服器所在的內網機器。繼續看下麵的圖。
由於客戶端已經使用10.8.0.6這個地址,在此客戶端上有一條到10.0.10.0網段的路由(在配置文件中push指令指定的),還有到10.8.0.0網段的路由,這幾條路由都指明瞭到這幾個網段都的下一跳都是交給10.8.0.5,這是VPN伺服器生成的網關地址。 所以,客戶端要Ping通10.0.10.0/24網段,那麼數據包就會先交到10.8.0.1這個tun0上,然後交到10.0.10.0/24這個網段的主機上,但是回應的時候數據包卻回不來,除非在私有網路的機器上配置了到10.8.0.0網段的路由,否則它不知道10.8.0.6的ping包應該交給誰。
所以私網內的主機要能與10.8.0.6通信,方法一是加一條到10.8.0.0網段的路由,甚至針對此客戶端主機來添加主機路由,它們的下一跳要交給vpn server的內網地址。
route add -host 10.8.0.6 gw 10.0.10.5
# 或者
route add -net 10.8.0.0/24 gw 10.0.10.5
以下是route -n的結果。
這時候vpn客戶端就能和私網內的主機通信了,但要註意,此時私網內主機不能和客戶端通信。
顯然,這樣的方法並不合適。這裡說明這種方法是為瞭解釋雙方通信過程中的本質。
2.7 使用NAT讓客戶端和VPN所在內網通信
為了讓vpn服務端私網內的機器可以把數據包交回給vpn伺服器,可以在vpn伺服器上使用網路地址轉換(NAT)功能,讓源地址為10.8.0.0網段的機器發過來的數據包的源地址全部改變為自己的內網IP地址,即10.0.10.5,這樣私網內的機器回應數據包時就會回應給10.0.10.5,然後vpn伺服器就可以將數據包還給vpn客戶端,實現通信的目的。
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth1 -j SNAT --to-source 10.0.10.5
到此為止,配置site-to-client的vpn就配置完成了。
3.使用密碼撥號以及帳號吊銷
(1).使用密碼撥號
要讓客戶端使用密碼才能撥號,需要做的是在生成客戶端證書申請文件(csr)的時候使用一個密碼。
openssl req -newkey rsa:2048 -keyout shuai.key -out shuai.csr
openssl ca -in shuai.csr -out shuai.crt -days 365
然後再將ca.crt、ta.key、shuai.crt、shuai.key、client.conf傳到客戶端,重覆前面部署客戶端的步驟。最後在openvpn的圖標處右鍵會有兩個撥號選擇。
(2).吊銷帳號
吊銷撥號的帳號的本質是吊銷客戶端證書。
吊銷證書的命令是:
openssl ca -revoke crt_file
生成吊銷列表的命令是:
openssl ca -gencrl -out crl_file
假設要吊銷shuai客戶端的證書。
openssl ca -revoke /etc/openvpn/certs/shuai.crt
然後生成吊銷列表:
openssl ca -gencrl -out /etc/openvpn/certs/shuai.crl
如果使用的是openssl的預設配置文件,則在生成吊銷列表的時候可能會報錯提示找不到crlnumber文件。可以創建此文件,並向其中寫入一個序列號,然後再去生成吊銷列表。
echo "01" >/etc/pki/CA/crlnumber
生成吊銷列表後,只要服務端的配置文件,加上crl-verify指令然後重啟openvpn服務就可以吊銷了。如果要吊銷多個帳號,則寫多個crl-verify即可。
vim server.conf
local 192.168.100.5
port 1194
proto tcp
dev tun
ca /etc/openvpn/certs/ca.crt
cert /etc/openvpn/certs/server.crt
key /etc/openvpn/certs/server.key # This file should be kept secret
dh /etc/openvpn/certs/dh2048.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "route 10.0.10.0 255.255.255.0"
;duplicate-cn
keepalive 10 120
tls-auth ta.key 0
;compress lz4-v2
;push "compress lz4-v2"
comp-lzo
;max-clients 100
persist-key
persist-tun
status openvpn-status.log
log openvpn.log
verb 3
crl-verify /etc/openvpn/certs/shuai.crl
再重啟openvpn。
pkill openvpn
openvpn --config /etc/openvpn/server.conf &
這時客戶端撥號就會如下圖,無限重連狀態。
4.Linux主機上配置openvpn客戶端
要在Linux主機上配置openvpn的客戶端,其實也很簡單,安裝完後把客戶端需要持有的文件拷貝過去然後啟動即可。
以下是環境需求,以上海分公司的防火牆暫時當作openvpn的客戶端,IP地址是192.168.100.151,確保它能和vpn server的eth0通信。
安裝過程和安裝服務端vpn過程相同,此處給出簡易步驟。
yum -y install openssl-devel pam-devel lzo* lz4*
tar xf openvpn-2.4.0.tar.gz
cd openvpn-2.4.0
./configure --enable-lz4 --enable-lzo
make && make install
mkdir -p /etc/openvpn/certs
再提供配置文件和相關證書、密鑰等。
scp -p root@192.168.100.5:/etc/openvpn/ta.key /etc/openvpn/
scp -p root@192.168.100.5:/etc/openvpn/certs/{boss.*,ca.crt} /etc/openvpn/certs/
cat >/etc/openvpn/boss.conf<<eof
client
dev tun
proto tcp
remote 192.168.100.5 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca /etc/openvpn/certs/ca.crt
cert /etc/openvpn/certs/boss.crt
key /etc/openvpn/certs/boss.key
tls-auth /etc/openvpn/ta.key 1
cipher AES-256-CBC
comp-lzo
verb 3
eof
啟動vpn客戶端。會有些消息輸出在屏幕,多按幾次enter鍵就可以回到bash提示符下。
openvpn --config /etc/openvpn/boss.conf &
查看網卡信息是否有tun網卡。
ifconfig tun0
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.8.0.6 P-t-P:10.8.0.5 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:2 errors:0 dropped:0 overruns:0 frame:0
TX packets:2 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:168 (168.0 b) TX bytes:168 (168.0 b)
測試是否能ping通vpn server的內網機器10.0.10.6。
ping 10.0.10.6
PING 10.0.10.6 (10.0.10.6) 56(84) bytes of data.
64 bytes from 10.0.10.6: icmp_seq=1 ttl=63 time=3.07 ms
64 bytes from 10.0.10.6: icmp_seq=2 ttl=63 time=2.21 ms
64 bytes from 10.0.10.6: icmp_seq=3 ttl=63 time=2.19 ms
回到Linux系列文章大綱:http://www.cnblogs.com/f-ck-need-u/p/7048359.html
回到網站架構系列文章大綱:http://www.cnblogs.com/f-ck-need-u/p/7576137.html
回到資料庫系列文章大綱:http://www.cnblogs.com/f-ck-need-u/p/7586194.html
轉載請註明出處:http://www.cnblogs.com/f-ck-need-u/p/8593429.html
註:若您覺得這篇文章還不錯請點擊右下角推薦,您的支持能激發作者更大的寫作熱情,非常感謝!