Windows netsh TCP portproxy 无法通过环回转发数据包,解决方案?

Windows netsh TCP portproxy 无法通过环回转发数据包,解决方案?

情况如下,运行 Win 7 Pro SP1(版本 6.1.7601),Windows 防火墙已完全禁用(甚至添加了规则以允许任何内容通过,以防万一它仍然在运行),后台没有运行任何程序(关闭了所有不必要的服务/exe),ipv6 已安装并运行良好,netsh isatap 和 6to4 已启用。Teredo 设置为默认状态。

首先,我可以为 192/8 接口设置一个 netsh v4tov4 portproxy,在这种情况下,portproxy 将正常工作。在两个提升的命令 shell 中,我运行:

REM Admin Shell 1
ncat.exe -l 192.168.2.173 13337

REM Admin Shell 2
netsh interface portproxy add v4tov4 listenport=18080 connectport=13337 connectaddress=192.168.2.173
netsh interface portproxy show all

    Listen on ipv4:             Connect to ipv4:

    Address         Port        Address         Port
    --------------- ----------  --------------- ----------
    *               18080       192.168.2.173   13337

ncat 192.168.2.173 18080
[type a message and it will popup in shell 1]

C:\temp>netstat -a -b | grep -E -A1 13337
  TCP    192.168.2.173:13337     Windows7_x64:0         LISTENING
 [ncat.exe]

端口代理转发和 netcat 按预期工作。

接下来,简单地更改为 localhost(解析为 [::1])或明确使用带有 v4tov4 规则的 127.0.0.1(也尝试过 v6tov4)每次都会失败。

例如以 127.0.0.1 开头

REM Admin Shell 1
ncat.exe -l 127.0.0.1 13337

REM Admin Shell 2
netsh interface portproxy add v4tov4 listenport=18080 connectport=13337 connectaddress=127.0.0.1
netsh interface portproxy show all

    Listen on ipv4:             Connect to ipv4:

    Address         Port        Address         Port
    --------------- ----------  --------------- ----------
    *               18080       127.0.0.1       13337

ncat 127.0.0.1 18080
Ncat: No connection could be made because the target machine actively refused it. .

C:\temp>netstat -a -b | grep -E -A1 13337
  TCP    127.0.0.1:13337         Windows7_x64:0         LISTENING
  [ncat.exe]

最后,删除所有旧的 netsh 规则,并尝试使用 v6tov6,这也是一个彻底的失败:

REM Admin Shell 1
ncat.exe -6 -l [::1] 13337

REM Admin Shell 2
netsh interface portproxy add v6tov6 listenport=18080 connectport=13337 connectaddress=[::1]
netsh interface portproxy show all

    Listen on ipv6:             Connect to ipv6:

    Address         Port        Address         Port
    --------------- ----------  --------------- ----------
    *               18080       [::1]           13337

ncat -6 [::1] 18080
Ncat: No connection could be made because the target machine actively refused it.

C:\temp>netstat -a -b | grep -E -A1 13337
  TCP    [::1]:13337             Windows7_x64:0         LISTENING
  [ncat.exe]

注意 Windows7_x64 是本地主机,并且界面似乎运行正常。

C:\>ping localhost
Pinging Windows7_x64 [::1] with 32 bytes of data:
Reply from ::1: time<1ms

另外,我还可以直接连接到监听的 netcat 端点并发送数据,没有任何问题:

ncat -6 [::1] 13337

问题肯定出在 netsh portproxy 规则上。

那么这是怎么回事呢?防火墙已完全关闭。shell 已提升。没有其他程序在运行以妨碍操作(没有 AV/IDS)。

我尝试添加各种 v6tov4 和 v4tov6 规则组合,但也没有起到任何作用。MS Message Analyzer 没有帮助,因为即使建立了连接,它也不会拾取本地主机接口。

有任何想法吗?

编辑 2016/10/15 23:58EST: 停止以下六项服务将全面禁用端口代理。这表明其中一项服务与正在发生的事情有关。

sc stop homegrouplistener
sc stop Browser
sc stop lanmanserver
sc stop smb
sc stop iphlpsvc

答案1

这是设计使然。到达环回接口(Windows 上实际上不存在)的数据包只能来自127.0.0.0/8。同样,您无法将数据包发送到 ,127.0.0.0/8因为没有到其他位置的路由。这意味着即使流量到达,监听程序也无法响应。

如果你使用代理程序,它会从外部网络获取流量并产生新的环回接口上的流量(反之亦然)。这将起作用。

考虑以下(OS X)nmap示例:

sudo nmap -Pn -p 80 -S 192.168.2.1 -e lo0 127.0.0.1

它将强制(通过 root)将数据包注入环回接口。这可以通过tcpdump -i lo0在另一个终端上运行来验证。但是,即使在nc监听时,它也无法找到开放端口。但是,以下命令可以按预期找到监听器:

nmap -p 80 -e lo0 127.0.0.1

相关内容