linux vpn (pptp)安裝及設定


作者:csc@ocean-pioneer.com
更新時間:2003/08/06
最後更新日期:2006/6/17
參考網站:
www.poptop.org
pptpclient.sourceforge.net/howto-redhat-90-build.phtml

pptpclient.sourceforge.net/howto-fedora-core-3.phtml


目前不同的VPN的解決方案中,有 軟體也有硬體,但是為了 迎合一般家用使用者電腦所使用的作業系統(一般都是windows系列的),因此PPTP協定將會是最好的選擇,因為windows內建有pptp協定的 vpn.linux有一個免費的sever軟體 (www.poptop.org)或是client(pptpclient.sourceforge.net)的套件,省了一些麻煩:
#
我己經成功的使用98撥接來撥入公司網路,環境同公司網路芳鄰
#
已經成功的幫一家公司設定好了(2003/08/05)
#
目前我使用不同的網段
192.168.0.0(
主公司),192.168.1.0(A公司),192.168.2.0(B公司),192.168.4.0(C公司)
由主公司為client連線到A,B,C三家公司,在我主公司的區網可以直接連線到這三家公司的任何電腦,其中的個人電腦上裝有vnc軟體,便可以直接搖 控該公司內部的電腦了
#2004/12/17最近重新安裝redhat Fedora Core III,比以前簡單多了但步驟有點不同,有很好的參考網站:http://pptpclient.sourceforge.net/howto-fedora-core-3.phtml
你可以逕行參考該文件安裝,但我還說明一下附在本文最後一段

#2006/1最近家婺狃able 寬頻,使用xp可以連入公司的區網內
#2006/2/15更新fc3的pptp
#2006/06/17目前大部份的vpn我己經改用openswan(考慮安全性),但仍有一些舊系統,因此仍有部分使用pptp,並加入一些斷線檢查的shell script


SERVER端 安裝

首先我們必須要安裝下面三種套件:

  1. 核心系統的mppe(微軟的編碼協定)模組(2.6.15 不用裝)

  2. ppp(撥接point to point protocol)支援mppe

  3. pptpd(point to point tunnel protocol)伺服器
    我已經測試過redaht9.0Fecora core 1
    請選擇下述一種方式安裝(redhat9.0為例)


    rpm安裝

    下載檔案

    1. 先查詢你的kernel的版本,你可以在console登入的畫面看到,也可以使用uname -a 來查詢,我的是2.4.20-8(i686),因此下載http://pptpclient.sourceforge.net/howto-redhat-90.phtml,kernel-mppe-2.4.20-8.i686.rpm 如果找不到你如使用版本,請使用下一節由第二項目安裝 (FC1可能必須自己編譯)

    2. 下載ppp及pptpd軟體,
      http://sourceforge.net/project/showfiles.php?group_id=44827

      安裝
      rpm -Uvh kernel-mppe-2.4.20-8.i686.rpm
      rpm -Uvh ppp-2.4.2.xxxxx
      rpm -Uvh pptpd-2.4.2xxxx


    rpm安裝(核心 模組使用 mppe原始碼編譯)

    1. 安裝(RedHat9.0)套件:
      以下是原9.0必須已安裝的套件,如果沒有的話請安裝
      gcc-3.2.2-5.i386.rpm
      kernel-source-2.4.20-8.i386.rpm(
      這個套件版本和你的核心必需相同)
      rpm-build-4.2-0.69.i386.rpm
      rpm-devel-4.2-0.69.i386.rpm

    2. 下載及編kernelmod軟體-這個軟體作業系統核心的mppe模組的原始程式
        
      請至www.poptop.org下載kernelmod-0.7.1.tar.gz
         tar xvfz kernelmod-0.7.1.tar.gz
         cd kernelmod
         ./kernelmod.sh
        
      如果你要在別台linux redhat也可以執行的話,這個命令執行的最後會問你是否要建立rpm,如果要的話選Y
      上述命令之後就裝好了

    3. 下載ppp及pptpd
      http://sourceforge.net/project/showfiles.php?group_id=44827

      安裝
      rpm -Uvh kernel-mppe-2.x.xx-8.i686.rpm
      rpm -Uvh ppp-2.4.2.xxxxx
      rpm -Uvh pptpd-2.4.2xxx

