Iptables – 将端口上的出站stream量redirect到127.0.0.1上的入站stream量

有没有一种方法来redirectstream量设置从服务器到另一个IP,回到本地主机上的服务器(最好就好像它是从原来的目的地)?

我基本上希望能够build立我自己的软件,监听端口80,并接收发送的stream量,如1.2.3.4。

所以作为一些代码的例子。 这里将是服务器:

my $server = IO::Socket::INET->new( LocalAddr => '127.0.0.1', LocalPort => '80', Listen => 128, ); 

这将从下列客户端接收stream量:

 my $client = IO::Socket::INET->new( PeerAddr => 'google.com', PeerPort => '80', ) 

因此,而不是让客户端连接到google.com,它将连接到服务器,我已经监听同一台服务器的本地主机。

我的意图是使用此来捕获连接到远程主机的恶意软件。

我不特别需要将stream量redirect到127.0.0.1,但需要将其redirect到同一台机器可以侦听的IP。

编辑:我已经尝试了以下,它不起作用 –

 echo 1 > /proc/sys/net/ipv4/ip_forward iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 127.0.0.1:80 iptables -t nat -A POSTROUTING -j MASQUERADE 

你想使用iptables的REDIRECT目标。

 iptables -t nat -A OUTPUT -p tcp -d 1.2.3.4 --dport 80 -j REDIRECT 

iptables联机帮助页指定了一个允许您更改端口的REDIRECT选项。

该选项是--to-ports

据我了解,您可以使用TPROXY iptablesfunction和IP_TRANSPARENT套接字来实现完全透明的redirect(不涉及NAT)。 这样,你的应用程序将创build一个特殊的套接字,即使目的地IP是另一个盒子,也将接受stream量,然后使用iptables规则在第一个本地接口的端口80上redirect目标端口80的stream量,而不改变它所有。

 iptables -t mangle -A PREROUTING -i eth0 -p tcp -m tcp -d 1.2.3.4 --dport 80 -j TPROXY --on-port 80 

这在Squid Proxy中使用,为了在完全透明的模式下运行而不做任何NAT,因此不会改变数据包的单个字节。 请记住,你必须使用一个特殊的sockets,否则将无法正常工作!

以防万一,从内核文档中提取如何打开一个tproxy套接字:

 fd = socket(AF_INET, SOCK_STREAM, 0); /* - 8< -*/ int value = 1; setsockopt(fd, SOL_IP, IP_TRANSPARENT, &value, sizeof(value)); /* - 8< -*/ name.sin_family = AF_INET; name.sin_port = htons(0xCAFE); name.sin_addr.s_addr = htonl(0xDEADBEEF); bind(fd, &name, sizeof(name));