網頁

2005年10月27日 星期四

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 是蛋生雞雞生蛋的問題,似乎不能直接改,暫時就先放著吧。