配置基於ADSL的防火牆(轉)

gugu99發表於2007-08-11
配置基於ADSL的防火牆(轉)[@more@]

  我的目的是做一臺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(8) 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"foon" 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 ]; 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

  ;

  下面我們要開啟防火牆來測試一下了,我們開啟防火牆還需要修改一下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"

  其中兩個需要說明,firewall_type=後面我這裡是指定了一個檔案來做定製配置,ipfw還有其他幾種預設的方式可選,例如open,client,close等等。我們用不到就不說了無論如何一定要有以下這句,否則你的閘道器無法正常運轉gateway_enable="YES"

  大家注意到我的轉發介面設定的是rl0也就是我的網路卡,這在使用ppp的時候是沒有問題的,但是如果用mpd作PPPoE撥號時候無論如何不行,必須設定成mpd的建立的ng0裝置上。

  我開始的想法如果無法把pptp的監聽設定在外網介面上的情況下就把埠用natd從外網轉進來,誰知道pptp還需要埠以外的部分進行連線,所以現在natd基本上是沒有什麼作用的。

  下面我就給大家我的/etc/ipfw.conf裡面關於如何讓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

  只有新增了這四句才可以使得客戶端連線上閘道器,但是如果只有這四個,客戶端連上了是什麼也幹不了的,所以還要為客戶端設定下面兩個規則才行

  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是我分配給客戶端得內網地址,如果你的地址定義跟我不同你需要修改這個地址

  由於安全原因,我不能把我完整的配置檔案都放出來給大家了,關於其他的規則,請大家參考iceblood寫的透過FreeBSD共享ADSL上網等文章得防火牆設定或者檢視man 8 ipfw來定製自己的規則。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-944428/,如需轉載,請註明出處,否則將追究法律責任。

相關文章