SSHあれこれ
ssh
パスワードの問合せを行わない
ssh -o BatchMode=yes
ホスト鍵のチェックを行わない
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null
StrictHostKeyChecking=noでホスト鍵のチェックを抑止して無条件でホスト鍵ファイルを更新。
UserKnownHostsFile=/dev/nullでホスト鍵ファイルの更新を無効化。
接続タイムアウト、キープアライブ
ssh -o ConnectTimeout=30 -o ServerAliveInterval=10
ConnectTimeout=30で接続タイムアウトを30秒に変更。
ServerAliveInterval秒間隔でkeep-aliveを送信し、ServerAliveCountMax回(デフォルト3回)応答が無いと終了するので、
上記の例では30秒無応答なら終了。
ログアウト後も接続を維持する
ssh -o ControlMaster=auto -o ControlPath="%C" -o ControlPersist=60s
ログアウトした後、60秒間接続を維持する。
複数セッションによる接続の共有が有効になるので注意。ControlPathで作成したソケットを使用して接続を共有できてしまうため、他のユーザがアクセス出来ないディレクトリから実行する。
複数の踏台を経由して接続
例えば、下記のように複数の踏台を経由するネットワークで、clientからtargetへssh targetで接続したい場合。
+--------+ +----------+ +----------+ +--------+
| client |--------------| gateway2 |--------------| gateway1 |--------------| target |
+--------+ 192.168.3.1+----------+ 192.168.2.1+----------+ 192.168.1.2+--------+
方法1 ProxyCommand
- .ssh/config
Host gateway2 HostName 192.168.3.1 User gw2user Host gateway1 HostName 192.168.2.1 User gw1user ProxyCommand ssh -W %h:%p gateway2 Host target HostName 192.168.1.2 ProxyCommand ssh -W %h:%p gateway1
- ProxyCommandの
-Wは-CWでもOK、-Cはデータ圧縮なので経由するネットワークが細い場合におすすめ - 踏台も含めて公開鍵を登録しておけば、パスワード無しでログインできる
- 踏台によって公開鍵が異なる場合は
Host単位にIdentityFileで秘密鍵を指定できる??要チェック??
方法2 ProxyJump
- .ssh/config
Host gateway2 HostName 192.168.3.1 User gw2user Host gateway1 HostName 192.168.2.1 User gw1user Host target HostName 192.168.1.2 ProxyJump gateway2,gateway1
ProxyJumpはコマンドラインオプションの-Jでも指定可能。
踏み台の認証方法などは~/.ssh/configに記述しておく。
ssh -J gateway2,gateway1 192.168.1.2
sshをSOCKSプロキシサーバにする
gatewayを踏み台にして、SOCKSに対応したアプリで接続する。
ssh -nTND 1080 gateway
1080はプロキシのポート番号で任意。
SOCKSに対応したアプリで、
プロキシの種類をSOCKS5に、localhost:1080をSOCKSサーバに設定する。
ポート番号の前にコロンを置き:1080とすると、全てのインタフェースで接続を受け付ける。
限定したい場合はコロンの前にIPアドレスを記述する。
sshd
ネームサーバが無い環境でSSH接続に時間がかかる
sshdサーバのUseDNSがyesの場合、ネームサーバへの接続がタイムアウトするまで待たされる。
- /etc/ssh/sshd_config
UseDNS no
rootユーザでの接続を制限する
- /etc/ssh/sshd_config
PermitRootLogin no
noだとrootユーザでログインできなくなる。
prohibit-passwordにするとパスワード認証は拒否されるが、公開鍵認証ならログインできる。
yesなら制限なし。
公開鍵
公開鍵ファイルの変換
sshで公開鍵を使用した認証は成功しているのに、key_load_public: invalid formatと警告が出る場合は、
公開鍵ファイルのフォーマットが正しくないか壊れている。
PuTTYとOpenSSHで公開鍵のフォーマットが異なるので、PuTTYのPEM形式のファイルをOpenSSHでも使うと起こる。
秘密鍵ファイルから公開鍵ファイルを作成する
ssh-keygen -f ~/.ssh/id_rsa -y > ~/.ssh/id_rsa.pub
PuTTYの秘密鍵ファイル(PPK形式)をOpenSSHの形式に変換する
PuTTYから
File>Load private key>id_rsa.ppkを指定Conversions>Export OpenSSH key>id_rsaに出力
秘密鍵ファイルから公開鍵ファイル(PEM形式)を作成する
ssh-keygen -f ~/.ssh/id_rsa -y -e -m pem > ~/.ssh/id_rsa.pem
公開鍵ファイルをPEM形式に変換する
ssh-keygen -f ~/.ssh/id_rsa.pub -e -m pem > ~/.ssh/id_rsa.pem