使用 OpenVPN

之前有玩了一下 OpenVPN,不過沒搞定,就沒再摸了
昨天(6/14)在台大有場 Arne OpenVPN 的心得分享
回家後再給它試一次,終於試成功了
其實 OpenVPN 的應用方式有很多種,也要慢慢去試出來

安裝 OpenVPN

不管是 Linux Windows 或是 Mac OS X,都有現成的 Binary 套件可以使用
請到 OpenVPN 網站 下載合適的版本回去安裝
OpenVPN GUI for Mac 請到 這裡 下載 Tunnelblick 回去安裝
OpenVPN GUI for Windows 請到 這裡 下載 Install Packages 回去安裝

我的 Server 系統用的是 FC3,因此,去抓 DAG 的 binary RPM
下載回來後執行下列指令安裝:
$ rpm -ivh openvpn-2.0-1.1.fc3.rf.i386.rpm

建立 CA certificate 及 Server/Client keys

我是在 FC3 Server 下來建立所有相關的 CA certificate 及 keys
$ cd /usr/share/doc/openvpn-2.0/easy-rsa
ease-rsa 底下的一些 scripts (clean-all build-* 等等) 記得到先 chmod 755 讓它們可以執行

編輯 vars 檔案

主要是設定最後面的 KEY_COUNTRY KEY_PROVINCE KEY_CITY KEY_ORG KEY_EMAIL 等參數
$ vi vars
$ . vars
$ ./clean-all

產生 CA certificate

$ ./build-ca
會產生 keys/ca.*

產生 Server 的 key

$ ./build-key-server server
會產生 keys/server.*

產生 Diffie Hellman parameters

$ ./build-dh
會產生 keys/dh1024.pem

產生 tls-auth key

$ openvpn –genkey –secret ta.key
會產生 ta.key
$ mv ta.key keys/

產生 Client 的 key

$ ./build-key ibook
會產生 keys/ibook.*

$ ./build-key macmini
會產生 keys/macmini.*

$ ./build-key fujitsu
會產生 keys/fujitsu.*

$ ./build-key ns
會產生 keys/ns.*

$ ./build-key fedora
會產生 keys/fedora.*

我總共產生了五台 Clients 機器的 keys (ibook macmini fujitsu ns fedora)

所有的 CA certificate 及 keys 都建好後,接下來就是根據不同的狀況來設立不同的設定檔
底下為目前我個人成功在使用的例子:

狀況一

在 NAT Server 上架 OpenVPN Server(家裡的 NAT Server),然後 OpenVPN Client 則是架設在外面的任一台電腦上(我的 ibook)
這樣,我在公司或者是在外面的網咖上網時,就可以利用 OpenVPN 連上家裡的 Server 以及家裡 NAT 底下的其他機器(192.168.1.x/24)

Server 端:
eth0: a.b.c.d (Real IP)
eth1: 192.168.1.254/24
tap0: 192.168.2.1/24

Client 端:
eth0: e.f.g.h (Real IP or Virtual IP)
tap0: 192.168.2.x/24

Server 端的設定

我的 Server 是 FC3
首先,要把 Server 端相關的 CA certificate 及 keys 複製到 Server 機器的 /etc/openvpn/ 目錄底下
主要有 ca.crt ta.key dh1024.pem 及 server.*
$ cd /usr/share/doc/openvpn-2.0/easy-rsa/keys
$ cp ca.crt ta.key dh1024.pem server.* /etc/openvpn/

接下來就是設定檔部份了,先複製一份範例檔來修改
$ cd /usr/share/doc/openvpn-2.0/sample-config-files
$ cp server.conf /etc/openvpn/
$ vi /etc/openvpn/server.conf
—————————————-
local a.b.c.d ; Server 的 Real IP
port 1194
proto tcp ; 使用 tcp or udp
dev tap ; 使用 tap or tun
ca ca.crt ; 底下幾行指定 ca.crt 及各 key 的位置
cert server.crt
key server.key
dh dh1024.pem
server 192.168.2.0 255.255.255.0 ; OpenVPN 所使用的網段
ifconfig-pool-persist ipp.txt ; client Virtual IP 的對照表
push “route 192.168.1.0 255.255.255.0″ ; 讓 OpenVPN client 也可以連 192.168.1.x 網段
client-to-client ; 讓各個 OpenVPN client 也可以互連
keepalive 10 120
tls-auth ta.key 0 ; Server 要設 0 Client 設 1
comp-lzo
max-clients 10
user nobody
group nobody
persist-key
persist-tun
status openvpn-status.log
verb 3
—————————————-
都設定好後,就可以啟動 OpenVPN 了
$ /etc/init.d/openvpn start
成功啟動後,你就會看到系統多了一個 tap0 的裝置,IP 為 192.168.2.1

Client 端的設定

先為我的 ibook (Mac OS X) 做設定
首先,還是要先從 Server 上把 ca.crt ta.key 及 ibook.* 這幾個檔案都複製到 ibook 上
預設是放在 ~/Library/openvpn/ 底下
然後編輯 ibook client 端的設定檔
$ vi ~/Library/openvpn/openvpn.conf
或是直接執行應用程式裡的 Tunnelblick,然後會在選單列上看到圖示,選擇 “Edit Config File…”

—————————————-
client ; 表示這是 client 端的設定
dev tap
proto tcp
remote a.b.c.d 1194 ; a.b.c.d 為 Server 的 IP
resolv-retry infinite
nobind
user nobody
group nobody
persist-key
persist-tun
ca ca.crt
cert ibook.crt
key ibook.key
tls-auth ta.key 1 ; client 端要設成 1
comp-lzo
verb 3
—————————————-
編輯好後儲存
然後再選取選單列上的 Tunnelblick 裡的 “Connect”
這樣就連上了
執行 ifconfig 來看,會多了一個 tap0 IP 為 192.168.2.2
接著來測試看看
$ ping 192.168.2.1
$ ping 192.168.1.254
$ ping 192.168.1.x
都 ping 的到,那恭喜了

同樣的方式,我可以在公司的 Server 上再架一個 OpenVPN 的 Server
這樣我的 ibook 就可以同時連上家裡及公司內的各台機器了
不過,Mac OS X 上的這個 Tunnelblick 程式,目前只支援連一台 Server
若是想一次連到多個 OpenVPN server,可以不要用 GUI,直接用 command line
同樣先複製所需的 CA certificate 及 keys 到 ~/Library/openvpn/ 底下
然後,同樣在 ~/Library/openvpn/ 底下建立各個設定檔,如 client1.conf client2.conf
然後手動執行:
$ sudo openvpn –config client1.conf &
要連線到第二個 OpenVPN Server,再執行:
$ sudo openvpn –config client2.conf &
依此類推,或是乾脆直接寫個 script 來啟動多個設定檔:
startOpenVPN.sh
——————————————
#!/bin/bash
sudo pwd
cd ~/Library/openvpn/
for i in *.conf
do
sudo /usr/local/sbin/openvpn –config $i &
done
——————————————
然後在終端機下直接執行 sh startOpenVPN.sh 即可

再來設定我的 Fujitsu Notebook (Windows XP)
設定檔放在 C:\Program Files\OpenVPN\config\ 目錄底下
相關的 CA certificate 及 keys 一樣是複製到 C:\Program Files\OpenVPN\config\ 目錄底下
(包含 ca.crt ta.key fujitsu.*)
設定檔可以直接複製 C:\Program Files\OpenVPN\sample-config\ 裡的 client 再來修改即可
—————————————-
client
dev tap
proto tcp
remote a.b.c.d 1194 ; a.b.c.d 為 Server 的 IP
resolv-retry infinite
nobind
user nobody
group nobody
persist-key
persist-tun
ca ca.crt
cert fujitsu.crt
key fujitsu.key
tls-auth ta.key 1
comp-lzo
verb 3
—————————————-
再來就是點選狀態列裡的 “OpenVPn GUI” 選擇 “Connect”

狀況二

