脚本 + GUI 多 IP 配置方案BAT 批处理脚本:调用netsh 批量给单网卡添加多个 IPv4 地址 + 多网关、多 DNS GUI 手工路径:控制面板 → 网络适配器 → IPv4 高级设置 图形界面配置多 IP 底层统一入口:Windows TCP/IP 协议栈,NDIS 网卡适配器 PowerShell 现代等价脚本 Windows 操作系统中设置多个 IP 地址 多个DNS

 

脚本 + GUI 多 IP 配置方案拆解|底层原理 / 依赖文件 / 依赖关系 / 配套链 / 逻辑链路 / 边界

目标对象:

  1. BAT 批处理脚本:调用netsh interface ipv4批量给单网卡添加多个 IPv4 地址 + 多网关、多 DNS
  2. GUI 手工路径:控制面板 → 网络适配器 → IPv4 高级设置 图形界面配置多 IP
  3. 底层统一入口:Windows TCP/IP 协议栈,NDIS 网卡适配器

一、底层原理

Windows 单网卡支持多 IP 地址(单适配器多 IP,别名 IP/secondary IP),属于 TCP/IP 栈原生能力,不需要多张物理网卡。

  1. 一张 NDIS 网卡适配器,在 TCPIP.SYS 协议栈内可以绑定多个 IPv4 接口地址条目
  2. 每个 IP + 子网掩码为独立 IP 条目;网关是路由表条目,这里脚本写法存在一个经典问题:单网卡不能绑定多个默认网关(0.0.0.0/0 路由只能一条,多条默认网关会造成路由冲突,Windows 不会自动负载均衡);
  3. DNS 是适配器级的 DNS 服务器列表,可添加多个,按index优先级排序;
  4. GUI 和 netsh 本质是调用同一套内核 TCPIP 栈接口,只是前端 UI / 命令行封装不同。

核心概念区分

  • IP / 子网掩码:分配给网卡的接口地址,可以多个
  • 默认网关:0.0.0.0/0 全局默认路由,一个系统同一适配器只建议 1 条;脚本连续 add 多个默认网关属于错误用法,会造成路由表混乱。

二、依赖文件

文件 作用
cmd.exe BAT 批处理宿主解释器,解析@echo offrem注释、echo 等语法
netsh.exe 网络命令行工具,系统核心入口
netsh.dllnetship.dll netsh 的 IPv4 网络配置辅助 DLL
iphlpapi.dll IP Helper API,用户态配置网络地址、路由、DNS 的 API 库,netsh/GUI 都调用它
tcpip.sys 内核 TCP/IP 协议栈驱动,保存网卡 IP、子网掩码、路由、DNS 配置
ndis.sys NDIS 网卡底层驱动,承载网络适配器
dhcpcsvc.dll DHCP 客户端组件(静态 IP 场景不使用)
dnsapi.dll DNS 客户端组件,读取适配器 DNS 列表
hnetcfg.dll 网络连接控制面板 GUI 使用的 COM 组件(图形界面路径依赖)

三、依赖关系

BAT 脚本路径(netsh)

  1. 运行身份:管理员权限,非管理员会拒绝修改网卡 IP / 路由 / DNS;
  2. 服务依赖:不需要 DHCP 服务,但网卡(NDIS 适配器)必须存在、已枚举;网卡名称必须和脚本 "以太网" 完全匹配(中文 / 英文系统名称不一样,英文系统是Ethernet);
  3. 注册表持久化:静态 IP 配置写入注册表 HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{网卡GUID}

IP 地址、子网掩码、DNS 服务器存储在此;网关存储在系统路由表。

GUI 控制面板路径

  1. 底层同样调用 iphlpapi.dll + tcpip.sys;GUI 只是 hnetcfg.dll 封装的可视化界面;
  2. 权限同样需要管理员;
  3. 操作完成写入完全相同的注册表位置,和 netsh 修改的是同一套存储

四、配套链

BAT 脚本配套调用链路

