OpenSSH で接続が切れる時の対策

OpenSSH をクライアントで使っていて, 放置していると

Connection Reset By Peer

と言われてしまった場合, クライアント側の ssh_config で

ServerAliveInterval 20
# ServerAliveCountMax 3

とすると生存確認パケットを送ってくれるようになります。
この二つのオプションは OpenSSH 3.8 からの追加機能で、
 
ServerAliveInterval は、指定秒ごとに生存確認パケットを送る。0なら無効(デフォルト0)。
ServerAliveCountMax は、サーバから返答がない時の最大再試行回数(デフォルト3)
 
となっています。
 
参考:
http://www.unixuser.org/~haruyama/security/openssh/henkouten/henkouten_3.8.txt

tips – PuTTY でコマンドライン – サーバごとに接続設定を変える

PuTTY は SSH と互換のコマンドライン引数を持っているため、以下のようにしてコマンドラインからユーザ foo, ドメイン example.com でログインできます。

putty foo@example.com

 
環境変数 PATH に putty.exe (または puttyjp.exe)へのパスを通しておけば、Windows の「ファイル名を指定して実行(Windowsキー + Rキー)」で実行できるためかなり便利です。
 
GUIでのログインと同様、サーバごとに秘密鍵や文字コードの設定−保存(ストア)されたセッション−を切り替えてログインしたい場合は、

putty -load “セッション名”

とすると指定した設定(セッション)をコマンドラインから読み込んでログインすることができます。セッション名を user@hostname の書式で設定しておけば

putty -load foo@example.com

のように通常のログインに -load を加えるだけでよいので管理、利用が容易になります。
  
参考:
PuTTY でデフォルト設定を変更する(過去記事)
ssh -R の応用例(過去記事)
ssh を任意のポート、プロトコルの proxy にする(過去記事)

ssh -R の応用例

– SSH サーバ A から SSH クライアント B に逆方向に SSH 接続可能にする(双方向SSH)
この方法を使うとポートが閉じている環境にも外部からSSH接続ができるようになります。

B$ ssh -R 12345:127.0.0.1:22 A # (1) 12345 は任意のポート番号
(A にログイン)
A$ ssh 127.0.0.1:12345 # (2)
(A から B に逆にログイン)
B$ echo hello

メリット:
— (2)においてクライアント(B)のIPアドレスを知らなくてもサーバからクライアントに SSH 接続ができるようになります。
— クライアント側(B)の sshd がローカルからしか接続を受けない場合でもサーバ側(A)から接続することができます。
 
デメリット:
— クライアント側(B)にも最低限ローカルから TCP で接続できる sshd (または telnetd) が必要です。
— (2)でユーザ名がサーバ側とクライアント側で異なる場合、クライアント側のログイン可能なユーザ名を知っている必要があります。
— (2)を実行するには(1)の接続を保持し続けなければなりません。

参考:

ssh を任意のポート、プロトコルの逆 proxy にする

以前「ssh を任意のポート、プロトコルの proxy にする」という記事で ssh の -L オプションを紹介しましたが、この逆バージョンについて触れていなかったので紹介しておきます。
 
ssh -L は先の記事で紹介したとおり SSHクライアントの任意のポートへの通信をSSHサーバのネットワークの任意のホスト、任意のポートに転送できるようにするためのオプションですが、ssh -L とは逆に ssh -R を使うとSSHサーバの任意のポートへの接続をSSHクライアントのネットワークの任意のホスト:ポートに転送できるようになります。
 
使い方:

ssh -R <SSHサーバ側でLISTENするポート番号>:<SSHクライアント側ネットワークの転送先ホストIPアドレス>:<転送先ホストポート番号> <SSHサーバホスト>

 
例: クライアントA(192.168.1.2)からSSHサーバB(10.0.0.1)に接続し、SSH サーバからクライアント側ネットワークのHTTPサーバC(192.168.1.3:80) に A 経由でアクセスする

 
A$ ssh -R 7777:192.168.1.3:80 10.0.0.1
–connected to B(10.0.0.1)–
B$ netstat -an | grep LISTEN | grep 7777
tcp4 0 0 127.0.0.1.7777 *.* LISTEN
B$ telnet localhost 7777
Trying 127.0.0.1…
Connected to localhost.
Escape character is ‘^]’.
HEAD / HTTP/1.0\n
\n\n
HTTP/1.1 200 OK
Date: Fri, 14 Mar 2008 10:15:35 GMT
Server: Apache
Last-Modified: Thu, 20 Dec 2007 11:25:38 GMT
Accept-Ranges: bytes
Content-Length: 18050
Connection: close
Content-Type: text/html
 
Connection closed by foreign host.

 
なお、このオプションは -L 同様 PuTTY でも利用可能なので Windows から ssh 接続するときにも有用です。
 
参考:
ssh を任意のポート、プロトコルの proxy にする(過去記事)
ssh(1) manpage(openbsd.org)

PuTTY でデフォルト設定を変更する

度忘れしていたのでメモ。
 
