2014年7月18日金曜日

ssh 接続時に IPv6 のポートを転送しないようにする

環境
Ubuntu 14.04 Desktop 日本語 Remix

最近 ssh でポート転送をすると

$ ssh user@Server -L 5901:localhost:5901
bind: Cannot assign requested address

というようにワーニングっぽいメッセージが表示されるようになりました。

実際はちゃんと ssh もポート転送もできていて実害はないのでそのままにしていましたが、気になるので調べました。

思い出してみると、このメッセージが出だしたのは「 IPv6 を無効にする 」を実施した頃からなので、ssh クライアント側で無効にしている IPv6 の TCP ポートを転送しようとして失敗しているのではないかと想定されます。

man ページを見てみると、ワーニングを出さない方法がいろいろありました。

方法その1: ssh のオプションで接続時のアドレスに IPv4 のみを使うようにする

ssh の -4 オプションというものがありました。
$ man ssh
... snip ...
         -4      Forces ssh to use IPv4 addresses only.
... snip ...

これで ssh 接続時に IPv4 のみを使う (IPv6 を使わない) ようにできるようです。

ワーニングメッセージが出なくなりました。

$ ssh user@Server -L 5901:localhost:5901 -4

方法その2: 127.0.0.1 の指定ポートのみを転送するようにする

指定したアドレスのポートのみを転送することができるようです。
$ man ssh
... snip ...
     -L [bind_address:]port:host:hostport
... snip ...

bind_address に localhost を指定するといけそうです。

期待が外れて、これはいけませんでした。

$ ssh user@Server -L localhost:5901:localhost:5901
bind: Cannot assign requested address

しかし、bind_address に 127.0.0.1 を指定した場合はなぜかいけました。

$ ssh user@Server -L 127.0.0.1:5901:localhost:5901

方法その3: sshd_config ファイルの設定で ssh 接続時のアドレスに IPv4 のみを使うようにする

ssh_config の man ページを見てみると...

$ man ssh_config
... snip ...
     AddressFamily
         t    Specifies which address family to use when connecting.  Valid arguments
             are “any”, “inet” (use IPv4 only), or “inet6” (use IPv6 only).
... snip ...

これも使えそうです。ssh の -4 オプションと同様に ssh 接続時に IPv4 のみを使う (IPv6 を使わない) ようにできるようです。

$ pwd
/etc/ssh

$ diff -U 0 ssh_config.org ssh_config
--- ssh_config.org      2014-04-14 21:13:50.000000000 +0900
+++ ssh_config  2014-07-18 21:23:13.546925882 +0900
@@ -33 +33 @@
-#   AddressFamily any
+    AddressFamily inet

いけました。

$ ssh user@Server -L 5901:localhost:5901

ssh_config を編集せずコマンドラインのオプションでも指定できます。

$ ssh user@Server -L 5901:localhost:5901 -o AddressFamily=inet

0 件のコメント:

コメントを投稿