在家裡及公司的 Server 上各架一台 OpenVPN Server
同時,兩台 OpenVPN Server 也各自再跑一個 OpenVPN Client,互相連對方
這樣,在公司內的任何一台機器,就可以利用 OpenVPN 連上家裡的 Server 以及家裡 NAT 底下的其他機器(192.168.1.x/24)
同樣的,在家裡的任何一台機器,也可以連上公司內部網路裡的任一台機器(10.0.0.x/24)

家裡 Server 端:
eth0: a.b.c.d (Real IP)
eth1: 192.168.1.254/24
tap0: 192.168.2.1/24
tap1: 192.168.3.x/24

公司 Server 端:
eth0: e.f.g.h (Real IP)
eth1: 10.0.0.254/24
tap0: 192.168.3.1/24
tap1: 192.168.2.x/24

產生 CA certificate 及 kyes 並複製到各個 Servers 及 Clinets (請參考之前的做法)
設定檔的部份如下:

家裡 Server 端的設定

$ vi /etc/openvpn/server.conf
—————————————-
local a.b.c.d ; 家裡 Server 的 Real IP
port 1194
proto tcp
dev tap
ca ca.crt
cert server.crt
key server.key
dh dh1024.pem
server 192.168.2.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push “route 192.168.1.0 255.255.255.0″
client-to-client
keepalive 10 120
tls-auth ta.key 0
comp-lzo
max-clients 10
user nobody
group nobody
persist-key
persist-tun
status openvpn-status.log
verb 3
—————————————-

家裡 Client 端的設定

$ vi /etc/openvpn/client.conf
—————————————-
client
dev tap
proto tcp
remote a.b.c.d 1194 ; a.b.c.d 為公司 Server 的 IP
resolv-retry infinite
nobind
user nobody
group nobody
persist-key
persist-tun
ca ca.crt
cert ns.crt
key ns.key
tls-auth ta.key 1
comp-lzo
verb 3
—————————————-

公司 Server 端的設定

$ vi /etc/openvpn/server.conf
—————————————-
local a.b.c.d ; 公司 Server 的 Real IP
port 1194
proto tcp
dev tap
ca ca.crt
cert server_office.crt
key server_office.key
dh dh1024.pem
server 192.168.3.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push “route 10.0.0.0 255.255.255.0″
client-to-client
keepalive 10 120
tls-auth ta.key 0
comp-lzo
max-clients 10
user nobody
group nobody
persist-key
persist-tun
status openvpn-status.log
verb 3
—————————————-

公司 Client 端的設定

$ vi /etc/openvpn/client.conf
—————————————-
client
dev tap
proto tcp
remote a.b.c.d 1194 ; a.b.c.d 為家裡 Server 的 IP
resolv-retry infinite
nobind
user nobody
group nobody
persist-key
persist-tun
ca ca.crt
cert fedora.crt
key fedora.key
tls-auth ta.key 1
comp-lzo
verb 3
—————————————-

2 Responses to “使用 OpenVPN”

  1. Chung-Yen Chang Says:

    剛剛把 Windows Notebook 拿出來裝 OpenVPN GUI for Windows
    裝好後,設定檔要放在 C:\Program Files\OpenVPN\config\ 目錄底下
    相關的 key 則是放在 C:\Program Files\OpenVPN\config\keys\ 目錄底下
    (包含 ca.crt ta.key client.* 等)
    設定檔可以直接複製 C:\Program Files\OpenVPN\sample-config\ 裡的 client 再來修改即可
    再來就點選狀態列裡的 “OpenVPn GUI” 選擇 “Connect”
    連線成功

  2. ayo Says:

    不好意思~我也有稍微研究一下OPENVPN.
    有個疑問想請問大大一下..
    假設~有很多台SERVER要做VPN連線.
    以上述作法的話一定是可以做的起來.
    我也有試過這樣的作法..不過如果IFCONFIG時
    在本機SERVER端一定會出現很多tap的網路位置!
    以一個管理者這樣~可能會造成很多的困擾!
    因為要去記很多的客戶的TAP位置!
    請問~不曉得有沒有其他的方法可以解決這問題
    而且~我怕網卡到最後會支撐不住吧!
    問題有點多~真是不好意思!
    在麻煩您幫我解答一下吧~謝謝!

FireStats icon Powered by FireStats