将IP数据包重定向到我的应用程序,然后将它们向前发送

时间:2015-08-05 07:18:22

标签: c++ c linux sockets iptables

我想在我的应用中处理IP数据包,比如加密,删除"坏"如果他们匹配一些规则(例如目的地IP)然后发送到目的地等。我想我可以用它来实现iptables的REDIRECT。我知道在将数据包转发到我的应用程序后,原始目标地址将被覆盖,但有一个解决方案:

  

iptables会覆盖原始目标地址,但它会记住   旧的。然后,应用程序代码可以通过请求a来获取它   特殊套接字选项,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让我直截了当地解决我的问题:我希望连接到互联网的设备成为传入/传出连接的网关。我想借助我的应用处理这些数据包。我会修改一些数据包,如果它们符合某些规则,其他 - 只需向前发送而不做任何修改。而笔记本电脑是#34;获得互联网"借助该设备

1 个答案:

答案 0 :(得分:1)

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

相关问题