【问题标题】:Redirect IP-packets to my Application and then send them forward将 IP 数据包重定向到我的应用程序,然后将它们转发
【发布时间】:2015-08-05 18:54:01
【问题描述】:

我想在我的应用程序中处理 IP 数据包,例如加密它们,如果它们符合某些规则(例如目标 ip),则删除“坏”数据包等,然后发送到目标。我想我可以为此目的使用 iptables 的 REDIRECT。我知道将数据包转发到我的应用程序后,原始目标地址将被覆盖,但有一个解决方案:

iptables 会覆盖原始目标地址,但它会记住 旧的。然后应用程序代码可以通过请求 特殊套接字选项,SO_ORIGINAL_DST

static int getdestaddr_iptables(int fd, const struct sockaddr_in *client, const struct sockaddr_in *bindaddr, struct sockaddr_in *destaddr)
{
        socklen_t socklen = sizeof(*destaddr);
        int error;

        error = getsockopt(fd, SOL_IP, SO_ORIGINAL_DST, destaddr, &socklen);
        if (error) {
                log_errno(LOG_WARNING, "getsockopt");
                return -1;
        }
        return 0;
}

解决方案取自here

为此,我还通过以下方式配置了 IPv4 转发:

sysctl -w net.ipv4.ip_forward=1

但是通过尝试设置 iptable 的规则,我得到了一个错误

我的规则是:iptables -t nat -A OUTPUT -p ip -j REDIRECT --to-port 666

错误:iptables v1.4.21: Need TCP, UDP, SCTP or DCCP with port specification1

我真的是 iptables 和一般此类主题的新手。有人可以告诉我我做错了什么吗?为什么它不能使用 IP 进行重定向?我的想法正确吗?我也知道转移套接字,但它们不支持分片。

UPD1 让我直接谈谈我的问题:我希望连接到互联网的设备成为传入/传出连接的网关。我想在我的应用程序的帮助下处理这些数据包。如果某些数据包符合某些规则,我将对其进行修改,其他数据包 - 只需转发而不进行任何修改。在该设备的帮助下,笔记本电脑正在“上网”

【问题讨论】:

  • 您似乎正在尝试重新发明 iptables 或防火墙。为什么不将应用逻辑实现为 iptables 规则?
  • 是的,我可以借助 iptables 规则处理这些数据包,我明白这一点。但正如我所说,我需要修改一些数据包,而这对于 iptables 是不可能的(加密有效负载、更改 src/dst IP 等)。这就是为什么我需要做我想做的事。
  • 这听起来像是mangle 表的规则。
  • 但是使用 mangle 表我只能更改 TOS、TTL、MARK、SECMARK 和 CONNSECMARK,但不能更改有效负载。

标签: c++ c linux sockets iptables


【解决方案1】:

IP 协议根本没有端口号。 TCP 和 UDP 都提供 65536 个端口,但这些是无关的。一个是 TCP 头中的 2 字节字段,另一个是 UDP 头中的 2 字节字段。 ICMP (ping) 根本没有端口。

【讨论】:

  • 糟糕,我错过了那一刻,可能是因为我很累。谢谢。我已经发布了有关“问题”的其他信息
猜你喜欢
  • 2014-02-20
  • 2013-09-24
  • 1970-01-01
  • 2012-04-15
  • 2018-09-13
  • 2011-04-18
  • 1970-01-01
  • 2014-09-25
  • 1970-01-01
相关资源
最近更新 更多