Я работаю над API, который читает много данных через SNMP
(маршруты, интерфейсы, QoS
политики и т. д.). В последнее время я испытал случайный сообщение об ошибке:
Operation not permitted
Теперь я использую SNMP4J
в качестве основной библиотеки и не может точно определить источник ошибки. Некоторые вопросы о Stackoverflow предполагали, что ОС не может открыть достаточное количество дескрипторов файлов, но увеличение этого параметра не сильно помогло.
Странно то, что возникает ошибка только когда iptables
запущен и работает.
Может быть, брандмауэр блокирует какой-то трафик? Я пробовал писать JUnit
проверить, что имитирует логику приложения, но ошибок не было ...
Любая помощь будет оценена по достоинству! Спасибо!
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 извне, поэтому модуль состояния не помогает. Обычно он используется для отбрасывания входящих пакетов там, где не было исходящего соединения. Это не применимо, поэтому вы, вероятно, захотите отключить состояние. используйте параметр CT --notrack (см. man iptables-extensions). Сделав это, вы захотите установить правила в обоих направлениях.
-I ВВОД -p udp -m udp --dport 161 -j ПРИНЯТЬ
-I OUTPUT -p udp -m udp --sport 161 -j ACCEPT # требуется только в том случае, если у вас заблокирован какой-либо вывод
Это вполне может решить вашу проблему.
Если вы хотите устранить неполадки, то существует ряд причин, по которым iptables блокирует соединения, которые, по-видимому, должны разрешать правила. Например:
Поскольку вы, похоже, используете только UDP-соединения, есть нет реального состояния. Это означает, что пакеты, поступающие из вашей клиентской системы, должны приниматься вашими правилами, даже если это «новое» соединение.
Конечно, вы хотите знать, куда ваши iptables сбрасывают пакеты. Использовать
sudo iptables --list --verbose
чтобы посмотреть, какие правила получают пакеты. Чтобы получить более четкое представление, вы можете использовать
sudo iptables --zero
чтобы очистить счетчики, а затем проверить, не поднимается ли одна конкретная строка сразу после ошибки. Затем вы можете добавить правила ведения журнала (см., Например, https://wiki.archlinux.org/index.php/iptables#Logging) и посмотрите, какой именно пакет и где сброшен.
На этом этапе вы также можете просмотреть свои системные журналы и найти объяснение.