OpenVPN
出自DebianWiki
OpenVPN 2.0
架設 vpn server 有幾個功用:
- client 端並沒有真實 ip 時,某些服務無法使用,例如公司的 intranet,只允許公司內部的 ip 才能開啟,從家裡就無法連上,或是 ip 並沒有對應的 hostname,smtp 不給寄信,這時透過 vpn server 的 ip 及 hostname 即可使用。
- 想隱藏 client 端的 ip,不給別人知道。
- 或是某些裝備並不支援 ssh,僅提供 telnet,但又怕連線被中途 sniffer,就可使用 vpn。
- 另外還可做到存取 vpn server 內部的虛擬 ip 的機器,免除要在 vpn server 上將 port forward 到虛擬 ip 機器,或是要先 ssh 至 vpn server 那台,再 ssh 至虛擬機器的麻煩。
現在要設定的是 debian(sarge) 中的 openvpn 2.0 的版本。
root@debian:~# apt-get install openvpn
- 首先先從簡單的 static key 方式講起,等到這部份完成,再進一步到更複雜的。
- 優點:簡單易設定 No X509 PKI (Public Key Infrastructure) to maintain
- 缺點:規模受到限制,僅能一台 server,一台 client
Lack of perfect forward secrecy -- key compromise results in total disclosure of previous sessions 金鑰必須以明碼的方式存於各個 vpn 端 金鑰必須使用預先存在的加密通道來傳送
產生金鑰:
root@debian:~# openvpn --genkey --secret static.key
將此金鑰利用原本已存在的加密通道(如 ssh)傳送到另一台電腦,二端都用同一個金鑰
server 端設定:
dev tun ifconfig 10.8.0.1 10.8.0.2 secret static.key
client 端設定: (請將 your_vpn_server_ip_address 改成您的 ip)
remote your_vpn_server_ip_address dev tun ifconfig 10.8.0.2 10.8.0.1 secret static.key
防火牆的設定: server 端必須開啟 UDP 1194 port,並且二端都要允許TUN interface(tun0) 封包通過
接著將二端的 openvpn daemon 啟動:
root@debian:~# /etc/init.d/openvpn start
這時應該可以從 client(10.8.0.2) 去 ping 到 server(10.8.0.1) 了,或是從 server (10.8.0.1) ping 到 client (10.8.0.2)。
另外可將 vpn 連線壓縮,在二邊設定檔中加入:
comp-lzo
要保持 NAT 的 firewall 或 router 連線,可加上:
keepalive 10 60 ping-timer-rem persist-tun persist-key
將 openvpn 改成以 daemon 方式運作,並以 nobody 及 nogroup 來啟動:
daemon user nobody group nogroup
要允許 client 端存取整個 server 的 subnet:
route 192.168.4.0 255.255.255.0
以上就完成 static key 的方式
接下來要做是另一種較複雜且安全的方式,建立自己的 Certificate Authority (CA) 並產生 certificates 及金鑰供 openvpn server 及多個 client 使用。
第一步是建立 PKI (public key infrastructure). 切換到 /usr/share/doc/openvpn/examples/easy-rsa 目錄,執行: 設定環境變數
root@debian:~# . ./vars
以下東西產生出來會放到 ./keys/ 目錄下,可修改 vars 來改變位置
root@debian:~# ./clean-all root@debian:~# ./build-ca
會產生
ca.crt ca.key
建立給 server 用的 certificate & key
root@debian:~# ./build-key-server server
當中問到 "Common Name" 設成 "server" 會產生
01.pem server.crt server.csr server.key
產生給多個 client 用的 certificates & keys 當中問到 "Common Name" 設成 "client1",以此類推
root@debian:~# ./build-key client1
產生
client1.crt client1.csr client1.key
root@debian:~# ./build-key client2 root@debian:~# ./build-key client3
Generate Diffie Hellman parameters
root@debian:~# ./build-dh
Hardening OpenVPN Security
root@debian:~# openvpn --genkey --secret ta.key
接著將 key 利用加密通道拷貝到 server 及 client 機器上(和設定檔放在同一目錄)
在 server 端機器上修改 /etc/openvpn/server.conf,可從 /usr/share/doc/openvpn/examples/sample-config-files/ 拿來當範本
# openvpn server 的 ip local your_vpn_server_ip_address # vpn server 的 port port 1194 # protocol proto udp # device dev tun tls-server ca ca.crt cert server.crt key server.key tls-auth ta.key 0 dh dh1024.pem server 10.8.0.0 255.255.255.0 ifconfig-pool-persist ipp.txt # 自動將 client 的 default gateway 設成經由 VPN server 出去 push "redirect-gateway" # 保持連線,每 10 秒 ping 一次,若是 120 秒未收到封包,即認定 client 斷線 keepalive 10 120 comp-lzo # 最多同時只能有十個 client max-clients 10 # vpn daemon 執行時的身份(在非 Windows 平台中使用) user nobody group nogroup persist-key persist-tun daemon # 以下二行是將 vpn server 內部的虛擬 ip 機器開放給 client 使用 push "route 192.168.10.0 255.255.255.0" push "route 192.168.20.0 255.255.255.0"
在 client1 端機器上修改 client.conf
# 本台是當 client client dev tun proto udp # vpn server 的 ip 及 port remote your_vpn_server_ip_address 1194 # 執行時的身份 user nobody group nogroup persist-key persist-tun tls-client ca ca.crt cert client1.crt key client1.key tls-auth ta.key 1 ns-cert-type server comp-lzo daemon
client2 及 client3 設定檔和 client1 差不多,只有 cert 及 key 不同:
cert client2.crt key client2.key
以此列推
啟動 openvpn server 及 client,這時 client 端的 default gateway 會被修改過,經由 vpn server 那台出去,因此從外面查詢到的 ip 為 vpn server 的 ip。
由於啟動 openvpn 後,身份切換到 nobody,導致要結束 openvpn 時有錯誤訊息,無法執行 route 指令,將 default gateway 恢復到未啟動 vpn 前的狀況,因此在此寫個 shell script 來結束 openvpn
stop-openvpn
/etc/init.d/openvpn stop route del your_vpn_server_ip_address route add default gw your_original_default_gateway
用 root 執行即可結束 openvpn daemon
若是在 Windows 下要安裝 openvpn 請到 http://openvpn.net/download.html 不管是 linux 或 Windows 版,server 或 client 都是同一套程式,僅是設定檔不同,抓 openvpn-2.0_rc20-install.exe
安裝後會多出一個 TAP-Win32 Adapter 的區域連線 將 c:/Program Files/OpenVPN/sample-config 中的 server.ovpn(當 server) 或 client.ovpn(當 client) 複製一份到 c:/Program Files/OpenVPN/config 中,修改成符合我們需求即可,接著將從 server 產生的 key(ca.crt client1.crt client1.key)也放到 c:/Program Files/OpenVPN/config 中。
底下以 client 當範例:
client dev tun proto udp # vpn server 的 ip 及 port remote your_vpn_server_ip_address 1194 nobind persist-key persist-tun tls-client ca ca.crt cert client1.crt key client1.key tls-auth ta.key 1 ns-cert-type server comp-lzo
接著到 "服務" 中去啟動 openvpn service 即可,TAP-Win32 Adapter 會自動從 openvpn server 取得 ip 和 gateway。
![[Main Page]](/upload/4/49/Debian_taiwan_out.png)