はじめに
自宅サーバの Let's encrypt 証明書の更新は certbot に任せていたはずなのに更新されてないよメールが飛んできたので、その対処をしたときのメモ。
切り分け
まず始めに自宅サーバで tcpdump -i eth0 -n
を実行しながら certbot renew
を実行してみる。
⇒何もパケットが飛んでこない。もちろん証明書更新は失敗。
⇒ルータのフィルタが原因か?でも前回の更新は成功して、そこからフィルタ設定変えてないよな?
フィルタをいったんガバガバにしてみる
【Before】
ip filter 11000 pass * yourserver.example tcp * 80,443
【After】
ip filter 11000 pass * * tcp * 80,443
⇒通った
念のため、外部サイトを使って名前解決結果と実アドレスが一致することを確認しておく。
http://www.cman.jp/network/support/nslookup.html
vs
ip address show dev eth0
⇒一致
これによって、使用しているヤマハルータのFQDNフィルター機能の仕様が原因では?と推察し、詳しく調べてみることにした。
原因
ヤマハルータのFQNフィルター機能は、ヤマハルータ自身がDNSリカーシブサーバとして解決し自身のDNSキャッシュに載っているFQDNについてのみ、動作する。
そのため、外部から特定のグローバルIPアドレス(yourserver.example)を持つサーバへの着信のみを許可したい場合に
ip filter 11000 pass * yourserver.example tcp * 80,443
と書いたとしても、yourserver.exmaple がヤマハルータ自身によって解決されDNSキャッシュされていない限り、
つまり、ヤマハルータ配下の他の端末によって yourserver.example の解決がリクエストされない限り pass しない。
対策
自宅サーバの cron にでも名前解決を突っ込んでおきましょう。
* * * * * dig yourserver.example >/dev/null
参照
ip hostコマンドの設定値、dns staticコマンドの設定値、DNSキャッシュの順で検索します。
いやこの仕様読み取れんだろ・・・