歡迎您光臨本站 註冊首頁

FreeBSD 下用OpenVPN 架設虛擬區域網[原]

←手機掃碼閱讀     火星人 @ 2014-03-04 , reply:0

FreeBSD 下用OpenVPN 架設虛擬區域網[原]

FreeBSD 下用OpenVPN 架設虛擬區域網

1 環境及需求
    4 個房間,分別通過4 個802.1X 帳號連接到學校校園網。4 個房間屬於一個課題組,需要共享資料,4 個房間內計算機需要相互訪問文件共享,能訪問一台用於提供軟體及個人備份文件共享伺服器,一台Web 伺服器,以及印表機。
    4 個802.1X 帳號中有一個是可以上國外網的帳號,另外3 個可以上國內網,希望4 個房間的計算機上國內網路時通過本房間的帳號出去,上國外網時都通過1 個固定的國外帳號出去。

2 解決方案
    方案:使用OpenVPN 連接4 個房間的網路組成虛擬專用網。4 個房間都有專用的電腦做該房間的網關,使用FreeBSD 系統(個人喜好,用別的操作系統配置差不多)。網關通過802.1X 撥號連接到校園網,各個房間的網路通過網關NAT 共享上網。
    A,B,C,D 房間內部分別是192.168.10.0/24,192.168.11.0/24,192.168.12.0/24,192.168.13.0/24 網段,192.168.10.1,192.168.11.1,192.168.12.1,192.168.13.1 分別是4 個房間的網關,172.16.37.83 等地址為4 個機器的校園網地址。192.168.10.1 用作vpn server,B,C,D 房間的網關分別為vpn client1,vpn client2,vpn client3(下文client 為這3 個vpn 客戶端的總稱)。網路結構圖見圖1。

圖1 網路結構
       vpn 客戶端內部網路上國外網路的數據通過vpn server 的NAT 出去,上國內網路的數據通過自身NAT 出去。vpn client2 和vpn client3 上網數據的路由同vpn client1,圖裡沒有畫出。本文主要講OpenVPN 的配置。OpenVPN 有路由VPN 和乙太網橋接VPN 兩種模式,橋接VPN 相當於用網橋把多個網路連接,多個網路可以使用同一個網段。本文使用路由模式,可配置性強,功能也更強。參考信息見OpenVPN Install.htm,OpenVPN 2_0 HOWTO.htm和OpenVPN 2_0_x Man Page.htm

3 安裝OpenVPN
      4 台用於VPN的機器都需要安裝。OpenVPN依賴OpenSSL庫,加密用;LZO庫,數據壓縮用,不使用該庫也沒有關係。FreeBSD 6.0 默認安裝帶了OpenSSL庫,就不說了。沒有安裝的去http://www.openssl.org/下載安裝即可。或者用FreeBSD的ports安裝。

LZO去http://www.oberhumer.com/opensource/lzo/下載源代碼包。
或者用ports 安裝:
cd /usr/ports/archivers/lzo && make install 即可。
源代碼安裝:
./configure && make && make install
比較簡單,就不說了。

我用源代碼安裝OpenVPN,從http://www.openvpn.net下載openvpn-2.0.7.tar.tar
./configure --with-lzo-headers=/usr/local/include --with-lzo-lib=/usr/local/lib && make &&
make install
如果不使用LZO 庫則
./configure --disable-lzo && make && make install

