我制作了一个Linux应用程序,该应用程序修改到达指定端口的流量,并使用boost::asio
将流量重定向到另一个端口(本地应用程序)。当我的应用程序接受新的tcp连接时,它将与目标端口创建新连接并接收来自源和目标的所有数据并相互传递(+修改流量),我的应用程序位于Internet和目标应用程序之间。似乎一切正常,除了一件事,当目标进程接受新连接(来自我的应用程序的连接)时,它看到源IP为127.0.0.1
(+使用getpeername
),我该如何建立新连接因此目标应用会将源IP视为来自互联网的原始连接IP,如下图所示:
也许使用RAW插槽?是否可以使用欺骗的源IP地址创建自己的TCP握手过程,然后将文件描述符传递给boost::asio
而不是使用boost::async_connect
?但是,从目标进程传出的流量会直接进入Internet而不使用我的过滤应用程序吗?
不幸的是,我无法使用LD_PRELOAD
注入目标进程,因为它是静态编译的。我也无法使用自己的内核模块