Назад | Перейти на главную страницу

Запрос SNMP - операция не разрешена

Я работаю над 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 блокирует соединения, которые, по-видимому, должны разрешать правила. Например:

  1. состояние истекло
  2. состояние не помещается в таблицу состояний

Поскольку вы, похоже, используете только UDP-соединения, есть нет реального состояния. Это означает, что пакеты, поступающие из вашей клиентской системы, должны приниматься вашими правилами, даже если это «новое» соединение.

Конечно, вы хотите знать, куда ваши iptables сбрасывают пакеты. Использовать

sudo iptables --list  --verbose

чтобы посмотреть, какие правила получают пакеты. Чтобы получить более четкое представление, вы можете использовать

sudo iptables --zero

чтобы очистить счетчики, а затем проверить, не поднимается ли одна конкретная строка сразу после ошибки. Затем вы можете добавить правила ведения журнала (см., Например, https://wiki.archlinux.org/index.php/iptables#Logging) и посмотрите, какой именно пакет и где сброшен.

На этом этапе вы также можете просмотреть свои системные журналы и найти объяснение.