繁体   English   中英

将IP数据包重定向到我的应用程序,然后将其转发

[英]Redirect IP-packets to my Application and then send them forward

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

这里采取的解决方案

为此,我还通过以下操作配置了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让我直说一下我的问题:我希望连接到Internet的设备成为用于传入/传出连接的网关。 我想在我的应用程序的帮助下处理这些数据包。 如果某些数据包符合某些规则,我将对其进行修改,而其他数据包则仅进行转发而无需进行任何修改。 笔记本电脑借助该设备“正在上网”

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM