C ++ iptables重定向形成单独的数据包

时间:2010-10-16 22:15:14

标签: c++ sockets udp redirect iptables

我使用

将端口50的所有流量重定向到5050
iptables -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,因为由于某些原因它不起作用,我希望不要浪费更多时间让它工作。

1 个答案:

答案 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网站上找到正式文档。