我使用以下命令将所有来自端口50的流量重定向到5050:

iptables -t nat -A POSTROUTING -p udp --dport 50 -j REDIRECT --to-port 5050

我在5050上使用RAW套接字进行监听,并且看到了从0.0.0.0:50到0.0.0.0:5050的IP数据包。
显然不存在原始目标地址,因为这似乎是一个从端口50到端口5050的单独的重定向数据包。

如果原始数据包应该转到a.b.c.d:50,我如何获得该IP地址?如何确定应该将邮件发送到的目标地址,以便可以将其转发到该地址?

我感谢您的帮助。

附注:我不想使用libipq,因为某些原因它没有用,我希望不要浪费更多的时间来使用它。

最佳答案

Linux netfilter在SO_ORIGINAL_DST中定义了一个名为<linux/netfilter_ipv4.h>的套接字选项。

首先,您需要使用以下命令之一在系统中启用端口转发:

sysctl net.ipv4.ip_forward=1
echo 1 > /proc/sys/net/ipv4/ip_forward

然后,您可以使用以下代码:
struct sockaddr_in addr;
socklen_t addr_sz = sizeof(addr);
getsockopt(fd, IPPROTO_IP, SO_ORIGINAL_DST, &addr, &addr_sz);

我在任何Linux手册页中都找不到SO_ORIGINAL_DST。您可能很幸运在netfilter站点上找到正式文档。

10-06 07:41