如何读取已重定向到localhost的tcp包?

时间:2011-06-05 22:58:24

标签: linux sockets network-programming iptables

我使用iptables(PREROUTING)将所有TCP流量重定向到本地端口。

现在我想使用C程序捕获这些数据包。我尝试了很多套接字变种(UDP / TCP / ...)但是我无法使用iptables中指定的端口建立到localhost的连接。

我可以看到所有正在重定向的数据包,但是如何捕获此流量?

这些是我的规则(它的Android,但不应该有任何差异......):

Chain PREROUTING (policy ACCEPT 32 packets, 5675 bytes)
 pkts bytes target     prot opt in     out     source               destination
FIX ME! implement getprotobynumber() bionic/libc/bionic/stubs.c:384
    0     0 DNAT       tcp  --  any    any     anywhere             anywhere            tcp dpt:5512 to:192.168.1.107

Chain OUTPUT (policy ACCEPT 56 packets, 3433 bytes)
 pkts bytes target     prot opt in     out     source               destination
FIX ME! implement getprotobynumber() bionic/libc/bionic/stubs.c:384
    0     0 DNAT       tcp  --  any    any     anywhere             anywhere            tcp dpt:5512 to:127.0.0.1

我已经尝试过创建TCP / UDP / RAW Socket(我还想过“本地”/ UNIX-Sockets,但它的地址是什么?)和ServerSocket / DatagramServer - 但我什么都没收到......

谢谢!

2 个答案:

答案 0 :(得分:0)

如果您只是想读取数据包,那么ULOG目标应该是您的首选。您可以配置netfilter将数据包发送到用户空间,ulogd守护程序可以save the packets to a file or database,因此可以配置或修改它以直接将数据包发送到您的程序。

另一方面,如果你试图做一些聪明的插入来创建一个透明的VPN或类似的东西,ULOG可能会有点太多的工作。

答案 1 :(得分:0)

您可以使用libpcap来捕获以太网设备上发生的任何流量,然后过滤掉您想要/需要的内容。

如果没有服务侦听,即使使用DNAT,您也无法建立与端口的连接。您需要准确解释您要完成的工作,解释您的网络设置以及您尝试捕获的数据。