WindowsでTailscaleを使用したリモートSSH接続手順

# 概要
普段自宅のデスクトップPCで趣味開発をしているが、長期で実家に帰るときにクソ雑魚ノートPCでしか作業できないのはしんどいのでノートPCからデスクトップPCにリモートログインできるようにしたい
[Chromeリモートデスクトップ](https://support.google.com/chrome/answer/1649523?hl=ja&co=GENIE.Platform%3DDesktop)を使えば簡単に潜れるがコーディングしたいだけの割りには重たいので、VSCodeでSSH接続することを目指す
ネットワークなんもわからず、以前ZeroTierを使った接続を試したがうまくいかなかったため、Tailscaleを使った方法を試した

参考文献：[Tailscaleと言う恐ろしく簡単なVPNを見つけたんだが。。。](https://qiita.com/yu_uk/items/7a3561ad6089431c532d)

https://qiita.com/yu_uk/items/7a3561ad6089431c532d#tailscale%E3%81%AE%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E6%96%B9%E6%B3%95

# 環境
デスクトップPC：Windows11
ノートPC：Windows11、VSCodeインストール済み
Wi-Fiルータ：マンションの壁に埋め込まれている。これのせいでルータのグローバルIPが取得できなくて困った

# Tailscaleの設定
デスクトップPCとノートPCが同じネットワーク（同じ部屋で同じWi-Fiに）に接続していた場合のSSH接続は簡単にできたが、外出先でノートPCが自宅デスクトップPCと異なるネットワークに接続していた場合そうもいかないらしい。
そこでTailscaleを使うと、2つのPCが同じ仮想ネットワークに接続することで外出先でも同じネットワークに接続しているかのようにふるまえるらしい（？）

**1. セットアップ**
[Tailscaleのセットアップ方法](https://qiita.com/yu_uk/items/7a3561ad6089431c532d#tailscale%E3%81%AE%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E6%96%B9%E6%B3%95)を参考に[公式サイト](https://tailscale.com/)でアカウントを作成し、デスクトップとノートの両方にクライアントアプリをインストールする
私はGitHubアカウントで登録しました

**2. IPアドレスと接続の確認**
[Machines - Tailscale](https://login.tailscale.com/admin/machines?refreshed=true)にアクセスすると以下のような画面が出てくるデスクトップ側とノート側のLAST SEENがConnectedになっていることを確認し、デスクトップ側のIPアドレス（赤く囲った部分）をメモしておく

![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3955850/8066af63-e2e7-42c5-bbc0-79a568102c9e.png)

# デスクトップ側の設定
**1. OpenSSHサーバのインストール**
    この記事を参考にしました
    
https://qiita.com/nujust/items/6d5ccea95e635467c96a#openssh-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AE%E8%B5%B7%E5%8B%95

OpenSSHサーバがインストールされてるかは以下のコマンドでも確認できる
```:powershell（管理者権限）
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'
```
`OpenSSH.Server`の`State`が`Installed`と表示されていればOK

**2. ファイアウォールの許可**
    `設定`>`プライバシーとセキュリティ`>`ファイアウォールとネットワーク保護`>`ファイアウォールによるアプリケーションの許可`
    OpenSSH Serverのプライベート、パブリック両方にチェックを入れる

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3955850/38fe7fdb-55fd-e6c3-76f8-f3a2b90e0c30.png">

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3955850/6b87f493-19c8-4dce-7a31-efccac99161b.png">

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3955850/54f65f63-939a-adce-c566-28be2bbf863f.png">

**3. SSHの設定ファイル編集**
    VSCode（じゃなくてもいいが）で`C:\ProgramData\ssh\sshd_config`を開く
    ファイルが存在しない場合は、`C:\Windows\System32\OpenSSH\sshd_config_default`にあるデフォルト設定をコピーして作成
    以下の項目を確認、修正する
```:sshd_config
Port 22
PermitRootLogin prohibit-password
PasswordAuthentication yes
ListenAddress <IPアドレス>
```
`<IPアドレス>`はさっきメモったIPアドレス
設定を反映させるため、SSHサーバを再起動する
```:powershell（管理者権限）
Restart-Service sshd
```
SSHサーバーが起動していることを確認
```:powershell（管理者権限）
netstat -an | findstr ":22"
```
`LISTENING`が表示されていれば成功

# ノート側（VSCode）の設定

**1. 拡張機能のインストール**
VSCodeに拡張機能Remote-SSHをインストールする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3955850/88c273a9-3a3e-c744-8e58-1afbd1177a60.png)

**2. configファイルの設定**
`~/.ssh/config`ファイル（ない場合は作成）を編集し、以下を追加
```:powershell（管理者権限）
Host <Host Name>
    HostName <IPアドレス>
    User <username>
    Port 22
```
- `<Host Name>`は表示されるホスト名なのでなんでもいい
- `<username>`はデスクトップPCで使用しているWindowsアカウント名
- `<IPアドレス>`はさっきメモったIPアドレス

**3. リモートエクスプローラーから接続**

左のバーにある拡張機能Remote-SSHを開くとSSHのところに先ほどの `<Host Name>`が書いてあるので、右矢印から「現在のウィンドウで接続」or その右をクリックして「新しいウィンドウで接続」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3955850/a3336635-03fe-0a70-7f6f-4cf28a791a84.png)
真ん中上のほうに出てくるのでWindowsを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3955850/b1d82553-31a3-d587-433c-bb081131980f.png)
Windowsアカウントのパスワードを入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3955850/bb76a99f-8398-d0d7-c6bf-179449710b3b.png)
エクスプローラーを開いて、リモートに接続しましたと書いてあればOK
「フォルダーを開く」から好きなフォルダを開いて作業できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3955850/d8b123b5-cd0b-2596-7a6d-ecf4b3667613.png)
作業を終了するときは左下の青い部分をクリックして真ん中上に出てくるやつの一番上に「リモート接続を終了する」とあるのでそれを押せばリモート接続を切断できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3955850/a1915b98-c083-b566-a4f9-9a79d6f0f73c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3955850/2ddb4873-c97f-4778-808b-a95405e5a1e8.png)

