当我运行以下命令时:
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
提供了您需要的一切?