阻止内核处理绑定到原始套接字的 TCP 段

2024-01-11

根据http://linux.die.net/man/7/raw http://linux.die.net/man/7/raw , raw_socket = socket(AF_INET, SOCK_RAW, int protocol);是创建原始套接字的方法。

  1. 我假设原始套接字是在第 3 层上创建的,因此协议不应该是IPPROTO_TCP / IPPROTO_UDP但应该是IPPROTO_IP。这种理解正确吗?

  2. 但是当我使用协议创建原始套接字时IPPROTO_IP (*socketFd = socket(AF_INET, SOCK_RAW, IPPROTO_IP);),套接字创建失败并出现错误不支持协议

  3. 当我使用协议创建原始套接字时IPPROTO_RAW (*socketFd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);),我的应用程序没有收到任何数据包

  4. 当我使用协议创建原始套接字时IPPROTO_TCP (socketFd = socket(AF_INET, SOCK_RAW, IPPROTO_TCP);),我的应用程序接收 TCP 数据包,但内核也响应这些数据包(在我的情况下,它会 RST 链接)。我认为这是因为内核认为没有人在侦听该数据包的目标端口。

我的目的只是使用伪造的 IP 和 TCP 标头发送对传入我的应用程序的消息的响应。由于上述尝试都不适合我,我应该如何创建原始套接字并使内核 TCP 层仅对该连接保持安静?

编辑: 请跳过问题 1-3。菲利普已经回答了他们的问题。对于问题 4,我们确实有一个解决方法。但如果这里有人有答案并且愿意回答,请保持问题的开放性。


我假设原始套接字是在第 3 层等协议上创建的 不应该是 IPPROTO_TCP / IPPROTO_UDP,但应该是 IPPROTO_IP。是 这种理解正确吗?

不,你是对的,原始套接字基本上是第 3 层数据包,但协议不应该是IPPROTO_IP。对于原始套接字,协议参数指示您有兴趣在该套接字上接收什么类型的数据包。请记住,协议本质上执行传输级多路分解,因此您需要指定原始套接字感兴趣的协议类型。这一点在man 7 raw:

与指定的协议号匹配的所有数据包或错误 原始套接字传递到此套接字。有关允许的列表 协议请参阅 RFC 1700 分配的编号和 getprotobyname(3)。

由于您有兴趣接收 TCP 连接的 IP 数据包,因此您应该使用IPPROTO_TCP.

但是当我创建协议为 IPPROTO_IP 的原始套接字时 (*socketFd = socket(AF_INET, SOCK_RAW, IPPROTO_IP);),套接字创建 失败并显示错误“协议不支持”。

是的,这是可以预料的:IP 协议不是第 4 层协议。正如我所说,协议字段用于传输层解复用,因此使用它没有什么意义IPPROTO_IP.

当我创建协议为 IPPROTO_RAW (*socketFd = 套接字(AF_INET,SOCK_RAW,IPPROTO_RAW);),我的应用程序没有 接收任何数据包

那是因为IPPROTO_RAW表示您有兴趣发送所有类型的协议数据包(TCP、UDP 或任何其他协议)。但与IPPROTO_RAW你不能做相反的事情:IPPROTO_RAW意味着您可以在此原始套接字中接收任何不受支持的协议。这也明确在man 7 raw:

IPPROTO_RAW 协议意味着启用了 IP_HDRINCL 并且能够 发送在传递的标头中指定的任何 IP 协议。接收 使用原始套接字不可能通过 IPPROTO_RAW 访问所有 IP 协议。

换句话说,IPPROTO_RAW使您能够发送与任何协议匹配的数据包,但代价是无法获得回复。作为解决方法,您可以创建与协议绑定的其他特定原始套接字来获取回复,但这会使设计变得复杂,因为您必须管理原始套接字池,而且这绝对不是您想要在此处执行的操作。

当我创建协议为 IPPROTO_TCP 的原始套接字时(socketFd = socket(AF_INET, SOCK_RAW, IPPROTO_TCP);),我的应用程序收到 TCP 数据包,但内核也响应这些数据包(在我的例子中 它会重置链接)。我认为这是因为内核认为不存在 监听该数据包目标端口的任何人。

您无法阻止内核完成其工作。来自原始套接字联机帮助页:

