有没有一种方法来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));