c++ - 将 IP 数据包重定向到我的应用程序,然后将它们转发

标签 c++ c linux sockets iptables

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

iptables overrites the original destination address but it remembers the old one. The application code can then fetch it by asking for a special socket option, 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;
}

solution taken from 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:需要具有端口规范的 TCP、UDP、SCTP 或 DCCP1

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

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

最佳答案

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

关于c++ - 将 IP 数据包重定向到我的应用程序,然后将它们转发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31825841/

相关文章:

linux - ARB组件如何组装

python - 将手动安装的 python 库集成到系统中?

c++ - 为什么 SDL2 矩形和线条画不是像素完美的?

c++ - 过载技巧

c++ - 递归函数导致堆栈溢出

c++ - 将指针返回二维数组[C++]

java - 多线程 JNI 调用

c - 用于学习的 C 图形

c++ - __attribute__((packed)) 替代

c - c中的字符串反转而不需要翻转数字