顯示具有 VPN 標籤的文章。 顯示所有文章
顯示具有 VPN 標籤的文章。 顯示所有文章

2008年12月11日 星期四

[ZeroShell] 憑證管理 & VPN 設定

這個部份說明如何在 ZeroShell 設定並啟用 VPN 的服務。

由於 ZeroShell 使用 OpenVPN 來建構 VPN 的服務,因此首先要先瞭解設定 OpenVPN 的需求;基本上大概就是幾個部份,分別是:

  1. 憑證(certificate)的管理與發放

  2. 使用者認證的方式

  3. VPN tunnel 的 routing 相關設定

憑證(certificate)的管理與發放

要連線到 OpenVPN server,每個 client 都需要兩個憑證,分別是:

  1. OpenVPN server 的 CA 憑證(裡面包含了 server 的 public key)

  2. client 專屬的 CA 憑證(裡面包含了 public key & private key)

CA 的部份,若是沒有上游的 CA 檔案可以匯入,ZeroShell 就會自己扮演 self-CA 的角色來簽署憑證,而 server private key 的部份,ZeroShell 會自行處理好。

1、安裝 OpenVPN client

這個部份需要下載 OpenVPN GUI 來安裝,安裝時並不需要進行額外的設定。

2、取得 OpenVPN server CA 憑證

首先進入 ZeroShell 的 web 登入畫面,點選「CA」:

接著會出現 CA 憑證的資訊,選擇輸出(Export)為「PEM」格式:

接著把下載的檔案放到「C:\Program Files\OpenVPN\config」目錄中即可。

3、增加使用者(client)

目前除了 admin 之外,沒有其他使用者,因此這邊要新增一位,選擇「USERS –> Users –> Add」:

接著輸入使用者相關資訊:(包含帳號、密碼 … 等等)

使用者相關資訊填寫完畢後,按下 Submit 後使用者就新增完成了!

4、取得 client CA 憑證

使用者新增完成後,隨即會出現憑證相關資訊:

同樣的,格式的部份選擇「PEM」,並按下「Export」將 client 的 CA 憑證匯出,將憑證修改名稱為「client.pem」,並放到「C:\Program Files\OpenVPN\config」目錄。

若是之後想要另外在輸出使用者憑證,可以選擇「USERS –> Users –> 使用者名稱 –> X509」,進入憑證資訊畫面進行輸出:

5、下載連線設定檔

設定檔的部份要到官方網站下載,下載後放入「C:\Program Files\OpenVPN\config」(以 Windows 為例,其他的 OS 的設定方式請參考官方網站的文件 - OpenVPN client configuration for Windows, Linux, Mac OS X and Windows Mobile for Pocket PC)

以下是設定檔的內容:

;OpenVPN server 位址
remote zeroshell.example.com 1194

proto tcp

auth-user-pass

;OpenVPN server CA 憑證存放位置
ca CA.pem

;OpenVPN client 憑證存放位置
;cert client.pem
;key  client.pem

comp-lzo
verb 3
mute 20
resolv-retry infinite
nobind
client
dev tap
persist-key
persist-tun

但為了符合我們的實驗環境設定,修改成如下:

;OpenVPN server 位址
remote 10.1.16.222 1194

proto tcp

auth-user-pass

;OpenVPN server CA 憑證存放位置


ca CA.pem

;OpenVPN client 憑證存放位置
cert client.pem
key  client.pem

comp-lzo
verb 3
mute 20
resolv-retry infinite
nobind
client
dev tap
persist-key
persist-tun

如此一來就完成了! 透過右下角的 OpenVPN GUI 圖示按右鍵,選擇「zeroshell –> Connect」,輸入 client 的帳號密碼(在新增 user 時所輸入的帳號密碼),就可以順利連到 OpenVPN server 囉! (前提是 OpenVPN server 的服務有正確啟動)

 

VPN 服務的設定

這個部份則包含了之前提到的兩點:

  1. 使用者認證的方式

  2. VPN tunnel 的 routing 相關設定

在 ZeroShell 系統中選擇「NETWORK –> VPN」:

上面個畫面中有幾個需要注意的部份:

  1. 通訊協定與 port number
    這個部份預設為 TCP 1194,若有更動的話,設定檔也必須連同更動。

  2. 認證方式
    基本上搭配憑證的話,選擇「Only X.509 Certificate」即可,除非另外要搭配 Kerberos 或是 RADIUS 的密碼驗證,才需要選擇有 Password 的選項。

  3. VPN client 的網段設定
    這部份的設定決定 VPN client 連線後所取得的 IP,而 routing table 的部份,基本上 ZeroShell 會 push 給 client,因此當 client 取得新的 IP 後,連同 routing table 也會更著變動。

  4. 密碼認證
    在本實驗架構中並無搭配 Kerberos 或是 RADIUS,因此省略。

最後記得勾選「Enabled」並按下「Save」儲存設定,服務才會啟動。

 

連線前後 routing table 的改變

上面有提到,當連線到 VPN server 之後,VPN client 的 routing table 會隨之改變,以便可以連到內部網路中。

以下是 VPN client 原本的 routing table:

從上圖看得到 Default Gateway 的設定還是在網路卡上的設定。