4 生成證書和密鑰
cd /home/xdkui/openvpn-2.0.7/easy-rsa/
vi vars
根據自己的情況設置KEY_COUNTRY, KEY_PROVINCE, KEY_CITY, KEY_ORG,
KEY_EMAIL,比如我的
export KEY_COUNTRY=CN
export KEY_PROVINCE=Beijing
export KEY_CITY=Beijing
export KEY_ORG=BUAA
export KEY_EMAIL="xdkui@163.com"
然後保存
. ./vars //注意兩個點中間有空格
./clean-all
./build-ca
build-ca 命令使用openssl 命令生成certificate authority (CA) certificate 和密鑰:
./build-ca
Generating a 1024 bit RSA private key
....++++++
.......++++++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) :
State or Province Name (full name) :
Locality Name (eg, city) :
Organization Name (eg, company) :
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:xdkui-ca //這裡隨便輸入即可
Email Address :
4.1 為vpn server 產生證書和私鑰
./build-key-server server
Common Name 處填server,其他默認,為上面編輯vars 文件時設置的值。"Sign the certificate?
" 和"1 out of 1 certificate requests certified, commit? "兩處選y。
4.2 為vpn clients 產生證書和密鑰
./build-key client1
./build-key client2
./build-key client3
Common Name 處分別填client1 client2 client3,別的同vpn server 設置。
4.3 生成Diffie Hellman 參數
./build-dh
    現在生成了所需的文件。目錄keys 下生成的文件中,ca.crt 是所有vpn 機器都需要的。vpn server 需要ca.crt ca.key dh1024.pem server.crt server.key,拷貝到vpn server 的/etc/openvpn目錄。vpn client1 需要ca.crt client1.crt client1.key,拷貝到vpn client1 的/etc/openvpn 目錄。client2,client3 和client1 同,只是client1.crt 和client1.key 分別用client2 和client3 的對應文件。vpn client2 和vpn client3 也把對應的密鑰文件拷貝到各自的/etc/openvpn 目錄。各個文件的用途可以參看下錶(來自HOWTO):


5 配置vpn server 和client
      server.conf 使用代碼包目錄sample-config-files 里的server.conf 修改即可。配置文件里的
選項含義可以參考OpenVPN 2.0.x Man Page,比如keepalive, ifconfig-push 選項等。如下:
#################################################
# Sample OpenVPN 2.0 config file for #
# multi-client server. #
# Comments are preceded with '#' or ';' #
#################################################
;local a.b.c.d 綁定的IP 地址,可以不填
port 1194 綁定的埠
proto udp 選擇udp 協議,也可用tcp
# "dev tun" will create a routed IP tunnel,
# "dev tap" will create an ethernet tunnel.
;dev tap
#使用tun 設備,路由IP 通道。FreeBSD 默認支持TUN/TAP 驅動。
dev tun
#下面4 處填上面為vpn server 生成的證書和密鑰
ca ca.crt
cert server.crt
key server.key # This file should be kept secret
dh dh1024.pem
#配置vpn 虛擬網段,會在vpn server 建立一條10.0.0.1 >10.0.0.2 的點對點虛擬鏈路。
server 10.0.0.0 255.255.255.0
#記錄client 對應得虛擬地址,默認600 秒更新一次
ifconfig-pool-persist ipp.txt
#等價於ping 10 和ping-restart 120,對於vpn 機器有可能斷開外網聯線或者重起的,
#或者vpn client 先於vpn server 運行的情況下很重要。Client 會重新連接。
keepalive 10 120
#開啟壓縮支持。如果編譯的時候沒有使用LZO 庫則註釋本行
comp-lzo
#初始化完成後改變OpenVPN 進程的用戶ID 為nobody
user nobody
#同上,改變進程的組ID 為nobody。如果是Windows 系統,註釋掉這兩行
group nobody
persist-key
persist-tun
#默認每分鐘更新狀態文件,可以看到client 的真實IP 虛擬IP 等信息。
status openvpn-status.log
verb 3
    client1.conf 使用源代碼包目錄sample-config-files 里的client.conf 修改即可。如下:
