VPN(Vitual Private Network)近年來應用愈見廣泛,關於Windows系統的配置已經有不少專述,筆者就不準備贅述。本文只是針對個人在PC機上配置OpenBSD系統上的VPN作一小述,同時聲明所有操作只針對本人的配置經歷,在讀者自己實施的過程中可能有細微的差別,相信有一定OpenBSD操作經驗的讀者能夠勝任"因材施教"。
1.什麼是VPN?
提出這個問題只是為了"例行公事",事實上,關於VPN的論述也是有了很多種版本,包括china-pub.com的eMook專欄已經有不少精彩的論述。筆者不想從Ipsec、NAT、ipfilter、PPP等基礎概念講起,只是介紹一些入門知識,更深的知識請大家自行閱讀OpenBSD的相關文檔(FAQ和manpages等)。
VPN是Vitual Private Network的簡稱,即虛擬專用網路。本文中應用的網路環境是兩個物理上分隔開的LAN,通過一個公用的網路(比如Internet)進行通信??當然,最重要的是確保兩個LAN中間進行的任何通信都無法被這個公用網路上任何未授權的用戶竊聽。
經過簡化的網路拓撲簡圖如下:
圖一
這時候就是VPN的用武之地了。VPN對於連接兩個物理分割的LAN是最好的選擇,它可以做到配置好以後,兩個LAN完全像物理上連接的網路!這時,兩個LAN利用Internet作為主要的數據傳輸介質來傳遞數據。無論從概念上還是功能上都講遠遠超出原先平常連接的程序工作效率。
2.配置VPN
首先需要明確筆者的聯網環境。如果你的環境跟筆者的差不多甚至完全一樣,那麼恭喜你,你基本上可以按照以下步驟拷貝到你的系統上;如果有一定的差別,那麼,就像上面提到的,讀者應該完全有能力"即興發揮"找出解決辦法。何況這並不困難。
網路的連接跟(圖一)相同。LAN1和LAN2中間間隔大概1600KM(之所以選擇這麼長距離的兩個LAN,是為了突出VPN的強大性能),Gateway1和Gateway2(網關)都是OpenBSD系統的路由器。Gataway1有永久性的Internet連接和一個固定的IP地址,而Gateway2就沒有那麼幸運,他只是一個撥號連接到Internet,而且每次撥號被必須ISP指定新的IP地址(這個網關是用域名來工作的,所以,不要擔心這種網關是否存在)。LAN1的IP地址為192.168.35.0/24(這種寫法是"借用了"R.Stevens的TCP/IP Illustrated裡面的寫法,表示LAN1的網路號是192.168.35,主機數為24,IP地址分別為192.168.35.1到192.168.35.24) ,LAN2 是 192.168.105.0/24。 Gateway1對於LAN1有一個內部IP地址192.168.35.1,外部地址為25.50.100.200(不用說,這是個假的,呵呵);Gateway2 有一個內部地址192.168.105.1和隨每次撥號都要更新的外部地址。
配置開始。首先,Gateway得安裝號OpenBSD2.8並配置成標準網關,也就是說,進行IP轉發,給網關分配相應得IP地址。同時需要注意得是暫時不用配置ipfilter,這個可以在VPN配置完成以後再配;也不要打開任何OpenBSD安裝時得預設啟動得服務,比如ftp/telnet/finger/rpc/portmap之類得,這是一台安全得伺服器所必要得條件,而且可能回影響VPN配置過程,如果一定要開開,那麼請在VPN配置完成以後再一個一個得打開,確認VPN工作無誤。
·然後,升級OpenBSD 2.8到OpenBSD-current. 因為在OpenBSD2.8的ipsec/ipf/ipnat 實現部分有問題,所以不要嘗試在OpenBSD2.8上配置VPN。具體來講,升級主要升級以下部分到current:
·內核。在鏈接新內核之前重新鏈接和安裝usr.sbin/config
·isakmpd
·ipf
·ipnat 以上三項需要重新鏈接之前安裝內核頭文件(include 的時候 "make include")
只有升級這些才可以修復OpenBSD 2.8中IPSec的問題,這些問題主要包括isakmpd導致的錯誤選路,同時也至少崩潰過幾次。而且理論上AES的問題也可以得到解決,雖然筆者還沒有實驗過。
為了升級到最新內核,需要
·編譯和安裝libkvm
·編譯ps,vmstat,top並安裝到已經有新內核的機器上
讀者可以在http://www.openbsd.org/anoncvs.html 查閱最新的更新。
新內核開始工作以後,兩台可以作OpenBSD VPN的網關就出現了。保證兩台系統的/etc/sysctl.conf裡面都有"net.inet.esp.enable=1" ,這使esp(Encapsulated Security Protocol)能夠工作,以後所有通過VPN隧道到達網關的流量都是以esp形式的。只要應用了正確的密鑰,這些esp包就會被根據他們真正的解密協議、埠和內容進行重新處理。
下一件需要作的事情是讓isakmpd開始工作,這樣才可以讓兩個網關能夠找到對方、驗證對方的可信度從而開始交換密鑰。
這部分工作就不詳細描述了,man isakmpd應該已經能夠解決問題,而且筆者用的是非常標準的配置。兩台機器利用商定的公共秘密句子來交換密鑰,這個密鑰是給AES加密演算法用的。下面是筆者的isakmpd的配置文件,依次為isakmpd.policy (適用LAN 1和2), isakmpd.conf.lan1, 和 isakmpd.conf.lan2.
1.KeyNote-Version: 2
Comment: This policy accepts ESP SAs from a remote that uses the right password
Authorizer: "POLICY"
Licensees: "passphrase:SecRetPhrasE"
Conditions: app_domain == "IPsec policy" &&
esp_present == "yes";
2. # $OpenBSD: VPN-east.conf,v 1.11 2001/04/09 23:27:29 nick1 Exp $
# $EOM: VPN-east.conf,v 1.12 2001/04/09 22:08:30 nick2 Exp $
# A configuration sample for the isakmpd ISAKMP/Oakley (aka IKE) daemon.
#
[General]
Retransmits= 5
Exchange-max-time= 120
[Phase 1]
Default= ISAKMP-LAN2gw
[Phase 2]
Connections= IPsec-LAN1-LAN2
[ISAKMP-LAN2gw]
Phase= 1
Transport= udp
Configuration= Default-main-mode
Authentication= SecRetPhrasE
[IPsec-LAN1-LAN2]
Phase= 2
ISAKMP-peer= ISAKMP-LAN2gw
Configuration= Default-quick-mode
Local-ID= Net-LAN1
Remote-ID= Net-LAN2
[Net-LAN2]
ID-type= IPV4_ADDR_SUBNET
Network= 192.168.105.0
Netmask= 255.255.255.0
[Net-LAN1]
ID-type= IPV4_ADDR_SUBNET
Network= 192.168.55.0
Netmask= 255.255.255.0
[Default-main-mode]
DOI= IPSEC
EXCHANGE_TYPE= ID_PROT
Transforms= 3DES-SHA
[Default-quick-mode]
DOI= IPSEC
EXCHANGE_TYPE= QUICK_MODE
Suites= QM-ESP-AES-SHA-PFS-SUITE
3.# $OpenBSD: VPN-east.conf,v 1.11 2001/04/09 23:27:29 nick1 Exp $
# $EOM: VPN-east.conf,v 1.12 2001/04/09 22:08:30 nick2 Exp $
# A configuration sample for the isakmpd ISAKMP/Oakley (aka IKE) daemon.
#
[General]
Retransmits= 5
Exchange-max-time= 120
Listen-on= 25.50.100.200
[Phase 1]
25.50.100.200= ISAKMP-LAN1gw
[Phase 2]
Connections= IPsec-LAN2-LAN1
[ISAKMP-LAN1gw]
Phase= 1
Transport= udp
Address= 25.50.100.200
Configuration= Default-main-mode
Authentication= SecRetPhrasE
[IPsec-LAN2-LAN1]
Phase= 2
ISAKMP-peer= ISAKMP-LANAgw
Configuration= Default-quick-mode
Local-ID= Net-LAN2
Remote-ID= Net-LAN1
[Net-LAN1]
ID-type= IPV4_ADDR_SUBNET
Network= 192.168.35.0
Netmask= 255.255.255.0
[Net-LAN2]
ID-type= IPV4_ADDR_SUBNET
Network= 192.168.105.0
Netmask= 255.255.255.0
[Default-main-mode]
DOI= IPSEC
EXCHANGE_TYPE= ID_PROT
Transforms= 3DES-SHA
[Default-quick-mode]
DOI= IPSEC
EXCHANGE_TYPE= QUICK_MODE
Suites= QM-ESP-AES-SHA-PFS-SUITE
(其他的例子可以在isakmpd.policy和isakmpd.conf的手冊里找到)。這些文件都應該在網關的/etc/isakmpd下。
讀入這些配置文件的信息以後,兩個網關就掌握了足夠的信息來驗證對方身份、交換密鑰然後用正常的過程來改變和同步他們的加密密鑰。
對於第一次連接來說,筆者推薦先改動一下這些文件來適合你個人的需求,再確保兩頭的機器都正確無誤的連接到了Internet上。
isakmpd -d -DA=99
在兩頭的機器上,這會確保isakmpd在前台運行並顯示最多的調試信息。你會得到一頁又一頁的調試信息,然後你就可以去看看真正加密的信息是怎樣在機器間傳輸的。
現在,你就已經應該得到一個可以運行的VPN了。當然,還需要進一步的測試。如果還是不能夠運行,那麼就檢查一下,找出出問題的地方。一個簡單的測試方法是ping對方LAN裡面的一台機器。注意:你不能在網關上作這個試驗。所以比如從192.168.35.2 ping 192.168.105.2,然後從192.168.105.2 ping 192.168.35.2, 你就應該看到兩台機器跟一般的ping一樣,就像是一個LAN內的兩台機器(不必多講,就是看TTL)。如果有興趣,還可以再看看ftp/telnet之類的。如果你的ping工作不正常,可以看看本文最後提到的"測試和調試"。
3. 將過程自動化
為了避免每次需要使用VPN的時候都配置一大堆東西,一些步驟可以自動化。我們應該能夠自動ping對方機器、讓VPN自動開始工作。需要:
· 每當另一頭的VPN需要訪問,這邊的撥號PPP連接就應該建立
· 自動運行isakmpd
建立PPP連接並不是什麼難事:在使用撥號連接的網關的/etc/rc.local文件裡面加上"ppp -auto -nat ISP"。這樣就使LAN2的機器一旦要連接出區域網,網關2就會建立ppp連接。
而運行isakmpd就比較複雜了,他在靜態的網關和需要撥號連接的網關上工作方法不同。對於靜態網關,只需要修改/etc/rc.conf成'isakmpd_flags=""',然後isakmpd就可以每次重起都自動運行了。但是在撥號連接的網關上,這種方法就會毫無用處,因為他剛剛重起過以後並沒有Internet連接。這時候,如果我們需要每次建立PPP連接以後都自動運行isakmpd、取消PPP連接的時候也同時關閉isakmpd。可以在/etc/ppp.linkup和/etc/ppp.linkdown裡面加入一行字。在/etc/ppp.linkup裡面加入
MYADDR:
!bg isakmpd
而在/etc/ppp.linkdown裡面加入
MYADDR:
!bg /etc/ppp/killisakmpd
這裡killisakmpd是一個shell腳本,內容如下:
#!/bin/sh
kill `cat /var/run/isakmpd.pid`
這樣,就可以完全將VPN的配置運行自動化了,很方便。
4.測試和調試
如果讀者的VPN第一次沒有正常運行,那麼你就不得不調試。如果isakmpd的一些功能沒有正確配置、也就是雖然能夠設立路由,但是沒能加密所有的密鑰,那這將是極為危險的。
首先,最好先ping一下對方LAN的機器。上面已經講過。如果工作不正常,那麼在Gateway1上:
tcpdump -i [網路外部介面名稱,比如fxp1, tun0 等等] host [Gateway2的IP]
這條命令可以顯示所有從 Gateway2到Gateway1的流量。理論上應該只有加密的ping命令被傳送,就像這樣:
16:10:07.543323 esp d7-lp-23.dial-up.net > gateway.whatever.com spi
0xEFBF34AA seq 146 len 132
16:10:07.712902 esp gateway.whatever.com spi > d7-lp-23.dial-up.net
0xB17F45A2 seq 146 len 132
這表示進入的所有信息都是以esp方式進行加密的,而且你的VPN正常工作。如果你沒有看到任何有關ICMP的信息,你的Internet連接還是未被VPN加密的。
當筆者的VPN沒有正常工作的時候,卻也得到了以上信息,但是沒有ping的回答,表示加密的信息根本沒有在對方Gateway上處理。原因很簡單:對方Gateway運行的是OpenBSD 2.8系統!
5. 與NAT和防火牆(ipf)的交互性
當以上所有工作都完成,並在沒有Ipfilter的情況下正常工作了,筆者就打開了NAT和ipf。沒有對標準的NAT設置作任何修改。然後在/etc/ipf.rules加上幾行用來允許加密信息可以通過網關
# VPN: allow any traffic on the ISAKMP port
pass in on fxp1 proto udp from any port = 500 to 25.50.100.200 port = 500
pass out on fxp1 proto udp from 25.50.100.200 port = 500 to any port = 500
# VPN: allow all traffic in ESP form
pass in proto esp from any to 25.50.100.200
pass out proto esp from 25.50.100.200 to any
這些規則會允許所有通過isakmpd進行的的密鑰交換和後來的加密esp過程能夠正常進行。
6. 結論
從以上的記述來講,對於一個對網路、網關、NAT、ipf、ppp有基本認識的讀者,配置一個VPN不是很難的事情。當設定好一切,還可以嘗試運用各種不同的加密和認證手段。