Simple OpenVPN Topology 

  1. Install OpenBSD
  2. Install lzo
  3. Install OpenVPN
  4. Configure OpenVPN
  5. Configure OpenBSD

1. Install OpenBSD

網路上很多教學文件, 筆者就不負責任的跳過了 ^^ (註: 筆者目前用 OpenBSD 4.8). OpenBSD 的官網上面就有完整的安裝教學 (http://www.openbsd.org/faq/faq4.html), 習慣看中文的讀者可以參考以下網址 (http://www.9971.us/faq4.html). 安裝時依照安裝教學上面的預設安裝即可.

比較需要注意的是設定網路, 在本文的例子裡面:

em0 -> 61.62.63.64/255.255.255.0

em1 -> 192.168.20.20/255.255.255.0

default gateway -> 61.62.63.1

 

2. Install lzo

有 lzo 之後, OpenVPN 才具有流量壓縮的功能, 因此建議安裝. (註: 目前筆者使用 lzo 2.04)

  • 下載 lzo (例如 http://www.oberhumer.com/opensource/lzo/download/lzo-2.04.tar.gz), 並放置到 OpenBSD 的 ~/ (註: ~/ 表示 home directory)
  • 以 ssh 登入 OpenBSD, 執行指令如下:

    mkdir /usr/local/src && cd /usr/local/src # 預備將 source 放在 /usr/local/src
    tar -xvzf ~/lzo-2.04.tar.gz # 將 tarball 解開到 /usr/local/src/lzo-2.04
    cd lzo-2.04 # 切換目錄到 /usr/local/src/lzo-2.04
    ./configure # 偵測系統環境與設定編譯參數
    make # 編譯
    make check # 檢查編譯結果
    make test # 測試執行是否正常
    make install # 將編譯後的程式庫檔放置到 /usr/local/lib, 標頭檔放到 /usr/local/include


3. Install OpenVPN

  • 從 OpenVPN 官網下載 tarball (例如: http://swupdate.openvpn.net/community/releases/openvpn-2.2-beta5.tar.gz), 並放置到 OpenBSD 的 ~/ (註: 目前筆者使用 OpenVPN 2.2 Beta 5)
  • 以 ssh 登入 OpenBSD, 執行指令如下:
    cd /usr/local/src
    tar -xvzf ~/openvpn-2.2-beta5.tar.gz
    cd openvpn-2.2-beta5
    ./configure --with-lzo-headers=/usr/local/include --with-lzo-lib=/usr/local/lib --with-ssl-headers=/usr/include --with-ssl-lib=/usr/lib
    make
    make check
    make install

 

4. Configure OpenVPN

重點來了, 安裝不難, 難在設定組態, 請接招:

  1. 產生 Certification:
    mkdir /etc/openvpn
    cp /usr/local/src/openvpn-2.2-beta5/easy-rsa /etc/openvpn
    cd /etc/openvpn/easy-rsa/2.0
    if [ ! -f vars.old ]; then cp vars vars.old; fi # 複製 vars 檔案成為 vars.old, 作為備份
    # 編輯 vars (非必要), 例如:
    # 修改 KEY_COUNTRY="US" --> KEY_COUNTRY="TW"
    # 修改 KEY_PROVINCE="CA" --> KEY_PROVINCE="Taiwan"
    # 修改 kEY_CITY="SanFrancisco" --> KEY_CITY="Taipei"
    # 修改 KEY_ORG="Fort-Funston" --> KEY_ORG="My Company"
    # 修改 kEY_EMAIL="me@myhost.mydomain" --> KEY_EMAIL="admin@mycompany.com"
    . ./vars
    ./clean-all
    ./build-dh
    ./pki-tool --initca
    ./pki-tool --server server
    ./pki-tool client001
    mkdir /etc/openvpn/keys
    cp keys/ca.crt /etc/openvpn/keys
    cp keys/server.crt /etc/openvpn/keys
    cp keys/server.key /etc/openvpn/keys
    cp keys/dh1024.pem /etc/openvpn/keys

  2. 建立 OpenVPN 的啟動參數
    cd /etc/openvpn
    cat << EOF > server.conf
    port 1194
    proto tcp
    dev tun0
    ca /etc/openvpn/keys/ca.crt
    cert /etc/openvpn/keys/server.crt
    key /etc/openvpn/keys/server.key
    dh /etc/openvpn/keys/dh1024.pem
    ; Client 取得 VPN 連線後, 可以獲得 172.16.30.0/24 網段之中的某個 IP
    server 172.16.30.0 255.255.255.0
    ifconfig-pool-persist ipp.txt
    ;push "redirect-gateway def1 bypass-dhcp"
    ; 假設公司裡面除了 192.168.20.0/24 網段之外, 還有 192.168.30.0/24 網段
    push "route 192.168.30.0 255.255.255.0"
    ; 假設公司裡面的 DNS 是 192.168.20.2 與 192.168.20.3
    push "dhcp-option DNS 192.168.20.2"
    push "dhcp-option DNS 192.168.20.3"
    push "dhcp-option DOMAIN mycompany.com"
    ;client-to-client
    duplicate-cn
    keepalive 10 120
    comp-lzo
    user nobody
    group nobody
    persist-key
    persist-tun
    status openvpn-status.log
    ;script-security 2
    ;auth-user-pass-verify /etc/openvpn/auth.php via-env
    verb 3
    EOF
  3. 建立 start/stop 指令檔
    cat << EOF > /etc/openvpn/openvpn-start
    #!/bin/sh
    /usr/local/sbin/openvpn --daemon --config /etc/openvpn/server.conf --writepid /var/run/openvpn.pid &
    EOF

    cat << EOF > /etc/openvpn/openvpn-stop
    #!/bin/sh
    kill \`cat /var/run/openvpn.pid\`
    EOF

    chmod 700 /etc/openvpn/openvpn-start
    chmod 700 /etc/openvpn/openvpn-stop
  4. 測試一下
    # 用剛剛建立的 start 指令檔啟動 OpenVPN
    /etc/openvpn/openvpn-start
    # 看一下 log, 若最後有出現 "Initialization Sequence Completed" 的字樣基本是表示成功
    tail /var/log/messages
    # telnet 一下, 若最後有出現 "Escape character is '^]'" 表示 OpenVPN Daemon 已經在等候連線
    telnet localhost 1194
    # 用剛剛建立的 stop 指令檔停止 OpenVPN 
    /etc/openvpn/openvpn-stop
    # 看一下 log, 最後應該會有 "SIGTEAM[hard,]" 的訊息
    tail /var/log/messages
    # telnet 一下, 最後應該會出現 "Connection refused" 的訊息
    telnet localhost 1194

5. Configure OpenBSD

啥! OpenBSD 也需要設定組態喔!? 當然囉!! 至少 firewall 要開吧? 若能順便讓 OpenBSD 啟動時自動執行 OpenVPN 的話一定更美好, 對吧?

  1. 設定 ipforwarding (因為有 routing 的動作)
    # 編輯 /etc/sysctl.conf
    # 找到 "#net.inet.ip.forwarding=1" 這行, 把最前面的 "#" 拿掉後存檔
  2. 設定 firewall (OpenBSD 用的是 pf)
    # 備份 pf.conf (重要!!)
    if [ ! -f pf.conf.old ]; then cp pf.conf pf.conf.old; fi
    # 修改 pf.conf

    cat << EOF >> /etc/pf.conf

    lan_if="em1"
    wan_if="em0"
    vpn_if="tun0"
    vpn_net="172.16.30.0/24"
    vpn_port=1194
    lan_ip="192.168.20.20/32"
    ssh_port=22
    http_port=80
    https_port=443
    icmp_type="echoreq"

    match out on \$lan_if from \$vpn_net to any nat-to \$lan_ip
    block in all
    block out all
    pass quick on lo0 all
    pass in on \$wan_if inet proto {tcp,udp} from any to \$wan_if port \$vpn_port flags S/SA keep state
    pass in on \$lan_if inet proto {tcp,udp} from any to \$lan_if port \$vpn_port flags S/SA keep state
    pass in on \$wan_if inet proto tcp from any to \$wan_if port {\$ssh_port,\$http_port,\$https_port} flags S/SA keep state
    pass in on \$lan_if inet proto tcp from any to \$lan_if port {\$ssh_port,\$http_port,\$https_port} flags S/SA keep state
    pass in inet proto icmp icmp-type \$icmp_type keep state
    pass out on \$lan_if proto tcp all modulate state flags S/SA
    pass out on \$lan_if proto {udp,icmp} all keep state
    pass out on \$wan_if proto tcp all modulate state flags S/SA
    pass out on \$wan_if proto {udp,icmp} all keep state
    pass in on \$vpn_if proto {tcp,udp} all keep state
    pass out on \$vpn_if proto {tcp,udp} all keep state

    EOF

    pfctl -f /etc/pf.conf # 重新讀取 firewall rule, 可以檢查上面的指令有無錯誤
  3. 設定 OpenBSD 啟動時自動執行 OpenVPN
    # 編輯 /etc/rc.local, 在最後面的 "echo '.'" 之前, 加入以下指令
    if [ -x /usr/local/sbin/openvpn ]; then
        echo -n " openvpn "
        /etc/openvpn/openvpn-start
    fi

筆者: OK!! Server 設定完成.... 還有 Client 的設定.....
大家: 啥!!!~~~ (一片慘叫)

這就是 Open Source 的缺點囉!! 凡事要自己來. 不過若是把它當作是 DIY, 倒也是頗有樂趣的 ^^ 後續若有時間 (因為同時在撰寫 OpenNMS 的相關文章, 所以時間有限), 筆者會慢慢把 OpenVPN 的相關功能慢慢做出來 (例如 user/password 或是 LDAP 認證), 並跟大家分享.

附註: 更正, 這不應該說是缺點, 至少會的人不難, 不會的人付一筆小小費用給 Open Source 的開發者贊助一下, 也是鼓勵他們持續開發維護更好的功能, 對吧? ^^

若沒有時間的話, OpenVPN 官網有現成的 OpenVPN AS (安裝版的, VM 版的都有), 可以下載試用 (兩個 con-current user), 若用得舒服, 還可以付費擴充 (1 個 con-current user 只需要 USD$5), 也是一種不錯的選擇.

創作者介紹

Egg Chang 的部落格

Egg Chang 發表在 痞客邦 PIXNET 留言(0) 人氣()