如何在Linux上用OpenVPN搭建安全的遠(yuǎn)程網(wǎng)絡(luò)架構(gòu)
譯文對你在互聯(lián)網(wǎng)上傳送的數(shù)據(jù)采用一層妥善安全的加密機(jī)制,以挫敗各種各樣的窺視活動,這總歸是謹(jǐn)慎的舉措;由于我們的政府大量獲取每一則信息,此舉顯得愈發(fā)地重要。說到保護(hù)在不可信賴的網(wǎng)絡(luò)上傳送的數(shù)據(jù),OpenVPN是首要選擇。本文將簡要介紹一下如何設(shè)置OpenVPN,那樣即使你出門在外,也可以安全地訪問自己的家庭服務(wù)器。
先簡單地說一說VPN:市面上有許多并非名至實(shí)歸的商用VPN。它們并不比由SSL保護(hù)的網(wǎng)站強(qiáng)一點(diǎn),因?yàn)樗鼈冃湃嗡锌蛻魴C(jī)。真正的VPN(虛擬專用網(wǎng))通過不可信賴的網(wǎng)絡(luò)連接兩個(gè)可信賴的端點(diǎn)設(shè)備。你根本無法從隨便找到的任何一臺電腦登錄上去,這是好事,因?yàn)槟愦蟾乓裁靼走@個(gè)道理:從一個(gè)被感染的主機(jī)登錄到你的專有網(wǎng)絡(luò)是件壞事,不管網(wǎng)絡(luò)連接本身有多么安全。所以,你必須同時(shí)配置服務(wù)器和客戶機(jī)。
OpenVPN快速入門
你需要在不同子網(wǎng)上的兩臺電腦,比如同一個(gè)網(wǎng)絡(luò)上的一臺有線電腦和一臺無線電腦(或者在Virtualbox中的幾個(gè)Linux訪客系統(tǒng)),你還要知道這兩臺電腦的IP地址。假設(shè)把示例中的這兩臺電腦分別命名為Studio和Shop。在這兩臺電腦上都安裝OpenVPN。OpenVPN內(nèi)置在大多數(shù)Linux發(fā)行版中,所以你可以借助常用的程序包管理器來安裝它。本文這個(gè)示例適用于Debian、Ubuntu及眾多的派生版本:
$ sudo apt-get install openvpn openvpn-blacklist
該命令可安裝服務(wù)器以及檢查已泄密密鑰黑名單的一個(gè)小程序。你必須安裝這個(gè)黑名單檢查程序!由于從前Debian發(fā)行了一款破損版的OpenSSL(參閱http://www.debian.org/security/2008/dsa-1571),該版本OpenSSL有一個(gè)破損的隨機(jī)數(shù)生成器,所以用該版本OpenSSL生成的密鑰按理說不堪一擊,不可信賴。隨機(jī)數(shù)生成器其實(shí)并非隨機(jī)性的,而是可以預(yù)測的。這種情況發(fā)生于早在2008年的時(shí)候,使用過缺陷版OpenSSL的人都理應(yīng)能夠查到并更換安全性差的密鑰。盡管這是五年多前的事情,但為了保險(xiǎn)起見,還是應(yīng)該用黑名單檢查程序。
現(xiàn)在不妨測試一下,為此在我們的兩臺電腦之間建立一條未經(jīng)加密的隧道。首先ping每臺電腦,確保它們彼此可以正常聯(lián)系。然后確保OpenVPN沒有在運(yùn)行,因?yàn)槲覀円_始手動啟動它:
$ ps ax|grep openvpn
如果它在運(yùn)行,就終止它。假設(shè)Studio的IP地址是192.168.1.125,Shop的IP地址是192.168.2.125。建立一條從Studio到Shop的未經(jīng)加密的隧道:
$ sudo openvpn --remote 192.168.2.125 --dev tun0 --ifconfig 10.0.0.1 10.0.0.2
然后,建立一條從Shop到Studio的未經(jīng)加密的隧道:
$ sudo openvpn --remote 192.168.1.125 --dev tun0 --ifconfig 10.0.0.2 10.0.0.1
你成功建立了連接后,看到諸如此類的信息:
Wed Oct 16 2013 ******* WARNING *******: all encryption and authentication
features disabled -- all data will be tunnelled as cleartext
Wed Oct 16 2013 TUN/TAP device tun0 opened
Wed Oct 16 2013 do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0
Wed Oct 16 2013 /sbin/ifconfig tun0 10.0.0.1 pointopoint 10.0.0.2 mtu 1500
Wed Oct 16 2013 UDPv4 link local (bound): [undef]
Wed Oct 16 2013 UDPv4 link remote: [AF_INET]192.168.2.125:1194
Wed Oct 16 2013 Peer Connection Initiated with [AF_INET]192.168.2.125:1194
Wed Oct 16 2013 Initialization Sequence Completed
“Initialization Sequence Completed”(初始化序列已完成)這幾個(gè)神奇的字眼證明了你的做法正確。你應(yīng)該可以使用隧道地址來回ping,即ping 10.0.0.1和ping 10.0.0.2。你建立起隧道后,應(yīng)該可以使用你想使用的任何IP地址,只要沒有與現(xiàn)有網(wǎng)絡(luò)的IP地址重疊就行。想關(guān)閉隧道,只要按Ctrl+c組合鍵。
純粹為了試著玩,在你的隧道上打開一個(gè)SSH會話。圖1顯示了基于VPN隧道的成功的SSH登錄,它還顯示了每日消息(Message of the Day):
$ ssh carla@10.0.0.2
圖1:基于VPN隧道的成功的SSH會話,以及每日消息。
哇,它成功了!#p#
加密的VPN隧道
這么做很好玩,但要是沒有采取加密,毫無意義可言,于是我們將搭建一種簡單的靜態(tài)密鑰配置架構(gòu)。它不如真正的公開密鑰基礎(chǔ)設(shè)施(PKI)來得安全牢固,PKI通常擁有根證書、撤銷以及所有諸如此類的機(jī)制,但這種靜態(tài)密鑰架構(gòu)對出門在外時(shí)需要訪問家庭服務(wù)器的那些人來說是一種足夠好的解決方案。幸好,OpenVPN有一個(gè)命令,可以創(chuàng)建靜態(tài)密鑰,所以建立一個(gè)用來存放密鑰的文件夾,創(chuàng)建密鑰,然后將其設(shè)成只有文件擁有者才能讀?。?/p>
$ sudo mkdir /etc/openvpn/keys/
$ sudo openvpn --genkey --secret /etc/openvpn/keys/static.key
$ sudo chmod 0400 /etc/openvpn/keys/static.key
這是一個(gè)明文格式的密鑰,你可以在文本編輯器中打開及查看――如果你很好奇的話,還可以將其隨意取成想要的名稱;你沒必要把它取為“static.key”。將該密鑰拷貝到兩臺電腦上――沒錯(cuò),拷貝同一個(gè)密鑰。它不是私有-公共密鑰對,而是一個(gè)單一的共享密鑰。
現(xiàn)在,我們將為每臺電腦創(chuàng)建一些簡單而基本的配置文件。(在Debian/Ubuntu等發(fā)行版上,沒有默認(rèn)的配置文件,不過在/usr/share/doc/openvpn/中有眾多的示例文件。)在我小小的測試環(huán)境中,Studio是服務(wù)器,Shop是將登錄到服務(wù)器上的移動筆記本電腦。我的服務(wù)器配置文件是/etc/openvpn/studio.conf,這就是它擁有的一切:
# config for Studio
dev tun
ifconfig 10.0.0.1 10.0.0.2
secret /etc/openvpn/keys/static.key
確保只有文件所有者才能讀取并寫入該文件:
$ sudo chmod 0600 /etc/openvpn/studio.conf
客戶機(jī)上的配置文件很相似,只不過添加了服務(wù)器的IP地址:
# config for Shop
dev tun
ifconfig 10.0.0.2 10.0.0.1
secret /etc/openvpn/keys/static.key
remote 192.168.1.125
請注意ifconfig這一行上你那些IP地址的順序,因?yàn)樗鼈円凑毡镜氐刂?gt;遠(yuǎn)程地址的順序?,F(xiàn)在開啟服務(wù)器上的OpenVPN,指定服務(wù)器配置文件,然后在客戶機(jī)上進(jìn)行同樣一番操作:
$ sudo openvpn /etc/openvpn/studio.conf
$ sudo openvpn /etc/openvpn/shop.conf
你會看到成功的連接顯示同樣的“初始化序列已完成”這條消息;你還必須留意沒有出現(xiàn)下面這條消息,創(chuàng)建未經(jīng)加密的隧道時(shí),應(yīng)該會出現(xiàn)這條消息:
******* WARNING *******: all encryption and authentication features disabled
******* 警告 *******:所有加密和驗(yàn)證特性被禁用#p#
防火墻和動態(tài)IP地址
OpenVPN本身配置起來很簡單。最麻煩的地方還是在于處理防火墻和動態(tài)IP地址。世界上有無數(shù)不同的防火墻,所以我覺得你應(yīng)該事先弄清楚如何安全地訪問防火墻。OpenVPN需要端口1194,然后你需要有一條轉(zhuǎn)發(fā)規(guī)則,可以指向你想訪問的那臺電腦。
動態(tài)IP地址是另一個(gè)麻煩的地方。Dyn.com提供了一個(gè)成本低廉的方法,它可以管理你的互聯(lián)網(wǎng)服務(wù)提供商(ISP)為你分配的動態(tài)IP地址。或者你也可以向ISP付幾塊錢,獲得一個(gè)靜態(tài)地址。
到現(xiàn)在為止,你可以稱之為一切進(jìn)展良好,因?yàn)槟憧梢栽诜?wù)器上手動啟動OpenVPN,讓它等待你的指令,你可以將筆記本電腦帶到外面,隨時(shí)連接到服務(wù)器。不過,我們可以在一些方面加以改進(jìn),比如讓OpenVPN在服務(wù)器上后臺運(yùn)行,使用Network Manager(網(wǎng)絡(luò)管理器)自動建立連接,而OpenVPN實(shí)際操作方面缺少的最主要一項(xiàng)內(nèi)容是:如何訪問你的遠(yuǎn)程資源。下次我們將著重介紹這方面的內(nèi)容。
上面我們主要講了如何在家庭服務(wù)器與遠(yuǎn)程節(jié)點(diǎn)(比如筆記本電腦)之間建立一條簡單的OpenVPN加密隧道。下面我們將介紹一些改進(jìn),比如如何讓OpenVPN在后臺運(yùn)行,那樣我們沒必要手動啟動它,使用Network Manager(網(wǎng)絡(luò)管理器)以便易于連接到我們的遠(yuǎn)程服務(wù)器,以及訪問服務(wù)。#p#
集成了網(wǎng)絡(luò)管理器
網(wǎng)絡(luò)管理器是一款出色的OpenVPN客戶程序;只要確保你已安裝了network-manager-openvpn這個(gè)插件。我們將使用上篇中的示例配置。打開你的網(wǎng)絡(luò)管理器配置,找到可以建立新VPN連接的窗口。這在KDE和GNOME上看起來不一樣,但是你需要的信息卻一樣。當(dāng)你開始著手時(shí),需要查看OpenVPN連接類型,比如圖2中那樣;如果你沒有看到這個(gè)信息,那么表明缺少這個(gè)插件。(以下圖形來自GNOME。)
圖2:在網(wǎng)絡(luò)管理器中創(chuàng)建新的OpenVPN客戶機(jī)配置。
圖3顯示了主配置屏幕。從上往下分別如下:
·你想為該連接取的任何名稱。
·網(wǎng)關(guān)是你那臺遠(yuǎn)程服務(wù)器的IP地址。
·從下拉菜單選擇靜態(tài)密鑰。
·然后使用文件選擇器,找到你想要使用的密鑰。
·這不是一個(gè)單向/雙向密鑰,所以選擇None。
·遠(yuǎn)程IP地址和本地IP地址是你的虛擬OpenVPN地址,來自/etc/openvpn/foo.conf文件。
·我們沒有設(shè)定密碼。
·可以設(shè)置“所有用戶可用”或者只有你可用,隨你喜歡。
圖:3:針對OpenVPN客戶機(jī)的網(wǎng)絡(luò)管理器主配置屏幕
保存設(shè)置,然后使用網(wǎng)絡(luò)管理器來進(jìn)行連接。就是這么容易!現(xiàn)在,你只要點(diǎn)擊一下按鈕,就可以建立連接和斷開連接了(圖3)。
圖4:點(diǎn)擊一下按鈕,就可以建立連接和斷開連接了。#p#
自動運(yùn)行OpenVPN
手動啟動OpenVPN很簡單,但是為了方便起見,你可能想讓它在服務(wù)器上后臺運(yùn)行,而且在意外重啟后繼續(xù)保持連接。在Debian/Ubuntu/及眾多派生發(fā)行版上,這一步自動處理:當(dāng)你安裝了OpenVPN后,它可以配置成系統(tǒng)啟動時(shí)自動啟動。所以,安裝完畢后,你需要重啟,或者使用下面其中一個(gè)命令來啟動這個(gè)后臺程序:
$ sudo /etc/init.d/openvpn start
$ sudo service openvpn start
第一個(gè)命令是傳統(tǒng)方式,第二個(gè)命令則使用了service命令。早在之前,service最先出現(xiàn)在紅帽Linux中;如果你的發(fā)行版在默認(rèn)情況下沒有安裝該命令,它很可能潛伏在軟件庫中,如果你想使用它的話。
Fedora使用了systemd初始化系統(tǒng),相比之下Ubuntu使用Upstart,而Debian仍使用傳統(tǒng)的SysV初始化系統(tǒng)。如果你在/etc/openvpn中有多個(gè)OpenVPN配置,可以在systemd中有所選擇地啟動每一個(gè)配置,就像這樣:
# systemctl start systemctl start openvpn@studio.service
其中的“studio.service”引用上篇中的示例/etc/openvpn/studio.conf文件。這個(gè)調(diào)用在重啟后并不繼續(xù)保持,所以它就像是運(yùn)行openvpn /etc/openvpn/studio.conf,這是我們在上篇中手動啟動OpenVPN會話的方式。只要借助chkconfig,就能夠讓OpenVPN在systemd上后臺運(yùn)行:
# service openvpn start
# chkconfig openvpn on
這應(yīng)該會以通常的方式讓OpenVPN在后臺運(yùn)行,它作為一種整體式的后臺程序,而不是按照/etc/openvpn/中的.conf文件單獨(dú)配置。systemd支持chkconfig命令和service命令,所以這應(yīng)該能行。不過,使用systemd的發(fā)行版其情況很不一樣,所以如果你的發(fā)行版不一樣,請留言告知我們。#p#
加強(qiáng)你的連接
OpenVPN很強(qiáng)大,擅長保持一條持久性連接,哪怕出現(xiàn)在服務(wù)中斷的情況下。你可以讓連接更強(qiáng)大,只要將下面這幾行添加到客戶機(jī)和服務(wù)器上的.conf文件:
persist-tun
persist-key
這幾行對由于省電和移動而頻繁斷開連接的筆記本電腦用戶大有幫助。
現(xiàn)在怎么辦?
鑒于你已設(shè)置好了這個(gè)架構(gòu),該如何處理它呢?如果你習(xí)慣于使用OpenSSH用于遠(yuǎn)程操作,可能會局限于使用SSH的這種心態(tài):能夠登錄到特定的機(jī)器,并運(yùn)行應(yīng)用程序。這樣不行,而是應(yīng)該把OpenVPN看成是虛擬以太網(wǎng)連線,通向你的服務(wù)器或以太網(wǎng),它們都采用了一層牢固的加密機(jī)制?,F(xiàn)在你可以通過同一條隧道運(yùn)行未經(jīng)加密的服務(wù)和加密的服務(wù),只要在防火墻中開一個(gè)口就行。
所以,你可以通過你的OpenVPN隧道按以前的方式來運(yùn)行SSH,還可以進(jìn)行遠(yuǎn)程管理,運(yùn)行應(yīng)用程序。你可以訪問網(wǎng)絡(luò)資源,比如文件共享區(qū)和Web應(yīng)用程序。你可以迫使客戶機(jī)上的所有網(wǎng)絡(luò)信息都通過你的VPN隧道來進(jìn)行傳送,但是就本文而言,我認(rèn)為你希望能夠使用你的原生網(wǎng)絡(luò)和VPN網(wǎng)絡(luò)。
所以,如果你使用可信賴的筆記本電腦,就可以上網(wǎng)沖浪,運(yùn)行SSH,在你連接的任何網(wǎng)絡(luò)上處理想做的任何事情。之后,當(dāng)你想在OpenVPN隧道上運(yùn)行某個(gè)程序,就可以打開它,并指定IP地址,就像這樣:
$ ssh carla@10.0.0.1
Web應(yīng)用程序很容易:將Web瀏覽器指定你的OpenVPN服務(wù)器的虛擬IP地址,按平常那樣登錄。比如說,我運(yùn)行各種Web服務(wù),以便在家庭服務(wù)器上進(jìn)行測試。所以,我可以訪問http://10.0.0.1/drupal處的Drupal,可以訪問http://10.0.0.1/owncloud處的OwnCloud。我使用了很棒的gFTP圖形化FTP客戶程序,所以如果我想要連接,只需要Host(主機(jī))這一行上的虛擬IP地址、用戶名和密碼。或者使用這個(gè)命令行:
$ ftp 10.0.0.1 21
你可以遠(yuǎn)程管理自己的MySQL數(shù)據(jù)庫,只要使用你自己的用戶名和密碼:
$ mysql -h 10.0.0.1 -u admin –p
所以,你需要知道的主要是,如何將主機(jī)規(guī)格添加到你想運(yùn)行的任何命令上。
很顯然,要是借助名稱服務(wù),而不是非得使用IP地址,這一切會來得更容易,所以下一回我們將學(xué)習(xí)如何在OpenVPN中實(shí)施名稱服務(wù)。同時(shí),請盡情享用你那條又棒又安全的OpenVPN隧道。
原文地址:http://www.linux.com/learn/tutorials/743590-secure-remote-networking-with-openvpn-on-linux
http://www.linux.com/learn/tutorials/745233-how-to-set-up-secure-remote-networking-with-openvpn-on-linux-part-2