iptables给出输入/输出错误

时间:2011-12-27 07:43:11

标签: iptables netfilter

我想在我们基于MIPS的平台上使用iptables-1.4.3.2与Linux-2.6.35.9一起工作。发出的命令是

iptables -t mangle -A POSTROUTING -p udp -j <TC name> --map tos

iptables以输入/输出错误退出(同样的命令在Linux-2.6.28.8上运行)。然后在我们的目标上做了相同的strace并看到如下问题:

socket(PF_INET, SOCK_RAW, IPPROTO_RAW)  = 3
getsockopt(3, SOL_IP, 0x40 /* IP_??? */, "mangle\0\0\0\0\0\34\200F\0\0\200\1\340   \244\200\1\340\244\200\7W\224\200\7W\f\0"..., [84]) = 0
getsockopt(3, SOL_IP, 0x41 /* IP_??? */, "mangle\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\0"..., [976]) = 0
setsockopt(3, SOL_IP, 0x40 /* IP_??? */, "mangle\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\0"..., 1240) = -1 EIO (Input/output error)
close(3)                                = 0
write(2, "iptables: "..., 10iptables: )           = 10
write(2, "Input/output error"..., 18Input/output error)   = 18
write(2, ".\n"..., 2.
)                   = 2
munmap(0x2ab9b000, 75264)               = 0
exit(1)                                

上面的代码在libiptc.c中;任何进一步调试错误的建议都会有所帮助。谢谢。

2 个答案:

答案 0 :(得分:0)

通过更改linux-2.6.35 / net / netfilter / x_tables.c中的以下行来解决此问题

function xt_check_match: 改变了以下几行:

if (par->match->checkentry != NULL) { ret = par->match->checkentry(par); if (ret < 0) return ret; else if (ret > 0) { /* Flag up potential errors. */ return -EIO; } }

到:

if (par->match->checkentry != NULL && !par->match->checkentry(par)) return -EINVAL;

同样在函数xt_check_target中:从以下位置更改了行:

if (par->target->checkentry != NULL) { ret = par->target->checkentry(par); if (ret < 0) return ret; else if (ret > 0) { /* Flag up potential errors. */ return -EIO; } }

到:

if (par->target->checkentry != NULL && !par->target->checkentry(par)) return -EINVAL;

这些是以前内核中的检查。有相同的检查解决了上述问题。感谢。

答案 1 :(得分:0)

EIO意味着您的自定义“TC”目标(或其所指的任何内容)模块(即xt_TC.c)不符合API。 checkentry不应该在2.6.35及更高版本中返回大于零的值(没有分配给它们的含义)。