引数なしで putty.exe を起動し、設定を変更後に
“セッション” カテゴリを選択し、 “保存されたセッション”の欄で Default Settings を選択して保存ボタンでOK。
 
端末のプライベートキーファイルを設定するには、
“接続” -> “SSH” -> “認証” カテゴリを選択し、”認証パラメータ”の欄で認証のためのプライベートキーファイルに(puttygen.exe で作成した) *.pty ファイルを設定すればよい。
 
OpenSSH の ssh-keygen で作成した秘密鍵を putty でも使いたい場合は puttygen で Load ボタンでssh-keygen で作成した秘密鍵(id-dsa や id-rsa)を選択後 Save private key ボタンで .pty 形式に変換できる。
鍵の内容は同じなので、publick key は両方の秘密鍵で共通。

SSH でよく接続が切れる場合の対処

sshd_config で

# Setting timeout of connections.
# Default is..
# ClientAliveInterval 0
# ClientAliveCountMax 3
# 2 minites (10sec * 12 times = 120 sec)
ClientAliveInterval 10
ClientAliveCountMax 12

とかして、2 分間は猶予を与えることにした。
 
– ClientAliveInterval – 生存チェックをする間隔(デフォルトでは一切チェックしない)
– ClientAliveCountMax – 生存チェックする回数(デフォルトは 3 回)
 
サーバ側がいじれない場合はクライアントサイドの ssh_config で

>

ServerAliveInterval 10
ServerAliveCountMax 12

とすれば同じ効果があるらしい。
 
参考:
OpenSSH FAQ – 2.12 なにもしないで N 分たつと ssh 接続が固まるか、切れるかするんだけど。
MAN – sshd_config.0
MAN – ssh_config.0

ssh を任意のポート、プロトコルの proxy にする

[2005-11-17] SSH 経由でネットワーク共有フォルダにアクセスする」の応用すると、次のような事例についても応用できる。
– Firewall があって ○○○ が使えないけど無理に使いたい
– クライアントからの○○の送信, アクセス元 IP アドレスをサーバの IP アドレスにしたい(例.メール送信元の隠蔽)
 
仕事で VNC 接続をサーバからにする必要があり、応用してみた(VNC over SSH using PuTTY)。
– Loopback NIC の IP アドレス(ex. 169.254.0.2)についてポート番号 5900 (VNC のディスプレイ0 のポート)への接続が ssh サーバ(ex. ssh.example.org)経由での接続先ホスト(ex. target.OCexample.com)の5900番への接続になるようにローカルポートフォワードする。こんなかんじ。

ssh -N -L 169.254.0.2:5900:target.example.com:5900 ssh.example.org

 -Nは接続後にシェルを開かないためのオプション。通常通り端末操作を行いたい場合ははずしてもよい。
PuTTY でやるなら、SSH トンネルのポートフォワーディングで
 
– 源ポート: 169.254.0.2:5900
– 送り先: target.example.com:5900
– ローカル
 
として追加しておき、ssh.example.org に接続すればよい。
ローカルで 5900 を LISTEN していなければ、Loopback IP アドレスを使う必要はないため、この場合 PuTTY では源ポートの指定はポート番号のみでよい。また ssh コマンドでは

ssh -N -L 5900:target.example.com:5900 ssh.example.org

でよい。
また、-g オプションと組み合わせて使うと、ローカルだけでなく外にもポートを開き、公開プロキシのように振舞えるようになります。

ssh -N -g -L 5900:target.example.com:5900 ssh.example.org

 
ダイナミックポートフォワーディングとローカルポートフォワーディングの
メリット、デメリットは次の通り。
 
– ダイナミック
○ 一度の設定で、サーバからアクセスできる場所であればどこにでもアクセスできる。
× SOCKS サーバとして動作するため, プロキシ接続用のクライアントソフトが SOCKS プロトコルに対応している必要がある。
 
– ローカル
○ SOCKS プロトコルに対応している必要がなく、どんなクライアントソフトでも利用できる。
× 接続先、ポート番号を逐一マッピングする必要があるため、複数箇所に対しては手間。

SSH を SOCKS Proxy として使う

ssh -D port remort オプションで ssh クライアントが SOCKS サーバになる. PuTTY でもトンネルという機能でできますな.
あるいは Port Forwarding + tinyproxy で ssh -L 8888:localhost:8888 remotehost みたいな.
AAAA を持った web サーバにアクセスすると空白ページになる.. IPv6 が甘い? FireFox で試しても空白ばっかでよくわからず..
追記: 以下のようにすることで IE で成功.
1. PuTTY の設定でトンネル追加に Dynamic, IPv4 チェック, Listen するポートを任意のポート(8888)に設定. 宛先は空にする.
2. IE の proxy 設定で SOCKS を localhost:8888 にし, それ以外のプロトコルを空白にする.
3. ブラウザでローカルネットワークを叩く.
<http://google.co.jp> とかやったら PuTTY が強制終了した…
追記 : 結構頻繁に切れる. Firefox/Thunderbird では proxy をドメインやホスト名でなく IP アドレスにしないとつながらないとかいう現象もあり(Thunderbird 1.0).