![](/img/trans.png)
[英]C# or C/C++ How to receive packets from client, filter & redirect them to server, receive from server & send to client
[英]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.