FreeBSD網關
家庭網絡結構如下: 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 -INTppp來中止當前的連接,否則如果空閒120秒就會自動掛斷了(可以用settimeout參數進行調整)。這樣,簡單的PPP撥號連接配置就完成了。要更多的了解配置PPP方面的內容,可以參考Setting up User PPP(FreeBSD手冊中關於用戶級PPP的設定細節)。
使FreeBSD成為撥號網關 前面提到在/etc/ppp/ppp.conf中使用nat enableyes可以讓網絡內其它主機共享此PPP撥號連接,當然要達到這樣效果,還必須讓FreeBSD成為網關以允許轉發IP數據包,所以在/etc/rc.conf文件中加入:
gateway_enable=YES
然後重新啟動系統使其生效,當然,如果不想重啟,可以用以下命令:
sysctl -w net.inet.ip.forwarding=1
注意:PPP撥號會修改路由表,為使路由穩定,系統不能啟動動態路由守護程序,如routed或gated,因為它們會動態修改路由表。
設置緩沖型DNS 為了對網內計算機查詢域名進行緩沖,首先修改/etc/resolv.conf,因為PPP的enabledns參數會為系統設定從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 siz