2010年7月12日 星期一

Linux PPTP 實作報告

PPTP(Point to Point Tunneling Protocol),是VPN(Virtual Private Network)的一種,這裡PPTP的設定(MPPE. MPPC MS-CHAPv2)主要是為了Windows環境所設置的(Windows的OS還是大部份人在使用),方便員工在外地存取公司網路資源,...其它像是L2TP或L2TP/IPSec之類的VPN也許有機會可以試試看...

環境:
VMware-server 1.0.10
Fedora Core 5(記得要把selinux關掉)
由於FC5的核心已經包括了MPPE&MPPC的module功能,且ppp-2.4.3-6.2.1的RPM也預設安裝,所以只剩下pptpd for Server,和pptp for client.

首先實做Server:
下載pptpd-1.3.4.tar.gz,./configure,./make,./make install

編輯/etc/pptpd.conf(這個是pptpd的預設設定檔,可以man pptpd.conf或man pptpd參考)
localip 192.168.1.1
remoteip 192.168.1.10-19
#這是告訴pppd,它的設定檔是這一個,否則會預設用/etc/ppp/options
option /etc/ppp/options.pptpd

編輯/etc/ppp/options.pptpd(pppd的設定檔,裡面的參數,可以man pppd參考)
#這裡name的定義可以對應到/etc/ppp/chap-secrets
name test
#Microsoft定義兩種handshake protocol,MS-CHAPv1 for win95,之後就用MS-CHAPv2,所以這裡用較新的
require-mschap-v2
#這是通道加密的方法,開啟這個,可以使用40bits或128bits的加密方式,(參考Microsoft的加密等級)
require-mppe
ms-dns 192.168.1.1
ms-wins 192.168.1.1
 
編輯/etc/ppp/chap-secrets
“user_name”    “pptpd_hostname”    “password”    “allow-source-ip”
第二欄可以關聯/etc/ppp/options.pptpd的name的設定,所以這裡設定為test,也可以設定”*”,代表wildcard
第四欄設為”*”,可以不限制pptp client的來源ip

啟動pptpd
pptpd
#可以cat /var/log/messages,查看運作情形,如果有client連結成功,可以透過ifconifg可以看到ppp的介面

關閉pptpd
ps -e | grep pptpd #找出pptpd的process_id
kill process_id

利用windows client來連上
應該不困難,忽略...

Routing for Server:
當然不是clinet連得上來就好,封包還要能路由到用戶希望到的機器,所以第一步就是打開linux的路由功能
echo 1 > /proc/sys/net/ipv4/ip_forward
然後就是設定適當的路由,還有加入防火牆,保險一些...PPTP使用TCP port 1723

參考連結:
http://ericbbs.blogspot.com/2007/10/vpn-pptp.html
http://cha.homeip.net/blog/archives/2006/10/pptp_vpn.html
http://www.phparchitecture.com/howto_show.php?id=3&showall
http://en.wikipedia.org/wiki/Microsoft_Point-to-Point_Encryption
http://en.wikipedia.org/wiki/MS-CHAP

然後實做client:
下載pptp-1.7.2.tar.gz,make,install
安裝後,除了執行檔,還會產生一個設定檔/etc/ppp/options.pptp,裡面有註解,其看起來像是為了連到Microsoft VPN所設定的...

編輯/etc/ppp/options

編輯/etc/ppp/peer/$TUNNEL
pty "pptp $SERVER --nolaunchpppd"
name $DOMAIN\\$USERNAME
#這裡remotename的定義可以對應到/etc/ppp/chap-secrets
remotename PPTP
#這是通道加密的方法,開啟這個,可以使用40bits或128bits的加密方式,(參考Microsoft的加密等級)
require-mppe
file /etc/ppp/options.pptp
ipparam $IPPARAM

註解: $TUNNEL  所要呼叫的設定檔,裡面有server的位置,還有相關設定
        $SERVER  server的IP位置
        $DOMAIN   還不了解...可以省略
        $USERNAME  帳號的名稱,需對應/etc/ppp/chap-secrets內的某一列的”user_name”
        $IPPARAM 這個參數,會變成ip-up script的第六個輸入參數,我們可以在ip-up.local建立自己的script,並且使用它

編輯/etc/ppp/chap-secrets
“user_name”    “pptpd_hostname”    “password”    “allow-source-ip”
第二欄可以關聯/etc/ppp/options.pptpd的name的設定,所以這裡設定為PPTP,也可設定”*”,代表wildcard
第四欄設為”*”,應該代表不限制pptp server的目的ip

啟動pptp-client
pppd call $TUNNEL
#可以cat /var/log/messages,查看運作情形, 如果成功連結到server,可以透過ifconifg可以看到ppp的介面

關閉pptp-client
ps -e | grep pppd #找出pppd的process_id
kill process_id

Routing table for Client:
對於client,當connection建立起來,會有一個host routing entry(就是另一端的IP位址),對於一些簡單的使用情境,像是從家裡連到公司網路,基本上還是需要手動設定routing table,才能使用公司的網路資源,而pppd的package(for FC5 or RedHat),有提供機制來自己寫script增加所需要的routing entry...
在/etc/ppp目錄下,可以看ip-up和ip-down及其他的script,例如只要加入ip-up.local檔案就可以寫自己的script...細節可以man pppd和看if-up的script內容....
這裡要記錄的是,其script的執行時,stdin.stdout and stderror都導到/dev/null,要注意
這樣就可以客製化自己的routing table

PS:一般的情形,都是default routing entry設成另一端VPN的IP位址,或是介面ppp0之類,總之,除了特別的設定,大部分的流量都希望經由VPN...所以pppd也提供一個選項defaultroute來做這樣的事,幫你增加default routing entry到介面ppp0...
所以我一開始很高興的用,不過不會增加...後來想一下,才知道原因
因為我們的pppd就是利用原來default routing entry才能連接到VPN server的,如果真的多增加default routing entry,就代表有兩個default routing entry,當然可以用metric來決定優先權,不過不管用哪一個,對於VPN的建立和流量的導向,都有一個是我們不希望的(因為routing table是所有程式共用的).....所以pppd不會多增加一個default routing entry(/var/log/messages有顯示),除非VPN的建立不是透過default routing entry,而是透過自己LAN上的一台VPN Server

參考連結:
http://pptpclient.sourceforge.net/howto-debian.phtml#configure_by_hand
http://ppc52776.blogspot.com/2008/12/linux-pptp-client-windows-vpn-server.html
http://www.cyberciti.biz/tips/howto-configure-ubuntu-fedora-linux-pptp-client.html

沒有留言:

張貼留言