多數作業系統預設不會直接在網路介面之間轉送流量。這麼設計主要是為了安全:避免路由一側的人直接和另一側的網路位址通訊。想像一下,如果替你連上網際網路的路由器把來自網際網路的流量直接送進你的私有網路,會有什麼後果。所以在未啟用路由的情況下,任何送到機器某介面、需要被轉送的流量都會被丟棄,或回一則錯誤訊息給發送端。

因此,要讓作業系統執行路由,必須以管理員身分變更組態。各作業系統的做法不同,但有幾項共通前提:

  • 電腦至少要有兩個獨立的網路介面才能當路由器。
  • 閘道兩側都要有正確的路由資訊;若目的端沒有回到來源裝置的對應路由,通訊可能無法如預期運作。
  • 啟用路由後,把網路裝置設定成經由你這台新路由器轉送流量,再於路由器上執行 Wireshark 之類的工具,就能在兩個介面之間擷取被轉送的流量。

在 Windows 啟用路由#

Windows 預設不在網路介面間路由。要啟用,需修改系統登錄檔(registry)。可以用 GUI 登錄編輯器,但最簡單的方式是以管理員身分在命令提示字元執行指令,把 IPEnableRouter 設為 1;擷取完成後再設回 0。兩次變更之間都需要重新開機。

修改 Windows 登錄檔要格外小心。錯誤的變更可能徹底弄壞 Windows、導致無法開機。動手做任何危險變更前,先用內建的 Windows 備份工具之類做一次系統備份。

Windows:啟用/停用路由的指令

啟用路由:

reg add HKLM\System\CurrentControlSet\Services\Tcpip\Parameters ^
    /v IPEnableRouter /t REG_DWORD /d 1

停用路由:

reg add HKLM\System\CurrentControlSet\Services\Tcpip\Parameters ^
    /v IPEnableRouter /t REG_DWORD /d 0

兩次變更之間都需要重新開機。

在 *nix 啟用路由#

在類 Unix 系統上,只要用 sysctl 指令改動 IP 路由的系統設定即可。(各系統的具體指令不見得一致,但通常很容易查到對應寫法。)Linux 上的變更會立即生效,不需重開機;把指令中的 1 改回 0 即可還原。

Linux 的 IPv4 與 IPv6 是兩個獨立開關,要分別啟用。macOS 使用的鍵名又與 Linux 不同。

*nix:啟用路由的指令

Linux 啟用 IPv4 路由(以 root 執行):

sysctl net.ipv4.conf.all.forwarding=1

Linux 啟用 IPv6 路由:

sysctl net.ipv6.conf.all.forwarding=1

macOS 啟用路由:

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

1 改回 0 即可還原設定。