★OpenSSHを用いた簡単なVPNの構築
SSHで簡単に1対1のVPNを組む事ができる。
例えば社内から社外に対してはアクセスできるが、社外からはアクセスできない。これはIPマスカレードを用いているからである。しかしSSHを用いると、SSHでログインできる場所であればどこでも相互間通信を成り立たせる事ができる。そういう機能をSSHが提供しているからだ。
もちろん、どちらかのPCにsshが稼動していなくてはならない。
■リモートフォワード
リモートフォワードを使用すれば、sshでログインできる場所であればどこであっても双方向の接続ができる。例えば、社内LANなどであれば内部ネットワークから外部ネットワークには通信できるが、外部からの通信はファイアウォールによって遮断されてしまう。
しかし、リモートフォワードを使用することで、片方向の接続さえ確保していれば、その接続経路を使用してもう片方からも通信する事ができる。
つまり、sshでログインできる場所には双方向の接続を確立する事ができる。
今回の設定の設定図を示す。
内部ネットワークのマシンを10.10.10.2、外部ネットワークのマシンを10.0.0.1とする。サーバ側からクライアント側にはアクセスできるが、クライアント側からはサーバは内部ネットワークにあるので見る事ができないという、良くある設定とする。
サーバ側にはsshとtelnetが起動している事とする。
リモートフォワードをさせるために、サーバ側からクライアント側へ、リモートフォワード用の接続をする必要がある。構文は以下の通りである。
# ssh -R
<クライアント側が使用するポート>:<サーバ側のIPアドレス>:<ログインするサーバ側のポート> <クライアント側のIPアドレス> |
今回の設定では、サーバ側で以下のコマンドを打つ。
# ssh -R 10000:10.10.10.2:23
10.0.0.1 |
記述が混乱しやすいので、使用する場合はよく見て場所を間違えないようにして欲しい。
次にログインパスワードを聞かれるので入力する。そうすると、コンソールがクライアント側(10.0.0.1)にログインし、サーバとクライアントの1対1のマシン同士でセッションが張られる事になる。
# ssh -R 10000:10.10.10.2:23 10.0.0.1 root@10.0.0.1's Last login : Mon Aug 4 15.11.20 2003 from:0 # |
この状態で、クライアント側からは自分自身(ローカル)の指定のポート(10000番)にアクセスする事で、普通はログインできないサーバ側にログインする事ができる。
そのコマンドは以下のものを使用する
# telnet localhost 10000 |
これで10.10.10.2にtelnetでアクセスができているので、ログインユーザ名とパスワードを打てばログインする事ができる。
# telnet localhost 10000 Connected to localhost. Escape character is '^]' Red Hat Linux release 9 (Shrike) Kernel 2.4.30-18.9 on an i686 login:user Password:******** $ |
■ローカルフォワード
ローカルフォワードは、自分自身にはsshが入っている必要はないが、サーバ側にsshが稼動していてローカルからサーバはアクセスしてみる必要がある。
こちらがクライアント側であるときは-Lオプションを使用し、
# ssh –L <クライアント側が使用するポート>:<クライアント側のIPアドレス>:<ログインするサーバ側のポート> <サーバ側のIPアドレス> |
-Lと-Rで分かりにくいようだが、その構文を考えれば配置を理解できるだろう。
今回の設定では、コマンドを打つのはクライアント側でしか行なわない。
# ssh -L 10000:10.0.0.1:23
10.10.10.2 |
これで、クライアント側のコンソールはサーバの23番ポートにログインする事になる。
クライアント側で次のコマンドを入力すれば、10000番ポートを経由してサーバに自動的にアクセスされる事になる。
# telnet localhost 10000 |
★OpenSSH+PPPD+シェルスクリプト+cronを用いた本格的なVPNの構築
PPPDは離れたネットワークを同一ネットワークとして扱うサービスである。しかしこのまま使うとセキュリティに大きな不安がある。そのため、その2点間をSSHで暗号化し、通信すればVPNが組める、というものである。
これについては少々知識が必要である。ネットワークに応じてシェルスクリプトを記述し、cron(定期的コマンド実行サービス)で動作させる必要がある。
・・・・・(難しいので現在調査中)