脚本 + GUI 多 IP 配置方案BAT 批处理脚本:调用netsh 批量给单网卡添加多个 IPv4 地址 + 多网关、多 DNS GUI 手工路径:控制面板 → 网络适配器 → IPv4 高级设置 图形界面配置多 IP 底层统一入口:Windows TCP/IP 协议栈,NDIS 网卡适配器 PowerShell 现代等价脚本 Windows 操作系统中设置多个 IP 地址 多个DNS
脚本 + GUI 多 IP 配置方案拆解|底层原理 / 依赖文件 / 依赖关系 / 配套链 / 逻辑链路 / 边界
目标对象:
- BAT 批处理脚本:调用
netsh interface ipv4批量给单网卡添加多个 IPv4 地址 + 多网关、多 DNS- GUI 手工路径:控制面板 → 网络适配器 → IPv4 高级设置 图形界面配置多 IP
- 底层统一入口:Windows TCP/IP 协议栈,NDIS 网卡适配器
一、底层原理
Windows 单网卡支持多 IP 地址(单适配器多 IP,别名 IP/secondary IP),属于 TCP/IP 栈原生能力,不需要多张物理网卡。
- 一张 NDIS 网卡适配器,在 TCPIP.SYS 协议栈内可以绑定多个 IPv4 接口地址条目;
- 每个 IP + 子网掩码为独立 IP 条目;网关是路由表条目,这里脚本写法存在一个经典问题:单网卡不能绑定多个默认网关(0.0.0.0/0 路由只能一条,多条默认网关会造成路由冲突,Windows 不会自动负载均衡);
- DNS 是适配器级的 DNS 服务器列表,可添加多个,按
index优先级排序; - GUI 和 netsh 本质是调用同一套内核 TCPIP 栈接口,只是前端 UI / 命令行封装不同。
核心概念区分
- IP / 子网掩码:分配给网卡的接口地址,可以多个
- 默认网关:
0.0.0.0/0全局默认路由,一个系统同一适配器只建议 1 条;脚本连续 add 多个默认网关属于错误用法,会造成路由表混乱。
二、依赖文件
| 文件 | 作用 |
|---|---|
cmd.exe |
BAT 批处理宿主解释器,解析@echo off、rem注释、echo 等语法 |
netsh.exe |
网络命令行工具,系统核心入口 |
netsh.dll、netship.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)
- 运行身份:管理员权限,非管理员会拒绝修改网卡 IP / 路由 / DNS;
- 服务依赖:不需要 DHCP 服务,但网卡(NDIS 适配器)必须存在、已枚举;网卡名称必须和脚本
"以太网"完全匹配(中文 / 英文系统名称不一样,英文系统是Ethernet); - 注册表持久化:静态 IP 配置写入注册表
HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{网卡GUID}
IP 地址、子网掩码、DNS 服务器存储在此;网关存储在系统路由表。
GUI 控制面板路径
- 底层同样调用
iphlpapi.dll+tcpip.sys;GUI 只是 hnetcfg.dll 封装的可视化界面; - 权限同样需要管理员;
- 操作完成写入完全相同的注册表位置,和 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/DNSroute print:查看系统路由表(用来检查多网关冲突)- PowerShell
New-NetIPAddress/Set-DnsClientServerAddress:现代 PowerShell 原生替代 netsh Get-NetIPInterface:查看网卡接口信息
五、逻辑链路(时序)
BAT 脚本执行时序
@echo off:关闭命令回显;rem为注释,不执行;- 循环执行
netsh interface ipv4 add address "以太网" IP 掩码 网关- 向 tcpip.sys 添加一个次级 IP 地址;第三个参数是网关,等价新增一条默认路由;
- 执行
netsh interface ipv4 add dns,按 index 序号追加 DNS 服务器列表; - 所有配置写入内核 TCPIP 栈,同时写入注册表永久保存;
- 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 手工配置时序
- 打开更改适配器设置,打开网卡属性,IPv4 属性 → 高级;
- IP 设置 → 添加,填入 IP + 子网掩码;可选添加网关;
- DNS 区域,添加多个 DNS 服务器;
- 点击确定:GUI 调用 iphlpapi,写入 tcpip 内核栈,保存注册表;
- 内核立即生效(静态 IP 无需重启网卡,部分场景会短暂断流)。
六、边界约束(限制、坑点)
- 默认网关边界(最重大坑) Windows IPv4 路由表只使用优先级最高的一条 0.0.0.0/0 默认网关;脚本一次性添加 5 条默认网关,路由表存在多条默认路由,会引发非对称路由、随机访问失败。次级 IP 不要附加默认网关。
- 网卡名称严格匹配:脚本
"以太网"在英文系统是Ethernet;名称不一致直接报错找不到接口。 - 权限边界:必须管理员权限,普通用户无法修改网卡静态 IP 和路由。
- DHCP 冲突边界:网卡如果是 DHCP 自动获取,添加静态次级 IP 可以共存;但 DHCP 获取的网关和静态网关叠加同样会路由冲突。
- 网卡重启边界:静态 IP 保存在注册表,网卡禁用 / 启用、系统重启后配置保留。
- 路由跃点 (metric):添加网关时可设置跃点;多条默认网关依靠跃点决定优先级;Windows不会自动在多个默认网关之间做负载均衡,仅做故障转移(效果有限)。
- DNS index 边界:
index=1是首选 DNS;序号越大优先级越低;添加重复 DNS 条目会冗余占用列表。 - 地址冲突边界:添加 IP 前不校验网段,若同网段存在 IP 冲突,不会报错,直到二层 ARP 冲突出现网络异常。
- 最大 IP 条目:单网卡可添加大量次级 IP,但过多 IP 会增加 ARP 缓存、TCP 栈内存开销,影响网络性能。
- 两种方式等价性: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地址、子网掩码和网关 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 地址:
- 打开控制面板,然后选择“网络和共享中心”。
- 点击左侧的“更改适配器设置”。
- 右键点击需要设置多个 IP 地址的网络适配器,然后选择“属性”。
- 在网络连接属性窗口中,找到“Internet 协议版本 4 (TCP/IPv4)”(或者“IPv4 属性”),然后点击“属性”按钮。
- 在弹出的窗口中,点击“高级”按钮。
- 在“IP 设置”选项卡中,点击“添加”按钮,然后输入要添加的 IP 地址、子网掩码和可能的默认网关。
- 点击“确定”保存设置。
设置多个 IP 地址在计算机网络中可以实现一些特定的功能和应用场景。以下是设置多个 IP 地址的一些作用和影响:
作用:
-
多IP负载均衡:通过分配多个 IP 地址到同一网络接口,可以实现负载均衡,将流量分散到不同的 IP 地址上,从而提高网络性能和吞吐量。
-
虚拟主机:在同一台服务器上托管多个虚拟主机时,每个虚拟主机可以使用不同的 IP 地址,以便独立访问。
-
网络隔离:为不同的网络通信需求分配不同的 IP 地址,可以实现网络隔离和安全策略的应用。
-
故障切换:当一个 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 协议。
需要重新启动计算机之后该操作才能生效。

浙公网安备 33010602011771号