- Install OpenBSD
- Install lzo
- Install OpenVPN
- Configure OpenVPN
- 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
重點來了, 安裝不難, 難在設定組態, 請接招:
- 產生 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 - 建立 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 - 建立 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 - 測試一下
# 用剛剛建立的 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 的話一定更美好, 對吧?
- 設定 ipforwarding (因為有 routing 的動作)
# 編輯 /etc/sysctl.conf
# 找到 "#net.inet.ip.forwarding=1" 這行, 把最前面的 "#" 拿掉後存檔 - 設定 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, 可以檢查上面的指令有無錯誤 - 設定 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), 也是一種不錯的選擇.