bat脚本 → cmd.exe 解析脚本行 → netsh.exe → netship.dll → iphlpapi.dll(API:AddIpAddress、CreateRoute、SetInterfaceDnsServer)
→ 下发IRP到 tcpip.sys(内核TCP协议栈) → 绑定IP到NDIS网卡ndis.sys → 写入注册表持久化

GUI 图形界面配套调用链路

控制面板网络适配器 → hnetcfg.dll COM组件 → iphlpapi.dll → tcpip.sys内核栈 → ndis.sys网卡驱动 → 注册表持久化保存配置

配套相关工具

  • ipconfig /all:读取 iphlpapi 展示 IP/DNS
  • route print:查看系统路由表(用来检查多网关冲突)
  • PowerShell New-NetIPAddress / Set-DnsClientServerAddress:现代 PowerShell 原生替代 netsh
  • Get-NetIPInterface:查看网卡接口信息

五、逻辑链路(时序)

BAT 脚本执行时序

  1. @echo off:关闭命令回显;rem为注释,不执行;
  2. 循环执行 netsh interface ipv4 add address "以太网" IP 掩码 网关
    • 向 tcpip.sys 添加一个次级 IP 地址;第三个参数是网关,等价新增一条默认路由
  3. 执行netsh interface ipv4 add dns,按 index 序号追加 DNS 服务器列表;
  4. 所有配置写入内核 TCPIP 栈,同时写入注册表永久保存;
  5. echo 输出完成提示,脚本结束。

⚠️ 脚本缺陷:多次 add address 附带网关,等价重复添加 0.0.0.0/0 默认路由,路由表会存在多条默认网关,极易造成网络随机丢包、路由混乱。 正确用法:仅第一个 IP 可以带默认网关,其余次级 IP 只填 IP + 子网,网关参数省略

:: 正确示例:仅第一条带网关,后面IP不加网关
netsh interface ipv4 add address "以太网" 192.168.1.55 255.255.255.0 192.168.1.1
netsh interface ipv4 add address "以太网" 192.168.2.55 255.255.255.0

GUI 手工配置时序

  1. 打开更改适配器设置,打开网卡属性,IPv4 属性 → 高级;
  2. IP 设置 → 添加,填入 IP + 子网掩码;可选添加网关;
  3. DNS 区域,添加多个 DNS 服务器;
  4. 点击确定:GUI 调用 iphlpapi,写入 tcpip 内核栈,保存注册表;
  5. 内核立即生效(静态 IP 无需重启网卡,部分场景会短暂断流)。

六、边界约束(限制、坑点)

  1. 默认网关边界(最重大坑) Windows IPv4 路由表只使用优先级最高的一条 0.0.0.0/0 默认网关;脚本一次性添加 5 条默认网关,路由表存在多条默认路由,会引发非对称路由、随机访问失败。次级 IP 不要附加默认网关
  2. 网卡名称严格匹配:脚本 "以太网" 在英文系统是Ethernet;名称不一致直接报错找不到接口。
  3. 权限边界:必须管理员权限,普通用户无法修改网卡静态 IP 和路由。
  4. DHCP 冲突边界:网卡如果是 DHCP 自动获取,添加静态次级 IP 可以共存;但 DHCP 获取的网关和静态网关叠加同样会路由冲突。
  5. 网卡重启边界:静态 IP 保存在注册表,网卡禁用 / 启用、系统重启后配置保留。
  6. 路由跃点 (metric):添加网关时可设置跃点;多条默认网关依靠跃点决定优先级;Windows不会自动在多个默认网关之间做负载均衡,仅做故障转移(效果有限)。
  7. DNS index 边界:index=1是首选 DNS;序号越大优先级越低;添加重复 DNS 条目会冗余占用列表。
  8. 地址冲突边界:添加 IP 前不校验网段,若同网段存在 IP 冲突,不会报错,直到二层 ARP 冲突出现网络异常。
  9. 最大 IP 条目:单网卡可添加大量次级 IP,但过多 IP 会增加 ARP 缓存、TCP 栈内存开销,影响网络性能。
  10. 两种方式等价性:netsh 命令 和 GUI 控制面板 最终写入完全相同的系统配置;GUI 只是可视化封装,底层没有差异。

