top

TOP  RSS  Login

Cygwin で SSH サーバ


概要

環境例

遠隔地のルータ下にある Windows マシンをメンテナンスしたいので、Windows マシン上の Cygwin 環境で SSH サーバを動かしてリモートログインできるようにする。

ただし遠隔地の回線は IP アドレスが固定的ではなく、ルータの電源入り切りや PPPoE 接続の切断など、ある程度の頻度で IP アドレスが変更される。

手段

遠隔地のマシンの IP アドレスが変わるごとにそれをいちいち把握することは困難なので、どうにかする。

  1. ダイナミック DNS サービス(DDNS)を利用し特定のドメイン/ホスト名に紐付けし、サーバへのアクセスを容易にする
  2. 遠隔地のマシンの Cygwin 上で autossh を利用して外部 SSH サーバに接続し、リモートポートフォワーディングによってトンネリングを行う

が挙げられる。

1. の場合は DynDNS サービス + DDNS クライアント(DiCE などの DDNS クライアントやルータに備え付けの機能など)で実現可能。ただし DDNS クライアントを常時起動させておく必要があり、またポートマッピングのためにルータの NAT 設定を弄くる必要がある。

特に遠隔地のルータの設定に自由にアクセスできない場合、いくら DDNS によってホスト名を特定のものに固定させたとしても、遠隔メンテナンスは不可能となる。

そこで 2. となる。これは遠隔地の Windows マシンを SSH クライアントとして、autossh によって外部の SSH サーバへの接続を常時維持させつつ、SSH のポートフォワーディングを用いて外部 SSH サーバマシンの特定ポートへのアクセスを Windows マシン上の SSH サーバにリダイレクトさせるもの。

この場合、遠隔地のルータの設定を変更させる必要がない=ネットワーク管理権限がなくとも、Windows マシンに遠隔ログインし、常時メンテナンスを行うことができる(可能性がある)。

概念図

cygwin sshd tunnel

作業

注意

cygrunsrv コマンドは cygrunsrv 以外によって登録されたサービスの削除も可能なので、誤って既存のサービスを削除しないこと。

準備

Cygwin をインストール

Cygwin から setup.exe をダウンロードして実行。標準でインストールされるパッケージとは別に、下記パッケージにチェックをしてインストール。

  • Admin - cygrunsrv / Cygwin の特定のプログラムを Windows 上のサービスとして登録する
  • Net - autossh / ssh による接続を維持する
  • Net - openssh / ssh サーバとクライアントなど

sshd をサービスとして登録

$ ssh-host-config
...

Privilege(特権)ユーザを作るか訊かれるので yes。

また「Windows Server 2003 や Vista 以降の Windows では SYSTEM アカウントは setuid できませんし、LocalSystem アカウントは明示的にパスワードを入力しないと他のユーザとして振る舞えませんよ」と言われ、「そのためにユーザを変更できる特別なユーザアカウントを作りましょうか」と訊かれるので yes。

作成するユーザ名を問われるので適当に(例えば cyg_server などと)入れる。パスワードも入れる。

作成後、sshd が Windows サービスに "CYGWIN sshd" として登録されているので、開始する。このサービスを開始すると conhost.exe なるプロセスも一緒に動かされている。

localhost に ssh ログインできるか確認

$ ssh localhost
Password: (パスワード)
$

autossh 登録の設定

環境例は以下の通り。

  • Windows/Cygwin ユーザ名 : user (Windows マシンの管理者権限が必要)
  • Cygwin のホームディレクトリ : /home/user
  • SSH 認証用の鍵 : /home/user/.ssh/id_rsa_autossh
  • Cygwin の sshd ポート : 22
  • 外部サーバ : 172.16.10.10
  • 外部サーバのユーザ名 : tarou
  • 外部サーバでフォワードするポート : 12222
  • モニタ用ポート : 55510
  • 登録する Windows サービス名 : AutoSSH

専用の鍵を作成

$ ssh-keygen -t rsa -f /home/user/.ssh/id_rsa_autossh -P ""

/home/user/.ssh/id_rsa_autossh と /home/user/.ssh/id_rsa_autossh.pub が作成される。

~/.ssh/config にホスト設定を追加

# サーバとの接続の切断を防ぐために
# 定期的にパケットをやりとりする
ServerAliveInterval 60
ServerAliveCountMax 10

# 外部サーバを myautossh として設定
Host myautossh
  Hostname 172.16.10.10
  User tarou
  IdentityFile /home/user/.ssh/id_rsa_autossh
  RemoteForward 12222 localhost:22

公開鍵を外部サーバに登録

$ cat ~/.ssh/id_rsa_autossh.pub | ssh myautossh 'mkdir .ssh 2>/dev/null; cat >> .ssh/authorized_keys'
Password: (外部サーバのパスワード)

外部サーバに接続できるかテスト

$ ssh myautossh "exit" && echo done
done

Windows サービスとして登録

  # 同じ名前で登録されているサービスがないか確認
  # "Win32 error 1060" などが表示されれば登録されていない
$ cygrunsrv -Q AutoSSH

$ cygrunsrv -I AutoSSH -p /usr/bin/autossh -y tcpip -a "-M 55510 -N myautossh" -e AUTOSSH_NTSERVICE=yes -u user
Enter password of user : (Windows パスワード)
Reenter, please: (Windows パスワード)

サービスの起動を確認

$ cygrunsrv -S AutoSSH

その後コマンドプロンプトなどで netstat し、接続が確立されているかどうか確認する。

実用

Windows にリモートログイン

AutoSSH サービスを登録・起動したマシンは動かしたまま、他のマシンから外部サーバ 172.16.10.10 に ssh 接続し、さらにそのサーバ上で localhost のポート 12222 に接続する。

% ssh -t 172.16.10.10 "ssh -l user -p 12222 localhost"

参考

Last modified:2013/06/06 00:23:18

dYR

0.522163