我使用以下命令将所有来自端口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站点上找到正式文档。