我有一个在localhost(127.0.0.1)中运行的TCP服务器,我试图通过向回送接口注入SYN数据包来连接到服务器,但是服务器没有回答它们。这些数据包具有我的互联网适配器的以太网接口的源IP(而不是本地主机IP)。
我在Wireshark中观察发送到我的环回服务器的SYN数据包,但是服务器没有使用SYN / ACK应答它。我认为这是因为IP源不是127.0.0.1,例如192.168.1.24。
如果我去浏览器并连接到我的localhost服务器它工作正常,但我使用的源IP是127.0.0.1,目标IP也是127.0.0.1;数据包之间的唯一区别是源IP。
我想通过使用不同于127.0.0.1的IP源地址与我的环回服务器(localhost)建立TCP连接。这可能吗?
例如,来自192.168.1.24到127.0.0.1的Loopback TCP SYN数据包应该由loopbackserver回答吗?
谢谢和问候!
答案 0 :(得分:0)
您可以通过Npcap Loopback Adapter
将数据包发送到localhost并从对方获得响应(例如,同一台计算机上的进程)。一个例子是Nmap,Nmap使用Npcap Loopback Adapter
来扫描localhost的端口。命令是:nmap -v -A 127.0.0.1
。 Nmap是开源的here,因此您可以看到有关实现的代码。如果您认为Nmap太复杂,您可以看到Nping here的源代码,这是Nmap提供的ping工具。在ping localhost时,Nping也会使用Npcap Loopback Adapter
,这与Windows提供的原始ping不同。
使用其中一个本地适配器或使用127.0.0.1的IP应该是相同的。您可以运行Nmap来测试它。无论如何,使用127.0.0.1是Npcap在与localhost交谈时最好和推荐的。
所以我认为这个问题仍然与你自己的实现有关。
答案 1 :(得分:0)
服务器bind()
是否使用INADDR_LOOPBACK
?如果是这样,您可以尝试将其更改为INADDR_ANY
以查看是否有帮助。另见man 7 ip。
(这些链接显然是特定于Linux的;如果您的平台是其他的,请参阅适用于您的系统的文档。例如,如果您使用的是Windows,那么可以参考https://msdn.microsoft.com/en-us/library/windows/desktop/ms737550(v=vs.85).aspx。)
答案 2 :(得分:0)
我解决了这个问题,非常感谢你的回答。
问题有点愚蠢,我试图与环回服务器(localhost)建立TCP连接,其IP源地址不在环回范围内,环回网关:127.0.0.1,环回网络掩码:255.255 .0.0;它不能接受来自不在127.0.X.X范围内的IP源地址的数据包;如果我做NAT并将数据包从例如192.168.1.154转换为127.0.1.154,则服务器会收到数据包,我可以建立服务器连接,我不知道我之前没有意识到这一点。
感谢您的时间,问候!。
我认为也许最好将服务器绑定到其他虚拟网络适配器而不是环回,我正在研究:https://github.com/Microsoft/Windows-driver-samples/tree/master/network/ndis/netvmini/6x
创建一个微型端口驱动程序并将服务器绑定到那里会很好,我们可以拥有自己的网关和网络掩码,而且该层将是以太网而不是BSD环回。你的意见对我来说很有意思。