但是當 VPN tunnel 建立起來後,routing table 就會變更如下:
 

除了 Default Gateway 有變更外,也會額外附加一些由 VPN server push 過來的 routing 設定。

比較需要注意的是,Default Gateway 被改變了,因此到 192.168.1.0/24 與 192.168.100.0/24 兩個網段的封包,由於不在 routing table 內,因此都會改走 Default Gateway,而這些封包都會自動由 ZeroShell 導引至正確的網路介面。

2008年12月8日 星期一

功能強悍的防火牆 ZeroShell

之前使用 Untangle,發現實在是一套不錯的軟體,功能相當強大,已經達到 UTM 可以作到的程度了!

但是唯一的缺憾就是還不能對 Layer 7 application 進行 Qos 的管理,也許未來會推出相關套件也不一定…

因此就在網路上另外找到這套「ZeroShell」,他不大,可至官方網站下載 Live CD 來使用,也可以安裝至硬碟上(IDE only,如果主機板支援將 SATA 轉為 Legacy mode 應該也是可以)

而 ZeroShell 有哪些功能呢? NAT、DHCP、DNS、VPN、L7-Filter、Qos、RADIUS、LDAP、Load Balance、X.509 …等等一狗票的功能,詳細的功能可以到官方網站去看。

只是他恰巧符合我需要的 L7-Filter + QoS 的功能,因此目前選中他作為測試!

而 ZeroShell 中所提供的所有功能,幾乎都是從 open source 的專案來的,例如:OpenVPNOpenLDAPl7-filter …等等,因此要找到支援與協助應該不是太困難。

 

以下列出最近測試時,發現到要注意的設定重點:

設定資訊的儲存

上面有提到 ZeroShell 是以 Live CD 的方式啟動的,因此每次重開機設定都會不見;查了一下官方網站,有說到只要設定完成後,進入「SYSTEM –> Setup –> Profiles」將 profile 備份即可,進入時他會偵測電腦上的硬碟與分割,讓管理者可以自行決定 Profile 要放哪。

但真的有那麼美好嗎? 我實際測試是沒有……只有對外網卡的設定會保留下來,其他都還是跑掉,這讓我很困擾,因此最後我還是把他裝到硬碟上去了…(裝到硬碟上後,也不用儲存 profile 了,因為設定不會跑掉)


NAT

原本以為設定好每個 NIC 的 IP address 跟 default gateway,自動產生 routing table 之後,NAT 也會跟著起來,但實際上並沒有……

但設定並不困難,只要進到「NETWORK –> Router –> NAT」,把對外的那一張網卡加到「NAT Enabled Interfaces」即可。


憑證(certificate)的啟用

若要使用憑證相關的服務(例如:OpenVPN),就需要將憑證啟用,啟用要從「SECURITY –> X.509 CA」中選擇要啟用的憑證,將其啟用。

而啟用的方式比較特別,需要先 revoke 之後再 renew,才能將憑證正式啟用。


OpenVPN

在 server 的部份,只要進入「NETWORK –> VPN」將這個功能啟動即可,而認證方式有三種(密碼、密碼 + 憑證、憑證)可以自由選擇,而若要加入密碼的認證,則必須指定外部的 RADIUS 或是 LDAP server 進行認證。

而 client 的部份,需要從官方網站下載連線設定檔,並修改裡面的設定(OpenVPN server 位址、憑證位置、金鑰位置)。

另外 CA 憑證的部份可以從 ZeroShell 的登入頁下載。

而 client 的憑證則可以到「USERS –> Users –> X509」中將金鑰資訊 export 出來。


QoS

設定 Qos 必須注意,Qos 僅能管理從特定網路介面出去的流量,無法管制進來的流量;雖然如此,透過針對不同網卡的管控,還是可以作到上下傳的頻寬控管。

另外載設定的部份就稍微複雜一點,就跟直接設定防火牆差不多,需要以下三個步驟:(下面的設定都在「NETWORK –> QoS 中」)

  1. 設定 QoS Class
    在「Class Manager」中,可設定傳輸的優先權(Priority),最大傳輸頻寬(Max)以及保證頻寬(Guaranteed)。

  2. 將 Qos Class 與網路介面進行繫結
    不一定設定的規則都要套用在每一個網路介面上,因此可以到「Interface Manager」中指定要將 QoS Class 套用到那一個網路介面。

  3. 設定規則,並指定其屬於哪個 Qos Class
    設定了頻寬的限制、所要管理的網路介面後,就要設定規則與其匹配了,而規則設定需要到「Classifier」中進行設定,而 ZeroShell 提供的設定選項很多,幾乎 iptables 支援的功能他都做到 web 介面上了,當然也包含了 Layer 7 的選項囉!

 

L7 Filter 的更新

目前 ZeroShell 還沒有提供線上更新 Layer 7 pattern 的功能,若要更新的話,可以從 l7filter 的官方網站下載最新的 protocol definition,並將檔案命名為「l7-protocols.tgz」後,放到「/var/register/system/net/L7」資料夾內,重新開機即可。

2008年11月24日 星期一

[Untangle] OpenVPN 設定

鼎鼎有名的 Untangle 應該不用詳加說明了吧?

