使用PowerShell通過不同網路(網卡)訪問不同網站

来源:https://www.cnblogs.com/pokersang/Undeclared/17964222
-Advertisement-
Play Games

title: 使用PowerShell通過不同網路(網卡)訪問不同網站 date: 2022-03-26 categories: 編程 tags: - PowerShell - 網路 - Windows 前言 在學校生活時經常有一種需求:訪問某些網站(如校內系統)時需要使用校園網,訪問另一些網站(如 ...


title: 使用PowerShell通過不同網路(網卡)訪問不同網站
date: 2022-03-26
categories: 編程
tags:
- PowerShell
- 網路
- Windows

前言

在學校生活時經常有一種需求:訪問某些網站(如校內系統)時需要使用校園網,訪問另一些網站(如Steam、Github等)校園網很慢,需要使用手機瀏覽器等其他網路加速。此時我就覺得如果能同時使用兩個網路該多好。

本文就介紹如何用PowerShell[1]實現這個功能(需要Windows平臺,版本XP及以上)。

原理

首先需要明確,同一張網卡是無法同時連接兩個網路的(除非同時使用多個代理達到這種效果)。幸運的是,現在絕大多數電腦都同時擁有有線和無線兩張網卡,所以可以實現這個效果。

其次,一般應用程式無法直接指定網卡上網(例如虛擬機軟體除外),不過我們有代替的方法:設置路由表。

路由表的基本原理是:要求IP的某些網段,走指定的網關。而網關又和網路有密不可分的聯繫,從而實現隱式地指定網卡。

查看電腦信息

首先可以同時連上有線和無線網,方便查看

網路適配器

一臺電腦上會有多個網路適配器,其中有物理網卡,也有虛擬網卡。我們要找出其中物理網卡裡的有線和無線網卡:首先鍵入ipconfig,可以對此有一個大致印象:

十分明顯地看到,有好多適配器。但比如說名字裡帶virtual的,或者vEthernet這種顯然是虛擬網卡。剩下很快就能發現有線和無線網路適配器分別是:乙太網和WLAN(不同電腦可能名字不一樣,連接狀態也不盡相同)。

PS C:\Users\poker> ipconfig

Windows IP 配置


乙太網適配器 乙太網:

   連接特定的 DNS 尾碼 . . . . . . . : hgd
   本地鏈接 IPv6 地址. . . . . . . . : XXXX::XXXX:XXXX:XXXX:XXXX%XX
   IPv4 地址 . . . . . . . . . . . . : XXX.XXX.XXX.XXX
   子網掩碼  . . . . . . . . . . . . : XXX.XXX.XXX.XXX
   預設網關. . . . . . . . . . . . . : XXX.XXX.XXX.XXX

無線區域網適配器 本地連接* 5:

   媒體狀態  . . . . . . . . . . . . : 媒體已斷開連接
   連接特定的 DNS 尾碼 . . . . . . . :

無線區域網適配器 本地連接* 6:

   媒體狀態  . . . . . . . . . . . . : 媒體已斷開連接
   連接特定的 DNS 尾碼 . . . . . . . :

無線區域網適配器 WLAN:

   連接特定的 DNS 尾碼 . . . . . . . :
   本地鏈接 IPv6 地址. . . . . . . . : XXXX::XXXX:XXXX:XXXX:XXXX%XX
   IPv4 地址 . . . . . . . . . . . . : XXX.XXX.XXX.XXX
   子網掩碼  . . . . . . . . . . . . : XXX.XXX.XXX.XXX
   預設網關. . . . . . . . . . . . . : XXX.XXX.XXX.XXX

乙太網適配器 藍牙網路連接 3:

   媒體狀態  . . . . . . . . . . . . : 媒體已斷開連接
   連接特定的 DNS 尾碼 . . . . . . . :

接下來使用Get-NetIPConfiguration指令,就可以看到物理網卡的信息了:

其中我們要註意Gateway的項,這就是網關。

PS C:\Users\poker> Get-NetIPConfiguration

InterfaceAlias       : 乙太網
InterfaceIndex       : 18
InterfaceDescription : Realtek PCIe GbE Family Controller
NetProfile.Name      : XXXXXXXXXXXXXXX
IPv4Address          : XXX.XXX.XXX.XXX
IPv6DefaultGateway   :
IPv4DefaultGateway   : XXX.XXX.XXX.XXX
DNSServer            : XXX.XXX.XXX.XXX
                       XXX.XXX.XXX.XXX
                       XXX.XXX.XXX.XXX
                       XXX.XXX.XXX.XXX
                       XXX.XXX.XXX.XXX
                       XXX.XXX.XXX.XXX

InterfaceAlias       : WLAN
InterfaceIndex       : 14
InterfaceDescription : Intel(R) Wi-Fi 6 AX200 160MHz
NetProfile.Name      : XXXXXXXXXXXXXXX
IPv4Address          : XXX.XXX.XXX.XXX
IPv6DefaultGateway   :
IPv4DefaultGateway   : XXX.XXX.XXX.XXX
DNSServer            : XXX.XXX.XXX.XXX

InterfaceAlias       : 藍牙網路連接 3
InterfaceIndex       : 10
InterfaceDescription : Bluetooth Device (Personal Area Network) #3
NetAdapter.Status    : Disconnected

其他相關指令:netsh interface show interfaceGet-NetAdapter,感興趣可以看看。

路由

使用Get-NetRoute指令(或route print)可以查看路由表:

表中每一條代表一個路由,註意他所有的屬性:

  • ifIndex (interface index)(介面序號):即和上圖同名的屬性。

  • DestinationPrefix(目標首碼):即指定的網段,屬於這個網段的會找對應的網關(其中前面四段句點分開的是IP,斜杠後的是子網掩碼從左往右數1的位數)。

  • NextHop(下一跳):即指定的網關。

  • 兩個Metric(躍點):大致表示這個路由的優先順序,數字越小越優先。

  • PolicyStore(存儲策略):表示這是臨時路由(ActiveStore)還是永久路由(PersistentStore),其中臨時路由會在重啟後刪除重設。

PS C:\Users\poker> Get-NetRoute

ifIndex DestinationPrefix                              NextHop                                  RouteMetric ifMetric PolicyStore
------- -----------------                              -------                                  ----------- -------- -----------
10      255.255.255.255/32                             0.0.0.0                                          256 65       ActiveStore
13      255.255.255.255/32                             0.0.0.0                                          256 25       ActiveStore
11      255.255.255.255/32                             0.0.0.0                                          256 25       ActiveStore
18      255.255.255.255/32                             0.0.0.0                                          256 25       ActiveStore
14      255.255.255.255/32                             0.0.0.0                                          256 50       ActiveStore
1       255.255.255.255/32                             0.0.0.0                                          256 75       ActiveStore
10      224.0.0.0/4                                    0.0.0.0                                          256 65       ActiveStore
13      224.0.0.0/4                                    0.0.0.0                                          256 25       ActiveStore
11      224.0.0.0/4                                    0.0.0.0                                          256 25       ActiveStore
18      224.0.0.0/4                                    0.0.0.0                                          256 25       ActiveStore
14      224.0.0.0/4                                    0.0.0.0                                          256 50       ActiveStore
1       224.0.0.0/4                                    0.0.0.0                                          256 75       ActiveStore
14      192.168.1.255/32                               0.0.0.0                                          256 50       ActiveStore
14      192.168.1.226/32                               0.0.0.0                                          256 50       ActiveStore
14      192.168.1.0/24                                 0.0.0.0                                          256 50       ActiveStore
18      172.19.73.255/32                               0.0.0.0                                          256 25       ActiveStore
18      172.19.73.29/32                                0.0.0.0                                          256 25       ActiveStore
18      172.19.73.0/24                                 0.0.0.0                                          256 25       ActiveStore
1       127.255.255.255/32                             0.0.0.0                                          256 75       ActiveStore
1       127.0.0.1/32                                   0.0.0.0                                          256 75       ActiveStore
1       127.0.0.0/8                                    0.0.0.0                                          256 75       ActiveStore
14      0.0.0.0/0                                      XXX.XXX.XXX.XXX                                    0 50       ActiveStore
18      0.0.0.0/0                                      XXX.XXX.XXX.XXX                                    0 25       ActiveStore
10      ff00::/8                                       ::                                               256 65       ActiveStore
13      ff00::/8                                       ::                                               256 25       ActiveStore
11      ff00::/8                                       ::                                               256 25       ActiveStore
18      ff00::/8                                       ::                                               256 25       ActiveStore
14      ff00::/8                                       ::                                               256 50       ActiveStore
1       ff00::/8                                       ::                                               256 75       ActiveStore
13      fe80::ddf5:310e:d09b:1326/128                  ::                                               256 25       ActiveStore
10      fe80::8b75:5968:ee8a:42d6/128                  ::                                               256 65       ActiveStore
18      fe80::5c8c:97bf:72c:71e9/128                   ::                                               256 25       ActiveStore
11      fe80::4fbb:4f7c:2d3c:426a/128                  ::                                               256 25       ActiveStore
14      fe80::3c65:d5a8:6d1:95cd/128                   ::                                               256 50       ActiveStore
10      fe80::/64                                      ::                                               256 65       ActiveStore
13      fe80::/64                                      ::                                               256 25       ActiveStore
11      fe80::/64                                      ::                                               256 25       ActiveStore
18      fe80::/64                                      ::                                               256 25       ActiveStore
14      fe80::/64                                      ::                                               256 50       ActiveStore
1       ::1/128                                        ::                                               256 75       ActiveStore
18      ::/0                                           XXXX::XXXX:XXXX:XXXX:XXXX                        256 25       ActiveStore

註意NextHop不為空的路由(一般Metric也最小),這就是有線和無線網預設的路由,我們新建路由時為避免衝突,要先刪除這個(不用擔心失誤,重啟後會恢復)

這些路由前面網段都是0.0.0.0/0(或::/0),表示全網段都可以使用這個路由。

Metric可以發現,絕大多數電腦同時連有線和無線網時,都是有線網的Metric比較小,這也是為什麼路由總是會優先選擇有線網連接。Windows預設開啟了AutomaticMetric,會按照帶寬網速自動設定Metric[2],有需要可以去設置關閉

設備地址

輸入指令Get-CimInstance Win32_NetworkAdapterConfiguration | Select-Object Description, SettingID,可以看到網卡以及對應的Guid

我們將來可以通過這個Guid,從註冊表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\{對應設備Guid}\ConnectionPnPInstanceId項判斷是不是物理網卡(值以PCI開頭是物理網卡,BTH開頭是藍牙網卡,其他是虛擬網卡)

PS C:\Users\poker> Get-CimInstance Win32_NetworkAdapterConfiguration | Select-Object Description, SettingID

Description                              SettingID
-----------                              ---------
Microsoft Kernel Debug Network Adapter   {2A714150-362D-497E-AC8B-A9F963B02478}
Realtek PCIe GbE Family Controller       {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}
Intel(R) Wi-Fi 6 AX200 160MHz            {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}
Microsoft Wi-Fi Direct Virtual Adapter   {33A4093B-99C7-478F-AF06-FD0A698B1FF5}
Microsoft Wi-Fi Direct Virtual Adapter   {F1F71D7B-D35B-4C65-8A91-DC94EE7C0A2E}
WAN Miniport (SSTP)                      {FA29F161-184C-4773-898D-A104510EE7F5}
WAN Miniport (IKEv2)                     {9859D6F0-2451-47BB-8748-7B1C5C542200}
WAN Miniport (L2TP)                      {EF4DCC46-BE1D-4FC7-8CFB-CF00F37AB9C8}
WAN Miniport (PPTP)                      {5E553B27-3FA5-445B-8A15-8249DF31AF3F}
WAN Miniport (PPPOE)                     {91899BE4-723E-43A6-8006-6BB2AFA4FC32}
WAN Miniport (IP)                        {CD5DD751-23AA-44F2-940F-4B565365892D}
WAN Miniport (IPv6)                      {DC0056A3-472D-4178-901C-131B8D8261E9}
WAN Miniport (Network Monitor)           {218400DD-182F-4BC4-A266-EBDB68EDD6DF}
Bluetooth Device (Personal Area Network) {2CA478BD-DADE-48B3-949B-66A882E18A72}

實現思路

接下來就是實現環節了,雖然指定網關聽起來很容易。但如果切換網路之後,不僅網關可能會變,而且介面別名(InterfaceAlias)也會變,到時候再調整比較麻煩。

如果可以指定網卡,並指定網段就很方便了。實際上我們確實可以這樣做,因為Get-NetIPConfiguration(或Get-NetAdapter)可以看出來:介面描述(InterfaceDescription)、介面別名(InterfaceAlias)和網關(Gateway)幾乎是一一對應的關係,所以我們可以通過PowerShell(或C/C++)從介面描述查找網關,並設置路由,就可以達成目的。

至於網段分配,一般校園網都是連續的網段,比如說172.18.XXX.XXX都是校園網IP,那麼就設置目標首碼(DestinationPrefix)為172.18.0.0/16,表示子網掩碼是255.255.0.0,即前16位是固定的,後面可以變化。將這段路由優先順序設最高,然後再設置剩下的路由(直接用0.0.0.0/0)全部走另一個網路(優先順序第二高)。

另外還可以結合Proxifier等軟體管理,如用Proxifier強大的代理篩選功能將校園網所有IP或程式都代理到某一臺學校的伺服器上,這樣路由規則就可以只要指定一個IP了(如172.18.6.57/32)。

腳本代碼

需要使用PowerShell7及以上運行。

在使用的時候,只需要按照需要修改# Main部分。

# NetAdapterInfo
class NetAdapterInfo {
    [guid] $SettingID
    [string] $Description
    [string] $DefaultIPGateway

    NetAdapterInfo (
        [guid] $settingID,
        [string] $description,
        [string] $defaultIPGateway
    ) {
        $this.SettingID = $settingID
        $this.Description = $description
        $this.DefaultIPGateway = $defaultIPGateway
    }
}

# Functions
function Test-PhysicalNic {
    param (
        [Parameter(
            Mandatory,
            ValueFromPipeline
        )]
        [NetAdapterInfo]
        $Info
    )

    $str = Get-ItemProperty `
        -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\{$($Info.SettingID)}\Connection" `
        -Name PnPInstanceId
    $str.PnPInstanceId.StartsWith("PCI")
}

function Get-PhysicalNics {
    Get-CimInstance `
        -Class Win32_NetworkAdapterConfiguration `
    | ForEach-Object {
        [NetAdapterInfo]::new(
            $_.SettingID,
            $_.Description,
            $_.DefaultIPGateway
        )
    } `
    | Where-Object { Test-PhysicalNic $_ }
}

function Remove-AdapterRoute {
    param (
        [string]
        $DestinationPrefix = "0.0.0.0/0"
    )
    Remove-NetRoute $DestinationPrefix
}

function Set-AdapterRoute {
    param (
        [NetAdapterInfo[]]
        $List,
        [string]
        $AdapterDescription,
        [string]
        $DestinationPrefix = "0.0.0.0/0",
        [UInt16]
        $RouteMetric = 0,
        [bool]
        $PersistentStore = $false
    )
    $Private:NextHop = ($List | Where-Object Description -EQ $AdapterDescription)[0].DefaultIPGateway
    New-NetRoute `
        $DestinationPrefix `
        -InterfaceAlias $AdapterDescription `
        -NextHop $Private:NextHop `
        -PolicyStore ($PersistentStore ? "PersistentStore" : "ActiveStore")
}

function Set-AdapterRoute {
    param (
        [NetAdapterInfo[]]
        $List,
        [string]
        $InterfaceDescription,
        [string]
        $DestinationPrefix = "0.0.0.0/0",
        [string]
        $IsIpv4 = $true,
        [UInt16]
        $RouteMetric = 0,
        [bool]
        $PersistentStore = $false
    )
    $InterfaceAlias = (Get-NetAdapter | Where-Object Name -EQ $InterfaceDescription)[0].Name
    $gateways = ($List | Where-Object Description -EQ $InterfaceAlias)[0].DefaultIPGateway
    if ($gateways -EQ "") {
        return
    }
    foreach ($gateway in $gateways.Split(' ')) {
        if (($IsIpv4 -and ([System.Net.IPAddress]::Parse($gateway).AddressFamily -EQ [System.Net.Sockets.AddressFamily]::InterNetwork)) -or `
            (!$IsIpv4 -and ([System.Net.IPAddress]::Parse($gateway).AddressFamily  -EQ [System.Net.Sockets.AddressFamily]::InterNetworkV6))) {
            New-NetRoute `
                $DestinationPrefix `
                -InterfaceAlias $InterfaceAlias `
                -NextHop $gateway `
                -PolicyStore ($PersistentStore ? "PersistentStore" : "ActiveStore") `
                -RouteMetric $RouteMetric
            return
        }
    }
}

# Main
$info = Get-PhysicalNics

Remove-AdapterRoute

Remove-AdapterRoute ::/0

Set-AdapterRoute $info "Realtek PCIe GbE Family Controller" 172.18.6.57/32

Set-AdapterRoute $info "Intel(R) Wi-Fi 6 AX200 160MHz" 0.0.0.0/0

我的代碼倉庫[3]里包含完整PowerShell腳本和部分C++方法。


  1. NetTcpIp ↩︎

  2. Automatic Metric ↩︎

  3. RouteModifier ↩︎


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 學習 Rust 的 15 種方法 1. 閱讀:The Rust Book - https://doc.rust-lang.org/book/ 2. 代碼:做 Rustlings 練習 - https://github.com/rust-lang/rustlings 3. 課程:如何通過以下方式 學習 ...
  • Spring事務提交後執行:深入理解和實踐 在Java開發中,Spring框架的事務管理是一個核心概念,尤其是在企業級應用中。理解和正確使用Spring事務對於保證應用的數據一致性和穩定性至關重要。本文將深入探討在Spring中事務提交後的執行邏輯,這是一個經常被忽視但又極為重要的部分。 事務的基礎 ...
  • 測試預設測java對應層級下的東西 如果test和java層級不在對應位置 可以手動寫Test的路徑來更改 @Component =@Repository @Service @Controller 對於WebMvcConfigurer 加不加EnableWebMvc都可以 對於WebMvcConfi ...
  • 數據來源分析💥 網站鏈接: aHR0cHM6Ly93d3cua3Vnb3UuY29tLw== 歌曲下載 signature 💥 正常抓包分析找到音頻鏈接地址 通過鏈接搜索找到對應的數據包位置 分析 signature 參數加密位置 通過 s 列表 合併成字元串, 傳入d函數中進行加密, 返回32 ...
  • Java中SimpleDateFormat、LocalDateTime和DateTimeFormatter的區別及使用 在Java的世界里,處理日期和時間是常見的任務。尤其在Java 8之前,SimpleDateFormat是處理日期和時間的主要方式。然而,Java 8引入了新的日期時間API,其中 ...
  • PathIcon是一個Avalonia內置的控制項,可以根據Geometry繪製一個圖標。 源碼 PathIcon間接繼承TemplatedControl,只有一個Geometry類型的依賴屬性Data: public class PathIcon : IconElement { static Pat ...
  • 本文以一個控制台應用與一個winform程式為例向大家介紹了C#如何基於ScottPlot進行數據可視化,並介紹了實現動態繪圖的兩種方式,一種是使用定時器,另一種是使用非同步操作,希望對你有所幫助。 ...
  • 在前面隨筆《使用Winform開發自定義用戶控制項,以及實現相關自定義事件的處理》中介紹了Winform用戶自定義控制項的處理,對於Winform自定義的用戶控制項來說,它的呈現方式主要就是基於GDI+進行渲染的,對於數量不多的控制項呈現,一般不會覺察性能有太多的問題,隨著控制項的數量大量的增加,就會產生性能... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...