設定Server環 境檔(設定1.新版已經不用了)

  1. /etc/modules.conf
    這是載入的模組,安裝時會幫你修改一般你不需變動(好像有一些是不 需要的)

    alias eth0 via-rhine
    alias eth1 3c59x
    alias usb-controller usb-uhci
    alias char-major-10-200 tun
    #-----------------------------#
    alias char-major-108 ppp_generic
    alias ppp-compress-18 ppp_mppe
    alias ppp-compress-21 off
    alias ppp-compress-24 ppp_deflate
    alias ppp-compress-26 ppp_deflate
    alias tty-ldisc-3 ppp_async
    alias tty-ldisc-14 ppp_synctty

    下半段部份是安裝模組後自動幫你加的,
    ppp-compress-21原後面接 bsd_comp ,
    因為會產生錯誤訊息,因此改為 off
    你可以使用模組相關命令,來進行測試
    depmod -a           (
    檢 查模組的相依性)
    modprobe  ppp-compress-18 (
    測試該模組)




    depmod -a
    modprobe  ppp-compress-18
    如果執行會產生訊息,則代表有問題,正常是沒有任何訊息,如果有問 題建議直接由原始mmpe的程式碼在你的系統上編譯後重新安裝

  2. /etc/pptpd.conf
    執行man pptpd.conf 查看其設定檔可用的參數
    範例:

    debug
    option /etc/ppp/options.pptpd

    localip 192.168.0.150-160
    remoteip 192.168.0.161-170

    開啟除錯
    設定ppttp的其它設定

    我們主機的ip可以是一個ip,也可以是多個ip,或是一個區間,詳請參照後面
    連線進來的ip

  3. /etc/ppp/options.pptpd
    範例:

    lock

    debug
    dump

    require-mschap-v2
    require-mppe
    require-mppe-128

    proxyarp
    nobsdcomp



    開啟除錯一般是使用debug,但是dump會比較詳細一點,除錯資訊放在/var/log/messages

    啟動mschap-v2認證
    啟動數據編碼
    啟動數據編碼128位元

    啟動arp代理
    關閉bsd_comp,該模組已經移出核心程式(好像是版權問題),所以你沒有這 模組

  4. /etc/ppp/chap-secrets
    使用者設定檔,你也可以直接修改或是使用vpnuser指 令來新增或修改使用者(這個檔案不同的程式可能會有不同的結果,如果連線出現找不到密碼,可能是這個檔案有問題,有時必須加入"",如*變成"*"

    client       server       secret        ip address
    domain\\abc     *         abcd123        *
    ccc             *         cc345          *

    注意:
    使用者(client)是有兩種情況

    1.是單獨使用者 的名稱
    2.
    包含網域及使用者名稱-網域\\使用者
    經過98的測試,使用者驗證是使用上述的1,或是2要看你是否有在 網路內的client for microsoft networks是否有設定登入網域,如果有則驗證是 使用2,否 則是使用1
    這是/var/log/messages內驗證錯誤的訊息
    No CHAP secret found for authenticating nt\\abc
    你可以根據上述了解你電腦是送出"使用者"或是"網域\\使用者"來驗證網域或是群組

    電腦的網域或是群組,和撥接網路的登入網域是可以不相同的,沒有絕對的關係, 不要弄混 了,再來就是該設定檔chap-sercets的格式使用vpnuser或是webmin來改可能都有誤,因此任何連線時出現連線使用者/密碼有問題時請手動修改這個檔案



設定/etc/pptpd.conf
其可設定的選項如下:

項目

說明

命令列相對命令

speed  speed

指定速度(bytes per second)來通過PPP daemon當作介面的速度給 tty/pty .這可能被某些PPP daemons所忽略.內定值是115200 bytes per second,在一些應用上等同於沒有限制.

-s
--speed

option option-file

指定option檔 案所在的位置內定/etc/ppp/options

-o
--option

stimeout seconds

Poptop 有一些內建的DOS保護.其中一個保護 是取得峰值,在第一個封包連線和執行一些檢查在它和Poptop 持持續連線之前.stimeout的選項是定義 Poptop會 讓該封包保留多久.正常10秒是合理.

-s
--speed

debug

啟動除錯模式,傳送除錯的訊 息到系統的log(/var/log/messages)

-d
--debug

bcrelay internal-interface

啟動廣播轉送模式,傳送所有廣播在伺服器收到的內部介面到clients.

-b --bcrelay

localip  ip-specification

指定一個或多個IP addresses 給使用的本地端的tunnelled PPP 來連結在serverclient之間. 如果只有一個address, 這個位址將被使為為所有的clients. 否則會給每一個client一 個位址,而且如果沒有給多餘的位址,及任何新的連線將會被拒絕.


remoteip ip-specification

指定遠端位置的P addresses被使用在通道的連結PPP serverclient之間. 每一個client至少要有一個IP才可以模擬 連線,並且最好保留一些備份的位址.如果IP位址已經超 過了會在系統的log檔產生一個警告訊息.


listen ip-address

指定本定介面的 IP address 讓程式只監聽這個IP.

-l --listen

pidfile pid-file

指定檔案名稱來儲存行程PID 號碼.

-p --pidfile

注意:
localip
remoteip 的設定


範例

說明

數個IP

192.168.0.2,192.168.0.3

","分 開

網路範圍

192.168.0.1-254

"-"代 表某一範圍

合併單一ip及 子網

192.168.0.2,192.168.0.5-8



啟動
所有都設定好了可以啟動pptpd
service pptpd start
所有的啟動記錄成功及錯誤訊息可以在/var/log/messages看到(注意一些重要的 錯誤要在連線時才會產生)


Client端 的安裝

Client(linux)安 裝
server,但只一個套件不 同(前 面步驟同server端 的安裝),項 目3不 同
我們必須要安裝下面三種套件:
1.
核心系統的mppe(微軟的編碼協定)模組
2.ppp(
撥接point to point protocol)支援mppe(原始的pppd並沒有支援mppe,因此要安裝支援mppe,Fedoar core 2已經內建了)
3.pptp(client
主要程式)
 
下載pptp
  rpm -ivh pptp-xxxxxxx.rpm

設定撥接的全域功能的設定檔(預設)(如果你不想設可以保持空白,然後在撥接檔中 設定)
/etc/ppp/options.pptp
其功能設定類似pptpd
然後設定主要的連線檔
/etc/ppp/peers/
自定檔案名稱
簡單範例:

內容

說明

# Server IP: a.b.c.d

在這堨H#並不一定是
# Server IP:
是設定要連線的ip或是名稱

name abc

登入的名稱(密碼的設定在/etc/ppp/chap- secrets)

file  /etc/ppp/optins.pptp

其它全域的設定檔

require-mppe

這是一定要的支援編碼

require-mppe-128

支援128bit的 編碼

# Route: add -net 192.168.2.0 dev TUNNEL_DEV netmask
  255.255.255.0

不是註解這是設定登入時route add的動作


設定我連線檔,目前我只會兩種連線方法使用
1.pptp-command: 1-start        已經沒有這個命令了,如果你要使用可以將舊版的cp /usr/sbin它是一個shell script
2.webmin (
設定方面不錯,但是使用者設定有問題)

Server
vpnuser的程式,但是pptp-linux並沒有,但是所附的程式pptp-command
pptp-command
包含了所有相關的設定,使用者,撥號檔等
1.) start (
開始連線)
2.) stop  (
停止連線)
3.) setup (
設定)
4.) quit
你要設定就進入3.) setup
快速進入
pptp-command start
pptp-command stop
pptp-command setup