它是一套 open source 且功能很強大的 UTM(Unified Threat Management),對於預算不夠卻想要建置 UTM 的單位,是很合適的選擇。

另外,如果想瞭解 VPN 是什麼,以及 OpenVPN 的相關概念,可以參考之前的幾篇文章:

  1. 虛擬私有網路(VPN)服務介紹

  2. Certificate Authority(CA) 簡介

  3. OpenVPN 簡介

 

要設定 Untangle 中的 OpenVPN,有幾個步驟是必須要完成的:

設定 OpenVPN 類型

在 Untangle 的 OpenVPN 設定中,可以將其設定為:

  1. VPN Server

    此設定可以讓 Untangle 的管理者自行決定開放哪些後方的電腦或是區域,以提供給外部的 openvpn client 可以連線進行存取相關資源。

  2. VPN Client

    此設定則是讓 Untangle 變成連線到其他 OpenVPN Server 的 client,至於可以透過 vpn tunnel 取得哪些資源,則是視對方管理者的設定而定。

【備註】若是有需求,Untangle 也可以同時設定為 VPN server 與 client 喔!

 

Generate Certificate

由於在 vpn tunnel 的資料傳輸需要加密,而加密需要金鑰,金鑰的驗證需要靠 CA。

因此在這個步驟中必須輸入相關資訊以產生 CA 的憑證。(此時 Untangle 扮演一台 Self-Signed CA,並自行產生憑證)

 

Add Address Pools

address pool 的設定就是要設定 VPN server(這裡指的是 Untangle) 配發給 vpn client 的 private IP address 範圍。

 

Add Exports

這個部份則是設定 VPN server(這裡指的是 Untangle) 要開放給外部 VPN client 可以連線的內部網段;要注意的是,這邊設定的不是 address pool 中設定的網段,而是內部實際的網段喔!

透過 IP address 與 Netmask 的設定,可以決定開放存取的範圍;基本上為了安全性考量,盡量還是僅開放確定要提供給 vpn client 存取的網段即可。

 

Add VPN Clients

在這個步驟中,要設定可以連線到 VPN server 的 client。

剛開始設定時,僅能設定 client name 並指定其屬於哪個 address pool。因為 address pool 可能不只一個,而多個 client 的話可能會分別屬於不同的 address pool。

若是有針對不同使用者群組來分成不同網段的話,就可以透過將 client 指定給不同的 address pool 的方式來達成。

 

Add VPN Sites

此功能是用於與其他的 VPN server 對連時的設定,目前還尚未用到,因此先略過,之後再來補充…

 

金鑰檔的傳輸

金鑰檔傳輸的方面,Untangle 可以用 E-Mail 或是 USB 的方式;但 E-Mail 只會給下載連結,但如果 Untangle Server 沒有 Public IP 以及 Domain Name 的話,根本就連不到,這時候可能就需要 USB 了!

但如果都不行呢? 那就只好進去終端機了…(預設 ssh 是沒開的,但可以到本機把服務打開!)

使用者的金鑰檔都存在「/usr/share/untangle/conf/openvpn/client-packages」資料夾中,檔名為「config-xxxx.zip」,其中 xxxx 為使用者名稱;知道檔案位置以後,就可以透過 scp 傳到自己的主機上囉!
 

 

連線至 OpenVPN server

取得金鑰檔之後,就可以透過 OpenVPN client 軟體連線至 VPN server 囉! 以 OpenVPN GUI 為例,要將金鑰檔案放到「C:\Program Files\OpenVPN\config」目錄中,連線時不需要輸入帳號密碼,連線後可從 VPN server 中取得一組虛擬 IP,並可透過 VPN tunnel 連線至內部主機。

 

問題處理

在設定完 OpenVPN 之後,卻發生了連上 OpenVPN server 後,無法連進 Internal Network 的問題,經過以下檢查:

  1. 檢查 Address Pools => 沒有問題

  2. 檢查 Exports => 也沒有問題

  3. Firewall => 根本都還沒安裝,所以不會是 firewall 的問題

  4. Packet Filter => 所有 VPN 相關的 Accept 選項統統勾選了

到底是為何呢? 當初也是百思不得其解;後來另外找台 NB 來測試,卻發現通了! 後來在原來的 client 上 run 一個 virtual machine,簡單裝個 Windows 2003,也通了!

我想原因應該是公司在電腦上安裝了會影響 OpenVPN 封包的軟體吧!

在 Untangle 的論壇上也有人有同樣情形,不過他是更換網路卡就好了!

所以可能會發生這樣情況的原因似乎不少,但設定照上面說明的就沒錯了! 

 

參考資料

  1. Untangle - OpenVPN

2007年7月2日 星期一

解決 OpenVPN client 連線後,外部網段無法連到 client 的問題

之前架設 OpenVPN (Routing Mode),並將所有的 traffic 都設定經由 VPN server!

但是卻發生了一個問題,就是當 client 與 server 連線後,外部網段就無法連到 client 了! 後來查了一下原因,原來是 routing table 的規格被修改了!

原本的設定如下:(僅擷取重點部分)
# 此行設定會讓 client 所有的網路流量通通會經過 VPN server
push "redirect-gateway def1"
後來想出解決方案,只要針對進出內部有控管的網路的流量進行管制,經過 VPN server 再連入,並不需要所有的網路流量都經過 VPN server,如此一來,就解決這個問題了!

