我使用
将端口50的所有流量重定向到5050iptables -t nat -A POSTROUTING -p udp --dport 50 -j REDIRECT --to-port 5050
我在5050上使用RAW Socket听,我看到从0.0.0.0:50到0.0.0.0:5050的IP数据包。 原始目标地址显然不存在,因为这似乎是从端口50到端口5050的单独重定向数据包。
如果原始数据包应该转到a.b.c.d:50,我该如何获取该IP地址?我怎样才能找出发送消息的目的地址,以便我可以将其转发到那里?
感谢您的帮助。
P.S。:我不想使用libipq,因为由于某些原因它不起作用,我希望不要浪费更多时间让它工作。
答案 0 :(得分:3)
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网站上找到正式文档。