SSHリモートアクセス設定

ちょいと自宅サーバなるものに興味がわいたので、設定してみる。
要するに、外から自由に自分のパソコンにアクセスできるようにしちゃいましょう!
ってことですね。



まず自宅環境を軽く説明

我が家はeo光
eoの用意したモデムに外から光ファイバーつながっていて、

そこからeoの用意したルータにLANケーブルでつながってる。
そしてさらに、そのルータから自前のNECの無線ルータにLANケーブルでつながってる。
そこから電波でーの、LANケーブルでーのでPCがいっぱいつながってるという状態。
文字だけでは分かりにくいので図に書く。 こんな感じ。

したいこと

外から、プライベートIPのサーバ(192.168.0.2)にSSHでリモート接続したい。

前提条件・環境

サーバOS
Fedora7
接続
ルータbyNECからPPPoE接続
SSH
OpenSSHを使用
IP
プライベートIPはOS側の設定で固定しておく

設定手順

  • サーバを識別できるものがIPしかないので、ドメイン名をとる
  • eoから与えられる、外から見えるグローバルIPも数時間ごとに変更されるので、それに合わせてDynamicDNSに登録する
  • このままではプライベートIPへの情報がないので、ルータのNAT設定でポートをあける。

ドメイン名をとる

ドメイン名とは簡単に言えばパソコンの所在地ですね。 IPを言い換えてます(エイリアス的な)。
ホームページのURLも一部ドメイン名ですが、これはそのホームページのデータがどこのパソコンにあるか
を示しているわけですね。


グローバルIPが固定されているなら、最悪IP直打ちでのアクセスでもいいんやけど、
不幸なことに、IPがちょこちょこかわります。
なので、ドメイン名でアクセスできるとその変更を気にしなくてよくて、便利。


ドメイン名は唯一なもので、好きなのにしようと思ったらお金かかりますが、
なんでもよかったらタダで手に入っちゃいます。
今回は後で説明するDynamicDNSにも強い、業界最大手DynDNSさんManaged DNS DDNS DynDNS Services | Dyn
ドメインいただくことにします。
DynamicDNSに適当に登録して、好きなドメイン名作って、グローバルIPを設定すればOK!

DynamicDNSの設定

これで晴れて、ドメイン名ゲットしたわけですが、ものの数分数時間でグローバルIP変わったら、
また新しいの登録しなおさんといけません。
こら面倒です。


でもこの面倒くさい作業を自動でやってくれる賢いソフトがあるみたいです。
有名なのが

DiCE
特徴:Windowsでも使える、最大手で情報豊富。設定簡単だが不安定。
ddclient
特徴:Linuxでも使える、設定むずいが安定。

というものですが、
今回はddclientを使ってみます。
Stray Penguin - Linux Memo (Dynamic DNS)
ここがわかりやすいので参考に。


簡単に説明すると。
ddclientのソフトDL、インストール。
Perlのモジュール IO:Socket::SSL とやらをインストール。(ここは我ながらよくわかりません)
ddclient.confを設定。
上のページではグローバルIPをルータからとってきて、ごにょごにょ・・・っていう設定みたいですが、
DynDNSではWebページでIPがわかり、Webみればいいだけなので、
http://ddclient.wiki.sourceforge.net/
http://nox-insomniae.ddo.jp/insomnia/2008/08/mailserver-daiojo.html
こんな感じの設定でOK


設定できたらソフト動かす。
これで自動的にグローバルIP書き換えてくれます。 かしこすぎる。

ルータのNAT設定でポートをあける

これでルータの入り口までは、ドメイン名がわかれば誰でもたどり着けるようになった。


でも、Fedora7のサーバにSSHでつなぎたいわけで・・・。 どうしよ。
ここで俺はてっきり、プライベートIPをもったサーバ自体にも何らかの形でドメイン名を与えて、
それでアクセスするものやと思ってたわけですが、
どうやらルータから先へはサービスのポート番号でパケットが割り振られるようです。
つまり、「SSH ドメイン名」 で「ドメイン名+22番ポート」のパケットが送られ、
それをドメイン名のアドレス(グローバルIP)を持つルータに
「22番ポートへのパケットはFedora7の192.168.0.2へ」
という設定をしておき、それによってサーバへパケットが届くというわけです。

ここで1日ハマりました。アハ。


だらだら文字続いて申し訳ないが、もうちょっと。
このパケットルーティングの設定をルータのNAT設定で行う。 
NATの呼び名はルータのメーカーによってまちまちなのでご注意。

サービスポート番号、届け先プライベートIP、プロトコルの種類(TCPとか)を設定すればOK。
ここで22番(SSH)ならどのサーバ、80番(WWW)ならどのサーバというように設定しておく。


ということは、同じサービスを同一セグメント内の別サーバで稼働させることはできんのかな??
このへんはよくわかりません。。。><


その他注意すべきこと

これでできないときは、パケットがサーバ内のギリギリまできてるけど、
iptableの設定ではじかれてる、
とか、
SELinuxの設定ではじかれてる、
とかいう可能性が考えられます。  


あと、これは個人的なミス?というか、しらんだけ?やってんけど、
SSHがサーバに届くかどうかのテストを同一セグメント内のPCから(192.168.0.3とか)から行ったら、
Pingは飛ぶけど、全然接続できんという状況に陥りました。


どうやらNATのポート設定はあくまでも、外部からの要求に対するものみたいで、
内部からのパケットには適用されない?ようでした。
まぁこの原因は推測でしかありませんが、このエラーは実際起こったのでご注意あれ。







以上、リモートアクセスの設定をざっくり書いてみました。
これは参考にしたサイトでも書かれていたことですが、
いろんなポート開けっ放しにするだとかして、セキュリティを疎かにすると、
自分のPCだけじゃなくて、踏み台にされて他のPCまでクラッキングされることになりかねないので、
セキュリティ管理には十分に注意する必要があります。


最後に、間違ってる点、疑問点、その他おすすめの参考書籍などあれば教えてください。