使用FreeBSD配置基于ADSL的VPN網(wǎng)關(guān)+防火墻
我前前后后一共折騰了四天才弄完,真是麻煩死了,不過需要跟大家說明的是其
實(shí)VPN(PPTP方式)的配置在FreeBSD上面并不困難,大家只需要5分鐘就能
解決了,其余99%的時(shí)間我有一半再跟tun0搏斗,結(jié)果發(fā)現(xiàn)我犯了個(gè)低級(jí)錯(cuò)
誤,另外一半時(shí)間我在跟ipfw搏斗,發(fā)現(xiàn)了VPN的連接機(jī)制還挺復(fù)雜。好了廢
話不多說了,let's go
我的目的是做一臺(tái)ADSL撥號(hào)網(wǎng)關(guān),這個(gè)網(wǎng)關(guān)上由MPD作為VPN網(wǎng)關(guān)的守護(hù)進(jìn)程,
使用PPTP協(xié)議作為傳輸協(xié)議,由于這臺(tái)機(jī)器上有samba服務(wù)器,所以我無法開
放我的所有端口,我必須封鎖所有不需要的端口。正因?yàn)檫@樣花了很長(zhǎng)時(shí)間研究
PPTP協(xié)議到底需要通過防火墻上的那些端口和那些協(xié)議。配置的目的已經(jīng)告訴大
家了,下面是配置的過程。
首先從ppp撥ADSL說起,如果您對(duì)于使用ppp連接PPPoE(也就是ADSL使用的連
接方式)已經(jīng)非常熟悉了,那就可以跳過這一段直接看后面的。
使用ppp連接PPPoE是非常簡(jiǎn)單的,FreeBSD在安裝好之后你會(huì)在/etc/ppp/目錄
下看到一個(gè)叫做ppp.conf的文件,你把這個(gè)文件修改成下面的樣子就可以連接
PPPoE了,文件內(nèi)容如下:
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
第一部分是設(shè)置日志的方式和一些默認(rèn)信息
set device PPPoE:后面需要改成你的網(wǎng)卡的驅(qū)動(dòng),我的是Realtek的8139,所以
就是rl0了,下面是設(shè)置最大發(fā)送/接受單元,PPPoE默認(rèn)是1492,然后timeout是在
你是用auto方式的時(shí)候設(shè)置的超時(shí)時(shí)間,超過這個(gè)時(shí)間將會(huì)斷線。enable dns是打開
從ISP服務(wù)端接收分配的DNS,后面papchap部分是設(shè)置你的PPPoE帳號(hào)信息,最后兩句
是設(shè)置路由信息的,請(qǐng)務(wù)必添加。
注意標(biāo)簽后面的語句要有縮進(jìn),至少縮進(jìn)一個(gè)空格,在帖子里可能看不到,大家要注意!
修改過配置文件之后你就可以用ppp -ddial papchap來試驗(yàn)一下,如果連接上了網(wǎng)絡(luò)
就沒問題了,在rc.conf文件中添加下面兩句就可以在開機(jī)的時(shí)候啟動(dòng)ppp撥號(hào):
ppp_enable=YES
ppp_mode=ddial
ppp_nat=YES
ppp_profile=papchap
其中ppp_mode=后面是ppp的方式,可選的有auto ddial background等等,具體的信
息可以從man ppp中獲得。以上就是PPP撥PPPoE的配置,可以看到非常的簡(jiǎn)單。
下面一部分是啟動(dòng)IPFW的防火墻,這個(gè)需要修改默認(rèn)得內(nèi)核設(shè)置,同時(shí)使用MPD也需要
對(duì)內(nèi)核進(jìn)行修改,所就在這里同時(shí)都修改了。我使用的是升級(jí)版本的IPFW,也就是被稱作
IPFW2的防火墻,在FreeBSD4.x上使用這個(gè)防火墻需要重新編譯IPFW,這需要你事先安
裝了FreeBSD4.6以上的源碼在你的硬盤上,然后執(zhí)行下列步驟升級(jí)你的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來升級(jí)你的防火墻
升級(jí)IPFW完畢之后,接下來就是修改內(nèi)核了,重新編譯內(nèi)核需要經(jīng)過如下步驟,首先進(jìn)入
/sys/i386/conf/目錄,里面有兩個(gè)文件,一個(gè)是GENERIC,另一個(gè)是LINT,具體的說明
信息我就不贅述了,我只講一下我修改內(nèi)核的過程。
首先
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
然后重新啟動(dòng)機(jī)器內(nèi)核的更新就已經(jīng)完成了。
這樣IPFW2的安裝就已經(jīng)完成了,我們先不打開防火墻,我們先配置mpd來建立PPTP的服
務(wù)器。關(guān)于MPD的安裝其實(shí)非常簡(jiǎn)單,你可以自己手動(dòng)編譯,但我還是推薦大家用ports
來安裝,因?yàn)槲覍?shí)在是想不出什么理由來不用ports安裝:)
如果你安裝了ports到你的硬盤上,你通過下列步驟就可以完成mpd的安裝了
cd /usr/ports/net/mpd
make install
make clean
安裝完畢之后,ports會(huì)自動(dòng)創(chuàng)建/usr/local/etc/mpd目錄
并把配置文件的樣本存放在這個(gè)目錄里面,可以通過修改已有的配置文件樣本來完成對(duì)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
這個(gè)是sample里面的默認(rèn)配置,下面對(duì)于需要修改的部分做出說明
實(shí)際上我們需要修改只有三行,就是下面三行
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
第一行是設(shè)置你的本地VPN網(wǎng)關(guān)的地址,如果你是像我一樣用NAT來區(qū)分內(nèi)外網(wǎng)的話
這個(gè)應(yīng)該是網(wǎng)關(guān)的內(nèi)網(wǎng)地址,后面的是對(duì)方撥入以后將會(huì)在內(nèi)網(wǎng)獲得的地址,這個(gè)
地址倒是沒有什么特殊要求,就是首先這個(gè)地址需要和內(nèi)網(wǎng)處于一個(gè)網(wǎng)段,否則訪
問不了,第二后面可以設(shè)置一個(gè)掩碼,來控制這個(gè)地址可能的范圍,如果這個(gè)地址
被占用了,將會(huì)分配一個(gè)再限定范圍內(nèi)的地址給客戶端,這個(gè)范圍由/后面的掩
碼來控制。
第二行是指定你內(nèi)網(wǎng)使用的DNS服務(wù)器的地址,注意這個(gè)將會(huì)在用戶連入的時(shí)候同
內(nèi)網(wǎng)地址一起被分配給用戶
第三行和第二行類似,是指定Netbios服務(wù)器的地址,如果內(nèi)網(wǎng)沒有WINS服務(wù)器
這行可以不寫。最后我還增加了一行命令,再不增加這個(gè)命令的時(shí)候mpd看起來也是
正常運(yùn)轉(zhuǎn)的,但是我不太放心還是加了這行加密指令
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服務(wù)器綁定在那個(gè)地址上面,如果是我們現(xiàn)在使用ppp撥叫ADSL的情況,會(huì)遇
到網(wǎng)絡(luò)界面改變,ip地址改變的情況,就不能定義這一句,所以針對(duì)我們的情況,我們
要去掉這句,其他的我們就不用改了
當(dāng)然我們還要修改一下mpd.secret文件
這個(gè)文件定義了撥入用戶的用戶名和密碼
用戶名寫在前面,密碼寫在后面用引號(hào)引起來,就像下面這樣
fred fred-pw
當(dāng)然還可以指定這個(gè)用戶必須從那個(gè)地址或者網(wǎng)段來撥入,就像下面的例子:
joe foobar 192.168.1.1
bob x34foon 192.168.1.10/24
之后我們還可以添加一句來默認(rèn)讓mpd執(zhí)行pptp的這組設(shè)置,需要修改配置文件的這個(gè)
部分:
default:
load pptp
sample文件里面還有配置多用戶登陸的情況下的樣本,我就不用在寫了,配置是一樣的
改完這些之后只要運(yùn)行mpd -b就可以啟動(dòng)了
由于考慮到安全原因我沒有書寫啟動(dòng)腳本在開機(jī)的時(shí)候啟動(dòng)mpd,因?yàn)閷?duì)于防火墻來說
在沒有用的時(shí)候多開一個(gè)端口就多一份危險(xiǎn),但是也許很多人需要在開機(jī)的時(shí)候自動(dòng)運(yùn)行
mpd,下面我還是提供一個(gè)啟動(dòng)腳本給大家,可以放在/usr/local/etc/rc.d/目錄下面
記住要加上執(zhí)行權(quán)限。
#!/bin/sh
PREFIX=/usr/local
case $1 in
start)
if [ -x ${PREFIX}/sbin/mpd -a
-f ${PREFIX}/etc/mpd/mpd.conf ]; then
${PREFIX}/sbin/mpd -b
echo -n ' mpd '
fi
;;
stop)
killall mpd echo -n ' mpd '
;;
*)
echo Usage: 'basename $0' {start|stop} >2
;;
esac
exit 0
;
下面我們要開啟防火墻來測(cè)試一下了,我們開啟防火墻還需要修改一下rc.conf文件
我們需要添加下列配置
firewall_enable=YES
firewall_type=/etc/ipfw.conf
gateway_enable=YES
natd_enable=YES
natd_interface=rl0
natd_flags=-f /etc/natd.conf
其中兩個(gè)需要說明,firewall_type=后面我這里是指定了一個(gè)文件來做定制配置,ipfw
還有其他幾種默認(rèn)的方式可選,例如open,client,close等等。我們用不到就不說了
無論如何一定要有以下這句,否則你的網(wǎng)關(guān)無法正常運(yùn)轉(zhuǎn)
gateway_enable=YES
大家注意到我的轉(zhuǎn)發(fā)界面設(shè)置的是rl0也就是我的網(wǎng)卡,這在使用ppp的時(shí)候是沒有問題的,
但是如果用mpd作PPPoE撥號(hào)時(shí)候無論如何不行,必須設(shè)置成mpd的創(chuàng)建的ng0設(shè)備上。
我開始的想法如果無法把pptp的監(jiān)聽設(shè)定在外網(wǎng)界面上的情況下就把端口用natd從外網(wǎng)
轉(zhuǎn)進(jìn)來,誰知道pptp還需要端口以外的部分進(jìn)行連接,所以現(xiàn)在natd基本上是沒有什么
作用的。
下面我就給大家我的/etc/ipfw.conf里面關(guān)于如何讓pptp連接通過的語句
add 40009 allow tcp from me 1723 to any
add 40010 allow tcp from any to me 1723
add 40011 allow gre from me to any
add 40012 allow gre from any to me
只有添加了這四句才可以使得客戶端連接上網(wǎng)關(guān),但是如果只有這四個(gè),客戶端連上了是
什么也干不了的,所以還要為客戶端設(shè)置下面兩個(gè)規(guī)則才行
add 40007 allow ip from any to 192.168.1.30 keep-state setup
add 40008 allow ip from 192.168.1.30 to any keep-state setup
注意我得配置中192.168.1.30是我分配給客戶端得內(nèi)網(wǎng)地址,如果你的地址定義跟我
不同你需要修改這個(gè)地址
由于安全原因,我不能把我完整的配置文件都放出來給大家了,關(guān)于其他的規(guī)則,請(qǐng)大家
參考iceblood寫的通過FreeBSD共享ADSL上網(wǎng)等文章得防火墻設(shè)置或者查看man 8 ipfw
來定制自己的規(guī)則。
評(píng)論