2012-04-26 68 views
4

我有Android的iptables支持根设备上。getprotobyname错误iptables

我似乎得到这个错误,任何人有任何想法为什么?

iptables -A INPUT -p tcp -i eth0 --dport 8000 -m state --state NEW -j ACCEPT 

FIX ME! implement getprotobyname() bionic/libc/bionic/stubs.c:378 
+0

这是一个已知的问题,因为你会发现,如果你做了网页搜索在iptables和错误消息之前问这里。如果这实际上是关键而不是切线,那么你需要用不支持的函数来修补iptables或者以避免需要的方式来使用它。 – 2012-04-27 15:28:36

回答

6

Android使用仿生libc,这是一个非常小的libc,它缺少很多东西。该错误消息说getprotobyname()未在仿生libc中实现。 iptables似乎无论如何运行命令,当这个错误被触发,但我的猜测是,它忽略了-p tcp部分,只是设置所有协议的规则。

幸运的是,这个函数对于使用iptables来说并不重要。 getprotobyname()只是将协议名称(如tcp)转换为数字(tcp == 6)。你可以在这里找到这些数字:http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xml

使用协议号,而不是-p 6消除错误信息:

iptables -A INPUT -p 6 -i eth0 --dport 8000 -m state --state NEW -j ACCEPT

+0

试过这个,现在我得到了“FIX ME!实现getprotobynumber()bionic/libc/bionic/stubs.c:384” – Dakkaron 2014-04-28 11:49:27

+0

@Dakkaron也许你正在使用一个甚至没有'getprotobynumber()'实现的旧版Android版本?在这种情况下,似乎你唯一的选择是省略'-p'并为所有协议设置规则。 – 2014-07-09 13:36:02

+0

我也在Android 4.1.2上遇到'getprotobynumber'错误 – user276648 2016-11-28 02:59:41

1

在某些设备上,这可能只是一个警告,但该规则将被确定。 检查规则是否使用iptables -L INPUT -nv 出现,然后尝试使用。

+1

当这个错误被触发时,'iptables'似乎可以运行命令,但我的猜测是它忽略了'-p tcp'部分,并且只是为所有协议设置规则。如果在规则中包括协议,则使用协议号码是必需的。 – 2013-08-22 15:51:15