如何使本地终止的TCP连接通过prerouting和postrouting?

时间:2012-01-21 11:42:01

标签: linux testing networking tcp netfilter

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

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

所以我需要一些方法在预先路由阶段之前注入数据包并在发出后拦截它们。如果我能以某种方式使用流套接字来发送和接收那些非常棒的数据!

3 个答案:

答案 0 :(得分:1)

我能想到的最直接的方法是使用tun设备。 tun设备允许您从用户空间注入看似通过tun接口到达的数据包。您可以自己编写代码来创建和操作tun接口,也可以使用已经执行此操作的OpenVPN之类的应用程序。使用OpenVPN很容易:没有特殊的原始套接字或任何东西:你只需发送封装在UDP中的IP数据包,它就会通过tun接口到达它们。

答案 1 :(得分:0)

我一直在考虑这个并使用tun设备我的客户端和服务器测试应用程序应该能够使用普通的Linux套接字。我将通过描述测试客户端发送的数据包的路径来解释这是如何工作的。

先决条件:

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

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

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

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

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

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

5)tun2app会将其发回并且服务器将接收该数据包,假设目标端口是服务器正在侦听的端口

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

这似乎是一个非常有用的工具的核心思想。有没有人知道能够做到这一点的工具?

答案 2 :(得分:0)

来自本地主机本身的所有连接执行过去PREROUTING和POSTROUTING。谁告诉别的事情是错的。 (您可以使用ip6tables -t raw -I OUTPUT -j TRACE验证,并且您会看到它通过OUTPUT-POSTROUTING-PREROUTING-INPUT,例如,当您自己ping6 ::1时。)