补充:PowerShell 现代等价脚本(推荐替代老旧 netsh)

# 添加主IP+网关
New-NetIPAddress -InterfaceAlias "以太网" -IPAddress 192.168.1.55 -PrefixLength 24 -DefaultGateway 192.168.1.1
# 次级IP,不加网关
New-NetIPAddress -InterfaceAlias "以太网" -IPAddress 192.168.2.55 -PrefixLength 24
New-NetIPAddress -InterfaceAlias "以太网" -IPAddress 192.168.3.55 -PrefixLength 24
# 设置DNS(数组,顺序代表优先级)
Set-DnsClientServerAddress -InterfaceAlias "以太网" -ServerAddresses ("119.29.29.29","223.5.5.5","180.76.76.76","180.184.1.1","114.114.114.114")

BAT / GUI / PowerShell 横向对比简表

项目 BAT(netsh) GUI 控制面板 PowerShell (NetTCPIP 模块)
底层 API iphlpapi.dll iphlpapi.dll iphlpapi.dll(NetTCPIP WMI 封装)
持久化 写入 Tcpip 注册表 写入 Tcpip 注册表 写入 Tcpip 注册表
多网关风险 容易误写多条默认路由 手动添加时同样可以误添加多条默认网关 参数分离,更容易控制是否添加网关
依赖 cmd.exe + netsh.exe hnetcfg.dll 控制面板组件 PowerShell + NetTCPIP 模块 (Win8/Server2012+)
适用系统 全版本 Windows 全版本 Windows Win8/Server2012 及更新版本
推荐场景 老旧服务器快速脚本 临时手工调试 现代 Windows,自动化批量运维

@echo off
rem 设置第一个 IP 地址、子网掩码和网关
netsh interface ipv4 add address "以太网" 192.168.1.55 255.255.255.0  192.168.1.1
netsh interface ipv4 add address "以太网" 192.168.2.55 255.255.255.0  192.168.2.1
netsh interface ipv4 add address "以太网" 192.168.3.55 255.255.255.0  192.168.3.1
netsh interface ipv4 add address "以太网" 192.168.4.55 255.255.255.0  192.168.4.1
netsh interface ipv4 add address "以太网" 192.168.5.55 255.255.255.0  192.168.5.1

rem 依此类推,根据需要添加更多IP地址、子网掩码和网关

echo 设置完成

rem 设置第一个 DNS 服务器地址
netsh interface ipv4 add dns "以太网"  119.29.29.29  index=1
rem 设置第二个 DNS 服务器地址
netsh interface ipv4 add dns "以太网"  223.5.5.5  index=2
rem 设置第三个 DNS 服务器地址
netsh interface ipv4 add dns "以太网" 180.76.76.76 index=3
rem 设置第四个 DNS 服务器地址
netsh interface ipv4 add dns "以太网" 180.184.1.1 index=4
rem 设置第五个 DNS 服务器地址
netsh interface ipv4 add dns "以太网" 114.114.114.114 index=5

PS C:\WINDOWS\system32> netsh interface ipv4 add help

下列指令有效:

此上下文中的命令:
netsh interface ipv4 add address    - 将静态 IP 地址或默认网关添加到指定接口。
netsh interface ipv4 add dnsservers - 添加一个静态 DNS 服务器地址。
netsh interface ipv4 add excludedportrange - 为连续的端口块添加排除。
netsh interface ipv4 add neighbors  - 添加邻居地址。
netsh interface ipv4 add route      - 在接口上添加路由。
netsh interface ipv4 add winsservers - 添加一个静态 WINS 服务器地址。

PS C:\WINDOWS\system32> netsh interface ipv4 add address help