##############################################
# Sample client-side OpenVPN 2.0 config file #
# for connecting to multi-client server. #
# On Windows, you might want to rename this #
# file so it has a .ovpn extension #
##############################################
client
dev tun
proto udp #和server.conf 一致即可
remote 172.16.37.83 1194 #指定vpn server 的IP 地址和埠
resolv-retry infinite #如果解析vpn server 失敗則無限次重試
nobind
user nobody
group nobody
persist-key
persist-tun
ca ca.crt
cert client1.crt #這2 行填給client1 生成的密鑰文件。client2 client3 相應更改。
key client1.key
comp-lzo
keepalive 10 120
      vpn client2 和vpn client3 的客戶端配置文件client2.conf 和client3.conf 同上,只是改cert和key 選項為對應的密鑰文件。
    對於vpn server,運行openvpn 後會建立一條本地ip 為10.0.0.1,對端ip 為10.0.0.2 的點對點虛擬鏈路,這樣所有server.conf 里的route 選項都會路由到10.0.0.2,即openvpn 裡面,然後由openvpn 處理。
    對於client,則會選在一對ip 作為客戶端的點對點虛擬鏈路,比如本地10.0.0.10,對端10.0.0.9。並把第一次分配給client 的ip 記錄在ipp.txt(server.conf 里ifconfig-pool-persist 指定)里,下次對應的client 連接的時候可以分配先前被指定的地址,但man 手冊說不保證每次會指定同一個ip。
    我需要給每個client 指定固定的vpn 地址,用ifconfig-push 指令即可。Windows 下,由於TAP-Win32 驅動的限制,虛擬IP 對只能在/30 子網選擇,最後2 個2 進位位,除去全0的網路地址和全1 的廣播地址,虛擬IP 只能選擇01 和10,故虛擬IP 對只能是 等(詳見HOWTO)。Unix 客戶端則沒有這個限制,可以隨便設置IP,比如client 分別設置成本地IP 為10.0.0.2, 10.0.3, 10.0.4 對端IP 都為10.0.0.1。考慮到以後client 可能會用Windows,故本文中遵循這個限制。給vpn client1, vpn client2, vpn client3 分配的虛擬客戶端和伺服器端IP 對分別為,,。見圖2。

圖2 指定VPN 的虛擬IP 地址對
    給server.confi 添加如下行:
client-config-dir ccd
    並在vpn server 的/etc/openvpn 目錄建立ccd 子目錄,並在ccd 目錄下建立文件client1,client2,client3(這裡的文件名對應」為vpn clients 產生證書和密鑰」步驟里的Common Name),當對應得client 連接時,vpn server 會讀去對應文件里的配置信息。文件client1 里輸入:
ifconfig-push 10.0.0.5 10.0.0.6,即給vpn client1 指定10.0.0.5,對端10.0.0.6 的虛擬鏈路。
client2 內容:ifconfig-push 10.0.0.9 10.0.0.10
client3 內容:ifconfig-push 10.0.0.13 10.0.0.14
    分別拷貝server.conf,client1.conf,client2.conf,client3.conf 到vpn server 和對應的client。分別在各個vpn 計算機啟動vpn server 和vpn client
openvpn --config /etc/openvpn/server.conf --cd /etc/openvpn/
openvpn --config /etc/openvpn/client1.conf --cd /etc/openvpn/等
    如果是Windows,改.conf 為.ovpn,然後右鍵選擇Start OpenVPN on this config file 即可
啟動。
    如果都出現「Initialization Sequence Completed」表示VPN 建立成功,否則檢查vpn server的防火牆是否屏蔽了UDP 1194 埠。如果客戶端是Windows,檢查DHCP Client 服務是否啟動。到這一步,VPN 客戶端和服務端可以相互通訊了。10.0.0.1 應該可以ping 通10.0.0.5,10.0.0.9,10.0.0.13。10.0.0.5,10.0.0.9,10.0.0.13 也可以ping 通10.0.0.1。但10.0.0.5,10.0.0.9,10.0.0.13 還不能相互ping 通,即vpn 客戶端之間還不能相通。

5.1 vpn client 訪問vpn server 所在192.168.10.0/24 網段內計算機
      第一種方法,添加如下行到server.conf
