【问题标题】:Forwarding UDP packets in C using the socket API使用套接字 API 在 C 中转发 UDP 数据包
【发布时间】:2012-10-07 02:54:10
【问题描述】:

我正在使用套接字 API 在 C 中编写一个内容过滤器,它将拦截 DNS 请求,并且仅在允许域时才返回响应。描述这个的伪代码是:

  1. 将所有 DNS 查询重定向到正在侦听 UDP 端口 X 的内容过滤程序。
  2. 内容过滤程序提取正在查询的域并确定是否允许。
  3. 如果允许,则内容过滤程序将原始DNS请求包转发给原始目标DNS服务器,同时保持原始源和IP+端口,以便DNS服务器可以直接将回复发送回客户端。
  4. 如果域不被允许,则不发送回复。

我目前有程序在 UDP 端口 X 上侦听,但问题是我无法访问 IP 标头,因此无法在保留原始标头的同时将 DNS 请求简单地转发到原始服务器。

我尝试过使用socket(AF_INET, SOCK_RAW, IPPROTO_UDP),但它没有绑定到端口 X(可以理解),也没有收到任何流量。

在 UDP 端口 X 上侦听,同时仍然能够访问传入数据包的 IP 标头的最佳方法是什么?

【问题讨论】:

标签: c sockets udp ip


【解决方案1】:

我认为 UDP 套接字上的 recvfrom 应该为您提供正确的源地址。您可能仍然需要一个原始套接字来转发消息。

【讨论】:

  • 哦,对,当然。抱歉,我好像有点糊涂了。但是,如果我想保持原始目的地而不是发送到预定的 DNS 服务器,那么我需要知道原始目的地。我该怎么做?
  • 我的印象是 DNS 数据包直接发送到运行该程序的主机。如果您想透明地过滤未定向到您的主机的数据包,那么 UDP 套接字不适合。您可能需要设置一些内核 netfilter 魔术来对路由系统转发的数据包进行用户空间处理。
  • 运行这个程序的主机是一个网关,它使用iptables将任何UDP端口53的数据包重定向到这个程序。
【解决方案2】:

基于 SOCK_RAW 的套接字的功能因您所在的平台而异。通常,当您想访问完整的 IP 数据报信息时,我建议使用Berkeley Packet Filter 来挖掘寻址到感兴趣的 UDP 端口的数据链路层帧。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 2015-11-26
    • 1970-01-01
    • 2014-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多