用法: netsh interface ipv4 add address [name=]<字符串>
             [[address=]<IPv4 address>[/<整数> [[mask=]<IPv4 掩码>]]
                  [[type=]unicast|anycast]]
             [[gateway=]<IPv4 地址> [gwmetric=]<整数>]
             [[validlifetime=]<整数>|infinite]
             [[preferredlifetime=]<整数>|infinite]
             [[subinterface=]<字符串>]
             [[store=]active|persistent]
             [[skipassource=]true|false]

参数:

       标记                 值
       name              - 接口名称或索引。
       address           - 要添加的 IPv4 地址,后面可以加上子网前缀长度。
       mask              - 指定的 IP 地址的 IP 子网掩码。
       type              - 下列值之一:
                           unicast: 添加单播地址(默认)。
                           anycast: 添加任意广播地址。
       gateway           - 要添加的默认网关的 IPv4 地址。
       gwmetric          - 默认网关的跃点数。
       validlifetime     - 地址/路由的有效生存时间。
                           默认值为 infinite。
       preferredlifetime - 地址/路由的首选生存时间。默认值为 infinite。
       subinterface      - 默认网关存在于其上的子接口的 LUID。此参数仅用于带有多个子接口的接口。
       store             - 下列值之一:
                           active: 地址将在下一次启动时消失。
                           persistent: 地址持久有效。 此为默认值。
       skipassource      - 除非明确指定,否则不将该地址作为任何传出数据包的源地址。 默认值为 false。

备注: 将静态 IP 地址和默认网关添加到接口。如果接口上启用了 DHCP,则将禁用该接口。

示例:

       netsh interface ipv4 add address "Wired Ethernet Connection" 10.0.0.2  255.0.0.0
       netsh interface ipv4 add address "Wired Ethernet Connection" gateway=10.0.0.3 gwmetric=2

       第一个命令向有线以太网连接接口添加一个静态 IP 地址 10.0.0.2,其子网掩码为 255.0.0.0。第二个命令添加 IP 地址 10.0.0.3 作为网关跃点数为 2 的接口的第二个默认网关。

PS C:\WINDOWS\system32> netsh interface ipv4 add dnsservers help

用法: netsh interface ipv4 add dnsservers [name=]<字符串> [address=]<IPv4 地址>
             [[index=]<整数>] [[validate=]yes|no]


参数:

      标记            值
      name         - 要添加的 DNS 服务器的接口的名称 或索引。
      address      - 要添加的 DNS 服务器的 IP 地址。
      index        - 为指定的 DNS 服务器地址指定 索引(首选项)。
      validate     - 指定是否将验证 DNS 服务器设置。 默认情况下,值为 yes。

备注: 将新的 DNS 服务器 IP 地址添加到静态配置的列表。 默认情况下,将 DNS 服务器添加到列表结尾。如果指定了索引,则将该 DNS 服务器放置在列表的此位置上,其他服务器依次下移以腾出空间。如果 DNS 服务器以前是通过 DHCP 获取的,则该新地址将取代旧列表。如果 Validate 开关为 yes,则验证新添加的 DNS 服务器。

示例:

       netsh interface ipv4 add dnsservers "Wired Ethernet Connection" 10.0.0.1
       netsh interface ipv4 add dnsservers "Wired Ethernet Connection" 10.0.0.3 index=2

PS C:\WINDOWS\system32> netsh interface ipv4 add excludedportrange help

用法: netsh interface ipv4 add excludedportrange [protocol=]tcp|udp
             [startport=]<integer> [numberofports=]<integer>
             [[store=]active|persistent]

参数:

      标记                 值
      protocol       - 为以下值之一:
                       tcp: 为 TCP 添加排除。
                       udp: 为 UDP 添加排除。
      startport      - 排除的起始端口号。
      numberofports  - 从排除的 startport 开始的端口号。
      store          - 为以下值之一:
                       active: 设置只持续到下一次启动。
                       persistent: 更改持久有效。这是默认值。

备注: 为连续的端口块添加排除。

