[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB | BIG5

首頁 > 網絡管理 > 互聯網技術 > 正文
用FreeBSD建立撥號網關
http://www.linuxforum.net 作者:meaculpa (2001-04-21 17:04:29)
家庭網絡結構如下: 

W2K(192.168.0.100) -----以太網-----> FreeBSD(192.168.0.200) -----PPP撥號-----> internet 

實現要求如下: 

     在FreeBSD主機上使用調制解調器撥號上網,並對局域網內其它計算機提供該撥號連接的共享。 
     在FreeBSD主機上設置緩沖型的DNS系統以避免對域名的重復查詢,減輕網絡流量。 
     在FreeBSD主機上設置Squid軟件對局域網提供http代理服務並配置ipfw防止用戶繞過代理服務器。 
     在FreeBSD主機上使用Fetchmail及Qpopper為局域網用戶代收外部電子郵件。 

安裝PPP
眾所周知,在FreeBSD下有兩種類型的PPP,在這裡為簡單起見使用用戶級PPP(User-PPP),因為
內核級PPP(Kernel-PPP)需要更多設定配置方面的工作。 

當然在開始之前弄清設備所用的硬件資源可使工作事半功倍。為此,需要了解以下內容: 

     調制解調器所用端口及速率(我假設為所用端口為串口1、速率為115200) 
     上網的賬號及口令 
     ISP分配的靜態IP地址(如為動態分配則無須知道) 

現在要根據這些資料來配置並編譯新的內核以支持用戶級PPP和防火牆功能,在內核配置
文件中加入以下內容:


options IPFIREWALL #防火牆功能
options IPDIVERT #轉移套接字(支持NAT)
# 串(COM)口
device sio0 at isa? port "IO_COM1" flags 0x10 tty irq 4
# 偽設備 - 數字說明分配之單元數
pseudo-device tun 1 # 分組隧道 

編譯完新內核,就可以根據需要修改/etc/ppp/ppp.conf文件了(相應的防火牆功能稍配置),
該文件的樣本如下:


default: 

set device /dev/cuaa0
set log Phase Chat LCP IPCP CCP tun command
set speed 115200
set dial "ABORT BUSY ABORT NO\\sCARRIER TIMEOUT 5 \"\" AT OK-AT-OK ATE1Q0 OK \\dATDT\ \T
TIMEOUT 40 CONNECT" 

set timeout 120
set ifaddr 10.0.0.1/0 10.0.0.2/0 255.255.255.0 0.0.0.0
add default HISADDR
enable dns
nat enable yes 

163: 

set phone 163
set authname 163
set authkey 163 

在此樣本文件中,set device說明使用的端口,在此我用了串口1;set speed說明設備使用的
速率,我用的是115200;set ifaddr說明PPP連接所用的IP地址,第一個地址為本地地址及網絡
掩碼,而第二個地址為ISP處的撥號服務器地址及掩碼。如果使用ISP動態分配的地址,就可以象
我這樣用掩碼為0的地址,它說明可以接受任何地址。否則請指定您的ISP分配的靜態地址。
nat enable yes說明該PPP撥號連接可以讓局域網絡內的其它計算機共享。它使用NAT技術將網絡
內有連接請求的主機本身的本地IP轉換為PPP連接所用的IP,從而可以訪問外部互聯網。 

適當修改可以用ppp命令來進行撥號測試了: 

#ppp
ppp > dial 163
PPP > 

當提示符由小寫變為大寫時說明已經撥號成功了,這時可以ping一下ISP處的DNS服務器地址,
看是否能通。另外還可以用netstat命令檢查網絡狀態: 

# netstat -nr
Routing tables 

Internet:

Destination         Gateway                 Flags     Refs   Use        Netif   Expire
127.0.0.1            127.0.0.1                UH        10      389        lo0
192.168               link#1                     UC        0        0            ed0
192.100.53.23    202.102.141.141    UH        1        0            tun0
192.168.0.100    52:54:4c:19:6d:d   UHLW   2        3968      ed0    1198

要掛斷退出可以在提示符下打quit命令,當然還可以用killall -INT
ppp來中止當前的連接,否則如果空閑120秒就會自動掛斷了(可以用set
timeout參數進行調整)。這樣,簡單的PPP撥號連接配置就完成了。要更多的了解配置PPP方面的
內容,可以參考Setting up User PPP(FreeBSD手冊中關用戶級PPP的設定細節)。 

使FreeBSD成為撥號網關
前面提到在/etc/ppp/ppp.conf中使用nat enable
yes可以讓網絡內其它主機共享此PPP撥號連接,當然要達到這樣效果,還必須讓FreeBSD成為
網關以允許轉發IP數據包,所以在/etc/rc.conf文件中加入: 

gateway_enable=YES 

然重新啟動系統使其生效,當然,如果不想重啟,可以用以下命令: 

sysctl -w net.inet.ip.forwarding=1 

注意:PPP撥號會修改路由表,為使路由穩定,系統不能啟動動態路由守護程序,如routed或
gated,因為它們會動態修改路由表。 

設置緩沖型DNS
為了對網內計算機查詢域名進行緩沖,首先修改/etc/resolv.conf,因為PPP的enable
dns參數會為系統設定從ISP處獲得的域名服務器,要使系統優先使用本地域名服務器才能發揮
緩沖型DNS的特性,這時可以把其它服務器作為備: 

domain meaculpa.net
nameserver 127.0.0.1
nameserver 202.102.14.141
nameserver 202.102.15.162 

以上添加127.0.0.1作為首域名服務器。然用/etc/namedb/make-localhost產生適合本機的
localhost.rev文件。注意,make-localhost腳本屬性為644,需以root身份將其改為744才能運行。 

接著修改/etc/namedb/named.conf,以使BIND運行為緩沖方式,樣本如下: 

options {
directory "/etc/namedb";
forward only;
forwarders {
202.102.14.141;
};
}; 

zone "." {
type hint;
file "named.root";
}; 

zone "0.0.127.IN-ADDR.ARPA" {
type master;
file "localhost.rev";
}; 

如使用BIND4則修改named.boot,樣本如下: 

directory /etc/namedb
primary 0.0.127.IN-ADDR.ARPA localhost.rev
cache . named.ca
forwarders 202.102.14.141
options forward-only 

最就可以向/etc/rc.conf文件加入以下行使域名服務啟動: 

named_enable="YES" 

這樣重啟就擁有一個緩沖型的DNS系統了,這時可以設置局域網內其它計算機的TCP/IP
屬性,將DNS服務器指向該系統以利用其特性。 

安裝Squid
為了改善慢速的撥號連接並阻塞內部計算機直接訪問外部網站,可以安裝一套代理/緩沖
系統並添加一定的防火牆規則。 

在FreeBSD上我用了Squid這套軟件,當然可以有兩種安裝方法,一是用現成的tgz包,打
pkg_add命令就可以方便地裝好了;另外就是到http://squid.nlanr.net/下載合適的版本
(這裡用了squid21)到FreeBSD的ports目錄裡自己編譯安裝,如: 

cd /usr/ports/www/squid21;make install 

建立Cache系統
接下來首先需要建立Cache目錄。缺省會使用100M的磁盤空間,建議專門分一個區給它使用,
如/cache。如果您想調整此Cache目錄的大小,可以適當修改
/usr/local/etc/squid/squid.conf文件。 

在完成對其配置文件的修改進行首次運行時,必須以root身份建立Cache目錄: 

# /usr/local/sbin/squid -z 

如果得到“Permission denied”的出錯信息,如: 

09:09:29| Creating Swap Directories FATAL: Failed to make swap directory 
      /usr/local/squid/cache/00: (13) Permission denied
Squid Cache (Version 2.1):Terminated abnormally. CPU Usage: 0.022 seconds 
      Maximum Resident Size: 1000 KB Page faults with physical i/o: 0 

則可能是以下原因之一: 

     磁盤上沒有空間了。
     (對此我無能為力) 
     沒有建立/usr/local/squid/logs/目錄。
     (手工建一個嘛) 
     您的/usr/local/squid/logs/cache.log文件屬root。
     (可以用這條命令“chown nobody.nogroup
     /usr/local/squid/logs/cache.log”改一下,另外../log和../cache目錄裡的
     所有文件都要有此屬性。) 

是我查了一下這些目錄中的文件,的確都屬root,所以我用了這兩條命令: 

# chown nobody.nogroup /usr/local/squid/logs
# chown nobody.nogroup /usr/local/squid/cache 

然再試一下建立Cache目錄: 

# /usr/local/sbin/squid -z 
2001/01/01 09:14:32| Creating Swap Directories 

這次運行順利! 

測試
在IE的選項->連接選項卡中設好代理服務器的地址和端口(3128),接著用squid的
調試/測試模式進行試運行: 

# /usr/local/sbin/squid -NCd1
09:30:54| Starting Squid Cache version 2.1 for i386--freebsd3.2...
09:30:54| Process ID 1026
09:30:54| With 1064 file descriptors available
09:30:54| Performing DNS Tests...
09:30:54| Successful DNS name lookup tests...
09:30:54| helperOpenServers: Starting 5 'dnsserver' processes
09:30:54| Unlinkd pipe opened on FD 13
09:30:54| Swap maxSize 102400 KB, estimated 7876 objects
09:30:54| Target number of buckets: 157
09:30:54| Using 8192 Store buckets, replacement runs every 10 seconds
09:30:54| Max Mem size: 8192 KB
09:30:54| Max Swap size: 102400 KB
09:30:54| Rebuilding storage in Cache Dir #0 (DIRTY)
09:30:54| Loaded Icons.
09:30:54| Accepting HTTP connections on port 3128, FD 35.
09:30:54| Accepting ICP messages on port 3130, FD 36.
09:30:54| Ready to serve requests.
09:30:54| storeRebuildFromDirectory: DIR #0 done!
09:32:10| Finished rebuilding storage disk.
09:32:10| 0 Entries read from previous logfile.
09:32:10| 0 Entries scanned from swap files.
09:32:10| 0 Invalid entries.
09:32:10| 0 With invalid flags.
09:32:10| 0 Objects loaded.
09:32:10| 0 Objects expired.
09:32:10| 0 Objects cancelled.
09:32:10| 0 Duplicate URLs purged.
09:32:10| 0 Swapfile clashes avoided.
09:32:10| Took 76 seconds ( 0.0 objects/sec).
09:32:10| Beginning Validation Procedure
09:32:10| storeLateRelease: released 0 objects
09:32:11| Completed Validation Procedure
09:32:11| Validated 0 Entries
09:32:11| store_swap_size = 21k
09:32:31| parseHttpRequest: Unsupported method 'PROPFIND'
09:32:31| clientReadRequest: FD 14 Invalid Request 

(用Ctl+C中止squid) 

09:33:44| Preparing for shutdown after 8 requests
09:33:44| Waiting 0 seconds for active connections to finish
09:33:44| FD 35 Closing HTTP connection
09:33:45| Shutting down...
09:33:45| FD 36 Closing ICP connection
09:33:45| Closing unlinkd pipe on FD 13
09:33:45| storeDirWriteCleanLogs: Starting...
09:33:45| Finished. Wrote 0 entries.
09:33:45| Took 0 seconds ( 0.0 entries/sec). 

對/usr/local/etc/squid/squid.conf文件進行修改以允許適當的主機使用代理服務,
為此加入以下三條: 

acl ourhosts src 192.168.0.0/255.255.255.0 #定義可以使用代理服務的主機地址范圍及組名
http_access allow ourhosts    #允許此組訪問http
http_access deny all    #禁止其它所有主機訪問http 

重新啟動squid,並用IE進行測試,結果很順利: 

# /usr/local/sbin/squid -NCd1 

最檢查一下/usr/local/etc/rc.d目錄中是否有它的啟動腳本squid.sh,
如沒有可參照以下內容建一個: 

#!/bin/sh
if [ -x /usr/local/sbin/RunCache -a -f /usr/local/etc/squid/squid.conf ]; then
(cd /tmp; /usr/local/sbin/RunCache >/dev/null 2>&1 &) ; echo -n ' squid'
fi 

防止用戶繞過代理服務器
好了,現在已經初步架好了squid(該服務器軟件有非常之多的配置選項,可根據需要修改
/usr/local/etc/squid/squid.conf配置文件),緊接著的問題就是如何讓用戶只能通過代
理服務器訪問互聯網,而不能繞過它,也就是說要阻塞端口80。為此可以在系統的防火牆
規則中加入一些內容,假定ed0是網卡設備,規則添加如下: 

#/sbin/ipfw add 200 deny tcp from any to any 80 via ed0
#/sbin/ipfw add 300 deny udp from any to any 80 via ed0 

當然,可以將這些規則放入系統的啟動文件中,FreeBSD已經具有載入過濾規則的相應文件
/etc/rc.firewall,要使用它只要在/etc/rc.conf文件中設置以下參數:


firewall_enable=YES
firewall_type="UNKNOWN" 

這時,除了把它們添加到已有的規則模板以適應少量修改之外,還可以把它們與其它一些您
自定義的規則放入一個外部文件中,然把firewall_type的值(默認的/etc/rc.firewall文件
已定義了幾種類型可作為此參數的值)改為此文件的全路徑名,這樣系統就會在啟動時用ipfw
自動執行這些規則。

代收郵件
通過安裝並配置Fetchmail和Qpopper這兩個軟件可以為局域網中其它用戶代收他們的外部電子郵件: 

#pkg_add qpopper-2.53.tgz
#pkg_add fetchmail-5.2.0.tgz 

修改/etc/inetd.conf,去掉下面這條行首的#號: 

pop3 stream tcp nowait root /usr/local/libexec/popper popper 

然用以下方法重啟inetd以提供pop3服務: 

#ps -acx | grep inetd
165 ? I 0.12 inetd
#kill -HUP 165 

用戶級PPP包含一個/etc/ppp/ppp.linkup這樣的文件,用在撥號成功之運行一行東東,
就象自動批處理文件一樣,現在向這個文件中加入下面的內容: 

163:
!bg sh -c "fetchmail -f /root/.fetchmailrc" 

這樣就會在PPP撥號連接自動台運行Fetchmail收信了,至收信的具體配置,需要在
.fetchmailrc中定義,我把該文件放在/root目錄下並chmod為700,以防止其它用戶讀取
該文件中的信箱賬號及口令。其具體設置樣本如下:


poll mail-meaculpa via pop.server1.com
protocol pop3
preauth password
username meaculpa here is mea there
password "123abc"
pass8bits
fetchall 

poll mail-user via pop.server2.com
protocol pop3
preauth password
username user here is mike there
password "456def"
pass8bits
fetchall 

其中via的名稱為pop3郵件服務器名;protocol用來說明使用的協議;authenticate用來
說明驗証方式;here前的名稱為本地用戶郵箱賬號;there前的名稱為遠程用戶郵箱賬號;
password說明遠程賬號對應的口令,其中如包含數字等特殊字符需要加引號;pass8bits
說明收到的郵件中含有8位字符,這對我們中文的郵件非常關鍵;最的fetchall說明
全部收取。關Fetchmail的詳細說明請用man fetchmail命令。 

這樣,當Fetchmail讀取該配置文件即會收取對應的兩個用戶的外部郵件,並轉存到其
本地郵箱中,用戶可以在自己的計算機中使用pop3方式連到撥號網關計算機進行收信,
以便統一管理。 

-- 錯誤在所難免,歡迎批評指正 

-----------------------------------------
對 "FreeBSD建立撥號網關" 一點補充
-----------------------------------------
"chengc" chengc@263.net

                                              
在 FreeBSD 機器上設置如下規則,可使客戶機只設置 FreeBSD 機器為網關就
可以訪問 iNET(透明代理)
 
ipfw add 49  allow tcp from 192.168.0.200 to any
ipfw add 50 fwd 127.0.0.1,3128 tcp from any to any 80
 
修改 squid.conf
 
http_port 3128
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on



(http://www.fanqiang.com)
    進入【UNIX論壇

相關文章
SUN工作站在網絡中的深入應用:將SOLARIS設置成PPP撥入服務器 (2001-10-15 10:00:02)
RedHat6.2服務器配置方案大全--第七章 PPP (2001-09-28 15:00:00)
FreeBSD下PPPoE的設置 (2001-09-04 12:00:01)
網絡管理員指南 -8.點到點協議-10>配置一個PPP服務器 (2001-07-13 17:04:00)
網絡管理員指南 -8.點到點協議-9>PPP的授權 -3)PAP密碼文件 (2001-07-13 16:10:00)
網絡管理員指南 -8.點到點協議-9>PPP的授權 -2)CHAP密碼文件 (2001-07-13 15:00:00)
網絡管理員指南 -8.點到點協議-9>PPP的授權 -1)PAP與CHAP的比較 (2001-07-13 14:08:00)
網絡管理員指南 -8.點到點協議-5>調試你的PPP設置 (2001-07-13 08:10:00)
網絡管理員指南 -8.點到點協議-2>打開PPP,運行PPPD (2001-07-12 21:04:00)
網絡管理員指南 -5.設置TCP/IP網絡 -6>為IP的接口配置 -5)PLIP,SLIP 和 PPP 接口 (2001-07-11 16:10:00)

===更多相關===
 

★  樊強制作 歡迎分享  ★