有没有办法将从服务器发出的流量重定向到另一个 IP,再返回到本地主机上的服务器(最好就像是来自原始目的地一样)?
我基本上希望能够设置自己的软件,监听端口 80,并接收发送到 1.2.3.4 的流量。
举个例子,代码如下。服务器如下:
my $server = IO::Socket::INET->new(
LocalAddr => '127.0.0.1',
LocalPort => '80',
Listen => 128,
);
这将接收来自以下客户端的流量:
my $client = IO::Socket::INET->new(
PeerAddr => 'google.com',
PeerPort => '80',
)
因此,客户端不会连接到 google.com,而是连接到我在本地主机上监听同一服务器的服务器。
我的目的是用它来捕获连接到远程主机的恶意软件。
我并不特别需要将流量重定向到 127.0.0.1,但需要将其重定向到同一台机器可以监听的 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
答案1
您想使用 iptables REDIRECT 目标。
iptables -t nat -A OUTPUT -p tcp -d 1.2.3.4 --dport 80 -j REDIRECT
iptables 手册页为 REDIRECT 指定了一个选项,允许您更改端口。
该选项是--to-ports
。
答案2
据我所知,您可以使用 TPROXY iptables 功能和 IP_TRANSPARENT 套接字来实现完全透明的重定向(不涉及 NAT)。这样,您的应用程序将创建一个特殊的套接字,即使目标 IP 是另一个盒子,它也会接受流量,然后使用 iptables 规则将目标端口 80 的流量重定向到第一个本地接口的端口 80,而无需对其进行任何更改。
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,因此不会改变数据包的单个字节。请记住,您必须为此使用特殊套接字,否则它将无法工作!
为了以防万一,从内核文档中提取有关如何打开 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));