我想在我的应用程序中处理 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/