当接收到数据包时,它会被传递到任何具有以下功能的原始套接字: 在传递给其他协议之前已绑定到其协议 处理程序(例如,内核协议模块)。

所以你是对的,内核发送了一个RST数据包,因为它不知道指定端口上的活动 TCP 套接字或连接。正如我所说,你无法阻止内核完成其工作,但一个相对快速(也许是丑陋)的黑客方法是使用 iptables 丢弃 RST 数据包:

iptables -A OUTPUT -p tcp --tcp-flags RST RST -j DROP

是的,不是很优雅,但我认为我们在这里无能为力。

正如评论中所建议的,您还可以创建一个虚拟 TCP 套接字,绑定到您刚刚接收和丢弃消息的同一端口和地址。这样内核就不会发送RST回复,你不需要搞乱 iptables。

另请记住,因为您需要指定IPPROTO_TCP对于你的原始套接字,你应该设置IP_HDRINCL在插座上setsockopts(2)这样您就可以构建自定义 IP 标头。

最后,确保运行此进程的有效用户 ID 为 0 或CAP_NET_RAW能力(实际上:以 root 身份运行)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

阻止内核处理绑定到原始套接字的 TCP 段 的相关文章

  • 何时使用 =default 使析构函数默认?

    尽管对构造函数使用 default 对我来说很清楚 即强制编译器在其他构造函数存在时创建默认构造函数 但我仍然无法理解这两种类型的析构函数之间的区别 那些使用 default 的 那些没有显式定义并由编译器自动生成的 我唯一想到的是 gro
  • 如何在 C# / .NET 中创建内存泄漏[重复]

    这个问题在这里已经有答案了 可能的重复 托管代码中是否可能存在内存泄漏 特别是 C 3 0 https stackoverflow com questions 6436620 is it possible to have a memory
  • EF Core 通过完全替换断开集合导航属性的更新

    使用 EF Core 5 0 我有一个 SPA 页面 可以加载Group实体及其集合Employee来自 API 的实体 var groupToUpdate await context Groups Include g gt g Emplo
  • 防止 boost::asio::io_context 在空轮询调用时停止

    此代码调用发布的句柄 boost asio io context ioc boost asio post ioc std cout lt lt lol lt lt std endl ioc poll 而这并没有 boost asio io
  • 根据 N 个值中最小的一个返回不同的结果

    不确定如何使标题更具描述性 所以我只是从一个例子开始 我使用下面的代码位 它从枚举中选择一个方向 具体取决于四个轴中哪一个与给定方向相比形成最小角度 static Direction VectorToDirection Vector2 di
  • 与 Qt 项目的静态链接

    我有一个在 Visual Studio 2010 Professional 中构建的 Qt 项目 但是 当我运行它 在调试或发布模式下 时 它会要求一些 Qt dll 如果我提供 dll 并将它们放入 System32 中 它就可以工作 但
  • 类的成员复制

    在学习 复制成员 概念时 书中给出了如下说法 此外 如果非静态成员是引用 const 或没有复制赋值的用户定义类型 则无法生成默认赋值 我不太明白这个声明到底想传达什么 或者说这个说法指的是哪一种场景 谢谢 该语句与编译器自动为您编写的类
  • 如何在 QTabWidget Qt 中展开选项卡

    我有一个QTabWidget像这个 但我想展开选项卡以 填充 整个小部件宽度 如下所示 我怎样才能做到这一点 我在用Qt 5 3 2 and Qt 创建者 3 2 1 Update 我尝试使用setExpanding功能 ui gt myT
  • C++ php 和静态库

    我创建了一个library a 其中包含 cpp 和 h 文件 其中包含很多类 嵌套类和方法 我想在 php 示例中包含这个静态库并尝试使用它 我想提一下 我是 php 新手 我已经在 test cpp 文件中测试了我的 libray a
  • 无法在内存位置找到异常源:cudaError_enum

    我正在尝试确定 Microsoft C 异常的来源 test fft exe 中 0x770ab9bc 处的第一次机会异常 Microsoft C 异常 内存位置 0x016cf234 处的 cudaError enum 我的构建环境是 I
  • 如何通过 JsonConvert.DeserializeObject 在动态 JSON 中使用 null 条件运算符

    我正在使用 Newtonsoft 反序列化已知的 JSON 对象并从中检索一些值 如果存在 关键在于对象结构可能会不断变化 因此我使用动态来遍历结构并检索值 由于对象结构不断变化 我使用 null 条件运算符来遍历 JSON 代码看起来像这
  • 如何在c的case语句中使用省略号?

    CASE expr no commas ELLIPSIS expr no commas 我在c的语法规则中看到了这样的规则 但是当我尝试重现它时 int test float i switch i case 1 3 printf hi 它失
  • 在 EnvDTE 中调试时捕获 VS 局部变量

    是否可以使用 EnvDTE 进行 vsix Visual Studio 扩展来捕获本地和调试窗口使用的调试数据 或者可以通过其他方法吗 我想创建一个自定义的本地窗口 我们可以修改它以根据需要显示一些较重的内容 而无需为高级用户牺牲原始的本地
  • 跨多个域的 ASP.NET 会话

    是否有合适的 NET 解决方案来在多个域上提供持久服务器会话 即 如果该网站的用户在 www site1 com 下登录 他们也将在 www site2 com 下登录 安全是我们正在开发的程序的一个问题 Thanks 它是否需要在会话中
  • 使用taskkill停止Windows服务

    我需要帮助来使用 C 终止 Windows 服务 现在要终止该服务 请使用以下选项 从命令 sc queryex ServiceName 发现后PID服务的 taskkill pid 1234 exemple f 为了便于阅读 但如果您明白
  • 您是否将信息添加到每个 .hpp/.cpp 文件的顶部? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 创建新的 C 头文件 源文件时 您会在顶部添加哪些信息 例如 您是否添加日期 您的姓名 文件描述等 您是否使用结构化格式来存储此信息 e g F
  • 矩阵到数组 C#

    这将是转换方阵的最有效方法 例如 1 2 3 4 5 6 7 8 9 into 1 2 3 4 5 6 7 8 9 in c 我在做 int array2D new int 1 2 3 4 5 6 7 8 9 int array1D new
  • 将 char[][] 转换为 char** 会导致段错误吗?

    好吧 我的 C 有点生疏了 但我想我应该用 C 来做我的下一个 小 项目 这样我就可以对其进行抛光 并且我已经有不到 20 行的段错误了 这是我的完整代码 define ROWS 4 define COLS 4 char main map
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte
  • 使用 QtWebEngine 将 C++ 对象暴露给 Qt 中的 Javascript

    使用 QtWebkit 可以通过以下方式将 C 对象公开给 JavascriptQWebFrame addToJavaScriptWindowObject如中所述https stackoverflow com a 20685002 5959

