1135 lines
42 KiB
Text
1135 lines
42 KiB
Text
<!-- $FreeBSD$ -->
|
||
<!-- The FreeBSD Documentation Project -->
|
||
<!-- Translate into Chinese by wing@cc.nsysu.edu.tw, jtjang@gcn.net.tw -->
|
||
<!-- English Version: 1.20 -->
|
||
|
||
<sect>
|
||
<heading>網路設定<label id="networking"></heading>
|
||
|
||
<sect1>
|
||
<heading>我應該到哪邊找有關無磁碟開機 (diskless booting) 的資料?</heading>
|
||
|
||
<p>無磁碟開機就是讓 FreeBSD 主機從網路上開機,並且從網路上的 server 上讀取
|
||
其他必要的檔案,而非由主機的硬碟上取得這些檔案。 詳細的資料可以參考
|
||
<url url="../../handbook/diskless.html"
|
||
name="FreeBSD 手冊的無磁碟開機篇">
|
||
|
||
<sect1>
|
||
<heading>
|
||
FreeBSD 的主機可以當作某個網路上的路由器 (router) 嗎 ?
|
||
</heading>
|
||
|
||
<p>由於網際網路的標準化和程式設計的充分經驗之賜,我們
|
||
能夠在 FreeBSD 系統內建封包轉傳 (packet fowarding) 的功能。你可以
|
||
將這個功能打開,只要將這個變數設定為
|
||
<tt/YES/ 在 <htmlurl url="http://www.FreeBSD.org/cgi/man.cgi?rc.conf"
|
||
name="rc.conf">這個檔案中
|
||
|
||
<verb>
|
||
gateway_enable=YES # Set to YES if this host will be a gateway
|
||
</verb>
|
||
|
||
<p>這個選項會將 <htmlurl
|
||
url="http://www.FreeBSD.org/cgi/man.cgi?sysctl" name="sysctl"> 變數設定
|
||
<tt/net.inet.ip.forwarding/ 為 <tt/1/.
|
||
|
||
<p>在大部分的狀況下, 你還必須再跑一個處理 routing 的程式,告訴網路上的其他
|
||
主機關於你的 router 設定的資料; FreeBSD
|
||
出廠時便內附一個標準的 BSD routing 程式
|
||
<htmlurl url="http://www.FreeBSD.org/cgi/man.cgi?routed"
|
||
name="routed">, 如果你的網路設定更為複雜,你可以試試看
|
||
<em/GaTeD/ (可以以 FTP 方式由 <tt/ftp.gated.Merit.EDU/ 下載)
|
||
這個程式自 3_5Alpha7 後支援 FreeBSD .
|
||
|
||
<p>我們有必要告訴你,就算是 FreeBSD 以這種方式設定完成
|
||
, 它還是無法完全滿足 Internet 對 router 的標準定義
|
||
;不過, 就日常使用而言它已經足夠應付使用者的需求了。
|
||
|
||
<sect1>
|
||
<heading>我可以透過 FreeBSD 將我的 Win95 機器連上 Internet 嗎?</heading>
|
||
|
||
<p>基本上, 會問這種問題的人在家裡至少有兩台電腦, 一台跑 FreeBSD
|
||
另外一台跑 Win95; 這個主意是將 FreeBSD 主機連上 Internet
|
||
,然後透過這台 FreeBSD 主機,讓跑 Win95 的電腦能夠上網。
|
||
這個問題算是前一個問題的一個特例。
|
||
|
||
<p>這邊有重要的文件,教你怎麼把 FreeBSD 的主機設定成
|
||
<url url="http://www.ssimicro.com/~jeremyc/ppp.html"
|
||
name="PPP Dialup Router">
|
||
|
||
<p><bf/注意:/ 在這種狀況下你至少要有兩個以上的固定 IP addresses
|
||
, 有時是三個以上或更多組 IP 同時使用, 視你的需求而定。
|
||
如果你沒有固定的 IP 可以使用,你可以考慮使用 private IP
|
||
子網路,並安裝 <bf/proxies/ 例如
|
||
<url url="http://squid.nlanr.net/Squid/" name="SQUID"> 或是
|
||
<url url="http://www.tis.com/" name="the TIS firewall toolkit">
|
||
在你的 FreeBSD 主機上。
|
||
|
||
<p>另外可以參考 <ref id="natd">.
|
||
|
||
<sect1>
|
||
<heading>
|
||
為什麼我在 compile ISC 最新版的 BIND 程式時老是失敗?
|
||
</heading>
|
||
|
||
<p>在 ``<tt/cdefs.h/'' 檔案中的定義與 FreeBSD 系統中內附
|
||
的檔案定義有所衝突。直接把
|
||
<tt>compat/include/sys/cdefs.h</tt> 砍掉就可以了。
|
||
|
||
<sect1>
|
||
<heading>FreeBSD 支援 SLIP 和 PPP 嗎?</heading>
|
||
|
||
<p>是的。 你可以查查 man pages 中關於
|
||
<htmlurl url="http://www.FreeBSD.org/cgi/man.cgi?slattach"
|
||
name="slattach">, <htmlurl
|
||
url="http://www.FreeBSD.org/cgi/man.cgi?sliplogin" name="sliplogin">,
|
||
<htmlurl url="http://www.FreeBSD.org/cgi/man.cgi?pppd" name="pppd"> 以及
|
||
<htmlurl url="http://www.FreeBSD.org/cgi/man.cgi?ppp" name="ppp"> 的說明.
|
||
<tt/pppd/ 和 <tt/ppp/ 都提供撥進及撥出的功能。
|
||
<htmlurl url="http://www.FreeBSD.org/cgi/man.cgi?sliplogin"
|
||
name="Sliplogin"> 專門處理有關撥入的功能,而
|
||
<htmlurl url="http://www.FreeBSD.org/cgi/man.cgi?slattach"
|
||
name="slattach"> 處理有關撥出的功能。
|
||
|
||
<p>這些程式有詳細的說明,你可以在
|
||
<url url="../../handbook/index.html" name="handbook">中找到:
|
||
|
||
<itemize>
|
||
<item><url url="../../handbook/slips.html"
|
||
name="SLIP (server 端) 的說明">
|
||
|
||
<item><url url="../../handbook/slipc.html"
|
||
name="SLIP (client 端) 的說明">
|
||
|
||
<item><url url="../../handbook/ppp.html"
|
||
name="PPP (kernel 模式) 的說明">
|
||
|
||
<item><url url="../../handbook/ppp-and-slip.html#USERPPP"
|
||
name="PPP (使用者模式) 的說明">
|
||
</itemize>
|
||
|
||
<p>如果你只能藉由"shell account"的方式上網的話,
|
||
你可能會想看看 <htmlurl
|
||
url="http://www.FreeBSD.org/cgi/ports.cgi?^slirp" name="slirp">
|
||
這個軟體。 它可以讓你的電腦直接連上 (某些) 服務,
|
||
例如 ftp 和 http 等等。
|
||
|
||
<sect1>
|
||
<heading>
|
||
FreeBSD 支援 NAT 或 Masquerading 嗎?<label id="natd">
|
||
</heading>
|
||
|
||
<p>如果你有一個近端的子網路(有一台以上的機器), 但是你的 Internet provider
|
||
卻只分配一個 IP number 給你
|
||
(或者你只分配到一個動態的 IP number), 你可以參考
|
||
<htmlurl url="http://www.FreeBSD.org/cgi/man.cgi?natd" name="natd">
|
||
這個程式。 <tt/Natd/ 讓你可以透過這一個 IP number 讓整個子網路的電腦都能
|
||
連上 internet 。
|
||
|
||
<p><htmlurl url="http://www.FreeBSD.org/cgi/man.cgi?ppp"
|
||
name="ppp"> 這個程式也提供類似的功能 , 如果你下
|
||
<tt/-alias/ 這個選項的話。 <htmlurl
|
||
url="http://www.FreeBSD.org/cgi/man.cgi?libalias" name="alias library">
|
||
在這兩個處理方式中都會被使用到。
|
||
|
||
<sect1>
|
||
<heading>
|
||
我不能使用 ppp ,我做錯了什麼嗎 ?<label id="userppp">
|
||
</heading>
|
||
|
||
<p>你應該先看看 <htmlurl
|
||
url="http://www.FreeBSD.org/cgi/man.cgi?ppp" name="ppp man page"> 和
|
||
<url url="../../handbook/ppp-and-slip.html#USERPPP"
|
||
name="ppp 使用說明">。使用以下指令來打開記錄 (logging) 的功能
|
||
|
||
<verb>
|
||
set log Phase Chat Connect Carrier lcp ipcp ccp command
|
||
</verb>
|
||
|
||
<p>這個命令可以在 <bf/ppp/ command prompt 或者是在
|
||
<tt>/etc/ppp/ppp.conf</tt> 組態檔案中加入。
|
||
(加在 <bf>default</bf> section 的開頭最好).
|
||
確定在 <htmlurl
|
||
url="http://www.FreeBSD.org/cgi/man.cgi?syslog.conf"
|
||
name="/etc/syslog.conf"> 裡面有這麼一行:
|
||
|
||
<verb>
|
||
!ppp
|
||
*.* /var/log/ppp.log
|
||
</verb>
|
||
|
||
<p>而且<tt>/var/log/ppp.log</tt> 這個檔案存在。 如此一來
|
||
你可以從 log 檔案中知道到底發生了什麼事情。
|
||
先不用擔心檔案的內容你看不懂, 如果你要向人求救的話
|
||
, 救你的人會看得懂的。
|
||
|
||
<p>如果你系統上的那份 ppp 不提供 "set log"
|
||
的指令的話, 你應該去下載
|
||
<url url="http://www.FreeBSD.org/~brian" name="最新版本">.
|
||
這個版本在 FreeBSD 2.1.5 以上的版本都可以使用。
|
||
|
||
<sect2>
|
||
<heading>我一執行 ppp ,它就掛在那邊不動了</heading>
|
||
|
||
<p>會發生這種情形通常是你的 hostname 沒有辦法解出來。 解決這個問題
|
||
最好的辦法是確定 <tt>/etc/hosts</tt> 會被你的 resolver 第一個參考到。
|
||
你可以修改<tt>/etc/host.conf</tt>
|
||
並且把<tt>hosts</tt> 放到最前面. 接著, 只要把你的機器名稱放到
|
||
<tt>/etc/hosts</tt> 裡面就可以了。 如果你沒有
|
||
local network 的話, 修改 <tt>localhost</tt> 這一行:
|
||
|
||
<verb>
|
||
127.0.0.1 foo.bar.com foo localhost
|
||
</verb>
|
||
|
||
否則, 就把你主機的資訊加入檔案中。 你可以參考
|
||
相關的 man pages 以獲得進一步的資訊。
|
||
<p>如果你順利的完成這些動作, 你應該可以成功的執行 <tt>ping -c1 `hostname`</tt>
|
||
.
|
||
|
||
<sect2>
|
||
<heading>Ppp 在 -auto 模式下不能撥號</heading>
|
||
|
||
<p>首先確定你的內定路由 (default route) 是否有設定。 下 <htmlurl
|
||
url="http://www.FreeBSD.org/cgi/man.cgi?netstat">
|
||
name="netstat -rn"> 這個指令, 你應該能夠看到如以下範例的兩個 entries :
|
||
|
||
<verb>
|
||
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
|
||
</verb>
|
||
|
||
<p>這些設定是假設您使用的 address 跟 handbook 裡面的、或是 man
|
||
page 的範例、或者和 ppp.conf.sample 裡的設定相同。如果您沒有設定
|
||
default route,那麼有可能您現在使用舊版本的 <htmlurl
|
||
url="http://www.FreeBSD.org/cgi/man.cgi?ppp" name="ppp">,舊的
|
||
ppp 會看不懂 ppp.conf 裡的 <tt/HISADDR/。如果您的系統 <bf/ppp/
|
||
是在 FreeBSD 2.2.5 之前的話, 修改這一行
|
||
|
||
<verb>
|
||
add 0 0 HISADDR
|
||
</verb>
|
||
|
||
<p>成為
|
||
|
||
<verb>
|
||
add 0 0 10.0.0.2
|
||
</verb>
|
||
|
||
<p>default route 這行沒有出現的另一個原因是你設錯了 default
|
||
router,這個設定在 <htmlurl
|
||
url="http://www.FreeBSD.org/cgi/man.cgi?rc.conf"
|
||
name="/etc/rc.conf"> 檔案中(這個檔案在 release 2.2.2 前叫
|
||
<tt>/etc/sysconfig</tt>),你需要在 <tt>ppp.conf</tt> 中加入這
|
||
麼一行
|
||
|
||
<verb>
|
||
delete ALL
|
||
</verb>
|
||
|
||
<p>如果發生這種情形, 回到 handbook <url
|
||
url="../../handbook/ppp-and-slip.html#USERPPP-FINAL"
|
||
name="userppp 最後設定">
|
||
的說明中查詢。
|
||
|
||
<sect2>
|
||
<heading>什麼叫做 "No route to host"</heading>
|
||
|
||
<p>這個狀況通常是因為缺少了這段設定
|
||
|
||
<verb>
|
||
MYADDR:
|
||
delete ALL
|
||
add 0 0 HISADDR
|
||
</verb>
|
||
|
||
<p>請檢查您的 <tt>/etc/ppp/ppp.linkup</tt> 檔案中是否有這些設定。
|
||
只有在您使用動態 IP(dynamic IP) 或不知道您 gateway 的 IP 時才需要
|
||
設定這個。如果您是使用 interactive mode 的話, 您可以在進入 packet
|
||
mode 後輸入如下命令(如果 ppp 提示符號變成大寫的 <bf/PPP/,便代表已
|
||
經進入 packet mode):
|
||
|
||
<verb>
|
||
delete ALL
|
||
add 0 0 HISADDR
|
||
</verb>
|
||
|
||
<p>您可以參考 handbook 中
|
||
<url url="../../handbook/ppp-and-slip.html#USERPPP-DYNAMICIP"
|
||
name="PPP 和動態 IP 位址"> 的部份,有較詳盡的說明。
|
||
|
||
<sect2>
|
||
<heading>我的連線在三分鐘後自動斷掉了</heading>
|
||
|
||
<p>ppp 預設的 timeout 值是三分鐘。可以用以下這行命令調整
|
||
|
||
<verb>
|
||
set timeout NNN
|
||
</verb>
|
||
|
||
<p>這代表如果在 <bf/NNN/ 秒內網路都沒有動靜的話,ppp 就會自動關閉
|
||
連線。如果 <bf/NNN/ 設成 0,那麼將不會因為沒有資料來往而關閉連線。
|
||
你可以把這行命令放到 <tt>ppp.conf</tt> 這個檔案裡面,或是在
|
||
interactive mode 裡面輸入這個指令,也可以用 <htmlurl
|
||
url="http://www.FreeBSD.org/cgi/man.cgi?telnet" name="telnet"> 或
|
||
<htmlurl url="http://www.FreeBSD.org/cgi/man.cgi?pppctl"
|
||
name="pppctl"> 連到 <bf/ppp/s 伺服器的 socket,在連線後隨時調整
|
||
timeout 的值。參考 <htmlurl
|
||
url="http://www.FreeBSD.org/cgi/man.cgi?ppp" name="ppp"> man page
|
||
以獲得更詳盡的資料.
|
||
|
||
<sect2>
|
||
<heading>我的連線因為負荷太重而斷線</heading>
|
||
|
||
<p>如果您設定要用 Link Quality Reporting(LQR),您和對方主機之間就
|
||
有可能遺失太多的 LQR 封包。Ppp 會因此判斷電話線路有問題,然後就會
|
||
切斷連線。在 FreeBSD 2.2.5 版以前,內定會使用 LQR,現在的內定值是
|
||
不用。LQR 可以用這一行命令取消
|
||
|
||
<verb>
|
||
disable lqr
|
||
</verb>
|
||
|
||
<sect2>
|
||
<heading>ppp 會不定時的斷線</heading>
|
||
|
||
<p>有時候如果線路上有太多雜訊,甚至如果您使用了電話插撥服務的話,
|
||
您的數據機將會掛斷電話,因為它誤認這些訊息是 lost carrier。
|
||
|
||
<p>大部分的數據機都有容忍暫時失去 carrier 的設定。以 USR Sportster
|
||
為例,失去 carrier 和掛斷電話之間的時間,是以 1/10 秒為單位存在
|
||
S10 暫存器中。如果要讓您的數據機能容忍更長的時間,你可以在 dial
|
||
string 裡面加入以下 "送出命令 - 等待字串" 的部份:
|
||
|
||
<verb>
|
||
set dial "...... ATS10=10 OK ......"
|
||
</verb>
|
||
|
||
<p>參考數據機內附的說明書以取得更詳細的資料。
|
||
|
||
<sect2>
|
||
<heading>連線會不定時當掉</heading>
|
||
|
||
<p>許多人的連線會毫無來由的卡住,首先要做的是找出連線那一方當掉。
|
||
|
||
<p>如果用的是外接數據機,就用 <tt/ping/ 來看在傳資料時,<tt/TD/ 燈號
|
||
會不會閃。如果會的話(並且 <tt/RD/ 不會閃),代表是對方出問題;如果
|
||
不會,則是自己的問題。如果用內接數據機,先在 <tt/ppp.conf/ 中加入
|
||
<tt/set server/ 這道指令,當連線當掉時,執行 pppctl 連到 ppp。如果網
|
||
路連線突然好了(因為 ppp 看到用來診斷問題的 socket)或無法連上(假設
|
||
在一開始可以執行 <tt/set socket/ 這道指令),表示本地出問題。如果連
|
||
得上 ppp 卻仍然不能用,用 <tt/set log local async/ 打開本地的非同步
|
||
記錄,接著在另一個視窗(或終端機)執行 <tt/ping/ 在連線上傳送資料。
|
||
非同步記錄的功能會同時顯示送出和接收的資料,如果資料只出不進,就是對
|
||
方機器出問題。
|
||
|
||
<p>知道是本地或對方出問題後,就有兩種可能:
|
||
|
||
<sect3>
|
||
<heading>對方的機器沒有回應</heading>
|
||
|
||
<p>在這方面能作的相當有限,大部份的 ISP 會因為你不是用 Microsoft
|
||
作業系統而不願幫忙。可以在 <tt/ppp.conf/ 中加入 <tt/enable lqr/,
|
||
允許 ppp 偵測對方的錯誤而掛斷,但這個過程相當慢,所以不大實用。也
|
||
許不想告訴 ISP 你是用 user-ppp 上線的....
|
||
|
||
<p>首先,用下面兩道命令關掉所有本地的壓縮功能:
|
||
|
||
<verb>
|
||
disable pred1 deflate deflate24 protocomp acfcomp shortseq vj
|
||
deny pred1 deflate deflate24 protocomp acfcomp shortseq vj
|
||
</verb>
|
||
|
||
<p>然後重新連線,確定這樣不會有所不同。如果反而有進步或甚至將問題
|
||
解決掉,就用試誤法來找出是那個設定造成的。這樣在聯絡 ISP 時就可以
|
||
提供相當有用的資料(雖然會很容易看出你不是用 Microsoft 的產品)。
|
||
|
||
<p>在聯絡 ISP 之前,打開本地的非同步記錄功能,接著就等連線再度當掉,
|
||
這可能會用到相當大的硬碟空間。最後從連接埠讀進的資料可能會相當有用,
|
||
它通常是 ASCII 文字,甚至有可能會說明問題出在那裡(``Memory fault,
|
||
core dumped''?)。
|
||
|
||
<p>如果 ISP 願意協助的話,應該會在他們那一端也打開記錄功能,那麼在
|
||
下次連線當掉時,就可以告訴你為何會出問題。很歡迎將詳細內容送到 <url
|
||
url="mailto:brian@Awfulhak.org" name="brian@Awfulhak.org">,甚至要
|
||
求 ISP 直接向我連絡。
|
||
|
||
<sect3>
|
||
<heading>自己的 Ppp 當掉了</heading>
|
||
<p>這裡能做的最多就是重新編譯 ppp:在 Makefile 最後面加上
|
||
<tt/CFLAGS+=-g/ 和 <tt/STRIP=/,接著做
|
||
<tt/make clean && make && make install/。在 ppp 當
|
||
掉時,先用 <tt/ps ajxww |fgrep ppp/ 找出 ppp 的 process id,然後執
|
||
行 <tt/gdb ppp PID/。在 gdb 提示符號下,可以用 <tt/bt/ 找出 stack
|
||
trace。
|
||
|
||
<p>將結果送到 <url url="mailto:brian@Awfulhak.org"
|
||
name="brian@Awfulhak.org">.
|
||
|
||
<sect2>
|
||
<heading>在看到 Login OK! 的訊息以後就沒有反應了</heading>
|
||
|
||
<p>在 FreeBSD 2.2.5 以前的版本上,一旦連線建立完成以後,
|
||
<htmlurl url="http://www.FreeBSD.org/cgi/man.cgi?ppp" name="ppp">
|
||
會等對方的機器啟動 Line Control Protocol (LCP)。很多 ISP 不會自動
|
||
啟動,而是等待由 client 端來啟動。要強迫 <bf/ppp/ 主動啟動 LCP,請
|
||
執行這個命令:
|
||
|
||
<verb>
|
||
set openmode active
|
||
</verb>
|
||
|
||
<p><bf/Note/: 通常如果兩邊都啟動訊息交換的話,通常不會造成任何副作
|
||
用,所以 openmode 目前內定是打開的。然而,下一段將解釋在什麼狀況下
|
||
這樣設定 <bf/真的/ 會造成副作用。
|
||
|
||
<sect2>
|
||
<heading>我一直看到 magic being the same 的錯誤訊息</heading>
|
||
|
||
<p>有時就在連上之後,在記錄檔會看到 "magic is the same" 的訊息。通
|
||
常這些是無害的,有時候某一端則會斷線。大多數的 ppp 實作無法解決這個
|
||
問題,就算似乎連上了,在記錄檔也可以看到一直重複的 configure request
|
||
和 configure acknowledgement 之類的溝通訊息,ppp 最後會放棄而關掉連
|
||
線。
|
||
|
||
<p>會發生這種問題的通常情況是,伺服器用速度慢的硬碟、在通訊埠上執行
|
||
getty、並且等到使用者登入後才用 script 或程式執行 ppp;也有聽說用
|
||
slirp 就一定會發生類似問題的報告。原因是在 getty 結束和 ppp 開始執行
|
||
的這段時間內,client 端的 ppp 開始送出 Line Control Protocol(LCP) 封
|
||
包,由於伺服器通訊埠的 ECHO 仍在打開狀態,client 端的 ppp 就會看到送
|
||
出去的封包被 "反彈" 回來。
|
||
|
||
<p>在用 LCP 溝通時,有部份是要連線兩邊分別建立自己的 magic number,
|
||
來偵測及避免封包被 "反彈" 回來的狀況。協定標準中說當對方試圖用和自己
|
||
相同的 magic number 溝通時,要送給對方一個 NAK 的訊號(表示不接受),
|
||
接著對方就會選另一個數字。但在伺服器通訊埠 ECHO 仍打開的這段期間,
|
||
client 端的 ppp 送出 LCP 封包,看到相同的 magic number,於是送出
|
||
NAK 訊號。這個 NAK 也會被 "反彈" 回來,被誤認由對方送出,因此 client
|
||
端會改變自己的 magic number。這樣 magic number 的變動次數會非常地多,
|
||
並且也全都存在對方的終端機緩衝區中。當伺服器啟動 ppp 時,它馬上就
|
||
被 magic number 的大量更動所淹沒,並且(幾乎是立刻)決定已經試夠了
|
||
LCP 而放棄;在這期間,client 端雖然再也看不到被反彈的封包,但卻來得
|
||
及看到伺服器把電話線掛掉。
|
||
|
||
<p>允許讓對方來作 LCP 溝通可以避免這種情形,在 ppp.conf 中加下面這
|
||
一行:
|
||
|
||
<verb>
|
||
set openmode passive
|
||
</verb>
|
||
|
||
<p>這行告訴 ppp 由對方來啟動 LCP,不過有些伺服器永遠都不會主動溝通
|
||
,在這種情況下,可以這麼設定:
|
||
|
||
<verb>
|
||
set openmode active 3
|
||
</verb>
|
||
|
||
<p>這是要 ppp 等個三秒鐘,然後再開始送 LCP 相關要求。如果對方在這
|
||
段時間送出 LCP 封包,ppp 就不會等足三秒而立刻回應。
|
||
|
||
<sect2>
|
||
<heading>
|
||
LCP 的溝通一直到連線關閉才結束</heading>
|
||
|
||
<p>目前 <bf/ppp/ 在實作上有個會出問題的 "功能",不會將 LCP、CCP
|
||
& IPCP 這幾種封包的回應和原先要求作對照。結果是如果有一方的
|
||
<bf/ppp/ 啟動時比對方慢了六秒以上,對方會在其間多送出兩個 LCP 的設定
|
||
要求,後果相當嚴重。
|
||
|
||
<p>假設有兩端 <bf/A/ 和 <bf/B/ 都在執行 ppp,<bf/A/ 在連線後立刻
|
||
送出 LCP 要求,<bf/B/ 則花了七秒才開始,所以當 <bf/B/ 啟動時,<bf/A/
|
||
早已送出三個 LCP REQ(request)。我們也假設連線已將 ECHO 關掉,否則就
|
||
會看到上個問題提到的 magic number 問題。<bf/B/ 啟動時也會送出 REQ,
|
||
同時對 <bf/A/ 送出的第一個 REQ 回應,送出 ACK(acknowledge)。A 收到這
|
||
個 ACK 後會進入 <bf/OPENED/ 狀態,同時也對 <bf/B/ 的第一個 REQ 送出
|
||
ACK。但在這段期間,<bf/B/ 會看到 <bf/A/ 之前多送出的兩個 REQ,因而也
|
||
以兩個 ACK 回應。<bf/B/ 接著看到 <bf/A/ 傳來的第一個 ACK,因此也進入
|
||
<bf/OPENED/ 狀態。但這時 <bf/A/ 收到 <bf/B/ 多送的兩個 ACK。根據
|
||
RFC 的規定,會對第二個 ACK 送出第四個 REQ 而回到 <bf/REQ-SENT/ 狀態
|
||
(再重複一次 REQ-ACK 的過程),但一看到第三個 ACK,<bf/A/ 以為是
|
||
<bf/B/ 回應剛剛送出的 REQ,又進入 <bf/OPENED/ 狀態。此時 <bf/B/ 收到
|
||
<bf/A/ 發出的第四個 REQ,根據 RFC,會對這個 REQ 送出 ACK,然後再送出
|
||
第二個 REQ(也是再重複一次 REQ-ACK 的過程)。<bf/A/ 收到這個 REQ 後
|
||
會再重新送 REQ 而回到 <bf/REQ-SENT/ 狀態,接著又收到 ACK 而進入
|
||
<bf/OPENED/ 狀態。因此雙方都會以為收到的 ACK 是對方回應剛剛送出去的
|
||
REQ,最後 <bf/A/ 會一直在 <bf/OPENED/ 和 <bf/REQ-SENT/ 兩種狀態間切
|
||
換,對 <bf/B/ 則是 <bf/OPENED/ 和 <bf/ACK-SENT/。
|
||
|
||
<p>這種惡性循環會一直持續著,直到有一方發現自己在原地打轉而放棄繼續
|
||
下去。
|
||
|
||
<p>避免這種情況的最好方式,是將某一端設成<bf/被動模式/-也就是等另一
|
||
方先開始溝通,用這道命令:
|
||
|
||
<verb>
|
||
set openmode passive
|
||
</verb>
|
||
|
||
用這個選項時要小心,應該和這個命令一起用:
|
||
|
||
<verb>
|
||
set stopped N
|
||
</verb>
|
||
|
||
這會設定 <bf/ppp/ 等待對方開始溝通的時間上限,另一個方法是用:
|
||
|
||
<verb>
|
||
set openmode active N
|
||
</verb>
|
||
|
||
其中 <bf/N/ 是在主動溝通之前先等待的秒數,man page 有更詳細的說明。
|
||
|
||
<sect2>
|
||
<heading>Ppp 在連線後就卡住了</heading>
|
||
|
||
<p>在 FreeBSD 2.2.5 之前的版本,有可能因為 <bf/ppp/ 在處理 Predictor1
|
||
壓縮時發生錯誤,使得在連線後馬上就卡住。只有當連線雙方都試圖用不同
|
||
種 Compression Control Protocol(CCP) 溝通時,才會發生這種情形。這個
|
||
問題已經解決了,但如果仍在用舊版的 <bf/ppp/,可以用這種方法避免:
|
||
|
||
<verb>
|
||
disable pred1
|
||
</verb>
|
||
|
||
<sect2>
|
||
<heading>用 shell 跳出 Ppp 做測試時,連線似乎卡住了</heading>
|
||
|
||
<p>在用 <tt/shell/ 或 <tt/!/ 命令時,<bf/ppp/ 會執行 shell(<bf/ppp/
|
||
也會把你指定的參數傳給 shell),Ppp 會等到這些命令結束後才繼續。如果
|
||
有使用到 ppp 連線的命令,連線會像是被凍住了,這是因為 <bf/ppp/ 正在
|
||
等這些指令結束。
|
||
|
||
<p>如果想執行程式,用 <tt/!bg/ 這個命令,它會把程式丟到背景執行,ppp
|
||
接著就能繼續保持連線。
|
||
|
||
<sect2>
|
||
<heading>在 null-modem 線上建立的 Ppp 好像不會自動斷線</heading>
|
||
|
||
<p>由於 null-modem 本身用的線材,<bf/ppp/ 沒有辦法自動決定是否
|
||
某個直接連線已經斷掉。當使用這類方式的連線時,一定要打開 LQR:
|
||
|
||
<verb>
|
||
enable lqr
|
||
</verb>
|
||
|
||
<p>內定是會接受 LQR,如果對方用它來溝通的話。
|
||
|
||
<sect2>
|
||
<heading>為什麼 ppp 在 -auto 模式下會無緣無故播號?</heading>
|
||
|
||
<p>如果 <bf/ppp/ 非預期地播號,就必須要找出原因,然後設定播號過濾
|
||
器(dfilter, Dial filter)來避免這種情形。
|
||
|
||
<p>要找出原因,先用這個命令:
|
||
|
||
<verb>
|
||
set log +tcp/ip
|
||
</verb>
|
||
|
||
<p>這樣會記錄經由連線的所有資料。下次如果又無故播號,就可以從記錄
|
||
旁邊的時間很快找到原因。
|
||
|
||
<p>現在可以避免因為這些原因播號。通常是在作 DNS 查詢時才會發生這種
|
||
問題,要避免因 DNS 查詢而連線(這樣<bf/不會/使 <bf/ppp/ 在連線狀態
|
||
下擋掉這些封包),用下面這幾行:
|
||
|
||
<verb>
|
||
set dfilter 1 deny udp src eq 53
|
||
set dfilter 2 deny udp dst eq 53
|
||
set dfilter 3 permit 0/0 0/0
|
||
</verb>
|
||
|
||
<p>這種做法並不永遠適用,因為它事實上使得你無法用 demand-dial 功能
|
||
- 大部份程式在做網路相關動作前都會用到 DNS 查詢。
|
||
|
||
<p>在 DNS 這個情況下,應該試著找出到底是誰想要解出主機名稱,通常幾
|
||
乎都是由 <htmlurl url="http://www.FreeBSD.org/cgi/man.cgi?sendmail"
|
||
name="sendmail"> 所造成,所以要在 sendmail 設定檔中指示它不要做任何
|
||
DNS 查詢。在 <ref id="ispmail" name="Mail 設定">中有詳細說明如何作出
|
||
自己的設定檔、及裡面應該放那些設定,你也許想要將下一行加入 <bf/.mc/
|
||
檔中:
|
||
|
||
<verb>
|
||
define(`confDELIVERY_MODE', `d')dnl
|
||
</verb>
|
||
|
||
<p>這會使 sendmail 先擋著所有信件,直到送信時再一齊送出去(通常
|
||
sendmail 執行時是用 ``-bd -q30m'' 這個參數,告訴它每三十分鐘才送信)
|
||
或是有人執行 ``sendmail -q''(也許可以放在 ppp.linkup 裡)。
|
||
|
||
<sect2>
|
||
<heading>這些 CCP 錯誤訊息是指?</heading>
|
||
|
||
<p>我在 log 檔一直看到這些錯誤訊息:
|
||
|
||
<verb>
|
||
CCP: CcpSendConfigReq
|
||
CCP: Received Terminate Ack (1) state = Req-Sent (6)
|
||
</verb>
|
||
|
||
<p>這是因為 ppp 試圖作 Predictor1 壓縮方面的溝通,但對方的機器卻完
|
||
全不用壓縮功能。這些訊息是無害的,但如果不想看到它的話,可以把本地
|
||
ppp 的 Predictor1 壓縮也一起關掉:
|
||
|
||
<verb>
|
||
disable pred1
|
||
</verb>
|
||
|
||
<sect2>
|
||
<heading>傳檔案時發生 IO 錯誤,然後 Ppp 就掛掉了</heading>
|
||
|
||
<p>在 FreeBSD 2.2.2 及先前的版本中,tun 的驅動程式有個問題,它不會
|
||
接收那些大過 tun 介面 MTU 的封包。如果收到比 MTU 大的封包,它會用
|
||
syslogd 記錄為 IO 錯誤。
|
||
|
||
<p>但 ppp 規格中有提到,不管 LCP 溝通的結果如何,MRU 最小的可接受
|
||
值<bf>永遠</bf>是 1500。所以有可能你不小心將 MTU 調低於 1500,ISP
|
||
會不理它而送出 1500 大小的封包,然後就會觸發上述的 "功能"。
|
||
|
||
<p>在 FreeBSD 2.2.2 及之前的版本中,永遠不要將 MTU 調低於 1500,就
|
||
可以解決這個問題。
|
||
|
||
<sect2>
|
||
<heading>為什麼 ppp 不會記錄我的連線速度?</heading>
|
||
|
||
<p>如果要記錄電腦和數據機間的每一行 ``對話'',用下一行打開:
|
||
|
||
<verb>
|
||
set log +connect
|
||
</verb>
|
||
|
||
<p>這會使 <htmlurl url="http://www.FreeBSD.org/cgi/man.cgi?ppp"
|
||
name="ppp"> 記錄所有資料,直到播號字串最後一個等待的數據機傳回值
|
||
為止。
|
||
|
||
<p>如果使用 PAP 或 CHAP (因為沒有 "set login" 命令,所以設定檔中
|
||
CONNECT 之後就不會看到任何對話),想要看到連線速度的話,確定 ppp
|
||
等待的數據機傳回值是 CONNECT 這一整行,像這樣:
|
||
|
||
<verb>
|
||
set dial "ABORT BUSY ABORT NO\\sCARRIER TIMEOUT 4 \"\" ATZ OK-ATZ-OK ATDT\\T TIMEOUT 60 CONNECT \\c \\n"
|
||
</verb>
|
||
|
||
<p>這樣在看到 CONNECT 後不會送出任何東西,接著再等個換行字元,強
|
||
迫 <bf/ppp/ 讀取回應的 CONNECT 一整行。
|
||
|
||
<sect2>
|
||
<heading>Ppp 不理會 chat script 中的 `\' 字元</heading>
|
||
|
||
<p>Ppp 會去分析設定檔中的每一行,這樣它才會正確解讀像是
|
||
<tt/set phone "123 456 789"/ 的字串(你應該知道這個數字只是
|
||
<bf/一個/參數,如果要指定 ``"'' 這個字元,必須在它前面用反斜線
|
||
(``\'')將它跳開)。
|
||
|
||
<p>當解譯程式分析每個參數時,為了找出字串中所有像是 ``\P'' ``\T''
|
||
的跳脫字元(見 man page),必須重新解譯該參數。在這種雙重分析之下,
|
||
你必須記得用正確的跳脫數目。
|
||
|
||
<p>假設要對數據機送出 ``\'' 這個字元,應該像是:
|
||
|
||
<verb>
|
||
set dial "\"\" ATZ OK-ATZ-OK AT\\\\X OK"
|
||
</verb>
|
||
|
||
<p>這樣則會得到下面這串:
|
||
|
||
<verb>
|
||
ATZ
|
||
OK
|
||
AT\X
|
||
OK
|
||
</verb>
|
||
|
||
<p>如果是
|
||
|
||
<verb>
|
||
set phone 1234567
|
||
set dial "\"\" ATZ OK ATDT\\T"
|
||
</verb>
|
||
|
||
<p>則會得到下面結果:
|
||
|
||
<verb>
|
||
ATZ
|
||
OK
|
||
ATDT1234567
|
||
</verb>
|
||
|
||
<sect2>
|
||
<heading>Ppp 碰到了 seg-fault,但找不到 <tt/ppp.core/ 這個檔?
|
||
</heading>
|
||
|
||
<p>Ppp (或任何類似的程式) 應該不可能有 core dump。由於 ppp 執行時
|
||
的 effective user id 是 0 (即以 root 身份執行),作業系統在終止 ppp
|
||
前不會對磁碟寫它的 core 映像檔。如果 ppp <bf/真的/因為 segmentation
|
||
violation 或其他一般會 core dump 的 signal 而終止、<bf/並且/確定用
|
||
的是最新版本(見本節開頭),那麼你可以這麼做:
|
||
|
||
<verb>
|
||
$ 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
|
||
</verb>
|
||
|
||
<p>你現在已經裝上可以用來除錯的 ppp 版本,由於權限上沒有作特別設定,
|
||
所以必須以 root 來執行 ppp,順便也要注意是在那個目錄執行的。
|
||
|
||
<p>現在如果 ppp 碰到了 segmentation violation,就會將 coredump 存在
|
||
ppp.core 檔中,接下來就是:
|
||
|
||
<verb>
|
||
$ su
|
||
# gdb /usr/sbin/ppp ppp.core
|
||
(gdb) bt
|
||
.....
|
||
(gdb) f 0
|
||
.....
|
||
(gdb) i args
|
||
.....
|
||
(gdb) l
|
||
.....
|
||
</verb>
|
||
|
||
<p>根據你的問題來取得相關資料,就可以診斷問題出在那裡。
|
||
|
||
<p>如果熟悉 gdb,也許會想找出其他的詳細資料,像是那個動作造成
|
||
dump、及相關變數的位址及數值等。
|
||
|
||
<sect2>
|
||
<heading>
|
||
在 -auto 模式下,使 ppp 播號的程式在連線後卻連不到目的地
|
||
</heading>
|
||
|
||
<p>這是設定 <bf/ppp/ 在 -auto 模式向對方取得動態 IP 時的已知問題,
|
||
在最新版的 ppp 已經解決了 - 在 man page 中用 <bf/iface/ 關鍵字找找
|
||
看。
|
||
|
||
<p>當用到網路的程式呼叫 <htmlurl
|
||
url="http://www.FreeBSD.org/cgi/man.cgi?connect" name="connect(2)">
|
||
時,socket endpoint 會設成 tun 這個界面的 IP,kernel 接著產生要送出
|
||
去的第一個封包,把它傳給 tun,<bf/Ppp/ 讀到這個封包後就會開始建立連
|
||
線。如果 <bf/ppp/ 用的是動態分配 IP,那麼就會改變 tun 界面的位址,
|
||
原先的 socket endpoint 就成為不正確的值。接著送到對方的封包通常都會
|
||
被丟掉,就算能順利達到對方機器,由於該來源 IP 已給其他人使用,任何回
|
||
應也不會被傳回本地的機器上。
|
||
|
||
<p>理論上,有好幾種方法可以解決這個問題。如果 ISP 願意每次都提供相同
|
||
IP 當然是最好 <tt/:-)/,目前版本的 <bf/ppp/ 會做到這一點,但大多數的
|
||
ppp 實作不會這麼做。
|
||
|
||
<p>從 client 端最容易的解決方式是,永遠都不要改變 tun 界面的 IP 值,
|
||
但是將所有出去的封包來源 IP 從原先的 tun 界面 IP 改為連線時取得的
|
||
IP,基本上這就是最新版 <bf/ppp/ 裡 <tt/iface-alias/ 選項的做法(使用
|
||
了 <htmlurl url="http://www.FreeBSD.org/cgi/man.cgi?libalias"
|
||
name="libalias(3)"> 和執行 ppp 時的 <bf/-alias/ 參數)-記住之前所有
|
||
用過的 tun 界面 IP,再把全部換成最近一次拿到的位址。
|
||
|
||
<p>另一種方法(可能是最可靠)是寫個可以修改所有 socket endpoint 值的
|
||
system call。當拿到新的 IP 時,<bf/Ppp/ 就可以用它來修改所有執行程式
|
||
所建立的 socket。當 DHCP client 程式對 socket 重新使用 bind() 時,也
|
||
可以用同樣的呼叫。
|
||
|
||
<p>還有一個可能則是允許不用 IP,就可以啟用某個網路界面。送出去的封包
|
||
來源 IP 會設成 255.255.255.255,直到 SIOCAIFADDR 這個 ioctl 第一次執
|
||
行完成為止。這樣會完全連結 socket 的兩端,而由 <bf/ppp/ 來修改來源的
|
||
IP 值,但只有當原來 IP 值是 255.255.255.255 時、或者 IP 值和 IP 偵錯
|
||
碼需要修改時才會去更動。這種方式有點算是 hack,即 kernel 可以對沒設
|
||
定好的界面送出壞掉的封包,因為假設會有其他機制可以修正這種錯誤。
|
||
|
||
<sect2>
|
||
<heading>為何玩大多數遊戲時,都不能使用 -alias 這個參數?</heading>
|
||
|
||
<p>遊戲或類似程式不能和 libalias 搭配使用的原因是,外面的機器試著對
|
||
著內部的機器開啟連線、或(不請自來地)送出 UDP 封包,而 alias 封包的
|
||
軟體不知道它應該把這些封包送到裡面的機器去。
|
||
|
||
<p>解決的方式是,先確定現在只有執行那個會出問題的程式,然後在
|
||
gateway 機器上對 tun 界面執行 tcpdump、或在上面打開記錄 tcp/ip 的功
|
||
能(``set log +tcp/ip'')。
|
||
|
||
<p>在啟動出問題的程式時,應該會在 gateway 機器上看到有封包通過,當外
|
||
界有傳回封包時則會被丟掉(這就是問題所在)。記下這些封包要送到目的地
|
||
的那個埠,然後關掉程式。重複幾次,看看是否都要送到同樣固定的埠,如果
|
||
是的話,在 /etc/ppp/ppp.conf 相關位置加上這一行,就可使程式正確運作:
|
||
|
||
<verb>
|
||
alias port proto internalmachine:port port
|
||
</verb>
|
||
|
||
<p>其中 ``proto'' 是 ``tcp'' 或 ``udp'',``internalmachine'' 是要接
|
||
收這些封包的機器,``port'' 則是這些封包要送到那個埠。
|
||
|
||
<p>如果要在其他機器上執行同樣程式,必須重複同樣過程修改上一行設定,
|
||
否則就不能正常使用;也不可能在兩台內部機器上同時使用-畢竟外界只是把
|
||
這個內部網路看成一台機器而已。
|
||
|
||
<p>如果封包不一定送到同樣的埠,你有三種選擇:
|
||
|
||
<p><bf>1)</bf> 在 libalias 加入對它的支援,
|
||
/usr/src/lib/libalias/alias_*.c 有一些 ``特例'' 的示範(alias_ftp.c
|
||
是個不錯的原型檔)。通常是讀取某些可以認得出的外送封包,找出要外面連
|
||
到內部機器某個埠的指令,然後在 alias 表中設定 ``route'',以後再收到
|
||
這種封包就知道要往那裡送。
|
||
|
||
<p>這是最困難的解法,但也是最好的,並且還可以在多台機器上用同樣程式。
|
||
|
||
<p><bf>2)</bf> 使用 proxy。舉例來說,該應用程式也許支援 socks5,或是
|
||
有個 ``passive'' 的選項(像是 ``cvsup'')可以避免對方向內部機器提出
|
||
連線的要求。
|
||
|
||
<p><bf>3)</bf> 用 ``alias addr'' 把所有資料都轉給內部機器,這是最後
|
||
才用的暴力法。
|
||
|
||
<sect3>
|
||
<heading>那裡可以找到常用埠的列表?</heading>
|
||
|
||
<p>現在還沒有,但可以將這些弄成一個名單(如果有人感興趣的話)。
|
||
在下面的例子裡,把 <tt>internal</tt> 換成玩遊戲那台機器的 IP。
|
||
|
||
<itemize>
|
||
<item><bf>Quake</bf>
|
||
<p><tt>alias port udp internal:6112 6112</tt>
|
||
<p>如果想用其他方式,<htmlurl
|
||
url="http://www.battle.net/support/proxy/" name="www.battle.net">
|
||
有 Quake 對 proxy 支援的說明。
|
||
</itemize>
|
||
|
||
<itemize>
|
||
<item><bf>Quake 2</bf>
|
||
<p><tt>alias port udp internal:27901 27910</tt>
|
||
</itemize>
|
||
|
||
<itemize>
|
||
<item><bf>紅色警戒(Red Alert)</bf>
|
||
<p><tt>alias port udp internal:8675 8675</tt>
|
||
<p><tt>alias port udp internal:5009 5009</tt>
|
||
</itemize>
|
||
|
||
<itemize>
|
||
<item><bf>Half Life</bf>
|
||
<p><tt>alias port udp internal:27005 27015</tt>
|
||
</itemize>
|
||
|
||
<itemize>
|
||
<item><bf>PCAnywhere 8.0</bf>
|
||
<p><tt>alias port udp internal:5632 5632</tt>
|
||
<p><tt>alias port tcp internal:5631 5631</tt>
|
||
</itemize>
|
||
|
||
<sect2>
|
||
<heading>什麼是 FCS 錯誤?</heading>
|
||
|
||
<p>FCS 是 <bf/F/rame <bf/C/heck <bf/S/equence 的縮寫。每一個 ppp
|
||
封包都附有偵錯碼來確定收到的資料的確是送出的資料。如果進來的某個
|
||
封包 FCS 不正確,就丟掉這個封包、再把 HDLC 裡的 FCS 計數器加 1。
|
||
用 <tt>show hdlc</tt> 便可看到 HDLC 裡的各種錯誤計數值。
|
||
|
||
<p>不良線路(或封包被串列埠的驅動程式丟掉)有時候就會發生 FCS 錯誤,
|
||
雖然它的確會大大拖慢壓縮協定,不過通常這沒什麼大不了。如果你用的
|
||
是外接數據機,確定有保護線路不受外界干擾 - 這樣說不定就解決了。
|
||
|
||
<p>如果在連上時馬上就凍住、並且還看到一大堆 FCS 錯誤的話,有可能
|
||
是因為你的連線並非是 8 bit clean。確定數據機不是用軟體流程控制
|
||
(XON/XOFF),如果你的連線<bf>一定</bf>要用軟體流程控制的話,用
|
||
<tt>set accmap 0x000a0000</tt> 這道命令告訴 <bf>ppp</bf> 跳過 ^Q
|
||
和 ^S 這兩個字元。
|
||
|
||
<p>看到一大堆 FCS 錯誤的另一個原因,是連線另一端不再使用 <bf/PPP/
|
||
溝通。這時候也許應該打開 <tt/async/ 的記錄功能,來決定是否進來的
|
||
資料其實是 login 或 shell 提示符號。如果另一端是 shell 提示符號,
|
||
先執行 <tt>close lcp</tt>、接著 <tt>term</tt> 就可以重新連接到對
|
||
方機器的 shell 下,而不用掛掉電話線。
|
||
|
||
<p>如果記錄檔裡沒有任何資訊可以指示連線為何斷掉,那麼就該問問另一
|
||
端的管理員(你的 ISP?) 怎麼會這樣結束。
|
||
|
||
<sect2>
|
||
<heading>沒有一個方法可以用,我完蛋了啦!</heading>
|
||
|
||
<p>如果上面說的都沒用,就盡可能找出所有資訊,這包括了設定檔、如何
|
||
啟動 <bf/ppp/、log 檔的相關部份、連線前後的 <htmlurl
|
||
url="http://www.FreeBSD.org/cgi/man.cgi?netstat" name="netstat -rn">
|
||
輸出結果,把這些送到 <url url="mailto:freebsd-questions@FreeBSD.org"
|
||
name="freebsd-questions@FreeBSD.org"> mailing list 或
|
||
<url url="news:comp.unix.bsd.freebsd.misc"
|
||
name="comp.unix.bsd.freebsd.misc"> newsgroup,這樣應該就會有人指點
|
||
正確的方向。
|
||
|
||
<sect1>
|
||
<heading>我沒有辦法建立 <tt>/dev/ed0</tt> 這個 device!</heading>
|
||
|
||
<p>在 Berkeley 網路架構中, 只有 kernel 程式碼可以直接存取網路界面卡.
|
||
請參考 <tt>/etc/rc.network</tt> 這個檔案和 manual pages 取得與其他不同網路程式
|
||
更進一步的資訊. 如果你覺得你完全搞混了的話, 您應該找一本與其他 BSD 相關
|
||
作業系統網路管理有關書來參考; 除了少數顯著的不同外, FreeBSD 的網路管理
|
||
基本上和 SunOS 4.0 和 Ultrix 是一樣的.
|
||
|
||
|
||
<sect1>
|
||
<heading>我如何建立 Ethernet aliases?</heading>
|
||
|
||
<p>把 ``<tt/netmask 0xffffffff/'' 加到你的 <htmlurl
|
||
url="http://www.FreeBSD.org/cgi/man.cgi?ifconfig" name="ifconfig">
|
||
命令列中,例如:
|
||
|
||
<verb>
|
||
ifconfig ed0 alias 204.141.95.2 netmask 0xffffffff
|
||
</verb>
|
||
|
||
<sect1>
|
||
<heading>我如何指定我的 3C503 使用其他不同的的 network port?</heading>
|
||
|
||
<p>如果您想使用其他的 port, 你必須在
|
||
<htmlurl url="http://www.FreeBSD.org/cgi/man.cgi?ifconfig"
|
||
name="ifconfig"> 的命令中指定額外的參數. 內定的
|
||
port 是 ``<tt/link0/''. 要使用 AUI port 代替
|
||
BNC port 的話, 改用 ``<tt/link2/''. 這些 flags 應該改變
|
||
ifconfig_* 的變數來指定,你可以在這個檔案裡面找到 <htmlurl
|
||
url="http://www.FreeBSD.org/cgi/man.cgi?rc.conf" name="/etc/rc.conf">.
|
||
|
||
<sect1>
|
||
<heading>我在連上/輸出 FreeBSD 的 NFS 時出現問題.</heading>
|
||
|
||
<p>某些 PC 的網路卡比其他的好(含蓄的說來)
|
||
這種狀況在造成 NFS 這種對網路敏感的程式有時會出現問題.
|
||
|
||
<p>參考 <url url="../../handbook/nfs.html" name="the Handbook entry on NFS">
|
||
以獲得這個主題的更多資訊.
|
||
|
||
<sect1>
|
||
<heading>為什麼我不能 NFS-mount Linux 的機器?</heading>
|
||
|
||
<p>某些版本的 Linux NFS 程式碼只接受 privileged port 的 mount request
|
||
; 試用這行指令看看
|
||
|
||
<verb>
|
||
mount -o -P linuxbox:/blah /mnt
|
||
</verb>
|
||
|
||
<sect1>
|
||
<heading>W為什麼我不能 NFS-mount Sun 的機器?</heading>
|
||
|
||
<p>跑 SunOS 4.X 的 Sun 工作站只接受來自 privileged port 的 mount request
|
||
; 試用這行指令看看
|
||
|
||
<verb>
|
||
mount -o -P sunbox:/blah /mnt
|
||
</verb>
|
||
|
||
<sect1>
|
||
<heading>我在使用 PPP 連線到 NeXTStep 機器時有問題.</heading>
|
||
|
||
<p>把 TCP extensions 取消, 這個設定在 <htmlurl
|
||
url="http://www.FreeBSD.org/cgi/man.cgi?rc.conf" name="/etc/rc.conf"> 裡面.
|
||
把以下這個值設成 NO:
|
||
|
||
<verb>
|
||
tcp_extensions=NO
|
||
</verb>
|
||
|
||
<p>Xylogic 的 Annex 主機也有相同的問題,您要做相同的修改才能連上
|
||
這些主機.
|
||
|
||
<sect1>
|
||
<heading>我要怎樣才能把 IP multicast support 打開?</heading>
|
||
|
||
<p>Multicast host operations are fully supported in FreeBSD 2.0 and
|
||
later by default. 如果您想將您的主機設定成 multicast router 的話,
|
||
您必須重新 compile 您的 kernel, 加入 <tt>MROUTING</tt>
|
||
的選項,並且執行 <tt/mrouted/. 如果您的<tt>/etc/rc.conf</tt> 裡面的
|
||
<tt/mrouted_enable/ 這個參數是設定成"YES" 的話.FreeBSD 2.2 及之後的
|
||
版本會在開機時執行 <tt/mrouted/ .
|
||
|
||
<p>MBONE 的各種工具可以在他們 ports 下所屬叫做 mbone目錄中找到.
|
||
如果您在找視訊會議的工具如 <tt/vic/ 和 <tt/vat/ 的話,
|
||
到那邊找找!
|
||
|
||
<p>如果需要更進一部的訊息,找找
|
||
<url url="http://www.mbone.com/" name="Mbone Information Web">.
|
||
|
||
<sect1>
|
||
<heading>哪些網路卡是使用 DEC PCI chipset?</heading>
|
||
|
||
<p>以下是 <url url="mailto:gfoster@driver.nsta.org"
|
||
name="Glen Foster">提供的清單:
|
||
|
||
<verb>
|
||
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
|
||
</verb>
|
||
|
||
<sect1>
|
||
<heading>為什麼要用 FQDN 才能連到其他機器?</heading>
|
||
|
||
<p>你也許會發現要連的機器其實是在另一個網域。舉個例子,假設你是在
|
||
foo.bar.edu 這個網域中,想要連到在 bar.edu 裡一台叫 ``mumble'' 的
|
||
機器,則必須用 Fully-Qualified Domain Name,也就是
|
||
``mumble.bar.edu'',而不是只用 ``mumble'' 來指向它。
|
||
|
||
<p>傳統的 BSD BIND resolver 允許用這種方式解出機器的位址,但是
|
||
FreeBSD 內附 <htmlurl
|
||
url="http://www.FreeBSD.org/cgi/man.cgi?named" name="bind"> 版本
|
||
的內定方式,則是除了你所在的網域以外,不支援其他非 FQDN 的縮寫。
|
||
所以如 <tt>mumble</tt> 這種不合格的機器名稱,必須在
|
||
<tt>mumble.foo.bar.edu</tt>,否則就會從網域的最底層開始找。
|
||
|
||
<p>這和先前的做法不同,也就是不用 <tt>mumble.bar.edu</tt> 和
|
||
<tt>mumble.edu</tt> 繼續搜尋。看一下 RFC 1535,裡面有提到為什麼之
|
||
前的做法不好,甚至算是個安全漏洞。
|
||
|
||
<p>這裡有個不錯的解法,把
|
||
<htmlurl url="http://www.FreeBSD.org/cgi/man.cgi?resolv.conf"
|
||
name="/etc/resolv.conf"> 裡的這一行:
|
||
|
||
<verb>
|
||
domain foo.bar.edu
|
||
</verb>
|
||
|
||
換成這一行:
|
||
|
||
<verb>
|
||
search foo.bar.edu bar.edu
|
||
</verb>
|
||
|
||
但是要確定搜尋順序不會違反 RFC 2535 所謂的 ``boundary between local
|
||
and public administration''。
|
||
|
||
<sect1>
|
||
<heading>所有網路動作都會出現 ``Permission denied'' 錯誤訊息</heading>
|
||
|
||
<p>如果在編譯 kernel 時加了 <tt/IPFIREWALL/ 這個選項,要曉得 2.1.7R
|
||
內定是拒絕所有未經核准的網路封包(但在開發 2.1-STABLE 時改掉了)。
|
||
|
||
<p>如果不小心弄錯了 firewall 的設定,以 root 身份執行這個命令,接著
|
||
網路功能就會正常:
|
||
|
||
<verb>
|
||
ipfw add 65534 allow all from any to any
|
||
</verb>
|
||
|
||
<p>也可以在 <tt>/etc/rc.conf</tt> 設 "firewall_type='open'" 這個選項。
|
||
|
||
<p>如果想知道如何設定 FreeBSD firewall,請看 <url
|
||
url="../../handbook/firewalls.html" name="Handbook 相關部份">。
|
||
|
||
<sect1>
|
||
<heading>IPFW 會造成多大的網路延遲?</heading>
|
||
|
||
<p>這個問題的答案大多要看你怎麼訂 firewall 規則、還有 CPU 速度。對大
|
||
多數在 ethernet 上的程式及規則不多的情況下,延遲小到可以忽略。但如果
|
||
你想要精確數字來滿足好奇心,繼續往下讀。
|
||
|
||
<p>下面是在 486-66 2.2.5-STABLE 上所作的測量,我們修改了 IPFW 原始碼
|
||
來測量在 <tt/ip_fw_chk/ 函式上所花的時間,每處理 1000 個封包後就會在
|
||
console 上顯示結果。
|
||
|
||
<p>測試了兩組,每組各有 1000 個規則。第一組重複下面規則,故意設計成
|
||
最糟的情況:
|
||
|
||
<verb>
|
||
ipfw add deny tcp from any to any 55555
|
||
</verb>
|
||
|
||
<p>藉由檢查 port number,這樣會使 IPFW 在決定某個封包不符合條件前執
|
||
行大部份的檢查程式,因此造成最差的狀況。在重複這個規則 999 次後,接
|
||
著是 <tt>allow ip from any to any</tt>。
|
||
|
||
<p>第二組設計成以極快的速度跳過檢查規則:
|
||
|
||
<verb>
|
||
ipfw add deny ip from 1.2.3.4 to 1.2.3.4
|
||
</verb>
|
||
|
||
<p>一碰到封包的來源不符合規則所述,會很快跳過檢查讓封包通過。和上面
|
||
一樣,第 1000 個規則是 <tt>allow ip from any to any</tt>。
|
||
|
||
<p>在第一種情況中,處理每一個封包所造成的延遲大約是 2.703 ms,所以每
|
||
個規則大概會造成 2.7 microsecond 的延遲。所以在這些規則之下,理論上每
|
||
秒最多可以處理 370 個封包。在 10Mbps ethernet 和一個封包大概 1500 byte
|
||
的假設下,大概只會用到 55.5% 的網路頻寬。
|
||
|
||
<p>第二種情況,每個封包花了大約 1.172ms,所以每條規則大約用了 1.2
|
||
microsecond。理論上每秒最多可以處理 853 個封包,耗盡 10Mbps 的頻寬。
|
||
|
||
<p>上面測試用到的大量規則、及這些規則本身並不代表真實世界的情況,他們
|
||
只是用來產生所表示的數據。若想要訂出一套有效率的規則,記得這幾件事:
|
||
|
||
<itemize>
|
||
|
||
<item>在最前面放一個專門處理大量 TCP 流量的可用規則,在這條前面不
|
||
要放任何 <tt>allow tcp</tt> 的相關敘述。
|
||
|
||
<item>把常常觸發的規則放在前面,不常用到的則丟到後面(<bf>當然在不
|
||
影響 firewall 出入允許設定的前提下</bf>)。執行 <tt>ipfw -a l</tt>
|
||
就可看到封包的統計數目,來看最常用到那些規則。
|
||
|
||
</itemize>
|
||
|
||
<sect1>
|
||
<heading>要如何把對某台機器的網路服務要求(service request)轉向到另一台?
|
||
</heading>
|
||
|
||
<p>在 ports 目錄的 sysutils 種類中有個叫 'socket' 的 package,可以幫
|
||
你轉向 FTP 或其他類似的網路服務。只要把該網路服務的命令改成呼叫 socket
|
||
即可,如下(在 <tt>/etc/inetd.conf</tt> 裡):
|
||
|
||
<verb>
|
||
ftp stream tcp nowait nobody /usr/local/bin/socket socket ftp.foo.com ftp
|
||
</verb>
|
||
|
||
<p>其中 'ftp.foo.com' 和 'ftp' 分別是被轉到的機器和 port 名稱。
|
||
|
||
<sect1>
|
||
<heading>那裡可以找到管理頻寬的工具?</heading>
|
||
|
||
<p>FreeBSD 上有兩套頻寬管理工具:
|
||
<url url="http://www.csl.sony.co.jp/person/kjc/programs.html"
|
||
name="ALTQ"> 可以免費使用,
|
||
<url url="http://www.etinc.com" name="Emerging Technologies"> 出的
|
||
Bandwidth Manager 則是商用軟體。
|
||
|
||
<sect1>
|
||
<heading>怎麼會跑出 ``/dev/bpf0: device not configured'' 這個訊息?
|
||
</heading>
|
||
|
||
<p>柏克萊封包過濾器(Berkeley Packet Filter) <htmlurl
|
||
url="http://www.FreeBSD.org/cgi/man.cgi?bpf" name="(bpf)">
|
||
在程式使用前必須在 kernel 打開它的驅動程式,把下面這一行加入 kernel
|
||
設定檔中,編個新的 kernel:
|
||
|
||
<verb>
|
||
pseudo-device bpfilter # Berkeley Packet Filter+ </verb>
|
||
|
||
<p>在重新開機之後,還要做出 device node,在 <tt>/dev</tt> 下執行:
|
||
|
||
<tscreen><verb>
|
||
# sh MAKEDEV bpf0 </verb></tscreen>
|
||
|
||
<p>如果想要更進一步知道如何做出各種 device node,請看 <htmlurl
|
||
url="../../handbook/kernelconfig-nodes.html"
|
||
name="handbook 中有關 device node 的說明">。
|
||
|
||
</sect>
|
||
|