示例:

      netsh interface ipv4 add excludedportrange protocol=tcp startport=50000 numberofports=20


PS C:\WINDOWS\system32> netsh interface ipv4 add neighbors help

用法: netsh interface ipv4 add neighbors [interface=]<string> [address=]<IPv4 address>]
             [neighbor=]<string> [[subinterface=]<string>]
             [[store=]active|persistent]

参数:

       标记             值
       interface      - 接口名称或索引。
       address        - 邻居网络地址。
       neighbor       - 邻居链接层地址。
       subinterface   - 子接口的 LUID。此仅用于带有多个子接口的接口。
       store          - 下列其中一个值:
                        active: 地址将在下一次启动时出现。
                        persistent: 地址持久有效。此为默认值。


示例:

       netsh interface ipv4 add neighbors "Private" "10.1.1.1" "12-34-56-78-9a-bc"


PS C:\WINDOWS\system32> netsh interface ipv4 add route help

用法: netsh interface ipv4 add route [prefix=]<IPv4 address>/<integer> [interface=]<string>
             [[nexthop=]<IPv4 address>] [[siteprefixlength=]<integer>]
             [[metric=]<integer>] [[publish=]no|age|yes]
             [[validlifetime=]<integer>|infinite]
             [[preferredlifetime=]<integer>|infinite]
             [[store=]active|persistent]

参数:

       标记                值
       prefix            - 要为其添加路由的前缀。
       interface         - 接口名称或索引。
       nexthop           - 网关地址(如果前缀不在链路上)。
       siteprefixlength  - 整个站点的前缀长度(如果在链路上)。
       metric            - 路由跃点数。
       publish           - 以下值之一:
                           no: 在路由播发中不播发。此为默认值。
                           age: 在路由播发中播发,且生存时间有限。
                           yes: 在路由播发中播发,且生存时间无限。
       validlifetime     - 路由有效的生存时间。 默认值是无限。
       preferredlifetime - 首选路由生存时间。 默认值为有效生存时间。
       store             - 下列其中一个值:
                           active: 更改仅持续到下一次启动。
                           persistent: 更改持久有效。此为默认值。

说明: 为给定前缀添加路由。

示例:

       netsh interface ipv4 add route 10.2.0.0/16 "Internet" 10.0.0.1


PS C:\WINDOWS\system32> netsh interface ipv4 add winsservers help

用法: netsh interface ipv4 add winsservers [name=]<字符串> [address=]<IP 地址> [[index=]<整数>]

参数:

      标记            值
      name         - 要添加的 WINS 服务器所在的接口的名称或索引。
      address      - 要添加的 WINS 服务器的 IP 地址。
      index        - 为指定的 WINS 服务器地址指定 索引(首选项)。

备注: 将新的 WINS 服务器 IP 地址添加到静态配置的列表。 默认情况下,将 WINS 服务器添加到列表结尾。如果指定了 索引,WINS 服务器将被放置在该列表的此位置上,其他服务器依次下移以腾出空间。 如果 WINS 服务器以前是通过 DHCP 获取的,则该新地址将取代旧列表。

示例:

       netsh interface ipv4 add winsservers "Wired Ethernet Connection" 10.0.0.1
       netsh interface ipv4 add winsservers "Wired Ethernet Connection" 10.0.0.3 index=2

 

通过以下步骤在 Windows 操作系统中设置多个 IP 地址:

  1. 打开控制面板,然后选择“网络和共享中心”。
  2. 点击左侧的“更改适配器设置”。
  3. 右键点击需要设置多个 IP 地址的网络适配器,然后选择“属性”。
  4. 在网络连接属性窗口中,找到“Internet 协议版本 4 (TCP/IPv4)”(或者“IPv4 属性”),然后点击“属性”按钮。
  5. 在弹出的窗口中,点击“高级”按钮。
  6. 在“IP 设置”选项卡中,点击“添加”按钮,然后输入要添加的 IP 地址、子网掩码和可能的默认网关。
  7. 点击“确定”保存设置。

 


