【发布时间】:2015-08-05 18:54:01
【问题描述】:
我想在我的应用程序中处理 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; }解决方案取自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 让我直接谈谈我的问题:我希望连接到互联网的设备成为传入/传出连接的网关。我想在我的应用程序的帮助下处理这些数据包。如果某些数据包符合某些规则,我将对其进行修改,其他数据包 - 只需转发而不进行任何修改。在该设备的帮助下,笔记本电脑正在“上网”
【问题讨论】:
-
您似乎正在尝试重新发明 iptables 或防火墙。为什么不将应用逻辑实现为 iptables 规则?
-
是的,我可以借助 iptables 规则处理这些数据包,我明白这一点。但正如我所说,我需要修改一些数据包,而这对于 iptables 是不可能的(加密有效负载、更改 src/dst IP 等)。这就是为什么我需要做我想做的事。
-
这听起来像是
mangle表的规则。 -
但是使用 mangle 表我只能更改 TOS、TTL、MARK、SECMARK 和 CONNSECMARK,但不能更改有效负载。
标签: c++ c linux sockets iptables