client
(windows)安裝
windows95,98,98se
說要更新,讓其可以接受128位元的編碼,小心不要蓋過中文語言(如果安裝過程跑出語系不同則保 留該檔案),如果要詳 細資料,請看下面,並至此下載
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q285189
安裝完畢後到我的電腦->控制台->新增移除軟體->windows安裝程式->通訊->虛擬私人網路,打勾,確定,安裝 完畢 後,到撥接網路新增一個連線,裝置選擇Microsoft VPN Adaptor,輸入你相關的設定
剛開始使用,因為使用撥接所以先執行撥接的連線,然後在執行vpn連線
adsl
固接,同上,試過可以
adsl
撥接應該也是差不多吧.................


測試
在安裝好了pptpd之後(Fedora Core 1)
win98(vpn client)->linux(nat)->internet ->linux(vpn server)
1.
我使用win98 se(修 正過支援128bit 編碼)本 來連線測試(同 一區域網內)
 
但是在server端 產生太多問題,太 多不同的錯誤訊息,造 成太多的誤解,及 時間的浪費(錯誤訊息和真正的連線原因不同)
2.
因為以前有裝過redhat 9.0,使用win98 se 連線正常(同一域網內)
3.
使用win xp來連線也是一樣會有錯誤...(同一域網內)

