VS Code Remote Development SSHセットアップ中にハマったこと

# 試した環境

- クライアント
    - Windows 10 Pro: ver. 1903
    - Visual Studio Code:
        - Version: 1.38.1 (system setup)
        - Commit: b37e54c98e1a74ba89e03073e5a3761284e3ffb0
        - Date: 2019-09-11T13:35:15.005Z
        - Electron: 4.2.10
        - Chrome: 69.0.3497.128
        - Node.js: 10.11.0
        - V8: 6.9.427.31-electron.0
        - OS: Windows_NT x64 10.0.18362
    - Visual Studio Code Remote - SSH: ver. 0.46.0
    - ssh -V: `OpenSSH_7.9p1, OpenSSL 1.1.1b  26 Feb 2019`
        - ※Windows 10標準のOpenSSHではなく、MSYS2のOpenSSHを使用しています。
- サーバー
    - Debian GNU/Linux: ver. 9.11
    - ssh -V: `OpenSSH_7.4p1 Debian-10+deb9u7, OpenSSL 1.0.2s  28 May 2019`

# 前提

クライアントからサーバーに、下記のコマンドでログインできること

# ハマったところ1: `remote.SSH.configFile`が設定されてなければ読んでくれない？

初期設定時に「Select SSH configuration file」などと聞かれたので、従来から使っていた`C:\Users\<クライアントのユーザー名>\.ssh\config`を指定すると、指定したファイルが開かれたので、

```ssh_config
Host <サーバーのホスト名>
    HostName <サーバーのホスト名>
    User <サーバーで使用するユーザー名>
    IdentityFile C:\Users\<クライアントのユーザー名>\.ssh\id_rsa
```

などと書いて「TARGETS (SSH)」に表示された`<サーバーのホスト名>`をダブルクリックすると、別ウィンドウで接続先のサーバー向けのVS Codeが起動... したんですが、すぐに「Could not establish connection to "\<サーバーのホスト名\>".」というエラーが出てしまいました。

<img width="272" alt="Could not establish connection" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12688/18a2e09f-621a-684c-12ad-564ff644c406.jpeg">

ひとまず❎を押してウィンドウ下部にある「OUTPUT」に書いてある、ログっぽい文字列を確認したところ

```output
[05:28:19.182] > <クライアントのユーザー名>@<サーバーのホスト名>: Permission denied (publickey,gssapi-keyex,gssapi-with-m
> ic)
```

と表示されていました。  
`ssh_config`に`User <サーバーで使用するユーザー名>`と指定しているにもかかわらず、それが使用されず、代わりにデフォルトの値として`<クライアントのユーザー名>`が使われてしまっているみたいです。

どうしたものかとVS Code Remote Development SSHの設定項目を確認したところ、「Remote.SSH: Config File」なる設定項目（Setting ID: remote.SSH.configFile）が。  
こちらに `C:\Users\<クライアントのユーザー名>\.ssh\config`を書いて再度接続すると、無事接続詞に行ったのですが、今度は別のエラーになりました。

# ハマったところ2: 「Could not fetch remote environment」

今度は接続はできたのですが、「Could not fetch remote environment」とか「Failed to connect to the remote extension host server (Error: Time limit reached)」なるエラーが。

<img width="341" alt="Could not fetch remote environment" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12688/ff81cd75-adfe-768f-4358-310d6352cf55.jpeg">

VS Codeのウィンドウを見る限りそれ以上手がかりはなかったので、ログを漁ってみました。

すると`C:\Users\<クライアントのユーザー名>\AppData\Roaming\Code\logs`なるディレクトリーに、VS Codeを起動した時刻ごとにディレクトリーが1つ作られていました。  
保存されるパスは起動した時刻などによって変わるようですが、私の場合`C:\Users\<クライアントのユーザー名>\AppData\Roaming\Code\logs\20190914T141942\exthost4\output_logging_20190914T155257\1-Remote - SSH.log`というファイルに、エラーの原因とおぼしきメッセージが書かれていました。

```
... 省略 ..
[06:52:59.242] [Forwarding server 57546] Got connection 1
[06:52:59.242] [Forwarding server 57546] Got connection 2
[06:52:59.252] > channel 3: open failed: administratively prohibited: open failed
[06:52:59.252] >
[06:52:59.253] Failed to set up socket for dynamic port forward to remote port 41075: Socket closed. Is the remote port correct?
... 省略 ..
```

このうち、`administratively prohibited: open failed`で[vscode-remote-releaseのissue](https://github.com/microsoft/vscode-remote-release/issues)を探してみると、下記のissueが見つかりました。

[Channel 4: open failed: connect failed: Connection refused · Issue #773 · microsoft/vscode-remote-release](https://github.com/microsoft/vscode-remote-release/issues/773)

ドンピシャ🎯ですね（他にもよく似たissueが報告されています。原因もそれぞれバラバラかも知れません）。

長々とスクロールして[こちらのコメント](https://github.com/microsoft/vscode-remote-release/issues/773#issuecomment-521417255)に書いてあった[StackExchangeの回答](https://unix.stackexchange.com/questions/14160/ssh-tunneling-error-channel-1-open-failed-administratively-prohibited-open/58756#58756)曰く、`sshd_config`を書き換えろ、とのこと。

そこで`/etc/sshd_config`を編集して`AllowTcpForwarding`と`PermitOpen`という設定項目を次のように書き換えました。

```/etc/sshd_config
AllowTcpForwarding yes
PermitOpen any
```

書き換えて保存したらsshdの再起動をお忘れなく:

```bash
$ sudo systemctl restart sshd
```

再度接続したところ、無事利用できました。🎉  
これから詳しく使ってみます💪  
なんでもLanguage Serverもサーバー側にインストールされたものが使われるそうなので、クライアントが非力なマシンでも快適に編集できそうでいいですね！

# 本文で言及のなかった参考ページ

- [【設定爆速】VS CodeのRemote Developmentを使ってSSH接続したEC2上のファイルを編集する ｜ DevelopersIO](https://dev.classmethod.jp/etc/vs-code-remote-development-ec2/)