假設內部網路的網段為 140.137.100.0/24,只要將上面那行設定改成如下:
# 所有進入 140.137.100.0/24 網段的流量,必須經過 gateway 10.8.0.25
# 10.8.0.25 即為 VPN server 作虛擬出來的 gateway

push "route 140.137.100.0 255.255.255.0 10.8.0.25"

2007年5月17日 星期四

OpenVPN 結合 LDAP 認證機制

上一篇文章中介紹完 OpenVPN 如何與 certificate 搭配來加強傳輸的安全性後,這次要回歸到帳號密碼認證的問題!

原本在 certificate 的模式中,client 只要輸入 client certificate 的密碼即可! (因為帳號內定為 client certificate 中的 common name)

當然 OpenVPN 提供的驗證方法不只這種,除了上述的方式外,還可與 LDAP 或是 RADIUS 此類的遠端服務搭配來進行認證的工作,以下要介紹如何使用 LDAP 來進行認證。

全部的設定皆以上一篇為基礎,保留原有設定,並加入 LDAP 認證用的相關設定,以下是設定內容:

vpn server
# 用來認證使用者帳號密碼的 script
# 【注意】務必用「絕對路徑」指定 script 位置

# 「via-env」的目的是以使用者輸入的訊息作為 script 的參數
auth-user-pass-verify /etc/openvpn/ldap_auth.sh via-env

# 以使用者輸入的帳號為 common name
# 不用 client certificate 中的 common name

username-as-common-name

vpn client
# 以帳號密碼的方式進行認證
auth-user-pass


接著以下是 ldap_auth.sh 的內容:
#!/bin/sh

# LDAP Server 的位址
LDAP_HOST=ldap.example.com

# 檢查輸入是否有錯誤
if [ "$username" = "anonymous" || "$username" = "Anonymous" || -z "$username" || -z "$password" ] ; then
exit 1;
fi

# 查詢 LDAP Server 中的帳號密碼資訊
ldapwhoami -x -h $LDAP_HOST -D uid=$username,ou=users,dc=example,dc=com -w $password

if [ "$?" = "0" ]; then
exit 0;
else
exit 1;
fi
exit 1;
然後要讓此 script 讓 others 可以有執行(x)的權限,如此一來 LDAP 認證應該就可以正常進行了。


假設只要進行 LDAP 的帳號密碼認證就好呢?

或許有人會有這種疑問吧? 或是我多慮了........? @_@...算了,不重要...

如果要取消 client certificate 的密碼認證,只要在 vpn server 中加入以下設定:

# 不需 client certificate 相關資訊
client-cert-not-required
並在 vpn client 中將以下兩行註解:
cert keys/vpn_client_cert.pem
key keys/vpn_client_key.pem
如此一來,只要輸入 LDAP 的帳號密碼就可以完成認證囉!


實作心得感想

為了搞這個整整花了我一天,測試半天,中間一直出錯,但一直找不到錯誤原因........

結果發現加入設定「verb 6」可以變成 debug mode,如此一來顯示出來的訊息就相當詳細了!(當然不值得看的訊息也一堆啦......@_@) debug 也相對方便許多~問題也就解決了.....

2007年5月14日 星期一

OpenVPN 與金鑰的搭配使用

重點說明

這次要設定的 OpenVPN,要搭配 X.509 certificate 一同設定;基本上,針對安全性相關檔案的部分,有以下幾項工作必須完成:
  1. 自行建置 CA(certificate authority)外
  2. 必須使用 CA 產生給 vpn server 以及 vpn client 用的 key pair,用於身份辨識之用
  3. 使用 openssl 工具產生 Diffie-Hellman 加密檔,作為資料交換加密之用


環境介紹

這裡所測試的環境,還是與上一篇 static key VPN 所使用的環境一樣,只是這次改用 X.509 certificate 將安全性更為提升,以下用圖示來說明:



設定前的準備

在設定 vpn 前,必須準備以下檔案:

VPN Server
  • CA certificate
  • vpn server certificate
  • vpn server key (務必妥善保護)
  • Diffie-Hellman Key (務必妥善保護)

VPN Client
  • CA certificate
  • vpn client certificate
  • vpn client key (務必妥善保護)

其中 CA 的建置與 key pair 的產生,這邊就不作說明了,詳情可參考之前寫的文章「CA建置(1) - Self-Signed CA 」。

剩下的就只有 Diffie-Hellman Key 的產生了,在一般的教學中會指導使用者怎麼透過 easy-rsa utility 來產生,不過我看了一下原始碼,其實他還是透過 openssl 的指令去產生出來的,況且上面的連結所說明 server 以及 client 的 certificate 與 key 的部分,也不是用 easy-rsa 所產生的,因此這邊不打算用 easy-rsa 來作。

講了一堆廢話,要怎麼作呢? 假設我們要作一個 2048 bit 加密的 key,可用以下指令:
# 參數說明: # dhparam:指定產生 Diffie-Hellman Key
# -out:輸出檔案

# dh2048.pem:輸出檔案名稱
# 2048:表示要加密的長度為 2048 bit