使用linux來 測試
linunx(vpn_server)->internet->linux(vpn_server)
1.Fedora core 1 -> RedHat 9.0 
成功
2.RedHat 9.0 -> Fecora Core 1 
成功

為了得到更清楚的記錄
server端 的/etc/ppp/options
加入logfile /var/log/pppd
檢視內容(sent的 部份訊息有十幾次我將其簡化為四次)

using channel 76
Using interface ppp0
Connect: ppp0 <--> /dev/pts/1
sent [LCP ConfReq id=0x1 <asyncmap 0x0> <auth chap MS-v2> <magic 0x1fd49f47> <pcomp> <accomp>]
sent [LCP ConfReq id=0x1 <asyncmap 0x0> <auth chap MS-v2> <magic 0x1fd49f47> <pcomp> <accomp>]
sent [LCP ConfReq id=0x1 <asyncmap 0x0> <auth chap MS-v2> <magic 0x1fd49f47> <pcomp> <accomp>]
LCP: timeout sending Config-Requests
Connection terminated.

然後我再比對正常連線(sentrcvd部份訊息 重複五六次我簡化各一次)
sent [CCP ConfReq id=0x1 <mppe +H -M +S -L -D -C>]rcvd [CCP ConfReq id=0x1 <mppe +H -M +S +L -D -C>]
rcvd [CCP ConfReq id=0x2 <mppe +H -M +S -L -D -C>]sent [CCP ConfAck id=0x2 <mppe +H -M +S -L -D -C>]

經比對我猜想這是防火牆的關係,因為不正常的連 線記錄檔顯示server傳 送出資料,但 並沒有收到來自client的 回應,因 此我必須先確定pptpd到 底是使用那幾個連接埠:

