Dynamic DNS を使って SSH アクセスを制限する方法

いつでもどこからでもサーバにログインしたくなるときってありますよね。かといって、サーバの sshd への接続を全世界から可能にしておくというのは、たとえパスワード認証を無効化していても避けたいところ。

今までは自宅が事実上固定アドレスだったので、クライアントの IP アドレスによるフィルタリングで問題なかったんだけど、引越後は IP アドレスがコロコロ変わるようになるので、そのままだと対応できない。なのでちょっと頭をひねってみた。こんな感じ。

  • SSH ポートについては、 iptables 等パケットフィルタによるアクセス制限を行わない
  • sshd も対応している hosts_access を使って、ホスト名の「正引き」による制限を行う
  • モバイル環境に Dynamic DNS のクライアントをインストールして、正引きのマッピングを自動更新

具体的には、以下のような感じで設定した。

% crontab -l
*/3 * * * * /usr/bin/host ???.dyndns.org | awk '/has address/ {print $4}' > /etc/hosts.allow.d/???.dyndns.org
% cat /etc/hosts.allow
sshd : /etc/hosts.allow.d/???.dyndns.org

これで、「???.dyndns.org」(??? は任意のホスト名) に設定された IP アドレスからだけ接続を受け付けるようになる。IP アドレスが変わると、1〜2分程度のタイムラグは発生するけど、気にしない。普段 EMOBILE つなぎっぱだし。

ただ、FONEMOBILE みたいな NAT 経由でネットにつないでると、同じ NAT 下の人も sshd の認証まではたどり着けるようになる、というのは覚えておいたほうがいいかも。あくまでも、sshdセキュリティホールとか負荷対策とか、そういう感じ。

PS. 設定ミス等からの復帰手順は各自で考えてくださいねw