openssl dhparam -out dh2048.pem 2048
整個過程需要蠻長一段時間,如此一來,Diffie-Hellman Key 就順利產生了。

接著透過 scp 將檔案分別傳給 vpn server 以及 client,接下來就準備進行設定工作了。


VPN 設定

vpn server
dev tun

# 使用 TLS mode,並指定用來加密傳輸的 key file
tls-server
tls-auth keys/ta.key 0

# 金鑰相關設定
ca keys/cacert.pem
cert keys/vpn_server_cert.pem
key keys/vpn_server_key.pem

# server 與 client 之間交換金鑰時的加密用檔案
dh keys/dh2048.pem

# 設定啟用時所需密碼的檔案位置 # 有此設定就不需要再輸入密碼了
askpass keys/startup_password

# 設定 client 所分配的 ip 網段
server 10.8.0.0 255.255.255.0

# 紀錄 client 連線資訊的檔案
ifconfig-pool-persist ipp.txt

# 傳給 client 使用的設定檔
# 「redirect-gateway def1」是讓 client 所有的網路流量都透過 vpn server 進出

# 若 vpn server 及 client 在同一個實體網段內,則必須多加上「local」,若沒有,在同網段連上 vpn server 的電腦會無法連外喔!

#push "redirect-gateway local def1"

push "redirect-gateway def1"

# 設定 client 連至內部網路的的 routing 資訊
push "route 192.168.0.0 255.255.255.0"

# server 每 10 發送 ping 指令到 client,確定 client 持續連線
# 若 client 沒有回應,每 120 秒重試一次

keepalive 10 120

# 傳輸資料前進行壓縮
comp-lzo

# 同時最多 10 個 client
max-clients 10

# 以非 root 的身份啟動 vpn service
user nobody
group nogroup

# 以 daemon 的方式啟動 vpn service
daemon

# 不重複讀取 key file # 不重開 TUN 裝置
# 當用非 root 的使用者開啟服務時,必須要有以下兩個設定

persist-key
persist-tun

# Log 資訊
status openvpn-status.log
log openvpn.log
log-append openvpn.log
vpn client
# VPN server 的位址
remote 221.169.40.120

# 以 TLS mode 進行連線
tls-client
tls-auth keys/ta.key 1

# 從 VPN server 取得相關設定
pull

# 指定使用的裝置為 TUN
dev tun

# 金鑰相關設定
ca keys/cacert.pem
cert keys/vpn_client_cert.pem
key keys/vpn_client_key.pem

# 傳輸資料前進行壓縮
comp-lzo

接著,為了讓網路流量可以完全經由 vpn server,因此 server 必須執行以下兩行指令:
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o ppp0 -j MASQUERADE
其他的問題,就是檢查相關檔案所擺放的路徑是否正確了!


【後記】
後來發現,若 server 與 client 在同一網段內, server.conf 中的 push 設定中,不加上「local」也可以讓網路流量都走 vpn tunnel 順利上網。


參考連結:
  1. OpenVPN 建置方案
  2. 使用 OpenVPN
  3. OpenVPN(Debian)
  4. StudyArea - vpn一問,請高手幫忙一下
  5. OpenVPN 2.0 HOWTO
  6. OpenVPN FAQ
  7. OpenVPN HOWTO
  8. OpenVPN 2.1 Man Page

2007年5月8日 星期二

建立 static key OpenVPN tunnel

Static Key VPN 這是最容易架設的 vpn server,詳細的設定方式可以參考以下兩個連結:
  1. OpenVPN Static Key Mini-HOWTO
  2. OpenVPN(Debian)

雖然設定過程簡單,不過其中也得到了一些設定心得,搞清楚了一些觀念....

以下是今天實作的環境,用一張簡圖來表示:

最左邊是我手邊用的 NB,其為 vpn client;而 vpn server 則是家中的主機,此台主機做為家中的 NAT 使用。
而設定 vpn tunnel 的目的是在於可以直接在外透過 vpn tunnel 直接連線至家中內部區域網路(192.168.0.0/24)。


設定方式很簡單,以下說明一下設定的內容,首先在 vpn server 的部分
# 使用 TUN 裝置 (routing mode) # 官方建議盡量使用 tun,除非不是使用 IP 協定或是有其他更特殊的用途
dev tun

# 「ifconfig」所設定的 ip,基本上只是 tunnel 兩端用來連結之用,並沒有什麼特殊意義 # 前面的部分指定 tunnel 本地端的 IP 位址 # 後面的部分指定 tunnel 另一端的 IP 位址 # 10.8.0.1 為本地端 vpn server IP # 10.8.0.2 為遠端 vpn client IP
ifconfig 10.8.0.1 10.8.0.2

# 用來加密傳輸資料的 key file
secret static.key

# 針對傳輸的資料進行壓縮 # 必須安裝 lzo 套件才行
comp-lzo

# 以 daemon 模式開啟,並指定 user/group
user nobody
group nobody
daemon

