我正在使用python RAW套接字实现TCP握手。然而,Linux内核非常烦人,因为它试图处理该协议的某些方面。
例如,当我发送SYN数据包时,服务器响应SYN,ACK数据包;内核自动响应RST数据包重置连接。我克服了这一点,我使用以下iptable规则丢弃所有这些重置数据包:
public class ModelPager<TItem>
{
public int CurrentPage { get; set; }
public IEnumerable<TItem> Items { get; set; }
public int PageCount { get; set; }
public int PageSize { get; set; }
public int TotalItems { get; set; }
}
现在我想收到服务器发送的SYN,ACK数据包并打印出来。但是,当我执行以下操作时,我什么都得不到:
-A OUTPUT -p tcp -m tcp --sport 999 --tcp-flags RST RST -j DROP
我怀疑内核正在丢弃SYN,ACK,然后才能使用我的套接字恢复它。有谁知道合理的解决方法?
答案 0 :(得分:1)
虽然我希望有人提出更方便的解决方案,但其中一种方法是使用iptables将传入的TCP Syn数据包传递给nfqueue。 Nfqueue已经存在python bindings,所以使用它不应该是一个问题。
这个想法是在所有传入的TCP Syns到达内核的TCP实现之前捕获它们。然后将这些数据包传递给userland app可以监视的nfqueue。对于您的应用程序将从nfqueue获取的每个数据包,它必须决定(return a verdict)是否自己处理数据包(即,就操作系统而言丢弃数据包)或将其传递给常规数据包TCP实施。
我知道这种方法有效,但它很麻烦。
答案 1 :(得分:1)
你可以使用libpcap,在Python中看来这个模块:http://pylibpcap.sourceforge.net/或者这个:https://pypi.python.org/pypi/pypcap
使用pcap,您可以注册以从内核接收消息。通过从应用程序提供正确的过滤器,您可以从内核接收TCP段。我在C中使用了libpcap,我想你可以用同样的方式使用指定的模块。对我来说,这是最好的解决方案,因为您可以以非常标准的方式从应用程序中处理它。
为了避免内核使用RST响应,使用iptables的解决方案看起来对我来说是最好的。
答案 2 :(得分:1)
由于您使用原始数据包完成所有操作,为什么不创建自己的MAC地址和IP地址?您需要将适配器置于混杂模式以接收数据包,但是如果您这样做,内核不应该向您的传入数据包发送任何响应,因为它们似乎将被发送到&#34;其他一些系统&# 34 ;.这使得从其他人过滤您关心的数据包变得微不足道。
您还需要适当地响应ARP,以便其他系统找到您的MAC地址。如果您需要DHCP来获取IP地址,您还需要处理这些交互。