


先日、CentOS 7にpypolicyd-spfを導入しました。
運用を開始すると外部からのメールがエラーで受信できません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
policyd-spf[3858]: Traceback (most recent call last): policyd-spf[3858]: File "/usr/libexec/postfix/policyd-spf", line 702, in <module> policyd-spf[3858]: instance_dict, configData, peruser) policyd-spf[3858]: File "/usr/libexec/postfix/policyd-spf", line 414, in _spfcheck policyd-spf[3858]: res = spf.check2(ip, helo_fake_sender, helo, querytime=configData.get('Lookup_Time')) policyd-spf[3858]: File "/usr/lib/python2.7/site-packages/spf.py", line 297, in check2 policyd-spf[3858]: receiver=receiver,timeout=timeout,verbose=verbose,querytime=querytime).check() policyd-spf[3858]: File "/usr/lib/python2.7/site-packages/spf.py", line 378, in __init__ policyd-spf[3858]: self.set_ip(i) policyd-spf[3858]: File "/usr/lib/python2.7/site-packages/spf.py", line 405, in set_ip policyd-spf[3858]: self.ipaddr = ipaddress.ip_address(i) policyd-spf[3858]: File "/usr/lib/python2.7/site-packages/ipaddress.py", line 163, in ip_address policyd-spf[3858]: ' a unicode object?' % address) policyd-spf[3858]: AddressValueError: 'xxx.xxx.xxx.xxx' 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? postfix/spawn[3856]: warning: command /usr/libexec/postfix/policyd-spf exit status 1 postfix/smtpd[3849]: warning: premature end-of-input on private/policy-spf while reading input attribute name postfix/smtpd[3849]: warning: problem talking to server private/policy-spf: Success postfix/smtpd[3849]: NOQUEUE: reject: RCPT from hogehoge.co.jp[xxx.xxx.xxx.xxx]: 451 4.3.5 Server configuration problem; from=<user01@hogehoge.co.jp> to=<hoge@domain.jp> proto=ESMTP helo=<mail.hogehoge.co.jp> postfix/smtpd[3849]: disconnect from hogehoge.co.jp[xxx.xxx.xxx.xxx] |
ステータスコード 451を返してrejectしています。
探すと同じエラーが。
CentOS7でSPFチェック機能導入 Postfix pypolicyd-spf で動作させるとメールが届かなくなる
http://qiita.com/sin_w/items/fffc2bb565e9e3824518
バグなのか。
https://bugs.centos.org/view.php?id=12393
まだ修正されていなくて、最新の投稿だとpython-ipaddressモジュールがインストールされていると発生するらしいとのこと。
当面perl版policyd-spfを使うかってことでrepo dataが公開されています。
https://copr.fedorainfracloud.org/coprs/giesen/postfix-policyd-spf-perl/
さらに気になるメッセージもありました。
1 |
policyd-spf[2925]: ERROR: 127.0.0.0/8 in skip_addresses not IP network. Message: 'xxx.xxx.xxx.xxx' 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 whitelist processing. |
これについては下記の記事で解決しました。
postfix-policyd-spf-python クイックセットアップ
https://hgotoh.jp/wiki/doku.php/documents/quick/quick-0016
py-ipaddress と py-ipaddr が同居していると先のエラーが出力される。
py-ipaddress がなくて py-ipaddr がある環境だと先のエラーが出ないことを確認した。対処方法としては /usr/local/bin/policyd-spf を書き換えてしまうのが一番早い。
2行を入れ替えるだけだがエラーは起きずに動作している。
同じように書き換えることで解決しましたが、根本的なバグがあるので現状は利用できないです。残念。
1 2 3 4 5 6 |
try: # import ipaddress import ipaddr as ipaddress except ImportError: # import ipaddr as ipaddress import ipaddress |