# 若上面設定的 nobody 沒有存取 static key 以及 tunnel 裝置 的權限 # 就必須加上此兩行設定,以避免產生權限不足的問題
persist-key
persist-tun
當然也可以不用設定檔,直接以下指令的方式啟動 vpn server,以下指令可以達到同樣效果:
# 其實也是等於把所有參數在指令中下好是一樣的
shell> openvpn --dev tun --ifconfig 10.8.0.1 10.8.0.2 --secret /etc/openvpn/static.key --comp-lzo yes --user nobody --group nobody --daemon openvpn_daemon --persist-key --persist-key


再來是 vpn client 的設定部分:
# vpn server 的 ip address 或是 domain name
remote home.twcic.net

# 使用 TUN 裝置 (routing mode)
dev tun

# 同樣的,這邊也是指定 tunnel 兩端的 ip # 前面為 local ip,後面為 remote ip
ifconfig 10.8.0.2 10.8.0.1

secret static.key

comp-lzo

# 為了讓 client 可以直接與 server 後面的私有區域網路連線
# 必須設定 routing 資訊

# 注意! 這個部分不是設定在 server 喔!
route 192.168.0.0 255.255.255.0

最後,為了讓 client 可以順利連線到主機後端的私有區域網路,vpn server 必須將 packet forward 的功能開啟,透過以下指令即可:
echo "1" > /proc/sys/net/ipv4/ip_forward
PS. 其實原本就已經開啟了,因為那台本來就是 NAT server .......

如此一來,最基本的 vpn tunnel 就設定完成了!


參考連結:
  1. OpenVPN 建置方案
  2. 使用 OpenVPN
  3. OpenVPN(Debian)
  4. StudyArea - vpn一問,請高手幫忙一下
  5. OpenVPN 2.0 HOWTO
  6. OpenVPN FAQ
  7. OpenVPN HOWTO
  8. OpenVPN 2.1 Man Page

OpenVPN 簡介

簡介

何謂 VPN(Virtual Private Network) ? 可參考此篇文章 的說明.....

然而,市面上有許多 VPN solution,每個 solution 各有其優缺點,若是要考量到建置成本與彈性,可考慮使用這邊將會介紹的 OpenVPN

那 OpenVPN 有什麼特色呢? 以下是官方網站的簡單說明:
OpenVPN is a full-featured SSL VPN solution which can accomodate a wide range of configurations, including remote access, site-to-site VPNs, WiFi security, and enterprise-scale remote access solutions with load balancing, failover, and fine-grained access-controls.

OpenVPN implements OSI layer 2 or 3 secure network extension using the industry standard SSL/TLS protocol, supports flexible client authentication methods based on certificates, smart cards, and/or 2-factor authentication, and allows user or group-specific access control policies using firewall rules applied to the VPN virtual interface. OpenVPN is not a web application proxy and does not operate through a web browser.
上述說明中,最重要的部分在於 OpenVPN 中的安全機制,是建立在 OSI Layer 2 以及 Layer 3,並非在 Application Layer,不透過 Web Browser 進行操作,由於安全性架構在 OSI 的底層,因此在安全性上自然也是大大的提升。

此外,許多 VPN solution 都是走 IPSec 架構,因此就無法與 OpenVPN 相容了,因為在說明第一行中就提到,OpenVPN 是以 SSL 為安全架構,因此必須考量到實際的情形,已決定是否使用 OpenVPN。


OpenVPN 的優點

然而,OpenVPN 有何優點呢? 以下列舉 OpenVPN 的幾項優點供參考:
  1. 可實作在 OSI Layer 3 甚至於 Layer 2,因此可以傳送 Ethernet、IPX、NETBIOS....等協定的封包,相容性極高
  2. 提供連接 VPN 的使用者統一的通道進行網路傳輸,大大加強了安全性
  3. 透過 VPN 所建立的通道,幾乎可以與目前所有安全機制溝通無礙(例如:https)
  4. 支援代理(proxy)機制
  5. 僅需開啟防火牆的單一 port 即可處理來自多方的連線(multi tunnel),減少被惡意入侵的機會
  6. 管理者可根據需求自行撰寫 script,讓 OpenVPN 可以處理更多複雜的工作
  7. 針對動態 IP 使用者,提供了通透且高效能的服務;即使在使用 VPN 通道的同時更換了 IP,建立好的 VPN 通道也不會就此斷掉
  8. 在 NAT 的環境下運作是毫無問題的
  9. 在任何 OS 平台下皆可安裝
  10. 模組化的設計,因此管理者可以根據需求自行增加或減少 OpenVPN 的功能


資料傳輸方式

OpenVPN 會模擬出虛擬的網路裝置來進行資料的傳輸,而其所使用的虛擬裝置為TUN/TAP driver,而 TUN 以及 TAP 有何不同呢? 以下分別進行說明:

1、tun
可被視為虛擬的點對點裝置,就像一般家用的 modem、ADSL 一樣,使用此虛擬裝置的模式稱為 routed mode,因為是在連線後才決定 vpn 雙方的連線路徑,因此可瞭解 tun 裝置所處理的是 OSI Layer 3 的工作

2、tap
可被視為虛擬的 ethernet 網路卡,可以透過此裝置啟動一個 daemon 來接收 ethernet 訊框,稱為 bridge mode,因為此裝置是以 bridge 的方式來運作,這個是 tun 裝置做不到的! 因為 tap 裝置所處理的是 OSI Layer 2 的工作

