2

我将端口 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 的单独重定向数据包。

如果原始数据包应该发送到 abcd:50,我如何获得该 IP 地址?如何确定消息应该发送到的目标地址,以便我可以将其转发到那里?

我感谢您的帮助。

PS:我不想使用 libipq,因为由于某种原因它没有工作,我不想浪费更多时间让它工作。

4

1 回答 1

3

Linux netfilter 定义了一个名为SO_ORIGINAL_DSTin的套接字选项<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);

SO_ORIGINAL_DST我在任何 Linux 联机帮助页中都找不到。您可能会很幸运地在 netfilter 站点上找到正式文档。

于 2010-10-16T23:38:09.137 回答