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