FreeBSD 的主機可以當作某個網路上的路由器 (router) 嗎 ?
由於網際網路的標準化和程式設計的充分經驗之賜,我們
能夠在 FreeBSD 系統內建封包轉傳 (packet fowarding) 的功能。你可以
將這個功能打開,只要將這個變數設定為
這個檔案中
gateway_enable=YES # Set to YES if this host will be a gateway
這個選項會將 變數設定
在大部分的狀況下, 你還必須再跑一個處理 routing 的程式,告訴網路上的其他
主機關於你的 router 設定的資料; FreeBSD
出廠時便內附一個標準的 BSD routing 程式
, 如果你的網路設定更為複雜,你可以試試看
我們有必要告訴你,就算是 FreeBSD 以這種方式設定完成
, 它還是無法完全滿足 Internet 對 router 的標準定義
;不過, 就日常使用而言它已經足夠應付使用者的需求了。
我可以透過 FreeBSD 將我的 Win95 機器連上 Internet 嗎?
基本上, 會問這種問題的人在家裡至少有兩台電腦, 一台跑 FreeBSD
另外一台跑 Win95; 這個主意是將 FreeBSD 主機連上 Internet
,然後透過這台 FreeBSD 主機,讓跑 Win95 的電腦能夠上網。
這個問題算是前一個問題的一個特例。
這邊有重要的文件,教你怎麼把 FreeBSD 的主機設定成
或是
在你的 FreeBSD 主機上。
另外可以參考 [.
]
為什麼我在 compile ISC 最新版的 BIND 程式時老是失敗?
在 ``compat/include/sys/cdefs.h 砍掉就可以了。
FreeBSD 支援 SLIP 和 PPP 嗎?
是的。 你可以查查 man pages 中關於
, ,
以及
的說明.
專門處理有關撥入的功能,而
處理有關撥出的功能。
這些程式有詳細的說明,你可以在
中找到:
如果你只能藉由"shell account"的方式上網的話,
你可能會想看看
這個軟體。 它可以讓你的電腦直接連上 (某些) 服務,
例如 ftp 和 http 等等。
FreeBSD 支援 NAT 或 Masquerading 嗎?
如果你有一個近端的子網路(有一台以上的機器), 但是你的 Internet provider
卻只分配一個 IP number 給你
(或者你只分配到一個動態的 IP number), 你可以參考
這個程式。 這個程式也提供類似的功能 , 如果你下
在這兩個處理方式中都會被使用到。
我不能使用 ppp ,我做錯了什麼嗎 ?
你應該先看看 和
。使用以下指令來打開記錄 (logging) 的功能
set log Phase Chat Connect Carrier lcp ipcp ccp command
這個命令可以在 /etc/ppp/ppp.conf
組態檔案中加入。
(加在 default section 的開頭最好).
確定在 裡面有這麼一行:
!ppp
*.* /var/log/ppp.log
而且/var/log/ppp.log 這個檔案存在。 如此一來
你可以從 log 檔案中知道到底發生了什麼事情。
先不用擔心檔案的內容你看不懂, 如果你要向人求救的話
, 救你的人會看得懂的。
如果你系統上的那份 ppp 不提供 "set log"
的指令的話, 你應該去下載
.
這個版本在 FreeBSD 2.1.5 以上的版本都可以使用。
我一執行 ppp ,它就掛在那邊不動了
會發生這種情形通常是你的 hostname 沒有辦法解出來。 解決這個問題
最好的辦法是確定 /etc/hosts 會被你的 resolver 第一個參考到。
你可以修改/etc/host.conf
並且把hosts 放到最前面. 接著, 只要把你的機器名稱放到
/etc/hosts 裡面就可以了。 如果你沒有
local network 的話, 修改 localhost 這一行:
127.0.0.1 foo.bar.com foo localhost
否則, 就把你主機的資訊加入檔案中。 你可以參考
相關的 man pages 以獲得進一步的資訊。
如果你順利的完成這些動作, 你應該可以成功的執行 ping -c1 `hostname`
.
Ppp 在 -auto 模式下不能撥號
首先確定你的內定路由 (default route) 是否有設定。 下
name="netstat -rn"> 這個指令, 你應該能夠看到如以下範例的兩個 entries :
Destination Gateway Flags Refs Use Netif Expire
default 10.0.0.2 UGSc 0 0 tun0
10.0.0.2 10.0.0.1 UH 0 0 tun0
這些設定是假設您使用的 address 跟 handbook 裡面的、或是 man
page 的範例、或者和 ppp.conf.sample 裡的設定相同。如果您沒有設定
default route,那麼有可能您現在使用舊版本的 ,舊的
ppp 會看不懂 ppp.conf 裡的
add 0 0 HISADDR
成為
add 0 0 10.0.0.2
default route 這行沒有出現的另一個原因是你設錯了 default
router,這個設定在 檔案中(這個檔案在 release 2.2.2 前叫
/etc/sysconfig ),你需要在 ppp.conf 中加入這
麼一行
delete ALL
如果發生這種情形, 回到 handbook
的說明中查詢。
什麼叫做 "No route to host"
這個狀況通常是因為缺少了這段設定
MYADDR:
delete ALL
add 0 0 HISADDR
請檢查您的 /etc/ppp/ppp.linkup 檔案中是否有這些設定。
只有在您使用動態 IP(dynamic IP) 或不知道您 gateway 的 IP 時才需要
設定這個。如果您是使用 interactive mode 的話, 您可以在進入 packet
mode 後輸入如下命令(如果 ppp 提示符號變成大寫的
delete ALL
add 0 0 HISADDR
您可以參考 handbook 中
的部份,有較詳盡的說明。
我的連線在三分鐘後自動斷掉了
ppp 預設的 timeout 值是三分鐘。可以用以下這行命令調整
set timeout NNN
這代表如果在 ppp.conf
這個檔案裡面,或是在
interactive mode 裡面輸入這個指令,也可以用 或
連到 man page
以獲得更詳盡的資料.
我的連線因為負荷太重而斷線
如果您設定要用 Link Quality Reporting(LQR),您和對方主機之間就
有可能遺失太多的 LQR 封包。Ppp 會因此判斷電話線路有問題,然後就會
切斷連線。在 FreeBSD 2.2.5 版以前,內定會使用 LQR,現在的內定值是
不用。LQR 可以用這一行命令取消
disable lqr
ppp 會不定時的斷線
有時候如果線路上有太多雜訊,甚至如果您使用了電話插撥服務的話,
您的數據機將會掛斷電話,因為它誤認這些訊息是 lost carrier。
大部分的數據機都有容忍暫時失去 carrier 的設定。以 USR Sportster
為例,失去 carrier 和掛斷電話之間的時間,是以 1/10 秒為單位存在
S10 暫存器中。如果要讓您的數據機能容忍更長的時間,你可以在 dial
string 裡面加入以下 "送出命令 - 等待字串" 的部份:
set dial "...... ATS10=10 OK ......"
參考數據機內附的說明書以取得更詳細的資料。
連線會不定時當掉
許多人的連線會毫無來由的卡住,首先要做的是找出連線那一方當掉。
如果用的是外接數據機,就用 知道是本地或對方出問題後,就有兩種可能:
對方的機器沒有回應
在這方面能作的相當有限,大部份的 ISP 會因為你不是用 Microsoft
作業系統而不願幫忙。可以在 首先,用下面兩道命令關掉所有本地的壓縮功能:
disable pred1 deflate deflate24 protocomp acfcomp shortseq vj
deny pred1 deflate deflate24 protocomp acfcomp shortseq vj
然後重新連線,確定這樣不會有所不同。如果反而有進步或甚至將問題
解決掉,就用試誤法來找出是那個設定造成的。這樣在聯絡 ISP 時就可以
提供相當有用的資料(雖然會很容易看出你不是用 Microsoft 的產品)。
在聯絡 ISP 之前,打開本地的非同步記錄功能,接著就等連線再度當掉,
這可能會用到相當大的硬碟空間。最後從連接埠讀進的資料可能會相當有用,
它通常是 ASCII 文字,甚至有可能會說明問題出在那裡(``Memory fault,
core dumped''?)。
如果 ISP 願意協助的話,應該會在他們那一端也打開記錄功能,那麼在
下次連線當掉時,就可以告訴你為何會出問題。很歡迎將詳細內容送到 ,甚至要
求 ISP 直接向我連絡。
自己的 Ppp 當掉了
這裡能做的最多就是重新編譯 ppp:在 Makefile 最後面加上
將結果送到 .
在看到 Login OK! 的訊息以後就沒有反應了
在 FreeBSD 2.2.5 以前的版本上,一旦連線建立完成以後,
會等對方的機器啟動 Line Control Protocol (LCP)。很多 ISP 不會自動
啟動,而是等待由 client 端來啟動。要強迫
set openmode active
我一直看到 magic being the same 的錯誤訊息
有時就在連上之後,在記錄檔會看到 "magic is the same" 的訊息。通
常這些是無害的,有時候某一端則會斷線。大多數的 ppp 實作無法解決這個
問題,就算似乎連上了,在記錄檔也可以看到一直重複的 configure request
和 configure acknowledgement 之類的溝通訊息,ppp 最後會放棄而關掉連
線。
會發生這種問題的通常情況是,伺服器用速度慢的硬碟、在通訊埠上執行
getty、並且等到使用者登入後才用 script 或程式執行 ppp;也有聽說用
slirp 就一定會發生類似問題的報告。原因是在 getty 結束和 ppp 開始執行
的這段時間內,client 端的 ppp 開始送出 Line Control Protocol(LCP) 封
包,由於伺服器通訊埠的 ECHO 仍在打開狀態,client 端的 ppp 就會看到送
出去的封包被 "反彈" 回來。
在用 LCP 溝通時,有部份是要連線兩邊分別建立自己的 magic number,
來偵測及避免封包被 "反彈" 回來的狀況。協定標準中說當對方試圖用和自己
相同的 magic number 溝通時,要送給對方一個 NAK 的訊號(表示不接受),
接著對方就會選另一個數字。但在伺服器通訊埠 ECHO 仍打開的這段期間,
client 端的 ppp 送出 LCP 封包,看到相同的 magic number,於是送出
NAK 訊號。這個 NAK 也會被 "反彈" 回來,被誤認由對方送出,因此 client
端會改變自己的 magic number。這樣 magic number 的變動次數會非常地多,
並且也全都存在對方的終端機緩衝區中。當伺服器啟動 ppp 時,它馬上就
被 magic number 的大量更動所淹沒,並且(幾乎是立刻)決定已經試夠了
LCP 而放棄;在這期間,client 端雖然再也看不到被反彈的封包,但卻來得
及看到伺服器把電話線掛掉。
允許讓對方來作 LCP 溝通可以避免這種情形,在 ppp.conf 中加下面這
一行:
set openmode passive
這行告訴 ppp 由對方來啟動 LCP,不過有些伺服器永遠都不會主動溝通
,在這種情況下,可以這麼設定:
set openmode active 3
這是要 ppp 等個三秒鐘,然後再開始送 LCP 相關要求。如果對方在這
段時間送出 LCP 封包,ppp 就不會等足三秒而立刻回應。
LCP 的溝通一直到連線關閉才結束
目前 假設有兩端 這種惡性循環會一直持續著,直到有一方發現自己在原地打轉而放棄繼續
下去。
避免這種情況的最好方式,是將某一端設成
set openmode passive
用這個選項時要小心,應該和這個命令一起用:
set stopped N
這會設定
set openmode active N
其中
Ppp 在連線後就卡住了
在 FreeBSD 2.2.5 之前的版本,有可能因為
disable pred1
用 shell 跳出 Ppp 做測試時,連線似乎卡住了
在用 如果想執行程式,用
在 null-modem 線上建立的 Ppp 好像不會自動斷線
由於 null-modem 本身用的線材,
enable lqr
內定是會接受 LQR,如果對方用它來溝通的話。
為什麼 ppp 在 -auto 模式下會無緣無故播號?
如果 要找出原因,先用這個命令:
set log +tcp/ip
這樣會記錄經由連線的所有資料。下次如果又無故播號,就可以從記錄
旁邊的時間很快找到原因。
現在可以避免因為這些原因播號。通常是在作 DNS 查詢時才會發生這種
問題,要避免因 DNS 查詢而連線(這樣
set dfilter 1 deny udp src eq 53
set dfilter 2 deny udp dst eq 53
set dfilter 3 permit 0/0 0/0
這種做法並不永遠適用,因為它事實上使得你無法用 demand-dial 功能
- 大部份程式在做網路相關動作前都會用到 DNS 查詢。
在 DNS 這個情況下,應該試著找出到底是誰想要解出主機名稱,通常幾
乎都是由 所造成,所以要在 sendmail 設定檔中指示它不要做任何
DNS 查詢。在 [中有詳細說明如何作出
自己的設定檔、及裡面應該放那些設定,你也許想要將下一行加入 ]
define(`confDELIVERY_MODE', `d')dnl
這會使 sendmail 先擋著所有信件,直到送信時再一齊送出去(通常
sendmail 執行時是用 ``-bd -q30m'' 這個參數,告訴它每三十分鐘才送信)
或是有人執行 ``sendmail -q''(也許可以放在 ppp.linkup 裡)。
這些 CCP 錯誤訊息是指?
我在 log 檔一直看到這些錯誤訊息:
CCP: CcpSendConfigReq
CCP: Received Terminate Ack (1) state = Req-Sent (6)
這是因為 ppp 試圖作 Predictor1 壓縮方面的溝通,但對方的機器卻完
全不用壓縮功能。這些訊息是無害的,但如果不想看到它的話,可以把本地
ppp 的 Predictor1 壓縮也一起關掉:
disable pred1
傳檔案時發生 IO 錯誤,然後 Ppp 就掛掉了
在 FreeBSD 2.2.2 及先前的版本中,tun 的驅動程式有個問題,它不會
接收那些大過 tun 介面 MTU 的封包。如果收到比 MTU 大的封包,它會用
syslogd 記錄為 IO 錯誤。
但 ppp 規格中有提到,不管 LCP 溝通的結果如何,MRU 最小的可接受
值永遠 是 1500。所以有可能你不小心將 MTU 調低於 1500,ISP
會不理它而送出 1500 大小的封包,然後就會觸發上述的 "功能"。
在 FreeBSD 2.2.2 及之前的版本中,永遠不要將 MTU 調低於 1500,就
可以解決這個問題。
為什麼 ppp 不會記錄我的連線速度?
如果要記錄電腦和數據機間的每一行 ``對話'',用下一行打開:
set log +connect
這會使 記錄所有資料,直到播號字串最後一個等待的數據機傳回值
為止。
如果使用 PAP 或 CHAP (因為沒有 "set login" 命令,所以設定檔中
CONNECT 之後就不會看到任何對話),想要看到連線速度的話,確定 ppp
等待的數據機傳回值是 CONNECT 這一整行,像這樣:
set dial "ABORT BUSY ABORT NO\\sCARRIER TIMEOUT 4 \"\" ATZ OK-ATZ-OK ATDT\\T TIMEOUT 60 CONNECT \\c \\n"
這樣在看到 CONNECT 後不會送出任何東西,接著再等個換行字元,強
迫
Ppp 不理會 chat script 中的 `\' 字元
Ppp 會去分析設定檔中的每一行,這樣它才會正確解讀像是
當解譯程式分析每個參數時,為了找出字串中所有像是 ``\P'' ``\T''
的跳脫字元(見 man page),必須重新解譯該參數。在這種雙重分析之下,
你必須記得用正確的跳脫數目。
假設要對數據機送出 ``\'' 這個字元,應該像是:
set dial "\"\" ATZ OK-ATZ-OK AT\\\\X OK"
這樣則會得到下面這串:
ATZ
OK
AT\X
OK
如果是
set phone 1234567
set dial "\"\" ATZ OK ATDT\\T"
則會得到下面結果:
ATZ
OK
ATDT1234567
Ppp 碰到了 seg-fault,但找不到
Ppp (或任何類似的程式) 應該不可能有 core dump。由於 ppp 執行時
的 effective user id 是 0 (即以 root 身份執行),作業系統在終止 ppp
前不會對磁碟寫它的 core 映像檔。如果 ppp
$ tar xfz ppp-*.src.tar.gz
$ cd ppp*/ppp
$ echo STRIP= >>Makefile
$ echo CFLAGS+=-g >>Makefile
$ make clean all
$ su
# make install
# chmod 555 /usr/sbin/ppp
你現在已經裝上可以用來除錯的 ppp 版本,由於權限上沒有作特別設定,
所以必須以 root 來執行 ppp,順便也要注意是在那個目錄執行的。
現在如果 ppp 碰到了 segmentation violation,就會將 coredump 存在
ppp.core 檔中,接下來就是:
$ su
# gdb /usr/sbin/ppp ppp.core
(gdb) bt
.....
(gdb) f 0
.....
(gdb) i args
.....
(gdb) l
.....
根據你的問題來取得相關資料,就可以診斷問題出在那裡。
如果熟悉 gdb,也許會想找出其他的詳細資料,像是那個動作造成
dump、及相關變數的位址及數值等。
在 -auto 模式下,使 ppp 播號的程式在連線後卻連不到目的地
這是設定 當用到網路的程式呼叫
時,socket endpoint 會設成 tun 這個界面的 IP,kernel 接著產生要送出
去的第一個封包,把它傳給 tun,理論上,有好幾種方法可以解決這個問題。如果 ISP 願意每次都提供相同
IP 當然是最好 從 client 端最容易的解決方式是,永遠都不要改變 tun 界面的 IP 值,
但是將所有出去的封包來源 IP 從原先的 tun 界面 IP 改為連線時取得的
IP,基本上這就是最新版 和執行 ppp 時的 另一種方法(可能是最可靠)是寫個可以修改所有 socket endpoint 值的
system call。當拿到新的 IP 時,還有一個可能則是允許不用 IP,就可以啟用某個網路界面。送出去的封包
來源 IP 會設成 255.255.255.255,直到 SIOCAIFADDR 這個 ioctl 第一次執
行完成為止。這樣會完全連結 socket 的兩端,而由
為何玩大多數遊戲時,都不能使用 -alias 這個參數?
遊戲或類似程式不能和 libalias 搭配使用的原因是,外面的機器試著對
著內部的機器開啟連線、或(不請自來地)送出 UDP 封包,而 alias 封包的
軟體不知道它應該把這些封包送到裡面的機器去。
解決的方式是,先確定現在只有執行那個會出問題的程式,然後在
gateway 機器上對 tun 界面執行 tcpdump、或在上面打開記錄 tcp/ip 的功
能(``set log +tcp/ip'')。
在啟動出問題的程式時,應該會在 gateway 機器上看到有封包通過,當外
界有傳回封包時則會被丟掉(這就是問題所在)。記下這些封包要送到目的地
的那個埠,然後關掉程式。重複幾次,看看是否都要送到同樣固定的埠,如果
是的話,在 /etc/ppp/ppp.conf 相關位置加上這一行,就可使程式正確運作:
alias port proto internalmachine:port port
其中 ``proto'' 是 ``tcp'' 或 ``udp'',``internalmachine'' 是要接
收這些封包的機器,``port'' 則是這些封包要送到那個埠。
如果要在其他機器上執行同樣程式,必須重複同樣過程修改上一行設定,
否則就不能正常使用;也不可能在兩台內部機器上同時使用-畢竟外界只是把
這個內部網路看成一台機器而已。
如果封包不一定送到同樣的埠,你有三種選擇:
1) 在 libalias 加入對它的支援,
/usr/src/lib/libalias/alias_*.c 有一些 ``特例'' 的示範(alias_ftp.c
是個不錯的原型檔)。通常是讀取某些可以認得出的外送封包,找出要外面連
到內部機器某個埠的指令,然後在 alias 表中設定 ``route'',以後再收到
這種封包就知道要往那裡送。
這是最困難的解法,但也是最好的,並且還可以在多台機器上用同樣程式。
2) 使用 proxy。舉例來說,該應用程式也許支援 socks5,或是
有個 ``passive'' 的選項(像是 ``cvsup'')可以避免對方向內部機器提出
連線的要求。
3) 用 ``alias addr'' 把所有資料都轉給內部機器,這是最後
才用的暴力法。
那裡可以找到常用埠的列表?
現在還沒有,但可以將這些弄成一個名單(如果有人感興趣的話)。
在下面的例子裡,把 internal 換成玩遊戲那台機器的 IP。
Quake
alias port udp internal:6112 6112
如果想用其他方式,
有 Quake 對 proxy 支援的說明。
Quake 2
alias port udp internal:27901 27910
紅色警戒(Red Alert)
alias port udp internal:8675 8675
alias port udp internal:5009 5009
Half Life
alias port udp internal:27005 27015
PCAnywhere 8.0
alias port udp internal:5632 5632
alias port tcp internal:5631 5631
什麼是 FCS 錯誤?
FCS 是 show hdlc
便可看到 HDLC 裡的各種錯誤計數值。
不良線路(或封包被串列埠的驅動程式丟掉)有時候就會發生 FCS 錯誤,
雖然它的確會大大拖慢壓縮協定,不過通常這沒什麼大不了。如果你用的
是外接數據機,確定有保護線路不受外界干擾 - 這樣說不定就解決了。
如果在連上時馬上就凍住、並且還看到一大堆 FCS 錯誤的話,有可能
是因為你的連線並非是 8 bit clean。確定數據機不是用軟體流程控制
(XON/XOFF),如果你的連線一定 要用軟體流程控制的話,用
set accmap 0x000a0000 這道命令告訴 ppp 跳過 ^Q
和 ^S 這兩個字元。
看到一大堆 FCS 錯誤的另一個原因,是連線另一端不再使用 close lcp
、接著 term 就可以重新連接到對
方機器的 shell 下,而不用掛掉電話線。
如果記錄檔裡沒有任何資訊可以指示連線為何斷掉,那麼就該問問另一
端的管理員(你的 ISP?) 怎麼會這樣結束。
沒有一個方法可以用,我完蛋了啦!
如果上面說的都沒用,就盡可能找出所有資訊,這包括了設定檔、如何
啟動
輸出結果,把這些送到 mailing list 或
newsgroup,這樣應該就會有人指點
正確的方向。
我沒有辦法建立 /dev/ed0 這個 device!
在 Berkeley 網路架構中, 只有 kernel 程式碼可以直接存取網路界面卡.
請參考 /etc/rc.network 這個檔案和 manual pages 取得與其他不同網路程式
更進一步的資訊. 如果你覺得你完全搞混了的話, 您應該找一本與其他 BSD 相關
作業系統網路管理有關書來參考; 除了少數顯著的不同外, FreeBSD 的網路管理
基本上和 SunOS 4.0 和 Ultrix 是一樣的.
我如何建立 Ethernet aliases?
把 ``
命令列中,例如:
ifconfig ed0 alias 204.141.95.2 netmask 0xffffffff
我如何指定我的 3C503 使用其他不同的的 network port?
如果您想使用其他的 port, 你必須在
的命令中指定額外的參數. 內定的
port 是 ``.
我在連上/輸出 FreeBSD 的 NFS 時出現問題.
某些 PC 的網路卡比其他的好(含蓄的說來)
這種狀況在造成 NFS 這種對網路敏感的程式有時會出現問題.
參考
以獲得這個主題的更多資訊.
為什麼我不能 NFS-mount Linux 的機器?
某些版本的 Linux NFS 程式碼只接受 privileged port 的 mount request
; 試用這行指令看看
mount -o -P linuxbox:/blah /mnt
W為什麼我不能 NFS-mount Sun 的機器?
跑 SunOS 4.X 的 Sun 工作站只接受來自 privileged port 的 mount request
; 試用這行指令看看
mount -o -P sunbox:/blah /mnt
我在使用 PPP 連線到 NeXTStep 機器時有問題.
把 TCP extensions 取消, 這個設定在 裡面.
把以下這個值設成 NO:
tcp_extensions=NO
Xylogic 的 Annex 主機也有相同的問題,您要做相同的修改才能連上
這些主機.
我要怎樣才能把 IP multicast support 打開?
Multicast host operations are fully supported in FreeBSD 2.0 and
later by default. 如果您想將您的主機設定成 multicast router 的話,
您必須重新 compile 您的 kernel, 加入 MROUTING
的選項,並且執行 /etc/rc.conf 裡面的
MBONE 的各種工具可以在他們 ports 下所屬叫做 mbone目錄中找到.
如果您在找視訊會議的工具如 如果需要更進一部的訊息,找找
.
哪些網路卡是使用 DEC PCI chipset?
以下是 提供的清單:
Vendor Model
----------------------------------------------
ASUS PCI-L101-TB
Accton ENI1203
Cogent EM960PCI
Compex ENET32-PCI
D-Link DE-530
Dayna DP1203, DP2100
DEC DE435, DE450
Danpex EN-9400P3
JCIS Condor JC1260
Linksys EtherPCI
Mylex LNP101
SMC EtherPower 10/100 (Model 9332)
SMC EtherPower (Model 8432)
TopWare TE-3500P
Zynx ZX342
為什麼要用 FQDN 才能連到其他機器?
你也許會發現要連的機器其實是在另一個網域。舉個例子,假設你是在
foo.bar.edu 這個網域中,想要連到在 bar.edu 裡一台叫 ``mumble'' 的
機器,則必須用 Fully-Qualified Domain Name,也就是
``mumble.bar.edu'',而不是只用 ``mumble'' 來指向它。
傳統的 BSD BIND resolver 允許用這種方式解出機器的位址,但是
FreeBSD 內附 版本
的內定方式,則是除了你所在的網域以外,不支援其他非 FQDN 的縮寫。
所以如 mumble 這種不合格的機器名稱,必須在
mumble.foo.bar.edu ,否則就會從網域的最底層開始找。
這和先前的做法不同,也就是不用 mumble.bar.edu 和
mumble.edu 繼續搜尋。看一下 RFC 1535,裡面有提到為什麼之
前的做法不好,甚至算是個安全漏洞。
這裡有個不錯的解法,把
裡的這一行:
domain foo.bar.edu
換成這一行:
search foo.bar.edu bar.edu
但是要確定搜尋順序不會違反 RFC 2535 所謂的 ``boundary between local
and public administration''。
所有網路動作都會出現 ``Permission denied'' 錯誤訊息
如果在編譯 kernel 時加了 如果不小心弄錯了 firewall 的設定,以 root 身份執行這個命令,接著
網路功能就會正常:
ipfw add 65534 allow all from any to any
也可以在 /etc/rc.conf 設 "firewall_type='open'" 這個選項。
如果想知道如何設定 FreeBSD firewall,請看 。
IPFW 會造成多大的網路延遲?
這個問題的答案大多要看你怎麼訂 firewall 規則、還有 CPU 速度。對大
多數在 ethernet 上的程式及規則不多的情況下,延遲小到可以忽略。但如果
你想要精確數字來滿足好奇心,繼續往下讀。
下面是在 486-66 2.2.5-STABLE 上所作的測量,我們修改了 IPFW 原始碼
來測量在 測試了兩組,每組各有 1000 個規則。第一組重複下面規則,故意設計成
最糟的情況:
ipfw add deny tcp from any to any 55555
藉由檢查 port number,這樣會使 IPFW 在決定某個封包不符合條件前執
行大部份的檢查程式,因此造成最差的狀況。在重複這個規則 999 次後,接
著是 allow ip from any to any 。
第二組設計成以極快的速度跳過檢查規則:
ipfw add deny ip from 1.2.3.4 to 1.2.3.4
一碰到封包的來源不符合規則所述,會很快跳過檢查讓封包通過。和上面
一樣,第 1000 個規則是 allow ip from any to any 。
在第一種情況中,處理每一個封包所造成的延遲大約是 2.703 ms,所以每
個規則大概會造成 2.7 microsecond 的延遲。所以在這些規則之下,理論上每
秒最多可以處理 370 個封包。在 10Mbps ethernet 和一個封包大概 1500 byte
的假設下,大概只會用到 55.5% 的網路頻寬。
第二種情況,每個封包花了大約 1.172ms,所以每條規則大約用了 1.2
microsecond。理論上每秒最多可以處理 853 個封包,耗盡 10Mbps 的頻寬。
上面測試用到的大量規則、及這些規則本身並不代表真實世界的情況,他們
只是用來產生所表示的數據。若想要訂出一套有效率的規則,記得這幾件事:
- 在最前面放一個專門處理大量 TCP 流量的可用規則,在這條前面不
要放任何
allow tcp 的相關敘述。
- 把常常觸發的規則放在前面,不常用到的則丟到後面(
當然在不
影響 firewall 出入允許設定的前提下 )。執行 ipfw -a l
就可看到封包的統計數目,來看最常用到那些規則。
要如何把對某台機器的網路服務要求(service request)轉向到另一台?
在 ports 目錄的 sysutils 種類中有個叫 'socket' 的 package,可以幫
你轉向 FTP 或其他類似的網路服務。只要把該網路服務的命令改成呼叫 socket
即可,如下(在 /etc/inetd.conf 裡):
ftp stream tcp nowait nobody /usr/local/bin/socket socket ftp.foo.com ftp
其中 'ftp.foo.com' 和 'ftp' 分別是被轉到的機器和 port 名稱。
那裡可以找到管理頻寬的工具?
FreeBSD 上有兩套頻寬管理工具:
可以免費使用,
出的
Bandwidth Manager 則是商用軟體。
怎麼會跑出 ``/dev/bpf0: device not configured'' 這個訊息?
柏克萊封包過濾器(Berkeley Packet Filter)
在程式使用前必須在 kernel 打開它的驅動程式,把下面這一行加入 kernel
設定檔中,編個新的 kernel:
pseudo-device bpfilter # Berkeley Packet Filter+
在重新開機之後,還要做出 device node,在 /dev 下執行:
# sh MAKEDEV bpf0
如果想要更進一步知道如何做出各種 device node,請看 。