卡路由配置:從原理到實操解決內(nèi)外網(wǎng)沖突)
電腦上插了兩塊網(wǎng)卡一根網(wǎng)線接辦公內(nèi)網(wǎng)一根網(wǎng)線接寬帶外網(wǎng)結(jié)果要么外網(wǎng)上不去要么內(nèi)網(wǎng)系統(tǒng)打不開這個場景估計不少人都撞上過。問題不在網(wǎng)卡本身而在 Windows 的路由表——兩塊網(wǎng)卡各自帶著默認網(wǎng)關(guān)系統(tǒng)不知道該把數(shù)據(jù)往哪兒送于是“打架”。這篇文章就把雙網(wǎng)卡配置這件事徹底講清楚從原理到實操再到排障照著做就能讓外網(wǎng)和內(nèi)網(wǎng)各走各的路互不干擾。1. 雙網(wǎng)卡配置到底在解決什么問題1.1 為什么兩塊網(wǎng)卡會“打架”很多人以為網(wǎng)卡插上就能用兩塊網(wǎng)卡自然就是兩個網(wǎng)絡(luò)都能上。實際上 Windows 在同一時間只會選擇一個默認網(wǎng)關(guān)也就是“所有數(shù)據(jù)包的默認出口”。當內(nèi)網(wǎng)網(wǎng)卡和外網(wǎng)網(wǎng)卡都配置了網(wǎng)關(guān)時系統(tǒng)會按自動躍點數(shù)Metric選一個作為默認網(wǎng)關(guān)另一個被晾在一邊。于是你看到的典型癥狀就是外網(wǎng)偶爾能上但慢得離譜或者內(nèi)網(wǎng)系統(tǒng)徹底打不開又或者重啟一次網(wǎng)絡(luò)就換了一種“抽風”方式。這個問題的本質(zhì)是路由決策。Windows 每發(fā)一個數(shù)據(jù)包都會拿目標 IP 和路由表逐條比對先匹配掩碼范圍再比較躍點數(shù)最后決定從哪個網(wǎng)卡出去。內(nèi)網(wǎng)地址段如果沒被路由表精確命中數(shù)據(jù)包就會跑到默認網(wǎng)關(guān)去而默認網(wǎng)關(guān)是外網(wǎng)的內(nèi)網(wǎng)包自然就丟了。反過來外網(wǎng)數(shù)據(jù)包如果被內(nèi)網(wǎng)網(wǎng)卡搶了默認路由就會發(fā)到內(nèi)網(wǎng)網(wǎng)關(guān)網(wǎng)關(guān)一看目標不是內(nèi)網(wǎng)地址直接丟棄外網(wǎng)就斷。1.2 路由表的基本概念配置雙網(wǎng)卡前先理解路由表的四個核心字段字段含義舉例網(wǎng)絡(luò)目標數(shù)據(jù)包要去的地址段10.10.0.0網(wǎng)絡(luò)掩碼地址段的范圍大小255.255.0.0網(wǎng)關(guān)下一跳設(shè)備的 IP10.10.0.1接口從哪塊網(wǎng)卡發(fā)出10.10.5.100Windows 判斷一個數(shù)據(jù)包走哪條路由關(guān)鍵是“最長匹配”原則掩碼越長、范圍越精確的路由優(yōu)先級越高。比如目標 10.10.1.50 同時命中 0.0.0.0/0 和 10.10.0.0/16 兩條路由時系統(tǒng)一定走后者因為它的掩碼更長、更精確。這就是雙網(wǎng)卡配置的理論基礎(chǔ)——你不需要刪除默認路由只需要給內(nèi)網(wǎng)地址段添加一條更精確的靜態(tài)路由內(nèi)網(wǎng)流量就會自動走內(nèi)網(wǎng)網(wǎng)卡其余流量繼續(xù)走外網(wǎng)默認路由。提示雙網(wǎng)卡配置的核心思想不是“讓兩塊網(wǎng)卡同時上網(wǎng)”而是“讓不同的流量走不同的網(wǎng)卡”。默認路由只能有一條剩下的靠精確路由來分流。2. 動手之前先理清網(wǎng)絡(luò)拓撲2.1 采集網(wǎng)絡(luò)信息別上來就敲命令雙網(wǎng)卡配置翻車十有八九是沒搞清楚網(wǎng)絡(luò)地址段就開始操作。我的建議是先花五分鐘把信息摸清楚再決定怎么配。按 Win R 輸入cmd打開命令行執(zhí)行ipconfig /all重點看兩塊網(wǎng)卡各自的信息IPv4 地址、子網(wǎng)掩碼、默認網(wǎng)關(guān)、DNS。把結(jié)果抄下來確認哪個網(wǎng)卡對應(yīng)外網(wǎng)哪個對應(yīng)內(nèi)網(wǎng)。一般辦公環(huán)境里外網(wǎng)網(wǎng)卡可能是 DHCP 自動獲取地址段常見是 192.168.x.x 或 172.16.x.x內(nèi)網(wǎng)網(wǎng)卡通常是固定 IP地址段多為 10.x.x.x 或 172.16.x.x。接下來再看當前路由表route print -4這里會列出所有 IPv4 路由。你大概率會看到兩條 0.0.0.0/0 默認路由分別指向兩個網(wǎng)關(guān)其中一條的躍點數(shù)更小系統(tǒng)就選了它。這就是問題的根源。2.2 確定配置策略的幾個關(guān)鍵問題在動手前先回答下面幾個問題哪個網(wǎng)卡有訪問互聯(lián)網(wǎng)的能力只有這個網(wǎng)卡的默認網(wǎng)關(guān)需要保留。內(nèi)網(wǎng)有哪些地址段是單個網(wǎng)段還是多個網(wǎng)段比如 10.10.0.0/16 和 172.16.3.0/24有幾個內(nèi)網(wǎng)段就要加幾條路由。內(nèi)網(wǎng)網(wǎng)關(guān)是多少內(nèi)網(wǎng)網(wǎng)卡的網(wǎng)關(guān)要作為靜態(tài)路由的下一跳地址。內(nèi)網(wǎng)網(wǎng)卡用 DHCP 還是靜態(tài) IP如果內(nèi)網(wǎng)網(wǎng)卡走 DHCPIP 變化會導(dǎo)致路由失效強烈建議內(nèi)網(wǎng)網(wǎng)卡改成靜態(tài) IP。這些信息決定了下文的配置方案。如果內(nèi)網(wǎng)只有一個網(wǎng)段靜態(tài)路由方案最省事如果內(nèi)網(wǎng)網(wǎng)段很多或者你不想維護一堆路由規(guī)則可以試試調(diào)整接口躍點數(shù)的方式后面會講到。2.3 事先確認連通性配置之前先用 ping 測試一下當前狀態(tài)作為基線ping 外網(wǎng)網(wǎng)關(guān)IP ping 內(nèi)網(wǎng)網(wǎng)關(guān)IP如果內(nèi)網(wǎng)網(wǎng)關(guān)都 ping 不通說明網(wǎng)線、IP、防火墻這些基礎(chǔ)問題還沒解決這時候配置路由沒有意義。順便說一句有些內(nèi)網(wǎng)設(shè)備會禁 ICMPping 不通不代表網(wǎng)絡(luò)不通可以再試試訪問內(nèi)網(wǎng)的具體服務(wù)端口比如telnet 10.10.1.50 8080能通就說明鏈路是好的只是不響應(yīng) ping 而已。3. 兩種主流配置方案3.1 方案一靜態(tài)路由最精準也最常用這是我最推薦的方式思路很簡單內(nèi)網(wǎng)網(wǎng)卡只負責內(nèi)網(wǎng)網(wǎng)段外網(wǎng)網(wǎng)卡負責其余所有流量。實現(xiàn)方式就是添加一條或多條指向內(nèi)網(wǎng)網(wǎng)段的靜態(tài)路由。具體步驟分為三步第一步給內(nèi)網(wǎng)網(wǎng)卡配置固定 IP。打開“網(wǎng)絡(luò)和 Internet 設(shè)置” - “更改適配器選項”找到內(nèi)網(wǎng)網(wǎng)卡右鍵屬性雙擊“Internet 協(xié)議版本 4 (TCP/IPv4)”填入內(nèi)網(wǎng) IP、子網(wǎng)掩碼。關(guān)于網(wǎng)關(guān)這一欄我的建議是先留空網(wǎng)關(guān)只作為后面靜態(tài)路由的下一跳參數(shù)使用不需要填在這里。如果某些內(nèi)網(wǎng)環(huán)境必須填網(wǎng)關(guān)才能通那就填上但后續(xù)要在“高級”設(shè)置里把自動躍點數(shù)調(diào)大或者干脆用下方命令行的方式處理。第二步添加靜態(tài)路由?;氐焦芾韱T命令行執(zhí)行route add 10.0.0.0 mask 255.0.0.0 10.10.0.1 -p這條命令的含義是凡是目標地址在 10.0.0.0/8 范圍內(nèi)的數(shù)據(jù)包下一跳交給 10.10.0.1內(nèi)網(wǎng)網(wǎng)關(guān)。-p參數(shù)表示持久化路由重啟后仍然有效。這里有幾個參數(shù)要解釋清楚10.0.0.0是內(nèi)網(wǎng)地址段的起始地址。255.0.0.0是子網(wǎng)掩碼兩者配合決定了路由覆蓋的范圍。10.10.0.1是內(nèi)網(wǎng)網(wǎng)卡的網(wǎng)關(guān)數(shù)據(jù)包會從內(nèi)網(wǎng)網(wǎng)卡發(fā)到這個地址再由它轉(zhuǎn)發(fā)。-p對應(yīng) persistent不寫的話重啟就丟。第三步驗證。執(zhí)行route print -4確認路由已經(jīng)寫入然后分別 ping 內(nèi)網(wǎng)和外網(wǎng)的地址測試。注意route add命令需要管理員權(quán)限。普通權(quán)限的命令行執(zhí)行會報“需要提升權(quán)限”的錯誤。3.2 方案二調(diào)整接口躍點數(shù)適合內(nèi)網(wǎng)網(wǎng)段多的情況如果你所在的內(nèi)網(wǎng)有十幾個網(wǎng)段一條條加路由太痛苦這時可以用另一種思路讓內(nèi)網(wǎng)網(wǎng)卡接管所有“非外網(wǎng)”流量。做法是把內(nèi)網(wǎng)網(wǎng)卡的接口躍點數(shù)調(diào)低外網(wǎng)網(wǎng)卡的躍點數(shù)調(diào)高這樣當兩條路由的匹配精度相同時系統(tǒng)會優(yōu)先走躍點數(shù)小的網(wǎng)卡。操作路徑網(wǎng)卡屬性 - IPv4 - 高級 - 取消“自動躍點”手動填入一個數(shù)值。內(nèi)網(wǎng)網(wǎng)卡填 10外網(wǎng)網(wǎng)卡填 20。原理是 Windows 給每條路由計算一個綜合躍點數(shù)數(shù)值越小優(yōu)先級越高。所有需要走默認路由的流量會優(yōu)先從躍點數(shù)小的網(wǎng)卡出去。這個方案的好處是配置簡單內(nèi)網(wǎng)網(wǎng)段再多也不用管壞處是它的分流粒度比較粗如果內(nèi)網(wǎng)和外網(wǎng)存在重疊地址段或者某些流量必須走特定網(wǎng)卡它就搞不定了。另外如果你的外網(wǎng)網(wǎng)卡同時承擔著其他網(wǎng)段的轉(zhuǎn)發(fā)躍點數(shù)法也可能誤傷。3.3 方案三命令行一步到位對喜歡腳本化的朋友可以直接在管理員命令行里完成全部配置。修改網(wǎng)卡靜態(tài) IP 可以用 PowerShellNew-NetIPAddress -InterfaceAlias 以太網(wǎng) 2 -IPAddress 10.10.5.100 -PrefixLength 16添加靜態(tài)路由也可以用 PowerShell 的等價命令New-NetRoute -DestinationPrefix 10.0.0.0/8 -NextHop 10.10.0.1 -InterfaceAlias 以太網(wǎng) 2 -PersistentNew-NetRoute的-Persistent參數(shù)相當于命令行的-p。這種方式的好處是可以在一個腳本里完成 IP、網(wǎng)關(guān)、路由、DNS 的全部設(shè)置適合多臺電腦批量部署。內(nèi)網(wǎng) DNS 的配置可以用Set-DnsClientServerAddress -InterfaceAlias 以太網(wǎng) 2 -ServerAddresses 10.10.0.24. 實操演示一次典型的辦公場景配置4.1 場景說明與參數(shù)規(guī)劃假設(shè)一個典型的辦公環(huán)境外網(wǎng)網(wǎng)卡通過 DHCP 自動獲取當前 IP 為 192.168.1.100子網(wǎng)掩碼 255.255.255.0網(wǎng)關(guān) 192.168.1.1內(nèi)網(wǎng)網(wǎng)卡需要配置靜態(tài) IP 10.10.5.100子網(wǎng)掩碼 255.255.0.0內(nèi)網(wǎng)網(wǎng)關(guān) 10.10.0.1內(nèi)網(wǎng)里有一臺 ERP 服務(wù)器地址是 10.10.1.50還有一條獨立的財務(wù)網(wǎng)段 172.16.3.0/24。配置目標訪問 10.10.0.0/16 和 172.16.3.0/24 走內(nèi)網(wǎng)網(wǎng)卡其余流量全部走外網(wǎng)網(wǎng)卡。4.2 完整配置步驟第一步設(shè)置內(nèi)網(wǎng)網(wǎng)卡靜態(tài) IP。在內(nèi)網(wǎng)網(wǎng)卡的 IPv4 屬性里填入IP 地址10.10.5.100子網(wǎng)掩碼255.255.0.0默認網(wǎng)關(guān)留空DNS 可以填內(nèi)網(wǎng) DNS 服務(wù)器比如 10.10.0.2也可以暫時不填后面按需補。第二步添加兩條靜態(tài)路由。管理員命令行執(zhí)行route add 10.0.0.0 mask 255.0.0.0 10.10.0.1 -p route add 172.16.3.0 mask 255.255.255.0 10.10.0.1 -p這里第二條第掩碼是 255.255.255.0只覆蓋 172.16.3.0/24 這一個網(wǎng)段。如果你想偷懶也可以只加一條 172.16.0.0 mask 255.255.0.0 的路由把整個 172.16 段都交給內(nèi)網(wǎng)網(wǎng)關(guān)但這樣如果外網(wǎng)也有 172.16 段的資源就會被錯誤地拐到內(nèi)網(wǎng)去。我的原則是路由覆蓋范圍寧小勿大只寫確實需要走內(nèi)網(wǎng)的地址段。第三步驗證。先看路由表route print -4確認存在這樣幾條路由網(wǎng)絡(luò)目標掩碼網(wǎng)關(guān)接口躍點數(shù)0.0.0.00.0.0.0192.168.1.1192.168.1.1002010.0.0.0255.0.0.010.10.0.110.10.5.1001172.16.3.0255.255.255.010.10.0.110.10.5.1001然后測試連通性ping 10.10.1.50 ping www.baidu.com兩個都能通說明配置成功。4.3 用 tracert 驗證流量走向ping 通只是第一步你還需要確認流量確實走了正確的路徑。用 tracert 可以直觀看到數(shù)據(jù)包的下一跳tracert -d 10.10.1.50 tracert -d 8.8.8.8第一個命令的第一個跳點應(yīng)該是 10.10.0.1第二個命令的第一個跳點應(yīng)該是 192.168.1.1。如果第一個命令的跳點里出現(xiàn)了外網(wǎng)網(wǎng)關(guān)說明路由沒生效回去檢查路由表的接口和網(wǎng)關(guān)是不是填錯了。提示tracert -d里的-d參數(shù)表示不對 IP 反向解析域名輸出更快也更容易讀。5. 翻車現(xiàn)場與排查技巧實錄5.1 常見問題速查表現(xiàn)象可能原因處理方法配置完成后重啟路由丟失沒加-p參數(shù)重新用route add … -p添加內(nèi)網(wǎng)能通外網(wǎng)時斷時續(xù)內(nèi)網(wǎng)網(wǎng)卡也配置了默認網(wǎng)關(guān)系統(tǒng)選了內(nèi)網(wǎng)作為默認出口把內(nèi)網(wǎng)網(wǎng)卡的默認網(wǎng)關(guān)清空外網(wǎng)能通內(nèi)網(wǎng)某臺機器不通靜態(tài)路由的掩碼覆蓋范圍不夠確認內(nèi)網(wǎng)地址段補充路由規(guī)則路由表里添加了規(guī)則但流量不走接口 IP 變化舊路由失效刪除舊路由用新接口重新添加內(nèi)網(wǎng)網(wǎng)卡是 DHCPIP 變了路由失效DHCP 動態(tài)分配導(dǎo)致 IP 漂移內(nèi)網(wǎng)網(wǎng)卡改成靜態(tài) IP加了路由之后某個網(wǎng)站打不開網(wǎng)站的地址段恰好被靜態(tài)路由覆蓋流量被拐進內(nèi)網(wǎng)檢查路由覆蓋范圍拆分成更精確的網(wǎng)段5.2 路由不生效的經(jīng)典排查思路先說一個我踩過的坑用route add添加了靜態(tài)路由route print也能看到但流量就是不走這條路。后來發(fā)現(xiàn)是因為添加路由時沒指定接口Windows 自動選了躍點數(shù)最小的網(wǎng)卡作為接口而這個網(wǎng)卡恰好是外網(wǎng)網(wǎng)卡。數(shù)據(jù)包被發(fā)到外網(wǎng)網(wǎng)卡后雖然下一跳是內(nèi)網(wǎng)網(wǎng)關(guān)但外網(wǎng)網(wǎng)卡和內(nèi)網(wǎng)網(wǎng)關(guān)不在同一二層網(wǎng)絡(luò)包根本發(fā)不出去。解決辦法是添加路由時用if參數(shù)顯式指定接口編號。先查接口編號route print -4輸出第一列 Interface List 里有每個網(wǎng)卡的編號比如內(nèi)網(wǎng)網(wǎng)卡的編號是 15。然后添加路由時帶上 if 參數(shù)route add 10.0.0.0 mask 255.0.0.0 10.10.0.1 if 15 -p這樣可以強制讓路由走內(nèi)網(wǎng)網(wǎng)卡徹底避免選錯接口的問題。5.3 DHCP 和系統(tǒng)更新導(dǎo)致的坑公司網(wǎng)絡(luò)如果統(tǒng)一走 DHCP你內(nèi)網(wǎng)網(wǎng)卡的 IP 每次開機都可能變靜態(tài)路由里的接口 IP 對應(yīng)的路由就廢了。這種情況下有兩個選擇一是找網(wǎng)管把內(nèi)網(wǎng)網(wǎng)卡的 MAC 地址綁定到固定 IP二是堅持使用靜態(tài) IP對內(nèi)網(wǎng)網(wǎng)卡手動配置。我個人強烈推薦后者因為辦公電腦的內(nèi)網(wǎng) IP 通常需要穩(wěn)定手動配置反而省心。另外Windows 大版本更新后有可能會重置網(wǎng)絡(luò)配置包括清空靜態(tài)路由和網(wǎng)卡的高級設(shè)置。我遇到過幾次某次系統(tǒng)更新后內(nèi)網(wǎng)突然不通一看路由表空了一條只能重新執(zhí)行一遍 route add。建議把配置命令存成腳本出了問題時一鍵恢復(fù)下一節(jié)會給出腳本。5.4 防火墻和 DNS 的連帶問題雙網(wǎng)卡配置完成后內(nèi)網(wǎng)和外網(wǎng)都能通了但有時還是會出現(xiàn)“能 ping 通但打不開網(wǎng)頁”的情況這時候多半是 DNS 的問題。外網(wǎng) DNS 用 114.114.114.114 或者運營商的 DNS 沒問題但內(nèi)網(wǎng)資源如果用域名訪問那必須同時配置內(nèi)網(wǎng) DNS。我的做法是外網(wǎng)網(wǎng)卡只填外網(wǎng) DNS內(nèi)網(wǎng)網(wǎng)卡只填內(nèi)網(wǎng) DNS別混著填。因為 Windows 查詢 DNS 時會按網(wǎng)卡順序嘗試混填可能導(dǎo)致內(nèi)網(wǎng)域名被外網(wǎng) DNS 拒答。注意Windows 防火墻有時會攔截跨網(wǎng)卡的訪問尤其是從外網(wǎng)網(wǎng)卡去訪問內(nèi)網(wǎng)共享資源時。如果排除了路由問題還是不通用臨時關(guān)閉防火墻測試一下能通就把對應(yīng)的入站規(guī)則加白名單不要因噎廢食長期關(guān)防火墻。6. 配置腳本與長期維護6.1 一鍵配置腳本把常用的配置命令寫成一個批處理腳本省去每次手敲的麻煩。以下腳本以第 4 節(jié)的場景為例echo off rem 內(nèi)網(wǎng)網(wǎng)卡配置靜態(tài) IP netsh interface ip set address name以太網(wǎng) 2 static 10.10.5.100 255.255.0.0 netsh interface ip set dns name以太網(wǎng) 2 static 10.10.0.2 rem 添加靜態(tài)路由 route delete 10.0.0.0 mask 255.0.0.0 route delete 172.16.3.0 mask 255.255.255.0 route add 10.0.0.0 mask 255.0.0.0 10.10.0.1 if 15 -p route add 172.16.3.0 mask 255.255.255.0 10.10.0.1 if 15 -p rem 驗證 route print -4 pause腳本開頭先執(zhí)行route delete是為了保證腳本可重復(fù)運行。很多人寫腳本時忘了刪除舊路由第二次執(zhí)行會報“路由已存在”的錯或者殘留多條相同的路由導(dǎo)致系統(tǒng)選路混亂。6.2 路由表備份與恢復(fù)配置完成后最好把整個 IPv4 配置備份一份。用 netsh 可以在命令行里導(dǎo)出網(wǎng)卡配置netsh interface ipv4 show config 網(wǎng)卡配置備份.txt netsh interface ipv4 show route 路由表備份.txt系統(tǒng)更新或誤操作后對照備份文件恢復(fù)即可。如果只是路由表亂了可以直接重置所有靜態(tài)路由恢復(fù)到純 DHCP 狀態(tài)route -f這個命令會清除所有非默認路由謹慎使用。執(zhí)行后需要重新添加你的靜態(tài)路由。6.3 把配置做成開機自啟有些環(huán)境里同事的電腦也需要同樣的雙網(wǎng)卡配置與其一臺臺手動配我建議做一個更省事的版本把腳本放到“啟動”文件夾或者用任務(wù)計劃程序設(shè)置開機運行一次。批處理文件在開機時自動執(zhí)行管理員權(quán)限可以通過任務(wù)計劃程序設(shè)置為“使用最高權(quán)限運行”來解決。這樣即使 DHCP 或系統(tǒng)更新把路由搞亂了重啟一次電腦也能自動恢復(fù)。實測這個方案在公司幾十臺辦公電腦上運行穩(wěn)定省了不少運維時間。6.4 多網(wǎng)段內(nèi)網(wǎng)環(huán)境的擴展思路如果你的內(nèi)網(wǎng)不是單網(wǎng)段而是多個業(yè)務(wù)系統(tǒng)分布在幾個不同的地址段只要重復(fù)添加靜態(tài)路由就行了。比如公司還有一套 OA 系統(tǒng)在 172.16.8.0/24只需要再加一條route add 172.16.8.0 mask 255.255.255.0 10.10.0.1 if 15 -p這時候“路由覆蓋范圍寧小勿大”的原則就很重要了。我習慣把每個獨立業(yè)務(wù)系統(tǒng)的網(wǎng)段拆開寫而不是圖省事寫個大范圍的掩碼。少寫一條路由的代價是某天某個業(yè)務(wù)突然不通多寫一條路由的代價是有可能把外網(wǎng)流量錯誤地拐進內(nèi)網(wǎng)權(quán)衡下來還是細粒度更安全。我個人在實際操作中還有一個習慣每次配置完成后把命令、IP 規(guī)劃、驗證結(jié)果都記在文檔里標注清楚每塊網(wǎng)卡的用途和路由規(guī)則。別小看這一步幾個月后網(wǎng)卡驅(qū)動更新或者換新電腦需要重新配置時這份記錄比任何記憶都可靠。雙網(wǎng)卡配置本身不算復(fù)雜真正讓人翻車的永遠是細節(jié)——接口選錯、掩碼寫寬、DHCP 漂移、忘了加持久化參數(shù)這些坑踩過一次就記住了。