我正在研究通过SNMP (路由,接口, QoS策略等)读取大量数据的API。 最近,我经历了一个随机错误,指出:
Operation not permitted
现在,我使用SNMP4J作为核心库,不能真正查明错误的根源。 一些Stackoverflow的问题已经表明操作系统无法打开足够数量的文件句柄,但增加这个参数没有多大帮助。
奇怪的是, 只有当iptables启动并运行时才会出现错误。
难道防火墙阻止了一些stream量? 我已经尝试编写JUnittesting,模仿应用程序的逻辑,但没有错误被解雇…
任何帮助,将不胜感激! 谢谢!
IPTABLES
*nat :PREROUTING ACCEPT [2:96] :POSTROUTING ACCEPT [68:4218] :OUTPUT ACCEPT [68:4218] # route redirect za SNMP Trap i syslog -A PREROUTING -i eth0 -p udp -m udp --dport 514 -j REDIRECT --to-ports 33514 -A PREROUTING -i eth0 -p udp -m udp --dport 162 -j REDIRECT --to-ports 33162 COMMIT *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT ..... # SNMP -A INPUT -p udp -m state --state NEW -m udp --dport 161 -j ACCEPT # SNMP trap -A INPUT -p udp -m state --state NEW -m udp --dport 162 -j ACCEPT -A INPUT -p udp -m state --state NEW -m udp --dport 33162 -j ACCEPT ..... -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT
您的问题不是100%清楚,但我假设您的Operation not permitted错误来自您的客户端的SNMP库内部,意味着从目标主机的拒绝。 请澄清,如果你知道不同。
您正在接受来自外部的SNMP连接,所以状态模块不起作用。 通常在没有传出连接的情况下使用丢弃传入数据包。 这不适用,所以你可能想closures状态。 使用CT -notrack选项(请参阅man iptables-extensions)。 这样做后,你会想把规则放在两个方向。
-I INPUT -p udp -m udp –dport 161 -j ACCEPT
-I OUTPUT -p udp -m udp -sport 161 -j ACCEPT#如果你有一些输出被阻塞
这可能很好地解决你的问题。
如果你想排除故障,那么iptables阻塞连接有许多原因可能,这似乎规则应该允许。 例如:
由于您似乎只使用UDP连接,因此不存在真实状态 。 这意味着来自客户端系统的数据包应该被您的规则所接受,即使这是“新”连接。
当然,你想知道你的iptables在丢包。 使用
sudo iptables --list --verbose
看看哪些规则获取数据包。 为了更清楚的看法,你可以使用
sudo iptables --zero
清除计数器,然后检查一个特定的行是否在出错后立即上升。 然后,您可以添加日志logging规则(请参阅https://wiki.archlinux.org/index.php/iptables#Logging ),确切地看哪个数据包丢弃在哪里。
在这一点上,你也可以查看你的系统日志,你应该find一些解释。