push "route 192.168.10.0 255.255.255.0"
push 選項是把選項內容給連接的vpn 客戶端執行,也就是在vpn 客戶端執行「route 192.168.10.0 255.255.255.0」,即當client 連接時,添加路由到client 的路由表裡。對於vpn client1,該選項相當於在vpn client1 的路由表裡添加到網路192.168.10.0/24,下一跳為10.0.0.6的路由,這裡10.0.0.6 為給vpn client1 分配的虛擬IP 對的伺服器端IP,相當於路由到vpn server。
    第二種方法,如果不改變server.conf,在vpn client1 里route add –net 192.168.10.0 10.0.0.6 255.255.255.0 效果一樣,也可route add –net 192.168.10.0 10.0.0.1 255.255.255.0 直接路由到vpn server 的本端IP 也可,但這樣需要在所有的vpn 客戶端改變路由表。
    這樣在vpn 客戶端可以ping 通192.168.10.0/24 網段內部計算機了。到此,B,C,D 房間的
網關可以訪問A 房間的所有計算機了。

5.2 vpn server 訪問vpn client 網段內計算機
      以vpn client1 為例,是vpn server 能訪問192.168.11.0/24 網段內計算機。同樣有2 種方法,一是改server.conf 讓openvpn 程序添加路由,另一種是手動添加路由。
    第一種方法,添加如下行到server.conf
route 192.168.11.0 255.255.255.0
從OpenVPN 的man 手冊可知,route 選項用於改變路由表。這裡在vpn server 添加到網路192.168.11.0/24,下一跳為10.0.0.2 的路由,即把192.168.11.0/24 路由到openvpn 內部。然後添加如下行到/etc/openvpn/ccd/client1
iroute 192.168.11.0 255.255.255.0
告訴openvpn 192.168.11.0/24 的網段路由到vpn client1。route 選項用於修改從操作系統內核到OpenVPN 服務端的路由,iroute 用於控制OpenVPN 服務端到OpenVPN 客戶端的路由。現在從vpn server 或者其內部192.168.10.0/24 內機器都能ping 通192.168.11.0/24 內部的機器了。
    第二種方法,手動修改vpn server 路由表,route add -net 192.168.63.0 10.0.0.2
255.255.255.0 或者route add -net 192.168.63.0 10.0.0.5 255.255.255.0然後添加iroute 192.168.11.0 255.255.255.0 到/etc/openvpn/ccd/client1(注意:兩種方法都必須有這一步)。
    可以明顯看到修改OpenVPN 配置文件的方法要簡便些,不用顧及VPN 計算機分配的虛擬IP,對於多個VPN 客戶端,只需要修改server.conf 即可,而且路由條目都是建立VPN時動態添加,VPN 斷開時自動刪除。本文選擇這第一種方法配置VPN。提到兩種方法是想說明OpenVPN 里的選項對於操作系統路由的影響,用於對比,更能理解OpenVPN 的選項。
    vpn client2 和vpn client3 的修改類似vpn client1。總結所有修改如下:
添加如下行到server.conf
route 192.168.11.0 255.255.255.0 #使vpn server 能訪問B 房間計算機
route 192.168.12.0 255.255.255.0 #使vpn server 能訪問C 房間計算機
route 192.168.13.0 255.255.255.0 #使vpn server 能訪問D 房間計算機
添加如下行到vpn server 里/etc/openvpn/ccd/client1
iroute 192.168.11.0 255.255.255.0 #B 房間計算機路由到client1添加如下行到vpn server 里/etc/openvpn/ccd/client2
iroute 192.168.12.0 255.255.255.0 #C 房間計算機路由到client2添加如下行到vpn server 里/etc/openvpn/ccd/client3
iroute 192.168.13.0 255.255.255.0 #D 房間計算機路由到client3到這一步,A 房間的計算機能訪問B,C,D 房間的所有計算機了,B,C,D 房間的計算機
也能訪問A 房間的計算機了。

