我前前後後一共折騰了四天才弄完,真是麻煩死了,不過需要跟大家說明的是其實VPN(PPTP方式)的配置在FreeBSD上面並不困難,大家只需要5分鐘就能解決了,其余99%的時間我有一半再跟tun0搏斗,結果發現我犯了個低級錯誤,另外一半時間我在跟ipfw搏斗,發現了VPN的連接機制還挺復雜。好了廢話不多說了,let's go 我的目的是做一台ADSL撥號網關,這個網關上由MPD作為VPN網關的守護進程,使用PPTP協議作為傳輸協議,由於這台機器上有samba服務器,所以我無法開放我的所有端口,我必須封鎖所有不需要的端口。正因為這樣花了很長時間研究PPTP協議到底需要通過防火牆上的那些端口和那些協議。配置的目的已經告訴大家了,下面是配置的過程。 首先從ppp撥ADSL說起,如果您對於使用ppp連接PPPoE(也就是ADSL使用的連接方式)已經非常熟悉了,那就可以跳過這一段直接看後面的。使用ppp連接PPPoE是非常簡單的,FreeBSD在安裝好之後你會在/etc/ppp/目錄下看到一個叫做ppp.conf的文件,你把這個文件修改成下面的樣子就可以連接PPPoE了,文件內容如下: default: set log Phase Chat LCP IPCP CCP tun command ident user-ppp VERSION (built COMPILATIONDATE) # Ensure that "device" references the correct serial port # for your modem. (cuaa0 = COM1, cuaa1 = COM2) # set device PPPoE:rl0 set speed sync set mru 1492 set mtu 1492 set ctsrts off set timeout 60 # 3 minute idle timer (the default) enable dns # request DNS info (for resolv.conf) papchap: # # edit the next three lines and replace the items in caps with # the values which have been assigned by your ISP. # set authname #username# set authkey #passWord# set timeout 60 set ifaddr 10.0.0.1/0 10.0.0.2/0 255.255.255.0 0.0.0.0 add default HISADDR # Add a (sticky) default route 第一部分是設置日志的方式和一些默認信息 set device PPPoE:後面需要改成你的網卡的驅動,我的是Realtek的8139,所以就是rl0了,下面是設置最大發送/接受單元,PPPoE默認是1492,然後timeout是在你是用auto方式的時候設置的超時時間,超過這個時間將會斷線。enable dns是打開從ISP服務端接收分配的DNS,後面papchap部分是設置你的PPPoE帳號信息,最後兩句是設置路由信息的,請務必添加。 注意標簽後面的語句要有縮進,至少縮進一個空格,在帖子裡可能看不到,大家要注意!修改過配置文件之後你就可以用ppp -ddial papchap來試驗一下,如果連接上了網絡就沒問題了,在rc.conf文件中添加下面兩句就可以在開機的時候啟動ppp撥號: ppp_enable="YES" ppp_mode=ddial ppp_nat="YES" ppp_profile="papchap" 其中ppp_mode=後面是ppp的方式,可選的有auto ddial background等等,具體的信息可以從man ppp中獲得。以上就是PPP撥PPPoE的配置,可以看到非常的簡單。 下面一部分是啟動IPFW的防火牆,這個需要修改默認得內核設置,同時使用MPD也需要對內核進行修改,所就在這裡同時都修改了。我使用的是升級版本的IPFW,也就是被稱作IPFW2的防火牆,在FreeBSD4.x上使用這個防火牆需要重新編譯IPFW,這需要你事先安裝了FreeBSD4.6以上的源碼在你的硬盤上,然後執行下列步驟升級你的IPFW: cd /usr/src/sbin/ipfw make -DIPFW2 make install cd /usr/src/lib/libalias make -DIPFW2 make install 或者在你/etc/make.conf裡面添加IPFW2=TRUE 然後mak world來升級你的防火牆 升級IPFW完畢之後,接下來就是修改內核了,重新編譯內核需要經過如下步驟,首先進入/sys/i386/conf/目錄,裡面有兩個文件,一個是GENERIC,另一個是LINT,具體的說明信息我就不贅述了,我只講一下我修改內核的過程。 首先 cp GENERIC mykern 編輯mykern增加如下的部分: options NETGRAPH options NETGRAPH_PPPOE options NETGRAPH_SOCKET options NETGRAPH_ETHER options IPFW2 options IPDIVERT options IPFIREWALL_VERBOSE options IPFIREWALL_VERBOSE_LIMIT=100 options IPSTEALTH options ACCEPT_FILTER_DATA options ACCEPT_FILTER_HTTP 退出編輯器 config mykern cd ../../compile/mykern make depend make make install 然後重新啟動機器內核的更新就已經完成了。 這樣IPFW2的安裝就已經完成了,我們先不打開防火牆,我們先配置mpd來建立PPTP的服務器。關於MPD的安裝其實非常簡單,你可以自己手動編譯,但我還是推薦大家用ports來安裝,因為我實在是想不出什麼理由來不用ports安裝:) 如果你安裝了ports到你的硬盤上,你通過下列步驟就可以完成mpd的安裝了 cd /usr/ports/net/mpd make install make clean 安裝完畢之後,ports會自動創建/usr/local/etc/mpd目錄 並把配置文件的樣本存放在這個目錄裡面,可以通過修改已有的配置文件樣本來完成對mpd的配置,以mpd.conf.sample為例,首先cp mpd.conf.sample mpd.conf 然後修改下面的部分 pptp: new -i ng0 pptp pptp set iface disable on-demand set iface enable proxy-arp set iface idle 1800 set bundle enable multilink set link yes acfcomp protocomp set link no pap chap set link enable chap set link keep-alive 10 60 set link mtu 1460 set ipcp yes vjcomp set ipcp ranges 192.168.1.1/32 192.168.1.50/32 set ipcp dns 192.168.1.3 set ipcp nbns 192.168.1.4 # # The five lines below enable Microsoft Point-to-Point encryption # (MPPE) using the ng_mppc( netgraph node type. # set bundle enable compression set ccp yes mppc set ccp yes mpp-e40 set ccp yes mpp-e128 set ccp yes mpp-stateless 這個是sample裡面的默認配置,下面對於需要修改的部分做出說明實際上我們需要修改只有三行,就是下面三行 set ipcp ranges 192.168.1.1/32 192.168.1.50/32 set ipcp dns 192.168.1.3 set ipcp nbns 192.168.1.4 第一行是設置你的本地VPN網關的地址,如果你是像我一樣用NAT來區分內外網的話這個應該是網關的內網地址,後面的是對方撥入以後將會在內網獲得的地址,這個地址倒是沒有什麼特殊要求,就是首先這個地址需要和內網處於一個網段,否則訪問不了,第二後面可以設置一個掩碼,來控制這個地址可能的范圍,如果這個地址被占用了,將會分配一個再限定范圍內的地址給客戶端,這個范圍由"/"後面的掩碼來控制。 第二行是指定你內網使用的DNS服務器的地址,注意這個將會在用戶連入的時候同內網地址一起被分配給用戶 第三行和第二行類似,是指定Netbios服務器的地址,如果內網沒有WINS服務器這行可以不寫。最後我還增加了一行命令,再不增加這個命令的時候mpd看起來也是正常運轉的,但是我不太放心還是加了這行加密指令 set bundle enable encryption 下面我們還需要稍微修改一下mpd.links.sample pptp: set link type pptp set pptp self 1.2.3.4 set pptp enable incoming set pptp disable originate 上面的部分裡面需要修改一下set pptp self 1.2.3.4這一行,這行是指定mpd的pptp服務器綁定在那個地址上面,如果是我們現在使用ppp撥叫ADSL的情況,會遇到網絡界面改變,ip地址改變的情況,就不能定義這一句,所以針對我們的情況,我們要去掉這句,其他的我們就不用改了 當然我們還要修改一下mpd.secret文件 這個文件定義了撥入用戶的用戶名和密碼 用戶名寫在前面,密碼寫在後面用引號引起來,就像下面這樣 fred "fred-pw" 當然還可以指定這個用戶必須從那個地址或者網段來撥入,就像下面的例子: joe "Foobar" 192.168.1.1 bob "\x34\"foo\n" 192.168.1.10/24 之後我們還可以添加一句來默認讓mpd執行pptp的這組設置,需要修改配置文件的這個部分: default: load pptp sample文件裡面還有配置多用戶登陸的情況下的樣本,我就不用在寫了,配置是一樣的改完這些之後只要運行mpd -b就可以啟動了 由於考慮到安全原因我沒有書寫啟動腳本在開機的時候啟動mpd,因為對於防火牆來說在沒有用的時候多開一個端口就多一份危險,但是也許很多人需要在開機的時候自動運行mpd,下面我還是提供一個啟動腳本給大家,可以放在/usr/local/etc/rc.d/目錄下面記住要加上執行權限。 #!/bin/sh PREFIX=/usr/local case "$1" in start) if [ -x ${PREFIX}/sbin/mpd -a -f ${PREFIX}/etc/mpd/mpd.conf ]; the