OpenVPN

一陣子以前(好像是今年寒假左右?)曾經為 RW 架了 OpenVPN ,忘了是為什麼了,反正不外乎就是要搞邪惡計畫或者是玩遊戲。之前裝的時候還記得好像剛好是 2.0 RC12 然後剛好出 2.0 RC13 , FreeBSD 的 Ports 還在舊的 1.1.2 的樣子,所以我用手動的方式搞上去的。印象中好像還用 Static Key 搞了很久,期間一直都沒注意到他說如果要用 tap driver 加上 server mode 的話得用 TLS/SSL 而不能用 preshare static key ,然後因此耍了蠻久的白痴。而且那時他沒有提供所謂的 EASY-RSA 這目錄裡的 script ,不然也許是我眼瞎沒找到,所以餵了憑證也生了好久。又因為要為每個人都建憑證大麻煩了,在那邊蓋半天之後才發現原來有 duplicate-cn 的選項讓大家都能用同一份 key ,後來把 key 跟著 OpenVPN GUI for Windows 給包起來給要用的人抓之後才好不容易弄好。

現在由於學校的無線網路 仍然處於門戶大開的階段(完全沒有加密),也因此在我之前的小黑上完全不敢裝 KKMAN / PCMAN 之類的軟體,也不敢連 MUD ,所以在打密碼的時後都得再三確認這網頁到底有沒有加密。雖然說用 ssh tunnel (經由 putty or pietty 來建立)到某台機器的 proxy 可以解決大部分的問題,不過這只限於 http protocol 。也因此又讓我興起了再來裝 OpenVPN 的念頭。擇日不如撞日,於是乎昨天帶完os的課後輔導後就在 LAB 動手了。

OpenVPN 看到當前 release 的 2.0 版本是 OpenVPN 2.0.2 不過到 OpenVPN GUI for Windows 的網頁看的時候卻只看到 2.0.1 ,但是明明 release 的時間才差四天左右,不死心找了找,果然在他的目錄中發現了 openvpn-2.0.2-gui-1.0.3-install.exe ,並且在 FreeBSD 的 Ports 中也看到了 openvpn-2.0.2_1 ,於是就決定馬上下手了。

由於之前的經驗,所以在設定上還算熟悉,一切都如預期中順暢,甚至連翻上次在官網上拼命參考的的 example 都不需要,不過為了備忘還是把步驟給記一下比較保險。以免下次又暴走了。

安裝:

  • Server (FreeBSD)
  • cd /usr/ports
  • make update
  • cd /usr/ports/security/openvpn
  • make install clean
  • Client (Windows)
  • 設定:

    • Server

    dev tap
    ca keys/ca.crt
    cert keys/lab.crt
    key keys/lab.key # This file should be kept secret
    dh keys/dh2048.pem
    ifconfig 192.168.211.254 255.255.255.0
    server-bridge 192.168.211.254 255.255.255.0 192.168.211.1 192.168.211.250
    push “redirect-gateway”
    ifconfig-pool-persist ipp.txt
    client-to-client
    ;duplicate-cn
    keepalive 10 120
    user nobody
    group nobody
    comp-lzo
    status openvpn-status.log
    log-append openvpn.log
    verb 3

    • Client

    client
    dev tap
    proto udp
    remote serverip 1194
    resolv-retry infinite
    nobind
    persist-key
    persist-tun
    ca keys/ca.crt
    cert keys/cookys-nb.crt
    key keys/cookys-nb.key
    comp-lzo
    verb 4

    • 生憑證
      • 參考官方網頁的 PKI 文件
        • 編輯 var 檔案的內容、修改 KEY_COUNTRY, KEY_PROVINCE, KEY_CITY, KEY_ORG, and KEY_EMAIL 欄位(我很惡搞的把 KEY_SIZE 調到了 2048)
        • 處理以下將執行的檔頭的 #!/bin/bash 將其改正為對應的 interpreter
        • 依序執行:
          • ./vars
          • ./clean-all
          • ./build-ca
        • 為 server 作 key
          • ./build-key-server server
        • 為 client 作 key
          • ./build-key client1
        • Generate Diffie Hellman parameters
          • ./build-dh (剛剛惡搞亂改KEY_SIZE的這裡就慢慢等吧)
        • 把 client 打包並且想辦法「安全的」傳到 client 的機器上,需要打包的有:
          • client-conf.ovpn (OpenVPN 的設定檔)
          • ca.crt (Root CA certificate)
          • client.crt (Client Certificate)
          • client.csr (好像不需要)
          • client.key (Client Key)
    • 去設定 server 上的 Bridge (這裡是 FreeBSD 7.0-CURRENT)
      • 在 /usr/src/UPDATING 裡面看到
      • 所以 man 4 if_bridge 發現 FreeBSD 的 Bridge 變得超神奇了:
      • 或是在 /etc/rc.conf 加上設定
      • 記得在這之前要加上 OpenVPN 的起始設定:
      • 然後就可以跑起來試看看了。如果還想要開啟 NAT 的功能的話(因為前面有 redirect-default-gateway)就去 /etc/pf.conf (因為我很久以前就開始換用 OpenBSD port 過來的 PacketFilter了)裡面上一條
      • 然後 pfctl -f /etc/pf.conf 就 ok 了。
    • 20050927:
      The old bridge(4) implementation was retired. The new
      if_bridge(4) serves as a full functional replacement.

      ifconfig bridge0 create
      ifconfig bridge0 addm fxp0 stp fxp0 addm fxp1 stp fxp1

      cloned_interfaces=”bridge0″
      ifconfig_bridge0=”addm sis0 addm tap0 up”

      openvpn_enable=”YES”
      openvpn_if=”tap”

      nat on $ext_if from 192.168.211.254/24 to any -> ($ext_if)

    不過我發現一件很有趣的問題是,當我連回這台 vpn gateway 的時候「所有連線」會由於 routing table 上得設定而導致全部都走原來的 default gateway 而不是走重導後的 vpn gateway ,這是比較困擾的一點,不過因為他的 routing table 是蛋生雞雞生蛋的問題,似乎不能直接改,暫時就先放著吧。

    3 Responses to “OpenVPN”


    • 多回應是好事,不過沒人回應的狀態下我都能拼兩百多篇了 XD
      而且那時人氣一點都不高,不像現在每天每頁都有很多蜘蛛來爬 orz

    • Hi there.
      Is there any “English” translated version of this document?

      Regards
      Gregory

    • 请有空回我的email,大家交流一下,我也是openvpn的爱好者.

    Leave a Reply