Windows 上的数据包重定向

Posted

技术标签:

【中文标题】Windows 上的数据包重定向【英文标题】:Packet Redirection on Windows 【发布时间】:2016-07-18 17:27:15 【问题描述】:

由于软件限制,我们目前在所有机器上都运行 Windows。

然而,在此范围内,我们需要将某些进入 IP 和端口的数据包重定向到不同的端口(相同的 IP)。我们有软件在“代理端口”上侦听。

这可以通过 linux 上的 IPTables 实现,方法如下:

iptables -t nat -I PREROUTING -p udp -d <DSTIP> --dport <DSTPORT> -m u32 --u32 '0>>22&0x3C@8=0xFFFFFFFF && 0>>22&0x3C@12=0x54536F75 && 0>>22&0x3C@16=0x72636520 && 0>>22&0x3C@20=0x456E6769 && 0>>22&0x3C@24=0x6E652051 && 0>>22&0x3C@28=0x75657279' -j REDIRECT --to-port <REDIRECT PORT>

这在 linux 上效果很好,并将某些数据包重定向到我们的代理软件,但是是否有可能在 windows 上执行此类操作而无需在我们的 windows 机器前面安装专用机器?

我正在考虑用 pcap.net 编写一些东西,但我猜这必须直接从 NIC 而不是 windows 读取?

【问题讨论】:

那是哪个版本的 windows? 你见过***.com/a/11535395/2189500吗? 只是出于好奇:你为什么需要这个?我想你会被困在为 Windows 编写过滤器驱动程序或设置 Linux(虚拟)机器上,恐怕.. 【参考方案1】:

来自MSDN:

Netsh 是一个命令行脚本实用程序,它允许您: 在本地或远程,显示或修改网络配置 当前正在运行的计算机。

您可以使用以下命令将来自任何端口的连接重定向到另一个本地(或远程)端口:

netsh interface portproxy add v4tov4 listenaddress=localaddress listenport=localport connectaddress=destaddress connectport=destport

另外,正如this SO post 中所述,netsh 是 Windows 上 iptabes 的良好替代品。

【讨论】:

这几乎是我们所需要的,除了它只需要将某些包含某些有效负载的流量而不是所有流量转发到新端口。【参考方案2】:

命令

netsh interface portproxy ...

做端口代理而不是数据包转发。主要区别是

性能比 iptables 差很多(参见https://plus.google.com/+OlafMonien/posts/fsjUjropYeR) 源IP地址更改为localhost(127.0.0.1或::1取决于IP版本),您丢失了原始请求源IP地址。

我们一直在使用这种技术进行端口转发,但在这些发现之后,我们不得不在网络防火墙上使用额外的规则以避免使用 netsh。

【讨论】:

以上是关于Windows 上的数据包重定向的主要内容,如果未能解决你的问题,请参考以下文章

为啥说tcp协议中针对某数据报的应答包丢失不一定导致该数据包重传

Linux内核模块

windows下TCP数据包拦截与重定向

JavaWeb实战之Response重定向运用以及原理详解

Linux防火墙--iptables学习

Linux安全基线配置6小项