# 接続テスト

**1. pingテスト**
ノートPCで
```:powershell（管理者権限）
ping <IPアドレス>
```
を実行してIPアドレスからの応答を確認できる
応答があれば
```:powershell（管理者権限）
<IPアドレス> に ping を送信しています 32 バイトのデータ:
<IPアドレス> からの応答: バイト数 =32 時間 <1ms TTL=128
<IPアドレス> からの応答: バイト数 =32 時間 <1ms TTL=128
<IPアドレス> からの応答: バイト数 =32 時間 <1ms TTL=128
<IPアドレス> からの応答: バイト数 =32 時間 <1ms TTL=128
<IPアドレス> の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 0ms、最大 = 0ms、平均 = 0ms
```
と返ってくる

**2. SSH接続テスト**
ノートPCのpowershellからメモったIPアドレスにSSH接続する
```:powershell（管理者権限）
ssh <username>@<IPアドレス>
```
- `<username>`はデスクトップPCで使用しているWindowsアカウント名
- パスワード入力を求められるので、Windowsアカウントのパスワードを入力

接続できなかった場合
```:powershell（管理者権限）
ssh: connect to host <IPアドレス> port 22: Connection timed out
```
などと出る。接続できた場合はexitと入力してEnterで抜けられる

**3. SSHポートの開放状況を確認**
デスクトップPCのSSHポートが解放されているかノートPCから確認できる
```:powershell（管理者権限）
Test-NetConnection -ComputerName <IPアドレス> -Port 22
```
接続できなかった場合
```:powershell（管理者権限）
ComputerName           : <IPアドレス>
RemoteAddress          : <IPアドレス>
RemotePort             : 22
InterfaceAlias         : Tailscale
SourceAddress          : <ノートPCのIPアドレス>
PingSucceeded          : True
PingReplyDetails (RTT) : 0 ms
TcpTestSucceeded       : False
```
などと出る。接続できた場合
```:powershell（管理者権限）
ComputerName     : <IPアドレス>
RemoteAddress    : <IPアドレス>
RemotePort       : 22
InterfaceAlias   : Tailscale
SourceAddress    : <ノートPCのIPアドレス>
TcpTestSucceeded : True
```
と出る

# 運用
実家に帰る前にデスクトップPCで
```:powershell（管理者権限）
Restart-Service sshd
```
を実行して電源を切らずに放置しておく
実家に帰ったあと、VSCodeを開きリモートエクスプローラーから接続の手順をこなせばOK

# おわりに
SSHキー認証にした方がセキュリティ的には安全らしいので試しましたが、よくわからずうまくいかなかったので一旦断念しました。誰か教えてください。