Linux 如何使本地终止的tcp连接通过预路由和后路由?

Linux 如何使本地终止的tcp连接通过预路由和后路由?,linux,testing,networking,tcp,netfilter,Linux,Testing,Networking,Tcp,Netfilter,我正在开发一个应用程序,它使用netfilter队列对数据包进行过滤和管理。它相当复杂,需要很好地执行,所以我想自动化一些严格的测试。要做到这一点,我需要能够通过我的系统路由一些TCP连接,但是,我不想依赖另外两台机器作为客户端和服务器。我更喜欢运行发送数据的本地客户端和检查损坏结果的本地服务器 问题是,我的应用程序需要在预路由阶段截获数据包,因此本地客户端生成的数据包不能只路由到环回接口 所以我需要一些方法在预路由阶段之前注入数据包,并在后路由阶段之后截获它们。如果我能以某种方式使用流套接字发

我正在开发一个应用程序,它使用netfilter队列对数据包进行过滤和管理。它相当复杂,需要很好地执行,所以我想自动化一些严格的测试。要做到这一点,我需要能够通过我的系统路由一些TCP连接,但是,我不想依赖另外两台机器作为客户端和服务器。我更喜欢运行发送数据的本地客户端和检查损坏结果的本地服务器

问题是,我的应用程序需要在预路由阶段截获数据包,因此本地客户端生成的数据包不能只路由到环回接口


所以我需要一些方法在预路由阶段之前注入数据包,并在后路由阶段之后截获它们。如果我能以某种方式使用流套接字发送和接收数据,那就太好了

我能想到的最简单的方法是使用设备。tun设备允许您从用户空间注入看似通过tun接口到达的数据包。您可以自己编写代码来创建和操作tun接口,也可以使用这样的应用程序来实现这一点。使用OpenVPN很容易:没有特殊的原始套接字或任何东西:只需发送UDP封装的IP数据包,就可以通过tun接口到达。我一直在考虑这一点,使用tun设备,我的客户端和服务器测试应用程序应该能够使用普通的linux套接字。我将通过描述测试客户机发送的数据包的路径来解释这是如何工作的

先决条件:

a) 两个tun设备,每个提供对不同子网的访问

b) 已设置路由表以将流量路由到正确的tun设备

1) 客户端向tun1子网中的地址发送数据包

2) 连接到tun1(tun1app)的应用程序将数据包的dst地址转换为tun2子网中的地址,并将源地址转换为tun1子网中与tun1接口地址不同的地址

3) tun1app会将修改后的数据包发回

4) 路由后,tun2app将接收数据包,并将目标地址转换为tun2接口,将源地址转换为tun2网络中与接口地址不同的地址

5) tun2app将发送回数据包,服务器将接收数据包,前提是目标端口是服务器正在侦听的端口

来自服务器的数据包将遵循反向路径


这似乎是一个非常有用的工具的核心思想。有人知道有一种工具可以做到这一点吗?

所有与本地主机本身的连接都要经过预路由和后路由。谁说了别的话,谁就错了。(您可以使用
ip6tables-t raw-I OUTPUT-j TRACE
验证,例如,当您自己
ping6::1
时,您将看到它通过OUTPUT-POSTROUTING-PREROUTING-INPUT。)

到预路由的跳转仍然不允许我在后路由后拦截数据包,因此它不够好。Tun设备似乎正是我需要的。谢谢该命令有错误,将以“无效参数”出错,因为基链无法调用基链,原因是(a)它根本没有实现,(2)将导致循环,因此从一开始就被禁止。感谢您纠正这一点。但是,我确实需要模拟从预路由->转发->后路由的连接,即,我希望本地终止的连接遵循外部终止的连接的路径。因此,使用tun接口的设置似乎仍然是最透明的解决方案。也许我应该选择一个不那么自以为是的标题。维特似乎更愿意这样做。