我想在我的应用中处理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;获得互联网"借助该设备
答案 0 :(得分:1)
IP协议根本没有端口号。 TCP和UDP都提供65536个端口,但这些端口不相关。一个是TCP报头中的2字节字段,另一个是UDP报头中的2字节字段。 ICMP(ping)根本没有端口。