一般都以為只有tcp/1723,經我尋找結果gre(47 General Routing Encapsulation"封包)也是必要的,gre不是一般的tcp/udpport,其實通信協定大概有二、三十種的協定,包含了tcpudpicmp....
現在找到問題再來就是要確定iptable的設定
1.
iptables -t nat -A POSTROUTING -p gre -s {$client_net}/mask -j MASQUERADE
自動的偽裝,無法連線成功
2.
iptables -t nat -A PREROUTING -p gre -d {$fire_wall} -j DNAT --to-destination {$client}
將所有送往本fire_wallgre協定往win98端送 結果成功另一個是外連的vpn(nat)也 必須要設定
iptables -t nat -A POSTROUTING -p tcp -s {$client_net}/mask -j MASQUERADE
目前在想更好的設定因為{$client}ip是固定,在網路上尋(gre iptables)也未找到好的解決方案,這也就是說,你無法任意使用區網來連來連另一個區網(這也就是ip分享器的也可 能無法使用,因 未測試不敢斷言)

注意:
這是單向的因為client端已經指定server端的ip但是, server端 並不知道你原始的ip,而路由也沒有設定,因此server端並無法直接連到你這邊的區網,除非你在server端加入
route add -net {$client_net}  dev ppp? netmask 255.255.255.0
GRE:
這個協定的timeout600(10分鐘),如果連線有問題,必須等10分才可以再連線


server端 的管理工具

/usr/bin/confmod.sh
/usr/bin/vpnstats
/usr/bin/vpnstats.pl
/usr/bin/vpnuser
/usr/sbin/bcrelay(broadcast relay)

這是一個網路封包重複器(repeater),被設計來為了udp封包,將會監聽網路廣 播的封包,由 進來的介面收到這個封包,而 由它廣播到出去的介面
用法:
/usr/sbin/bcrelay  [options]
[-d] [--daemon]
daemon方式執行
[-h] [--help]
[-i] [--incoming]
定義來源的介面
[-o] [--outgoing]
定義目的的介面
[-s] [--ipsec]   
定義ipsectunnel介面,因為其來源及目 的是同一個
[-v] [--version] 
顯示版本
/usr/sbin/pptpctrl

vpnstats
是用來查詢vpn的連線記錄
你可以在/etc/vpnstats.conf中 設定
From:-
送件人
To: -
收送入
然後執行vpnstats ,它就會分析記錄檔產生報告,並寄給收件人


FC3 的安裝

fc3同其它的版本需要
1.MPPE核心
  dkms- 用來載入動態核心模組的程式
  kernel_ppp_mppe.dkms-mppe的核心模組(安裝過程中會幫你測試核模組,因此不需要手動測試)

2.ppp-必須和ppp-client的版本相配合
3.ppp-client (console下client端才需要)
4.pptpd(server端才需要)

下載需要的安裝就好了

 
1.client快速執行
  在/etc/ppp/peer
  建立檔案,內容類似下面
  a.b.c.d -要連線的主機
  name   -連線名稱
  192.168.2.0 -新增的路由

# Server IP: a.b.c.d
name abc
file  /etc/ppp/optins.pptp
require-mppe
require-mppe-128
# Route: add -net 192.168.2.0 dev TUNNEL_DEV netmask
  255.255.255.0  存成一個檔例如test
2.密碼
  在/etc/chap-secrets,輸入密碼,根據其格式例
  abc *  secrets *
  本使用者名稱密碼在server 端也要有
3.連線
  pptp-command start test
  如果沒問題就成功
更多的資料請參考本文之前

windows xp client 設定
  1. 記住wins要設定
  2. 網路功能->Internet Protocol(TCP/IP)->內容->進階->一般->使用遠端網路為預設閘道(不要打勾)

斷線檢查
在不正常斷線時,系統無法重新啟動pptp連線及變更server端的路由,因此我寫了shell script來檢查並重啟服務
我有兩個網段
192.168.1.0(server)<->192.168.0.0(client)
假設server 端ip s.s.s.s
client端ip c.c.c.c
正常連線
1.client端連線到server端後,client加入192.168.1.0段的路由,而server端加入192.168.0.0路由
2.client端的路由是在設定檔中可加入,在連線成立時自動加入
3.server端的路由是必須手動加入
當斷線時
1.client端使用crond每10分鐘檢查連線情況,如果斷線,重啟連線
2.server端使用crond每10分鐘檢查連線情況,如果斷線,加入路由

在server 端加入一個script(檢查某個client端是否連上pptpd,再檢查路由是否存在,如果不存在則重新加入路由)
!/bin/sh
pptp_pid=`ps aux | grep "pptpd \[c.c.c.c" |sed /grep/d |awk '{print $2;}'`
route_pptp=`/sbin/route | grep 192.168.0.0`
if [ -n "$pptp_pid" ] ; then
   if [ -z "$route_pptp" ] ;then
      add_route=`/sbin/route add -net 192.168.0.0 netmask 255.255.255.0 dev ppp0`;
   fi
fi

在client端加竹入一個script(檢查是否斷線,否則重新連線)
#!/bin/bash
pptp_pid=`ps aux | grep "pptp: call manager for s.s.s.s" |sed /grep/d |awk '{print $2;}'`
if [ -z "$pptp_pid" ];then
   pptp_connect=`/usr/sbin/pptp-command start 你的設定名稱`;
fi
#你的設定名稱是client端在/etc/ppp/peer內的設定,