5.3 各個vpn client 之間的網段相互訪問
下面配置B,C,D 房間的計算機相互訪問。
添加如下行到server.conf:
client-to-client這樣B,C,D 房間的網關(即10.0.0.5,10.0.0.9,10.0.0.13)可以相互ping 通了。現在B,
C,D 房間的網關還沒有到相互內部網段的路由。類似上面push vpn 服務端的內部網段到vpn
客戶端,添加如下行到server.conf
push "route 192.168.11.0 255.255.255.0"
push "route 192.168.12.0 255.255.255.0"
push "route 192.168.13.0 255.255.255.0"分別在vpn client1,vpn client2,vpn client3 添加3 條路由,對於vpn client1,192.168.11.0/24是其內部網段, vpn client1 上的openvpn 程序不會執行"route 192.168.11.0 255.255.255.0"選項,可以從openvpn 啟動的信息看出。同上面一樣,也可以手動修改3 個VPN 客戶端的路由表,這裡就不說了。到這一步,A,B,C,D4 個房間的計算機都可以相互訪問了。

6 配置出國和非出國數據的路由(只是理論想法,由於所在校園網還沒通,沒有測試)
    A房間網關,即vpn server,使用可以上國外網的802.1X 帳號,3 個vpn client3 使用只能上國內網的帳號。在server.conf 中利用push 選項在vpn 客戶端添加路由,把國外IP 地址路由到vpn server,並通過vpn server 的NAT 出去,不需要修改vpn 客戶端設置。這樣,vpn客戶端所在的B,C,D 房間的計算機上國內網直接通過他們的網關出去,上國外網則路由到A 房間網關再出去。A 房間的上網數據都通過A 房間網關出去。當然,也可以不修改server.conf,直接在3 個vpn 客戶端手動添加路由。
添加如下行到server.conf:
#下面是國外網路的網段
push "route xxx.xxx.xxx.xxx 255.255.255.0"
……..

7 總結
    在vpn server 的/etc/rc.local 文件添加如下行:
openvpn --config /etc/openvpn/server.conf --cd /etc/openvpn/ &
    在vpn client1 的/etc/rc.local 文件添加如下行:
openvpn --config /etc/openvpn/client1.conf --cd /etc/openvpn/ &
     vpn client2 和vpn client3 類似vpn client1。使openvpn 程序在系統啟動時自動運行。
   修改vpn server 的防火牆配置,我使用ipfw 防火牆。添加如下規則允許通過vpn server
的偵聽埠。
pass in quick on rl0 proto udp from any to any port = 1194 keep state
    在vpn server安裝Apache+phpBB為內部論壇,4 個房間所有計算機瀏覽http://10.0.0.1即可
訪問。在vpn client1 安裝Samba做文件共享伺服器,瀏覽\\10.0.0.5即可訪問到共享。印表機
安裝在A房間的內部Windwos計算機上,通過共享安裝網路印表機即可。
    這樣完成了所有的配置。下面總結如下:
    vpn server 的目錄/etc/openvpn 下有文件ca.crt,ca.key,dh1024.pem,server.crt,server.key和server.conf 以及子目錄ccd。/etc/openvpn/ccd 目錄下有文件client1,client2 和client3。
/etc/openvpn/server.conf 內容如下:
;local a.b.c.d
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key # This file should be kept secret
dh dh1024.pem
server 10.0.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
keepalive 10 120
comp-lzo
user nobody
group nobody
persist-key
persist-tun
status openvpn-status.log
verb 3
client-config-dir ccd
#使vpn clients 能訪問vpn server 內部網段計算機
push "route 192.168.10.0 255.255.255.0"
route 192.168.11.0 255.255.255.0 #使vpn server 能訪問B 房間計算機
route 192.168.12.0 255.255.255.0 #使vpn server 能訪問C 房間計算機
route 192.168.13.0 255.255.255.0 #使vpn server 能訪問D 房間計算機
client-to-client #使vpn clients 相互之間可以訪問
push "route 192.168.11.0 255.255.255.0"
push "route 192.168.12.0 255.255.255.0"
push "route 192.168.13.0 255.255.255.0"
/etc/openvpn/ccd/client1 內容如下:
ifconfig-push 10.0.0.5 10.0.0.6
iroute 192.168.11.0 255.255.255.0
/etc/openvpn/ccd/client2 內容如下:
ifconfig-push 10.0.0.9 10.0.0.10
iroute 192.168.12.0 255.255.255.0
/etc/openvpn/ccd/client3 內容如下:
ifconfig-push 10.0.0.13 10.0.0.14
iroute 192.168.13.0 255.255.255.0
    vpn client1 的目錄/etc/openvpn 下有文件ca.crt,client1.crt,client1.key 和client1.conf。