设置多个 IP 地址在计算机网络中可以实现一些特定的功能和应用场景。以下是设置多个 IP 地址的一些作用和影响:

作用:

  1. 多IP负载均衡:通过分配多个 IP 地址到同一网络接口,可以实现负载均衡,将流量分散到不同的 IP 地址上,从而提高网络性能和吞吐量。

  2. 虚拟主机:在同一台服务器上托管多个虚拟主机时,每个虚拟主机可以使用不同的 IP 地址,以便独立访问。

  3. 网络隔离:为不同的网络通信需求分配不同的 IP 地址,可以实现网络隔离和安全策略的应用。

  4. 故障切换:当一个 IP 地址发生故障时,可以快速切换到另一个备用 IP 地址,确保网络的连续性和可靠性。


PS C:\WINDOWS\system32> netsh interface ipv4 help

下列指令有效:

此上下文中的命令:
netsh interface ipv4 ?              - 显示命令列表。
netsh interface ipv4 add            - 在一个表格中添加一个配置项。
netsh interface ipv4 delete         - 从一个表格中删除一个配置项。
netsh interface ipv4 dump           - 显示一个配置脚本。
netsh interface ipv4 help           - 显示命令列表。
netsh interface ipv4 install        - 安装 IP 协议。
netsh interface ipv4 reset          - 重置 IP 配置。
netsh interface ipv4 set            - 设置配置信息。
netsh interface ipv4 show           - 显示信息。
netsh interface ipv4 uninstall      - 卸载 IP 协议。

若需要命令的更多帮助信息,请键入命令,接着是空格,
后面跟 ?。

PS C:\WINDOWS\system32> netsh interface ipv4 show

下列指令有效:

此上下文中的命令:
netsh interface ipv4 show addresses - 显示 IP 地址配置。
netsh interface ipv4 show compartments - 显示分段参数。
netsh interface ipv4 show config    - 显示 IP 地址和其他信息。
netsh interface ipv4 show destinationcache - 显示目标缓存项目。
netsh interface ipv4 show dnsservers - 显示 DNS 服务器地址。
netsh interface ipv4 show dynamicportrange - 显示动态端口范围配置参数。
netsh interface ipv4 show excludedportrange - 显示所有排除的端口范围。
netsh interface ipv4 show global    - 显示全局配置普通参数。
netsh interface ipv4 show icmpstats - 显示 ICMP 统计。
netsh interface ipv4 show interfaces - 显示接口参数。
netsh interface ipv4 show ipaddresses - 显示当前 IP 地址。
netsh interface ipv4 show ipnettomedia - 显示 IP 的网络到媒体的映射。
netsh interface ipv4 show ipstats   - 显示 IP 统计。
netsh interface ipv4 show joins     - 显示加入的多播组。
netsh interface ipv4 show neighbors - 显示邻居缓存项。
netsh interface ipv4 show offload   - 显示卸载信息。
netsh interface ipv4 show route     - 显示路由表项目。
netsh interface ipv4 show subinterfaces - 显示子接口参数。
netsh interface ipv4 show tcpconnections - 显示 TCP 连接。
netsh interface ipv4 show tcpstats  - 显示 TCP 统计。
netsh interface ipv4 show udpconnections - 显示 UDP 连接。
netsh interface ipv4 show udpstats  - 显示 UDP 统计。
netsh interface ipv4 show winsservers - 显示 WINS 服务器地址。
PS C:\WINDOWS\system32> netsh interface ipv4 uninstall help

用法:netsh interface ipv4 uninstall

参数: 无

说明: 卸载 IP 协议。
      需要重新启动计算机之后该操作才能生效。


PS C:\WINDOWS\system32> netsh interface ipv4 install help

用法:netsh interface ipv4 install

参数: 无

说明: 安装 IP 协议。
      需要重新启动计算机之后该操作才能生效。

 

posted @ 2024-03-05 08:27  suv789  阅读(1467)  评论(0)    收藏  举报