FreeBSDVPN
我前前後後一共折騰了四天才弄完,真是麻煩死了,不過需要跟大家說明的是其實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