2015年6月13日土曜日

NAT ルーター越しに ssh するとタイムアウトして接続が切れるのでキープアライブパケットを定期的に流すようにした

ssh で NAT ルーター越しにサーバーに接続してしばらく何もしないで放っておくと、 TCP パケットが流れないので NAT ルーターでタイムアウトして ssh 接続が切れます。

何もしない状態でも ssh サーバーとクライアントの間でキープアライブパケットを定期的に流すようにすればタイムアウトしなくなるようなので試してみました。

環境

Ubuntu 14.04 (Trusty Tahr) Server

素の設定の場合

ssh 関連が Ubuntu の素の設定の場合、 ssh 接続で何もしない状態だとパケットが流れないことを確認してみました。

サーバー側で以下のように対象クライアントからの全ての接続を tcpdump でモニタします。

$ sudo tcpdump -n host XXX.XXX.XXX.XXX
  • XXX.XXX.XXX.XXX は実際にはクライアントの IP アドレスです。

この状態でクライアントからサーバーに ssh 接続してクライアント側で何もしない状態で 10分以上放置しました。

ssh 接続開始時にはもちろん ssh パケットがモニタされましたが、その後はやはり何もパケットが流れていませんでした。

途中の NAT ルーターでタイムアウトして接続も切られてしまいました。


ssh クライアント側の設定でキープアライブパケットを流す設定の場合

クライアント側で以下の設定をします

$ pwd
/etc/ssh

$ diff -u ssh_config.org ssh_config
--- ssh_config.org      2014-04-14 21:13:50.000000000 +0900
+++ ssh_config  2015-06-08 12:31:44.252575367 +0900
@@ -17,6 +17,7 @@
 # ssh_config(5) man page.

 Host *
+    ServerAliveInterval 300
 #   ForwardAgent no
 #   ForwardX11 no
 #   ForwardX11Trusted yes
  • キープアライブパケット送信間隔を 5分に設定しています。

サーバー側で同様に tcpdump でモニタしながらクライアントから ssh すると、以下のように指定した時間間隔 (この場合は 5分間隔) でクライアント (XXX.XXX.XXX.XXX) 側からキープアライブの通信を開始しています。

12:53:21.433323 IP XXX.XXX.XXX.XXX.63308 > YYY.YYY.YYY.YYY: Flags [P.], seq 52:104, ack 37, win 350, options [nop,nop,TS val 2979620 ecr 153068638], length 52
12:53:21.433474 IP YYY.YYY.YYY.YYY > XXX.XXX.XXX.XXX.63308: Flags [P.], seq 37:73, ack 104, win 297, options [nop,nop,TS val 153143671 ecr 2979620], length 36
12:53:21.463697 IP XXX.XXX.XXX.XXX.63308 > YYY.YYY.YYY.YYY: Flags [.], ack 73, win 350, options [nop,nop,TS val 2979628 ecr 153143671], length 0

12:58:21.559894 IP XXX.XXX.XXX.XXX.63308 > YYY.YYY.YYY.YYY: Flags [P.], seq 104:156, ack 73, win 350, options [nop,nop,TS val 3054653 ecr 153143671], length 52
12:58:21.560022 IP YYY.YYY.YYY.YYY > XXX.XXX.XXX.XXX.63308: Flags [P.], seq 73:109, ack 156, win 297, options [nop,nop,TS val 153218703 ecr 3054653], length 36
12:58:21.606306 IP XXX.XXX.XXX.XXX.63308 > YYY.YYY.YYY.YYY: Flags [.], ack 109, win 350, options [nop,nop,TS val 3054665 ecr 153218703], length 0
  • XXX.XXX.XXX.XXX は実際にはクライアントの IP アドレスです。
  • YYY.YYY.YYY.YYY は実際にはサーバーの IP アドレスです。

この状態で ssh クライアント側で何もせず 1時間以上放置してみましたが、途中の NAT ルーターでタイムアウトしなくなり、接続も切れなくなりました。


ssh サーバー側の設定でキープアライブパケットを流す設定の場合

クライアント側で 「ssh クライアント側の設定でキープアライブパケットを流す設定の場合」 で設定した /etc/ssh/ssh_config を元に戻します。

サーバー側で以下の設定をします

$ pwd
/etc/ssh

$ diff -u sshd_config.org sshd_config
--- sshd_config.org     2014-12-22 05:38:21.425887766 +0900
+++ sshd_config 2015-06-12 12:35:16.744721457 +0900
@@ -86,3 +86,5 @@
 # PAM authentication, then enable this but set PasswordAuthentication
 # and ChallengeResponseAuthentication to 'no'.
 UsePAM yes
+
+ClientAliveInterval 300
  • キープアライブパケット送信間隔を 5分に設定しています。

sshd を再起動

$ sudo service ssh restart

サーバー側で同様に tcpdump でモニタしながらクライアントから ssh すると、以下のように指定した時間間隔 (この場合は 5分間隔) でサーバー (YYY.YYY.YYY.YYY) 側からキープアライブの通信を開始しています。

12:46:48.115453 IP YYY.YYY.YYY.YYY > XXX.XXX.XXX.XXX.63423: Flags [P.], seq 4462:4530, ack 3102, win 277, options [nop,nop,TS val 239445342 ecr 66098], length 68
12:46:48.142194 IP XXX.XXX.XXX.XXX.63423 > YYY.YYY.YYY.YYY: Flags [.], ack 4530, win 311, options [nop,nop,TS val 141143 ecr 239445342], length 0
12:46:48.142238 IP XXX.XXX.XXX.XXX.63423 > YYY.YYY.YYY.YYY: Flags [P.], seq 3102:3138, ack 4530, win 311, options [nop,nop,TS val 141143 ecr 239445342], length 36
12:46:48.179373 IP YYY.YYY.YYY.YYY > XXX.XXX.XXX.XXX.63423: Flags [.], ack 3138, win 277, options [nop,nop,TS val 239445358 ecr 141143], length 0

12:51:48.242408 IP YYY.YYY.YYY.YYY > XXX.XXX.XXX.XXX.63423: Flags [P.], seq 4530:4598, ack 3138, win 277, options [nop,nop,TS val 239520373 ecr 141143], length 68
12:51:48.281817 IP XXX.XXX.XXX.XXX.63423 > YYY.YYY.YYY.YYY: Flags [P.], seq 3138:3174, ack 4598, win 311, options [nop,nop,TS val 216179 ecr 239520373], length 36
12:51:48.281870 IP YYY.YYY.YYY.YYY > XXX.XXX.XXX.XXX.63423: Flags [.], ack 3174, win 277, options [nop,nop,TS val 239520383 ecr 216179], length 0
  • XXX.XXX.XXX.XXX は実際にはクライアントの IP アドレスです。
  • YYY.YYY.YYY.YYY は実際にはサーバーの IP アドレスです。

この状態で ssh クライアント側で何もせず 1時間以上放置してみましたが、途中の NAT ルーターでタイムアウトしなくなり、接続も切れなくなりました。


0 件のコメント:

コメントを投稿