ssh

ssh多段接続(2)

いつのまにかncコマンドの機能がsshにとりこまれて~/.ssh/configにこう書くだけでよくなっていた。

(以前の記事はこっち

Host REMOTE
        HostName REMOTE.test.jp
        User YOURNAMEonREMOTE
        ProxyCommand ssh YOURNAMEonGW@GW.test.jp -W %h:%p

コードを斜め読みした感じだとちゃんとTCP_NODELAYオプションも有効になってるみたいだ。

ssh多段接続

単純にsshをカスケードした場合の図:

 % ssh gateway ssh target command args

 [localhost]             [gateway]                       [target]

                                                         command args
                         _________________________________|______

                         ssh target                      sshd
                         ________________________________________
                          |
 stdin/out               stdin/out
 _|_______________________|_____________

 ssh gateway             sshd
 _______________________________________

gatewayからtargetにログインするのに、targetにprivate keyを置くかAgentForwardingをつかってlocalhostの鍵でtargetの認証を行うか二通りある。

ncでトンネルをつくって接続した場合の図:

 % ssh -o 'ProxyCommand ssh gateway nc %h %p' target command args

 [localhost]             [gateway]                       [target]

                                                         command args
 stdin/out                                                |
 _|______________        _________________________________|______
                                   . . . . . . . . . . .
 ssh target              nc %h %p  : . . . . . . . . . . sshd
                                   : :
 ____________: :_        __________: :___________________________
  |          : :          |        : :
 stdin/out   : :         stdin/out : :
 _|__________: :__________|________: :___
             : : . . . . . . . . . : :
             : . . . . . . . . . . . :
 ssh gateway             sshd
 ________________________________________

localhostの鍵でgatewayとtargetの両方にログインする。

inetdの接続制限でsshの辞書攻撃をあきらめさせる

sshdのログをみていると、ときどき辞書攻撃(というか名簿攻撃)をくらっているが、 そもそもパスワード認証は許可してないので侵入されるおそれはない。 そうはいっても大量のログが出るのはうっとうしいので、 FreeBSDのinetdには接続制限の機能をつかって同じアドレスから大量のコネクションが来ると 切断するようにしたところ、けっこう効果があった。
やったこと:
  1. /etc/rc.confを書き換えて sshd をデーモンで起動しない。
     #sshd_enable="YES"
     inetd_enable="YES"
    
  2. /etc/inetd.confを書き換えて inetd 経由で起動するようにする。
     ssh stream tcp nowait/0/6 root /usr/sbin/sshd sshd -i -4
    
    "nowait/0/6"の意味は、「接続がきたらどんどんデーモンを立ち上げる」/「同時接続数の制限はしない」/「同じIPアドレスからの接続は1分間あたり6接続に制限する」。 "sshd -4"はIPv6はつかってないのでIPv4のみでlisten、"sshd -i"はinetd経由でつかうのでstdin/stdoutをつかえという指示。 sshdのmanpageによるとinetd経由だとserver keyを生成する時間だけクライアントが待たされるよと書いてあるが、 試してみるとそんなに時間はかからない。
設定がおわったらsshdを止めてinetdを(再)起動する。
/etc/rc.d/sshd onestop
/etc/rc.d/inetd restart
これで連続して7回つなぎにいくと、7回目でエラーになるはず。
% ssh server date
Wed Aug 25 12:55:50 JST 2010
% ssh server date
Wed Aug 25 12:55:51 JST 2010
% ssh server date
Wed Aug 25 12:55:52 JST 2010
% ssh server date
Wed Aug 25 12:55:52 JST 2010
% ssh server date
Wed Aug 25 12:55:53 JST 2010
% ssh server date
Wed Aug 25 12:55:54 JST 2010
% ssh server date
ssh_exchange_identification: Connection closed by remote host
%
/var/log/messagesには次のようなメッセージが残る
Aug 25 12:55:55 server inetd[1204]: ssh from xxx.xxx.xxx.xxx exceeded counts/min (limit 6/min)

NATで外とつながっているゲストOSにホストOSからログインする方法

VirtualBox/FreeBSDでブリッジネットワークがうまく動かなかったのでネットワークアダプタをNAT接続にしたが、コンソール画面でいじるとコピペが自由にできないのでリモートログインする方法を考えた。

(step1) ゲストOSからホストOSにログインしてポートフォワーディングを設定する。この端末は放置する。

guest% ssh -R 2222:localhost:22 HOSTNAME

(step2) ホストOSからフォワーディングのポートをつかってゲストOSにログインする。

host% ssh -p 2222 localhost

記事検索
月別アーカイブ
アクセスカウンター

    タグ絞り込み検索
    ギャラリー
    • 今日の練習 2018-11-15
    • 今日の練習 2018-11-15
    • 今日の練習 2018-11-13
    • 今日の練習 2018-11-11
    • 今日の練習 2018-11-11
    • 今日の練習 2018-11-10
    Amazon
    楽天市場
    adby google
    LINE読者登録QRコード
    LINE読者登録QRコード
    • ライブドアブログ