[轉貼]OpenVPN完整SSL設定

因為作者寫得太優了,字字是重點
所以只好全轉貼了,有些部分我還看不太懂
放在這裡留著慢慢看

真的很謝謝原作者,因為這份資料他把VPN遺漏的NAT和iptables設定都加入進去了
VPN我之前有設定成功連線過,但除了ping,其他都無法使用
但又把client強制把gateway設定到server端上,因沒有配套措施
導致client整個斷線….:(

看到這篇我又有動力想嘗試了,看來只能在linux下才能發揮OpenVPN的全功能
(windows版就殘念….我再找文章看看)

 

2010/2/12補充:文章終於看董一些了,也可以正常用VPN來上網
看還是搞不定VPN存取server網路內的電腦= =

以下試做發現的勘誤,直接改上去

———————————————————————————————–

原文出處http://cheaster.blogspot.com/2009/11/openvpn-by-ssl.html

參考網頁:
1-http://ssorc.tw/rewrite.php/read-265.html
2-http://justshark.blogspot.com/2006/05/openvpn.html
3-http://blog.roodo.com/candyz/archives/283944.html
4-http://theitdepartment.wordpress.com/2009/06/08/openwrt-openvpn-routed-lans/
5-https://forum.openwrt.org/viewtopic.php?id=6576

我的openvpn是上rpm-pbone上找的,因為懶的用source去做…就找fc8的rpm上來裝

裝好後,你會在/etc/openvpn底下發現easy-rsa的資料匣,進入裡面的2.0…

接著,我從上面的五個參考網頁上看出幾個重點:

  1. ssl的server與client憑證
  2. server與client的config設定有七、八成要一致
  3. 如果你server是在unix-like上架設的,那就不僅只是把vpn-service啟動就好了,還要做封包的forward跟nat
  4. 在server的config上定義client的routing-table要特別注意…沒必要把default route做到vpn-gateway上就別做…(我個人認為啦)

ok,以上四個重點也是建置的幾個步驟,接下來就一個一個來吧

[1. ssl的server與client憑證]

Johnny註:關於這部分我會重新整理這段的做法,最常見犯的錯誤是在變數宣告上,指令為

. ./vars

其他依序

./clean-all
./build-ca
./build-inter 主機名字

注意主機名字不可重複,其他照提示作就可以了
可參考

http://fedoraproject.org/wiki/Openvpn

我之後會重新整理這段文章

[2. server與client的config設定有七、八成要一致]

server端(linux-fedora-8):
依參照網頁3上說的,把ca.crt/ta.key/dh1024.pem/server.* 從easy-rsa/2.0/keys下拷到/etc/openvpn,然後再把/usr/share/doc/openvpn-版本/sample-config-files/server.conf也拷到/etc/openvpn底下。
然後,編輯server.conf,主要要修改的地方有

  • local主機ip位置
  • port(我用預設1194)
  • proto(我用tcp)
  • dev(我用tun)
  • ca(指定ca.crt位置)
  • cert(指定server.crt位置)
  • key(指定server.key位置
  • dh(指定dh1024.pem位置
  • server ip mask(我用預設的10.8.0.0/24)
  • ifconfig-pool-persist ipp.txt(預設值)
  • push “route network mask”(這要點4要注意的,這是是修改client的routing-table,假設我要讓連上vpn的client可以存取或連線至vpn-server區域的某一塊的網路區域,就要增加這一行,例:讓client可以連至server網路區的192.168.111.0/24,那這一行就要寫成push “route 192.168.111.0 255.255.255.0”)
  • push “dhcp-option DNS ip-address”(vpn的虛擬網卡也是要用dns的,但建議這dns要在包在routing-table會從vpn-gateway走的範圍)
  • client-to-client(讓使用vpn的client們可以各自相連繫)
  • keepalive a b(預設值a=10/b=120,每a秒會由server向client詢問有沒有活著,若長達120秒沒回應,則server會判定client已失聯)
  • tls-auth ta.key-address 0/1(第一引數是指定ta.key的位置,第二引數0->server使用/1->client使用)
  • comp-lzo(使用lzo的連線壓縮技術)
  • max-clients num(最大同時使用vpn連上server的人數)
  • user/group(在unix-like的os上,讓vpn的service用daemon來啟動,windows就不用了)
  • status status-log-file-address(設定vpn-status的記錄檔的位置)
  • log/log-append log-address(openvpn-service的記錄檔位置)
  • verb num(log等級)

若沒提到的,就使用預值狀態吧,接著,請先到firewall把tcp-1194的port開放,然後啟動openvpn(service openvpn start),如果啟動正確的話(service openvpn status),就會在網路狀況(netstat -tlunp)上看到1194已被openvpn使用,然後log也可以讓你檢查一些狀況。接著看client的設定

client(windows XP):
在windows上要用openvpn,就要至官網下載openvpn-gui,找stable,我在用的時候是1.0.3,下載Installation Package後大部份都使用預設值安裝即可,不過,next不要按太快,到了安裝元件的選擇(Choose Components)時,多勾一個My Certificate Wizard(這是我的建議,不勾也無關緊要);安裝中途會有一個驅動的安裝,那是虛擬網卡,然後應該就安裝結束;裝完之後,有裝firewall的人請把openvpn-gui的應用給開放…
再來,在openvpn-gui的安裝路徑中有一個sample-config,把裡面的client.ovpn拷一分到openvpn-gui/config底下,接著,再到server端下載ca.crt/ta.key/你要開放的用戶要用的xxx.crt、xxx.key、xxx.csr,也放在config底下…當然,你要在windows上重做一份這一些檔案也行啦,方法跟server的產生方式一樣,但記住,vars中的KEY_xxxxxx的設定要跟server的一模一樣
接著,編輯client.ovpn

  • client(就是指client的意思,預設是開啟)
  • dev tap/tun(server用什麼,client就要用什麼,所以我是用tun)
  • proto tcp/udp(server用啥,client就要用啥)
  • remote server-real-ip(就server在網路上的ip-address)
  • resolv-retry infinite(重新測試…預設開啟)
  • nobind(預設是nobind)
  • ca/cert/key(跟server一樣意思,就是指定這三個東西的位置,但注意,cert/key是要用client,不是server.cert/server.key唷)
  • tls-auth ta.key-address 0/1(跟server那解釋的一樣,但第二引數在client要改1)
  • comp-lzo/verb 3

client要設定的不多,因為大至上都是預設值,所以也不用怎麼更動

3. 做封包的forward跟nat

這是我一開始卡很久的地方,因為,網路上很多教學都沒說了這一塊,但實際不說也沒錯,因為vpn的用意並不是讓你因為這樣的而繞行方便,但這其實就是一種route and nat的方式,很像一種load-balance(如果你vpn很多的話)

  1. 啟用forward功能[echo “1” > /proc/sys/net/ipv4/ip_forward]
  2. 讓vpn的虛擬網卡在server開放input/output
    input[iptables -A INPUT -i tun+ -j ACCEPT]
    output[iptables -A OUTPUT -o tun+ -j ACCEPT]
  3. 開放server端的vpn與實體網路進出FORWARD
    eth->vpn[iptables -A FORWARD -i eth* -o tun+ -j ACCEPT]
    vpn->eth[iptables -A FORWARD -i tun+ -o eth* -j ACCEPT]

    注意,eth*的星號,指的是你實體網卡的編號,建議指定一張就好…因為我不肯可否用eth+

Johnny註:文中的eth*指的是對外的網卡介面,例如:ppp0或eth0
目前如果要用VPN上網的話,還是只能架在Linux上
除非windows上有封包轉遞的軟體可以處理

參考http://openvpn.net/index.php/open-source/documentation/howto.html#redirect
http://fedoraproject.org/wiki/Openvpn

  1. 啟動nat,由source 10.8.0.0/24傳來的會走eth*出去
    [iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth* -j MASQUERADE]
    eth*這裡的星號是指你10.8.0.0/24要nat從哪一張網卡走出去,然後nat後的ip是那張網卡的

上述指令在server(unix-like os 適用)輸入就ok了

4. routing-table

主要設定就是在server.conf的push “route a.b.c.d x.x.x.x”這裡,就是,當你client要連a.b.c.d/x.x.x.x這網域時,才會往vpn-gateway走,若不是這一個網域的,就會走client其他的網路設定。如果你覺得,我連上vpn就是都只走vpn的話…那你就不用設定route,你直接在server.conf上,寫入[push “redirect-gateway”]就行了,這樣client的default-gateway會改成走vpn-gateway,幾乎就是叫client只走vpn了

以上四個是我實做二天openvpn的重點,實際上,照著參考網頁走就可以讓server啟動正常…但唯一就是routing-table的設定跟package-forward與nat的部份還是得詳研… 

Johnny註:正常的log長這樣

http://openvpn.net/index.php/open-source/documentation/howto.html#start