概要
普段自宅のデスクトップPCで趣味開発をしているが、長期で実家に帰るときにクソ雑魚ノートPCでしか作業できないのはしんどいのでリモートログインできるようにしたい
リモートデスクトップは重たいので、VSCodeでSSH接続することを目指す
ネットワークなんもわからずChatGPTと一緒に悪戦苦闘したため、自分用備忘録として残す
2024/12/13追記
実家に帰り手順通りに接続を試みたところ、ZeroTierの仮想IPアドレスが変更されており接続できなかった。おそらくIPアドレスが変更されるたびにデスクトップPCでRestart-Service sshd
しないといけない?ので、帰省中には対処できない。
年明けに自宅に帰ったらIPアドレスの変更に対応する方法を考えますが、誰か教えてください!
環境
デスクトップPC:Windows11
ノートPC:Windows11、VSCodeインストール済み
Wi-Fiルータ:マンションの壁に埋め込まれている。これのせいでルータのグローバルIP(なにそれ?)が取得できず、ZeroTierを使う必要があった
ZeroTierの設定
デスクトップPCとノートPCが同じネットワーク(同じ部屋で同じWi-Fiに)に接続していた場合のSSH接続は簡単にできたが、外出先でノートPCが自宅デスクトップPCと異なるネットワークに接続していた場合そうもいかないらしい。
そこでZeroTierを使うと、2つのPCが同じ仮想ネットワークに接続することで外出先でも同じネットワークに接続しているかのようにふるまえるらしい。
1. ZeroTierのアカウント作成
公式サイトから無料アカウントを作成する
2. ZeroTierをダウンロード
デスクトップPC、ノートPCの両方にZeroTierをダウンロードする
3. ネットワークを作成
デスクトップPC(どっちでもいい?)でZeroTierにログインし、Create A Network
をクリックするとNETWORL IDなどが出てきてネットワークが作成される
4. ネットワークに参加
デスクトップPCとノートPC両方で先ほど生成されたネットワークIDを使って以下を実行する
zerotier-cli join <ネットワークID>
5. デバイスの認証
Create A Network
の画面の生成されたネットワークをクリックすると以下のような管理画面が出てくる
ネットワークに参加できていればデスクトップとノートの2つがMembers
欄に追加されているので、各行のEdit
の横にあるチェックマークを押すとRefresh
の横にEdit Selected
が出てくるので、Authorize
をクリックしてデバイスを認証する
6. IPアドレスの確認
zerotier-cli listnetworks
を実行すると、<ZT assigned ips>
にIPアドレスが表示されるのでメモしておく
デスクトップ側の設定
1. OpenSSHサーバのインストール
この記事を参考にしました
OpenSSHサーバがインストールされてるかは以下のコマンドでも確認できる
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'
OpenSSH.Server
のState
がInstalled
と表示されていればOK
2. ファイアウォールの許可
設定
>プライバシーとセキュリティ
>ファイアウォールとネットワーク保護
>ファイアウォールによるアプリケーションの許可
OpenSSH Serverのプライベート、パブリック両方にチェックを入れる
3. SSHの設定ファイル編集
VSCode(じゃなくてもいいが)でC:\ProgramData\ssh\sshd_config
を開く
ファイルが存在しない場合は、C:\Windows\System32\OpenSSH\sshd_config_default
にあるデフォルト設定をコピーして作成
以下の項目を確認、修正する
Port 22
PermitRootLogin prohibit-password
PasswordAuthentication yes
ListenAddress <IPアドレス>
<IPアドレス>
はZeroTireネットワークのIPアドレス
設定を反映させるため、SSHサーバを再起動する
Restart-Service sshd
SSHサーバーが起動していることを確認
netstat -an | findstr ":22"
LISTENING
が表示されていれば成功
ノート側(VSCode)の設定
1. 拡張機能のインストール
VSCodeに拡張機能Remote-SSHをインストールする
2. configファイルの設定
~/.ssh/config
ファイル(ない場合は作成)を編集し、以下を追加
Host <Host Name>
HostName <IPアドレス>
User <username>
Port 22
-
<Host Name>
は表示されるホスト名なのでなんでもいい -
<username>
はデスクトップPCで使用しているWindowsアカウント名 -
<IPアドレス>
はZeroTireネットワークのIPアドレス
3. リモートエクスプローラーから接続
左のバーにある拡張機能Remote-SSHを開くとSSHのところに先ほどの <Host Name>
が書いてあるので、右矢印から「現在のウィンドウで接続」or その右をクリックして「新しいウィンドウで接続」
真ん中上のほうに出てくるのでWindowsを選択
Windowsアカウントのパスワードを入力
エクスプローラーを開いて、リモートに接続しましたと書いてあればOK
「フォルダーを開く」から好きなフォルダを開いて作業できる
作業を終了するときは左下の青い部分をクリックして真ん中上に出てくるやつの一番上に「リモート接続を終了する」とあるのでそれを押せばリモート接続を切断できる
最後に、
zerotier-cli leave <ネットワークID>
を実行してZeroTierのネットワークから抜ける
接続テスト
1. pingテスト
ノートPCで
ping <IPアドレス>
を実行してIPアドレスからの応答を確認できる
応答があれば
<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からZeroTier仮想IPアドレスにSSH接続する
ssh <username>@<IPアドレス>
-
<username>
はデスクトップPCで使用しているWindowsアカウント名 - パスワード入力を求められるので、Windowsアカウントのパスワードを入力
接続できなかった場合
ssh: connect to host <IPアドレス> port 22: Connection timed out
などと出る
3. SSHポートの開放状況を確認
デスクトップPCのSSHポートが解放されているかノートPCから確認できる
Test-NetConnection -ComputerName <IPアドレス> -Port 22
接続できなかった場合
ComputerName : <IPアドレス>
RemoteAddress : <IPアドレス>
RemotePort : 22
InterfaceAlias : ZeroTier One [<ネットワークID>]
SourceAddress : <IPアドレス>
PingSucceeded : True
PingReplyDetails (RTT) : 0 ms
TcpTestSucceeded : False
などと出る
運用
実家に帰る前にデスクトップPCで
Restart-Service sshd
zerotier-cli join <ネットワークID>
を実行して電源を切らずに放置しておく
実家に帰ったあと、ノートPCで
zerotier-cli join <ネットワークID>
を実行してVSCodeを開きリモートエクスプローラーから接続の手順をこなせばOK
おわりに
SSHキー認証にした方がセキュリティ的には安全らしいので試しましたが、よくわからずうまくいかなかったので一旦断念しました。誰か教えてください。