首页 文章

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

提问于
浏览
0

我想在我的应用程序中处理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 = getsockopt(fd,SOL_IP,SO_ORIGINAL_DST,destaddr,&socklen);
if(error){
log_errno(LOG_WARNING,“getsockopt”);
返回-1;
}
返回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让我直截了当地解决我的问题:我希望连接到互联网的设备成为传入/传出连接的网关 . 我希望借助我的应用处理这些数据包 . 我会修改一些数据包,如果它们符合某些规则,其他 - 只需向前发送而不做任何修改 . 笔记本电脑在该设备的帮助下“上网”

1 回答

  • 1

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

相关问题