最後,由於此兩個裝置處理的是 OSI Layer 2 與 3 的部分,因此自然可以容易的更上層的安全機制進行結合,例如:SSL/TLS(Layer 4)。

雖然這兩個裝置是虛擬的,但卻可以跟一般實體的網路卡一樣的運作,也因為有此特性,以下的情況都可以正常運作:
  • 在搜尋 Windows 內部網路或是區網遊戲時,需要發送廣播封包
  • 非 IP 協定的封包(例如:IPX),也可以透過 vpn tunnel 正常傳輸
  • 可以透過防火牆管理虛擬裝置的流量
  • 可以針對 vpn tunnel 的傳輸進行流量管控


OpenVPN 的缺點

OpenVPN 優點一堆,包括設定方便、功能強大、安全性佳....等等,但也是有缺點的! 最重要的缺點是與目前流行的 IPSec vpn 是不相容的,加上由於許多網路設備內建的都是支援 IPSec 的功能,因此跟OpenVPN 並不相容。

不過這並不要緊,技術是會進步的,相信廠商很快就會把相容於 OpenVPN 的功能也加入其設備中。


安裝 OpenVPN

現在要安裝 OpenVPN 可說是方便多了,Windows 下可以直接到官方網站下載,Linux 下可以直接透過 apt 或是 yum 進行網路安裝。

2007年5月7日 星期一

VPN 基本運作原理

何謂 VPN ?

VPN(Virtual Private Network) 中文翻譯為「虛擬私有網路」,以下從網路上擷取 VPN 的定義進行說明:

原文說明:
A virtual private network (VPN) is a private communications network often used by companies or organizations, to communicate confidentially over a public network. VPN traffic can be carried over a public networking infrastructure (e.g. the Internet) on top of standard protocols, or over a service provider's private network with a defined Service Level Agreement (SLA) between the VPN customer and the VPN service provider. A VPN can send data e.g. voice, data or video, or a combination of these media, across secured and encrypted private channels between two points.
中文說明:
VPN 是利用 Internet IP 的技術,建立 Internet 上的加密通道 (Tunneling) 來架構網際網路上的虛擬內聯網路(VPN),IP網路的擴充性良好,所使用的加密技術是標準的 IPSEC (IP Security) 方式,IPSec 結合了加密(Encryption)、認證(Authentication)、密鑰管理 (Key Management)、數位檢定 (Digital Certification) 等安全標準,具有高度的保護能力。

VPN透過Internet傳送企業重要資料自然成為競爭對手覬覦的對象,因此,保障通訊安全即為建置VPN的首要考量。這裡的安全除了保證資訊的隱密 (Confidentiality),避免第三者「竊聽」到通訊內容,同時還須確保網路傳送內容不被篡改破壞,亦即所謂資料的一致性 (Integrity);另外就是資料來源的驗證(Authentication),確定資料並非來自網際網路上第三者所偽造。至少達成這三點,我們才能確保跨越開放式網際網路的VPN有如專線構成的封閉式內聯網路一樣安全。
而由上述的說明,可瞭解到 VPN 是希望透過價格低廉的 WAN 線路,以 Tunneling 的技術,加上特殊的安全、傳輸等附加機制後,可以破除地理限制,讓 Intranet、Extranet、Internet 都可以用類似區域網路的方式進行連結。


VPN 的優點

VPN 擁有相當多的使用上優點,例如:
  1. 使用 WAN 的線路作為基礎,破除地理因素
  2. 安全性高
  3. 使用與維護成本低
  4. 增加生產力
  5. 原理與使用操作上簡單、容易
  6. 增強企業合作伙伴間、或是與企業與用戶間的聯繫


相關安全機制

由於 VPN 是架構在現有的 WAN 上面,當然在安全性的部分要注意的地方可是相當多,一般來講,大概有以下幾種加強安全性的方式:

1、防火牆 Firewall

防火牆是個很普遍的概念,因此這邊就不多做說明了,除了可參考坊間的許多書籍外,以下再附上介紹防火牆概念的連結資訊:

2、加密 Encryption

加密的方式,大致有以下兩種:
  1. 對稱式加密 Symmetric-key encryption
  2. 非對稱式加密 Public-key encryption

上述兩種加密方式,在密碼學裡面都有詳細的探討,以下附上幾個連結供參考:

3、IPSec

IPSec 的部分其實蠻複雜的,可以閱讀以下兩篇文章,相信觀念會相當清楚:

IPSec 的特色在於其架構於網路層的安全機制,因此即使傳輸層 or 應用層的部分沒有安全機制的防護,IPSec 依然可以保護網路通訊的內容。


Tunneling

VPN 的運作原理即稱為 Tunneling

簡單來說,Tunneling 是一種用於在不同通訊協定間傳遞資料的方法,其運作的在於將資料封包視為另外一個封包中的 Data,並加上不同協定的控制訊息後,轉變為適用於另一種通訊協定的資料封包,進而達到讓資料封包在不同通訊協定間傳遞的目的。

以下用一張圖,來解釋原本的 packet 加上了 encrypt information 以及 tunnel information 後的樣子:


看見了嗎? 要進行 tunneling 的資料,必須額外加掛上一層一層的資訊,雖然安全性與便利性提升了,不過也造成網路傳輸的 overhead 很高,這是管理者必須注意到的地方。

在原本的資料封包中,即使內含的 IP Address 是區域網路的 IP,甚至是自訂的 Protocol,經過加入外層 header information 後,便可以標準的通訊協定進行傳輸,而接收封包的兩端,則必須具有解析封包的能力,因此又稱為 Tunneling Interface。

而 Tunneling 需要三種不同的協定來組合而成:
  1. Carrier Protocol
    用來在網際網路上傳遞封包用的協定
  2. Encapsulation Protocol
    用來包裝原本封包資料用的協定,例如:GRE、IPSec、PPTP、L2TP....etc
  3. Passenger Protocol
    原本封包資料所使用的協定

此外,Tunneling 還可以根據其協定實作的層級不同,分為以下三種:

1、實作於 OSI Layer 2

在 Layer 2 就將 packet 進行封裝有一個相當大的好處,即是此 tunnel 在兩端使用非 IP 的協定時依然可以進行傳輸(IP 屬於 Layer 3),雖然 IP 在 internet 上被廣泛使用,但不代表只有 IP 一種協定,例如 Netware 系統中所使用的 IPX。

在此模式下,若 vpn 兩端要進行傳輸,client 會產生一個虛擬的 Point-to-Point(點對點) 的裝置來與 server 連結,而實作 Layer 2 tunneling 的技術,目前有以下四種較為熱門,不但提供了加密的功能,也提供了使用者認證的機制:
  1. Point to Point Tunneling Protocol (PPTP)
    其為擴充功能後的 PPP 協定,由 Microsoft 所協助發展而成,當然在 Windows 下也直接支援,所建立的 tunnel 可以用來傳送 IP 以及 IPX 的封包,不過主要缺點在於傳輸雙方一次只能建立一個 tunnel
  2. Layer 2 Forwarding (L2F)
    由 Cisco 所發展而成,提供了比 PPTP 更多的功能,在傳輸上較有效率,也可同時產生多個 tunnel
  3. Layer 2 Tunneling Protocol (L2TP)
    廣為使用的協定,原因是因為此協定結合了 PPTP 以及 L2F 的優點,卻沒有其缺點,並可與其他安全機制進行結合
  4. Layer 2 Security Protocol (L2Sec)
    似乎是發展用來處理與 IPSec 相容性的問題

當然選擇使用的 tunneling 協定時,要考量的還有很多,例如:
  1. 支援的使用者認證機制是否廣泛
  2. 是否支援在不同的網路環境下運作,例如:NAT
  3. 是否支援 dial-up 模式以方便僅有動態 IP 的使用者
  4. 是否支援 PKI 安全機制
當然還可能有更多的考量,都是管理者在選擇 tunneling protocol 時,必須針對需求來謹慎考慮的!

2、實作於 OSI Layer 3

實作於 Layer 3 中最著名且最為廣泛使用的 tunneling 技術則是 IPSec 了,IPSec 在前面已經有提供網頁介紹,因此這邊不再贅述;不過 IPSec 所提供的功能相當的多,不過也因此產生了一個很主要的缺點,即是設定過於複雜,不過在許多硬體中都支援 IPSec。

而 IPSec 是如何建立 tunnel 來傳輸資料呢? 有以下兩種方式:
  1. Tunnel mode
    此種模式下,packet 進行傳輸前,會將整個 packet 加密後,再加上 tunnel information 後進行傳輸
  2. Transport mode
    此種模式下,僅針對 packet 中的 data 進行加密(並非整個 packet),再加上 tunnel information 後進行傳輸;這樣做的缺點,在於惡意人士可以知道 packet 實際傳送的 source 以及 destination 為何,不過相對所產生的 overhead 也小。

3、實作於 OSI Layer 4

當然,vpn tunnel 也可以建立於 application layer,而 TLS 以及 SSL 就是為了此目的而產生的。透過此種方式,就可以直接透過 browser 連線到已經實作 SSL 的 https 網站進行相關的認證手續,以便建立起vpn tunnel,此種方式已經被廣泛測試過了,是相當可靠的一種方式。


範例說明

為了瞭解 Carrier ProtocolEncapsulation ProtocolPassenger ProtocolTunnel InterfaceInternet 之間的關係,以下用一個實際的簡單範例進行說明:
  1. 假設使用者透過網路訂購一台電腦,廠商製造完成後,要將此台電腦(原本的資料封包)透過快遞業者送交到使用者手上
  2. 而快遞業者收到廠商委託後,將此台電腦進行裝箱打包(Passenger Protocol)進送貨專用的箱子(Encapsulation Protocol)裡,再來會被統一送至快遞業者的貨物運送中心(Entry Tunnel Interface)
  3. 接著快遞業者用送貨車(Carrier Protocol),行經高速公路、一般道路(Internet)後,送達至使用者家中 (Exit Tunnel Interface)
  4. 最後,使用者打開箱子(Encapsulation Protocol),並取出裡面的電腦(Passenger Protocol)開始使用
由上述的範例可知,其實 Tunneling 的原理僅僅就是如此而已。


參考資料
  1. Virtual private network
  2. How Virtual Private Networks Work
  3. VPN