NETSH端口转发从本地端口到本地端口不起作用。

33

我正在尝试使用NETSH PORTPROXY命令将发送到我的XP PC(IP 192.168.0.10)端口8001的数据包转发到端口80(我有一个监听端口80的XAMPP Apache服务器)。

我执行了以下操作:

netsh interface portproxy add v4tov4 listenport=8001 listenaddress=192.168.0.10 connectport=80 connectaddress=192.168.0.10

显示所有确认一切都已正确配置:

netsh interface portproxy show all

Listen on IPv4:             Connect to IPv4:

Address         Port        Address         Port
--------------- ----------  --------------- ----------
192.168.0.10    8001        192.168.0.10    80

然而,我无法从 http://localhost:8001 访问 Apache 网站。如下所示,我可以通过直接端口访问 http://localhost

此外,我还尝试了以下操作: 1. 使用链接 http://192.168.0.10:8001 从远程 PC 访问 Apache 网站。防火墙已关闭。 2. 将 listenaddress 和 connectaddress 更改为 127.0.0.1

没有更多信息,我找不到解决问题的方法。有没有一种方法来调试 NETSH PORTPROXY?

enter image description here

注意:顺便说一下,如果你想知道我为什么要这样做,实际上是想将远程 MySQL 客户端连接从自定义端口映射到默认的 MySQL 服务器端口 3306。

5个回答

51

我通过下列方式成功地将其解决:

netsh interface ipv6 install

此外,对于我的目的,设置listenaddress并非必需,最好将connectaddress设置为127.0.0.1,例如:

netsh interface portproxy add v4tov4 listenport=8001 connectport=80 connectaddress=127.0.0.1

6
“netsh int ipv4 install”对我有用。谢谢。 - Florian Bidabé
6
127.0.0.1 不能用作连接端口。 - Medardas
1
在Windows XP上,它是netsh interface ipv6 install。解释是映射功能在ipv6支持dll中 :) - tishma
4
他们最近改变了命令吗?我收到一个错误信息:“未找到以下命令:interface ipv6 install。” - Dave Munger
@Medardas 你想使用“ConnectPort”、“ConnectAddress”还是“ListenAddress”? - Kind Contributor

25
如果 netsh 的端口代理没有按预期工作,则建议按以下顺序进行验证:
  1. 确保端口代理已正确配置
  2. 启动或重新启动相关的 Windows 服务
  3. 确保已安装对 IPv6 的支持
  4. 确保端口未被防火墙阻止

确保端口代理已正确配置

这看起来可能很琐碎,但为了确保不出错,请在进一步操作之前仔细检查您的配置。

从命令提示符或 PowerShell 提示符中运行以下命令:

netsh interface portproxy show all

结果应该类似于这样:

Listen on ipv4:             Connect to ipv4:

Address         Port        Address         Port
--------------- ----------  --------------- ----------
24.12.12.24     3306        192.168.0.100   3306
24.12.12.24     8080        192.168.0.100   80

仔细检查这些设置。确保您能够从本地计算机连接到该列表右侧的地址。例如,您是否可以在本地打开Web浏览器并访问192.168.0.100:80?如果协议不是HTTP,则请使用telnet:telnet 192.168.0.100 3306(有关如何在Windows上安装Telnet客户端,请参见此处)。

然后,左侧的值是否正确?IP地址对于您的计算机是否有效?这是您尝试从外部计算机连接的端口号吗?

启动或重新启动相关的Windows服务

在最新版本的Windows中,netsh的端口代理是由名为“IP Helper”或“iphlpsvc”的Windows服务处理的。如果停止了该服务,则代理显然无法工作。我也遇到过一些情况,后来发现通过重新启动该服务可以解决问题。

在最新版本的Windows中执行以下操作:

  1. 打开任务管理器,然后转到服务选项卡。
  2. 在“名称”列中,找到名为“iphlpsvc”或“IP Helper”的服务。
  3. 右键单击该服务,然后选择重新启动。如果没有“重新启动”选项,则该服务可能已停止,并且实际上必须启动,因此请选择开始

在早期版本的Windows中,在控制面板中的管理工具中查找服务

确保安装了对IPv6的支持(仅适用于旧版Windows)

在早期版本的Windows上(即Windows XP,肯定是一些早期的Windows 10版本,但这并不清楚),netsh的端口代理功能(包括IPv4到IPv4代理)实际上是由一个名为IPV6MON.DLL的DLL处理的,只有在启用了IPV6协议支持时才会加载。因此,在这些版本上,为了启用netsh的端口代理,需要支持IPv6协议(请参见Microsoft的支持文章)。

从命令提示符或PowerShell提示符运行以下命令:

netsh interface ipv6 install

如果您收到一个指示未找到命令interface ipv6 install的错误,这意味着您正在使用最近版本的Windows,在其中netsh的IPv6支持是隐含的且无法禁用。

确保端口未被防火墙阻止

本地防火墙可能会在到达IP Helper服务之前阻止端口。为了验证这个假设,请暂时禁用任何本地防火墙(包括Windows本机防火墙),然后重新测试。如果成功了,则只需将端口排除在防火墙配置中即可。


3
在Windows 10中以管理员身份打开PowerShell后,运行"netsh interface"命令会出现错误:'未找到以下命令:interface ipv6 install.' - Dave Munger
1
@DaveMunger(仅适用于旧版本)如果出现命令接口ipv6 install未找到的错误,则表示您正在使用最近的Windows版本,在其中netsh的IPv6支持是隐式的,不能被禁用。 - Noman_1
这应该是最佳答案。 - binglong li
启动网络服务 iphlpsvc,帮助我。 - Moshe L

15

我有一个问题想要跟你商量。我刚刚解决了这个问题。有一个名叫 "IP Helper" 的 Windows服务,提供了隧道连接的功能。你需要确保它已经启动。


1
虽然这可能是解决问题的有价值提示,但一个好的答案也应该展示解决方案。请编辑提供示例代码以展示您的意思。或者,考虑将其编写为评论。 - ρяσѕρєя K
11
我不认为这个答案需要任何改进。它只是可能的原因之一,而在我的情况下,也正是原因。 - mydoghasworms
我尝试在WinXP中使用portproxy,但是找不到名为“IP Helper”的服务。您在哪个版本的Windows中找到了此服务?或者在WinXP中该服务叫什么? - Radon8472

1
  1. 你必须首先以管理员身份运行Command.exe,右键单击命令提示符图标,选择“以管理员身份运行”。系统会要求你确认。

  2. 将你的netsh命令粘贴到命令提示符窗口中,然后按Enter。

  3. 如果没有显示错误消息,则命令已成功执行。

  4. 在你的Web浏览器中转到http://your-up:8001以查看它是否正常工作。

Windows事件日志可能有帮助找到故障原因的信息。


1

这里还有一个未提及的原因是,监听端口可能位于排除的端口范围内。我在这个问题上遇到了麻烦,并花了一些时间找出原因。

netsh interface portproxy add命令运行良好,netsh interface portproxy show all列出了添加的规则,但代理实际上并未工作,例如netstat -an | findstr <LPORT>没有输出任何内容。

要查看排除的端口列表,请运行netsh int ip show excludedportrange protocol=tcp命令。如果您的监听端口在排除的端口范围内,您可以尝试取消排除该范围,或选择另一个端口。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接