ubuntu 搭建OpenVPN伺服器
本文轉載下來也只是自己想留個備份,萬一自己某天又用到了呢,大神是在Ubuntu14.4上做的,我在16.4上面也測試過了,親測好用,原文地址http://www.cnblogs.com/ilanni/p/4681740.html
一、openvpn原理
openvpn通過使用公開金鑰(非對稱金鑰,加密解密使用不同的key,一個稱為Publice key,另外一個是Private key)對資料進行加密的。這種方式稱為TLS加密
openvpn使用TLS加密的工作過程是,首先VPN Sevrver端和VPN Client端要有相同的CA證書,雙方通過交換證書驗證雙方的合法性,用於決定是否建立VPN連線。
然後使用對方的CA證書,把自己目前使用的資料加密方法加密後傳送給對方,由於使用的是對方CA證書加密,所以只有對方CA證書對應的Private key才能解密該資料,這樣就保證了此金鑰的安全性,並且此金鑰是定期改變的,對於竊聽者來說,可能還沒有破解出此金鑰,VPN通訊雙方可能就已經更換金鑰了。
二、安裝openvpn
openvpn的安裝我們分為apt-get方式和原始碼方式,下面我們只講解apt-get方式的安裝。有關原始碼方式安裝openvpn,可自行百度。
apt-get方式安裝,我們可以使用如下命令:
sudo apt-get -y install openvpn libssl-dev openssl
openvpn安裝完畢後,我們來檢視openvpn的版本,如下:
openvpn --version
通過上圖,我們可以看到openvpn目前的版本為2.3.2。這個版本號,建議記住。
我們再來檢視下openvpn安裝時產生的檔案,如下:
dpkg -L openvpn |more
通過上圖,我們可以很明顯的看出openvpn已經有相關配置的模版了。
openvpn安裝完畢後,我們再來安裝easy-rsa。
easy-rsa是用來製作openvpn相關證書的。
安裝easy-rsa,使用如下命令:
sudo apt-get -y install easy-rsa
檢視easy-rsa安裝的檔案,如下:
dpkg -L easy-rsa |more
通過上圖,我們可以很明顯的看到easy-rsa已經安裝到/usr/share/easy-rsa/目錄下。
三、製作相關證書
根據第一章節openvpn的工作原理,我們可以知道openvpn的證書分為三部分:CA證書、Server端證書、Client端證書。
下面我們通過easy-rsa分別對其進行製作。
3.1 製作CA證書
openvpn與easy-rsa安裝完畢後,我們需要在/etc/openvpn/目錄下建立easy-rsa資料夾,如下:
sudo mkdir /etc/openvpn/easy-rsa/
然後把/usr/share/easy-rsa/目錄下的所有檔案全部複製到/etc/openvpn/easy-rsa/下,如下:
sudo cp -r /usr/share/easy-rsa/* /etc/openvpn/easy-rsa/
當然,我們也可以直接在/usr/share/easy-rsa/製作相關的證書,但是為了後續的管理證書的方便,我們還是把easy-rsa放在了openvpn的啟動目錄下。
注意:由於我們現在使用的是ubuntu系統,所以我們必須切換到root使用者下才能製作相關證書,否則easy-rsa會報錯。如果是centos系統,則不存在此問題。
切換到root使用者下,使用如下命令:
sudo su
在開始製作CA證書之前,我們還需要編輯vars檔案,修改如下相關選項內容即可。如下:
sudo vi /etc/openvpn/easy-rsa/vars
export KEY_COUNTRY=“CN”
export KEY_PROVINCE=“HZ”
export KEY_CITY=“HangZhou”
export KEY_ORG=“ilanni”
export KEY_EMAIL="[email protected]"
export KEY_OU=“ilanni”
export KEY_NAME=“vpnilanni”
vars檔案主要用於設定證書的相關組織資訊,紅色部分的內容可以根據自己的實際情況自行修改。
其中export KEY_NAME="vpnilanni"這個要記住下,我們下面在製作Server端證書時,會使用到。
注意:以上內容,我們也可以使用系統預設的,也就是說不進行修改也是可以使用的。
然後使用source vars命令使其生效,如下:
source vars
./clean-all
注意:執行clean-all命令會刪除,當前目錄下的keys資料夾。
現在開始正式製作CA證書,使用如下命令:
./build-ca
一路按回車鍵即可。製作完成後,我們可以檢視keys目錄。如下:
ll keys/
通過上圖,我們可以很明顯的看到已經生成了ca.crt和ca.key兩個檔案,其中ca.crt就是我們所說的CA證書。如此,CA證書製作完畢。
現在把該CA證書的ca.crt檔案複製到openvpn的啟動目錄/etc/openvpn下,如下:
cp keys/ca.crt /etc/openvpn/
ll /etc/openvpn/
3.2 製作Server端證書
CA證書製作完成後,我們現在開始製作Server端證書。如下:
./build-key-server vpnilanni
注意:上述命令中vpnilanni,就是我們前面vars檔案中設定的KEY_NAME
檢視生成的Server端證書,如下:
ll keys/
通過上圖,可以很明顯的看到已經生成了vpnilanni.crt、vpnilanni.key和vpnilanni.csr三個檔案。其中vpnilanni.crt和vpnilanni.key兩個檔案是我們要使用的。
現在再為伺服器生成加密交換時的Diffie-Hellman檔案,如下:
./build-dh
檢視生成的檔案,如下:
ll keys/
通過上圖,我們可以很明顯的看出已經生成了dh2048.pem,這個檔案。
以上操作完畢後,把vpnilanni.crt、vpnilanni.key、dh2048.pem複製到/etc/openvpn/目錄下,如下:
cp keys/vpnilanni.crt keys/vpnilanni.key keys/dh2048.pem /etc/openvpn/
如此,Server端證書就製作完畢。
3.3 製作Client端證書
Server端證書製作完成後,我們現在開始製作Client端證書,如下:
./build-key ilanni
注意:上述命令中的ilanni,是客戶端的名稱。這個是可以進行自定義的。
如果你想快速生成使用者證書不需要手工互動的話,可以使用如下命令:
./build-key --batch test1
檢視生成的證書,如下:
ll keys/
通過上圖,我們可以很明顯的看出已經生成了ilanni.csr、ilanni.crt和ilanni.key這個三個檔案。其中ilanni.crt和ilanni.key兩個檔案是我們要使用的。
如此,Client端證書就製作完畢。
四、配置Server端
所有證書製作完畢後,我們現在開始配置Server端。Server端的配置檔案,我們可以從openvpn自帶的模版中進行復制。如下:
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
cd /etc/openvpn/
解壓server.conf.gz 檔案,使用如下命令:
gzip -d server.conf.gz
注意:上述命令的意思是解壓server.conf.gz檔案後,然後刪除原檔案。
現在我們來修改server.conf檔案,如下:
grep -vE “#|;|^$” server.conf
port 1194
proto tcp
dev tun
ca ca.crt
cert vpnilanni.crt
key vpnilanni.key
dh dh2048.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
keepalive 10 120
comp-lzo
persist-key
persist-tun
status openvpn-status.log
verb 3
與原模版檔案相比,在此我修改幾個地方。
第一、修改了openvpn執行時使用的協議,由原來的UDP協議修改為TCP協議。生成環境建議使用TCP協議。
第二、修改了openvpn伺服器的相關證書,由原來的server.csr、server.key修改為vpnilanni.crt、vpnilanni.key。
第三、修改了Diffie-Hellman檔案,由原來的dh1024.pem修改為dh2048.pem。
注意:上述server.conf檔案中vpnilanni.crt、vpnilanni.key、dh2048.pem要與/etc/openvpn/目錄下的相關檔案一一對應。
同時,如果上述檔案如果沒有存放在/etc/openvpn/目錄下,在server.conf檔案中,我們要填寫該檔案的絕對路徑。如下所示:
配置檔案修改完畢後,我們現在來啟動openvpn,使用如下命令:
/etc/init.d/openvpn start
netstat -tunlp |grep 1194
通過上圖,我們可以很明顯的看出openvpn已經在此啟動,而且也確實使用的TCP協議的1194埠。
五、配置Client端
Server端配置並啟動後,我們現在來配置Client端。Client端根據作業系統的不同,又分為Linux OS上和Windows OS上。以下我們對此一一驚醒講解。
5.1 在Windows OS上
無論是在Windows OS還是在Linux OS上Client端的配置,我們都需要把Client證書、CA證書以及Client配置檔案下載下來。
先來下載Client證書和CA證書,Client證書我們主要使用crt和key結尾的兩個檔案,而CA證書我們主要使用crt結尾的檔案。如下:
先把這幾個檔案複製到/home/ilanni/目錄下,然後再把openvpn客戶端的配置檔案模版也複製到/home/ilanni/目錄下。如下:
cp ilanni.crt ilanni.key ca.crt /home/ilanni/
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /home/ilanni/
修改以上幾個檔案的使用者屬性,如下:
chown ilanni:ilanni ilanni.*
chown ilanni:ilanni ca.crt
修改完畢後,退出root使用者,回到ilanni使用者的家目錄下,然後使用sz命令把這幾個檔案下載下來。如下:
sz -y ilanni.crt ilanni.key ca.crt client.conf
下載完畢後,把client.conf檔案重新命名為client.ovpn,然後進行編輯,如下:
client
dev tun
proto tcp
remote 192.168.1.8 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert ilanni.crt
key ilanni.key
ns-cert-type server
comp-lzo
verb 3
Client配置檔案client.ovpn,我修改了幾個地方:
第一、使用的協議,由原來的UDP修改為TCP,這個一定要和Server端保持一致。否則Client無法連線。
第二、remote地址,這個地址要修改為Server端的地址。
第三、Client證書名稱,這個要和我們現在使用的Client證書名稱保持一直。
以上修改完畢後,我們要把這個幾個檔案放在同一個資料夾中,並且一定要保持client.ovpn這個檔名稱是唯一的。否則在openvpn客戶端連線時,會報錯。如下:
安裝openvpn for windows客戶端,我們可以從這個地址下載,如下:http://build.openvpn.net/downloads/releases/
注意:下載的客戶端版本號一定要與伺服器端openvpn的版本一直,否則可能會出現無法連線伺服器的現象。
我們現在伺服器端的openvpn版本是2.3.2,所以客戶端也建議使用2.3.2的版本。
下載並安裝後,把testilanni這個資料夾複製到openvpn客戶端安裝的config資料夾。如下:
現在我們來啟動openvpn客戶端連線Server,如下:
注意:上圖中的client就是根據client.ovpn,這個檔名來的。
點選connect,會出現如下的彈窗:
如果配置都正確的話,會出現如下的提示:
通過上圖,我們可以很明顯的看到Client已經正確連線Server端,並且獲得的IP地址是10.8.0.6。
下面我們在本機檢視下,該IP地址,如下:
通過上圖,我們可以看到本機確實已經連線到Server端,而且獲得的IP地址也確實為10.8.0.6。
5.2 在Linux OS上
在Windows OS上測試完畢後,我們現在在切換到linux系統。在此我們以ubuntu14.04為例。
要在ubuntu上連線openvpnServer端,我們需要先安裝openvpn軟體,如下:
sudo apt-get -y install openvpn
*
安裝完畢後,把我們剛剛在Windows系統配置的檔案上傳到ubuntu系統中。如下:
注意:上傳完畢後,我們不需要修改任何配置檔案。因為這幾個檔案在Windows下已經可以正確連線openvpn Server端。
注意:在連線Server端之前,一定要切換到root使用者下。因為在連線Server端時,openvpn會在本機建立一個虛擬網絡卡,如果使用普通使用者的話,是沒有許可權建立虛擬網絡卡的。
切換到root使用者,使用sudo su命令,如下:
sudo su
現在開始連線Server端,使用如下命令:
openvpn --config client.ovpn
如果出現上圖的資訊,說明已經正確連線Server端。
現在我們在本機使用ifconfig進行檢視,在此建議重新開啟一個新的ssh視窗,如下:
ifconfig
通過上圖,我們可以很明顯的看出,本機已經正確連線Server端,並且也在本機虛擬出一個叫tun0的虛擬網絡卡。
如果想讓ubuntu開機啟動並後臺執行的話,可以把這條命令寫入rc.local檔案中。如下:
/usr/sbin/openvpn --config /home/ilanni/testilanni/client.ovpn >/var/log/openvpn.log &
注意,命令末尾的&符號不能省略,否則將可能阻塞系統的正常啟動。
同時這個時候,client.ovpn檔案中有關證書的配置一定要寫成絕對路徑,要不然系統會報錯。如下:
如果是centos系統的話,我們首先需要安裝epel源,然後安裝openvpn軟體包。如下:
rpm -ivh http://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
yum -y install openvpn
以上安裝完畢後,把Windows已經成功連線的Client相關檔案上傳到centos系統中,然後連線方法和ubuntu系統上一樣。
注意:如果在centos系統要開機啟動的話,也是和ubuntu系統是一樣的,但是有一點需要指出就是Client相關配置檔案不能放在/root目錄下。
給一個正確配的例子,如下:
因為centos的openvpn server配置和unubutn基本一樣,所以就不再單獨寫一篇有關centos下安裝配置openvpn sever的文章。
但是附上在centos下,所有執行的命令。如下:
rpm -ivh http://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
yum -y install openvpn
rpm -ql openvpn
cat /usr/share/doc/openvpn-2.3.7/sample/sample-config-files/README
yum -y install easy-rsa
rpm -ql easy-rsa
cd /usr/share/easy-rsa/2.0/
vim vars
export KEY_COUNTRY=“CN”
export KEY_PROVINCE=“HangZhou”
export KEY_CITY=“HZ”
export KEY_ORG=“ilanni”
export KEY_EMAIL="[email protected]"
export KEY_OU=“MyOrganizationalUnit”
export KEY_NAME=“ilanni”
source vars
./clean-all
./build-ca
./build-key-server ilanni
./build-dh
./build-key centos
cd keys
cp ca.crt ilanni.key ilanni.crt /etc/openvpn/
cp ca.crt centos.key centos.crt /root/
cp /usr/share/doc/openvpn-2.3.7/sample/sample-config-files/client.conf /root
cp /usr/share/doc/openvpn-2.3.7/sample/sample-config-files/server.conf /etc/openvpn/
伺服器端配置檔案:
vim /etc/openvpn/server.conf
grep -vE “;|#|^$” /etc/openvpn/server.conf
port 1194
proto udp
dev tun
ca ca.crt
cert ilanni.crt
dh dh2048.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
keepalive 10 120
comp-lzo
persist-key
persist-tun
status openvpn-status.log
verb 3
客戶端配置檔案:
grep -vE “;|#|^$” centos.conf
client
dev tun
proto udp
remote 182.254.223.140 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert centos.crt
key centos.key
remote-cert-tls server
comp-lzo
verb 3