随机推荐

  • R Shiny:如何更改表格的背景颜色

    我找到了如何更改 Shiny 中用户界面的背景颜色 我发现的提款是它还为我显示的表格的背景着色tableOutput 这里我展示了一个虚拟示例 ui R 闪亮的UI 页面带侧边栏 headerPanel 虚拟 侧边栏面板 标签 hr 主面板
  • undefined 不是一个对象(评估 'RNGestureHandlerModule.State'

    我已经安装了反应导航 in my 反应本机项目 它是一个入门项目 没有任何代码 但是在运行项目时我遇到了这样的错误 这是我的导航代码 import createStackNavigator from react navigation imp
  • 在 C/C++ 中以 O(1) 时间初始化动态数组

    有没有办法在 O 1 时间内初始化整个动态数组 有没有类似的东西bool a 10 false 在静态数组的情况下 对于动态数组 要设置的每个元素都必须由CPU单独考虑 因此时间复杂度为O N 或者是吗 但这并不是 big oh 真正的工作
  • 尝试通过玩家输入使用 tkinter 使对象在网格中移动

    所以我正在 tkinter 而不是 pygame 中开发一个类似地下城爬行者的游戏 我发现这非常困难 因为网格无法在代码中工作 并且我找不到在画布上创建可通过按键输入移动的形状的方法 我已经尝试了多种修复方法 但无法找到一种方法将所有这些都
  • 与“docker run -d”等效的远程 api 命令是什么?

    我正在尝试通过远程 api 调用 docker 命令 Docker 远程 api 似乎没有 分离模式 选项 http docs docker io en latest commandline command run http docs do
  • LinQ 查询多个表并提取数据

    我正在对 4 个表进行内连接查询 我必须提取数据并转换为字符串并将其放入数组中 var query from a in context as join b in context bs on a prikey equals b forkey
  • 如何连接数组列表中的字符串值

    我需要使用 concat 一次打印所有数组列表值 这是我的代码 ArrayList
  • git merge 不创建合并提交,没有 MERGE_HEAD [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 在 Linux 上使用 Git 1 8 1 2 我一直在基于以下两个不同的分支上工作master并行 称为 A 和 B 并且还创建
  • 是什么导致 pyspark 中的“unicode”对象没有属性“toordinal”?

    我收到此错误 但我不知道是什么原因造成的 我的 python 代码在 pyspark 中运行 堆栈跟踪很长 我只显示其中的一些 所有堆栈跟踪都没有显示我的代码 所以我不知道在哪里寻找 导致此错误的可能原因是什么 usr hdp 2 4 2
  • 什么是 GWT 字节缓存文件?

    作为背景 今天我的 GWT 托管模式运行速度神秘地减慢到几乎无法工作的程度 每当我暂停应用程序时 相关线程 主线程 代码服务器等 都会等待某些文件 I O 本机方法 挠头一阵子后 我尝试清理一下我的硬盘 然后我刚刚在我的用户中发现Temp文
  • 在 Mac OS 上安装 Rails 失败并出现多个错误

    我尝试在 Mac OS v10 10 4 系统上安装 Rails 但运行时失败brew install rbenv ruby build 错误是 Error Permission denied usr local etc openssl W
  • PRNG 需要线程安全吗?

    只要并发调用不会导致 seg v 或返回相同的值 就有什么理由可以防止竞争条件和数据损坏PRNGs http en wikipedia org wiki Pseudorandom number generator当这些错误的主要影响是不可预
  • 如何在不删除约束的情况下从表中删除

    我有一个问题 我需要在不删除或暂停约束的情况下删除信息 问题是否允许放弃约束很简单 但是我可以将值从 NULL 更改为 NOT NULL DELETE FROM SUPPLIER WHERE COUNTRY USA 然而 另一个表 PROD
  • 方向改变时片段 Backstack 不会恢复

    我有一个FragmentActivity 当用户浏览应用程序时 我将当前片段替换为用户选择的片段 并将事务添加到后台堆栈 一切正常 用户可以通过按后退按钮返回到之前的片段 当设备方向改变时就会出现问题 假设用户看到的第一个片段是 A 然后他
  • 使用最小起订量模拟静态类

    我正在 NUnit 的帮助下编写单元测试用例 并且有一些静态类需要模拟来运行测试用例 所以我们可以在以下帮助下模拟静态类吗MOQ模拟框架 如果有人有想法 请提出建议 有两种方法可以实现这一点 正如 PSGuy 所说 您可以创建一个代码可以依
  • Google Delegates 讨论日历框架/EventKit

    我一直假设 Google 代表可以通过 iCal 和 calendar app 查看 但我们开发人员无法通过日历框架或 EventKit 看到 这有改变吗 我也有这个问题 日历出现两次 取消选择代表 过了一会儿 一切都消失了 显然这是谷歌方
  • 如何检测服务器是否正在使用 SPDY

    有什么方法可以检测远程网站是否支持 SPDY 以及它是什么版本 我可以从命令行使用一些东西 比如 bash 脚本 尝试使用curl发送自定义用户代理标头 但无法获得任何对我有帮助的响应标头 这个想法是能够为任何域获取 SPDY true f
  • c# text/winForm 覆盖视频游戏,如 xfire、PIX、steam、fraps 等

    我知道有很多关于这个主题的帖子 但是几个月来我一直在寻找解决方案 我在谷歌上查了大约 300 个关于这个的帖子 我发现的唯一好的东西是一个 C 程序 它在 League 的窗口上绘制了一个彩色矩形 我对directx不是很熟悉 我的程序是用
  • 在 Python 中训练后,神经网络没有给出预期的输出

    我的神经网络在 Python 训练后没有给出预期的输出 代码有错误吗 有什么方法可以减少均方误差 MSE 吗 我尝试重复训练 运行程序 网络 但它没有学习 而是给出相同的 MSE 和输出 这是我使用的数据 https drive googl
  • 阻止内核处理绑定到原始套接字的 TCP 段

    根据http linux die net man 7 raw http linux die net man 7 raw raw socket socket AF INET SOCK RAW int protocol 是创建原始套接字的方法