Вопрос или проблема
Недавно я столкнулся с проблемой на своем почтовом сервере FreeBSD Postfix с пакетом py27-postfix-policyd-spf-python-1.3.2_1
.
Мои почтовые логи были заполнены следующими сообщениями:
policyd-spf[16637]: ERROR: 127.0.0.0/8 in skip_addresses not IP network. Message: '11.22.33.44' does not appear to be an IPv4 or IPv6 address. Did you pass in a bytes (str in Python 2) instead of a unicode object?. Aborting white list processing.
Переход на Python 3, как предлагали другие люди, не сработал (ни изменение shebang, ни запуск через Python 3 напрямую).
Решением моей проблемы было (пока) добавить следующие строки в функцию _cidrmatch
в /usr/local/bin/policyd-spf
def _cidrmatch(ip, netwrk)
netwrk = unicode(netwrk)
ip = unicode(ip)
try:
address = ipaddress.ip_address(ip)
Это сделано для того, чтобы модуль python ipaddr работал только с Unicode строками (как запрашивает сообщение об ошибке)
Переход на python3, как предлагали другие посты в интернете, не сработал для меня (возможно, не хватало каких-то зависимостей?)
Этот пост также очень помог мне
https://stackoverflow.com/questions/30389019/valueerror-10-0-0-0-24-does-not-appear-to-be-an-ipv4-or-ipv6-network
НО ПОМНИТЕ: это исправление ИЗЧЕЗНЕТ после обновления пакета, поэтому это только предназначено как полезная заметка для тех, кто столкнулся с той же проблемой, что и я!
Поэтому, если у кого-то есть реальное решение, дайте нам знать 🙂
.
Ответ или решение
Ваша проблема связана с несовместимостью обработки IP-адресов в приложении policyd-spf-python
, используемом на вашем почтовом сервере FreeBSD с Postfix. Сообщения об ошибках, которые появляются в ваших почтовых логах, указывают на то, что модуль ipaddr
ожидает получить строки в формате Unicode, а не байтовые строки (в Python 2 это строки типа str
).
Для решения данной проблемы, вы внесли изменения в функцию _cidrmatch
в файле /usr/local/bin/policyd-spf
, что позволило преобразовать IP-адреса и сети в строки Unicode перед обработкой:
def _cidrmatch(ip, netwrk):
netwrk = unicode(netwrk)
ip = unicode(ip)
try:
address = ipaddress.ip_address(ip)
Эти изменения обеспечили корректную работу функции, предотвращая ошибки при проверке IP-адреса и сети. Однако важно помнить, что данные изменения могут быть утрачены при следующем обновлении пакета, так как они были внесены вручную.
Несмотря на рекомендации некоторых источников, переход на Python 3 не решил проблему. Это может быть связано с отсутствием необходимых зависимостей или совместимости в используемой версии пакета.
Если вы хотите более устойчивое решение, можно рассмотреть следующие шаги:
-
Обновление пакета: Проверяйте обновления для
policyd-spf-python
, так как разработчики могут выпустить исправление, устраняющее эту ошибку. -
Проверка зависимостей: Убедитесь, что все необходимые зависимости установлены и совместимы с Python 3.
-
Ознакомление с альтернативными решениями: Возможно, существуют другие политики или модули SPF, которые более полно поддерживают Python 3 и могут избежать подобных ошибок.
-
Автоматизация исправлений: Скрипт для автоматического внесения исправлений в случае обновления пакета может быть временным решением до выпуска официального патча.
Ваша корректировка работает как временное решение, поэтому важно следить за новыми версиями пакета и официальными переписками разработчиков для получения постоянного исправления. Обсудите эту проблему на форумах и в Сообществах для нахождения свежих рекомендаций от других экспертов.