基本连接跟踪支持(强制性)

基本连接跟踪支持(强制性)

当我运行以下命令时:

iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

我收到以下错误:

iptables: Protocol wrong type for socket.

我已经运行了该命令strace并且发现它在setsockopt调用时失败:

socket(PF_INET, SOCK_RAW, IPPROTO_RAW)  = 4
fcntl64(4, F_SETFD, FD_CLOEXEC)         = 0
getsockopt(4, SOL_IP, 0x40 /* IP_??? */, "filter\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., [84]) = 0
getsockopt(4, SOL_IP, 0x41 /* IP_??? */, "filter\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., [12328]) = 0
setsockopt(4, SOL_IP, 0x40 /* IP_??? */, "filter\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 12736) = -1 EPROTOTYPE (Protocol wrong type for socket)

可能出了什么问题?我怀疑是缺少内核配置选项,但与 netfilter 相关的选项有大约 50 个,我不想在没有理解自己在做什么的情况下就开始打开它们。有没有办法找出缺少的东西?

编辑:看起来 iptables 中失败的调用是setsockopt(handle->sockfd, TC_IPPROTO, SO_SET_REPLACE, ...)

答案1

我的 Android 2.3.3 / Linux Squeeze 设备也遇到过类似问题,我在本页左侧找到了答案。适用于 iptables 1.3.7。

iptables 允许所有传出 - 仍然无法解析 DNS 或发出 http 请求

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

答案2

我遇到了完全相同的问题,最后找到了如何正确配置内核(我的情况是 4.18)。这可能对其他人也有用...


基本连接跟踪支持(强制性)

首先启用CONFIG_NF_CONNTRACK以便显示其他选项。

然后,根据您需要的协议,启用CONFIG_NF_CONNTRACK_IPV4和/或CONFIG_NF_CONNTRACK_IPV6(自动选择CONFIG_NF_DEFRAG_IPV{4,6})。


iptables支持

CONFIG_XT_MATCH_CONNTRACK允许OP的规则:

iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

CONFIG_XT_MATCH_STATE是精简版,轻量级版本,xt_conntrack并允许 S0AndS0 的答案中提出的规则:

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

如果您不需要全部xt_conntrack功能,xt_state那么在受限系统上可能会很有趣,因为它的磁盘大小/内存占用较小。由于它们最终都使用相同的内核接口,我相信性能应该差不多。关键是:它是否xt_state提供了您需要的一切?

相关内容