<!-- $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 &amp;&amp; make &amp;&amp; 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
        &amp; 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>