/etc/openvpn/client1.conf 內容如下:
##############################################
# Sample client-side OpenVPN 2.0 config file #
# for connecting to multi-client server. #
##############################################
client
dev tun
proto udp
remote 172.16.37.83 1194
resolv-retry infinite
nobind
user nobody
group nobody
persist-key
persist-tun
ca ca.crt
cert client1.crt
key client1.key
comp-lzo
verb 3
keepalive 10 120
    vpn client2 和vpn client3 類似vpn client1。這裡就不說了。

附件包括pdf版文檔,參考資料及各個配置文件。

[ 本帖最後由 xdkui 於 2006-11-28 14:51 編輯 ]
《解決方案》

寫了這麼多,居然沒人看
:em06:頂一個
《解決方案》

我覺得對於普通的openvpn應用來說,如果流量比較大,最好使用lzo庫,如果可能的話,不使用ssl加密,而是讓應用層去加密。
如果是跑流媒體比較多的話,我覺得最好不使用lzo庫和ssl加密。
《解決方案》

原帖由 sailer_sh 於 2006-9-25 10:29 發表
我覺得對於普通的openvpn應用來說,如果流量比較大,最好使用lzo庫,如果可能的話,不使用ssl加密,而是讓應用層去加密。
如果是跑流媒體比較多的話,我覺得最好不使用lzo庫和ssl加密。

lzo是在帶寬和性能之間找一個平衡點
ssl是在安全和性能之間找一個平衡點
《解決方案》

樓主這個環境

因為是在學校,IP相對固定,因為在內網,安全也不是大問題

其實直接用Linux下面的IP in IP效率高。
《解決方案》

我在FreeBSD6.1下用Ports安裝了OpenVPN2.0.6,怎麼沒有/home/xdkui/openvpn-2.0.7/easy-rsa;/etc/openvpn等這些目錄?
《解決方案》

在Freebsd下沒有用port安裝過,所以不知道這些腳本是否會安裝到系統里

不過可以在port的源代碼目錄找到這些腳本。

/etc/openvpn目錄自己創建
《解決方案》

原帖由 FinSUN 於 2006-10-1 22:39 發表
我在FreeBSD6.1下用Ports安裝了OpenVPN2.0.6,怎麼沒有/home/xdkui/openvpn-2.0.7/easy-rsa;/etc/openvpn等這些目錄?

/etc/openvpn目錄都是自己建的
/home/xdkui/openvpn-2.0.7/easy-rsa這個目錄是openvpn源代碼里的目錄,如果使用ports安裝,用pkg_info -L看下安裝openvpn生成了哪些目錄即可知道

[ 本帖最後由 xdkui 於 2006-10-7 13:59 編輯 ]
《解決方案》

請問樓主OpenVPN是7層的還是幾層的?
《解決方案》

原帖由 phpman 於 2006-10-5 21:41 發表
請問樓主OpenVPN是7層的還是幾層的?
對於橋接模式,只是相當於網橋,是物理層的轉發
路由模式,是3層的轉發

openvpn程序本身則通過udp或者tcp埠通訊

[火星人 ] FreeBSD 下用OpenVPN 架設虛擬區域網[原]已經有1186次圍觀

http://coctec.com/docs/service/show-post-16372.html