お外でお家とか会社だとかのPCにアクセスしたいな と思ったから
やり方をここにまとめておきます
前提
・VPN等で接続先サーバーのIPに到達できる状態であること
・それなりの気合
今回の構成
ホスト(Ubuntu22.04) ←→ VPN ←→ クライアント(Windows)
VPN上にあるリバースプロキシからそれぞれのIPを取得できる構成になっています
やること
Ubuntu 22.04 標準搭載のRDPが一番早いのでそれを第一選択にしたい
が、一度ログインしてからでないとRDPが繋がらないのでログインだけxrdpを使う
また、RDP中にログアウトしないまま同一セッションでログインすると画面が表示されなくなる対策のためにSSHを設定しておく
長くなりそうなので今回はSSH編。
VS Codeから使うだけとか、CLIだけで済む用事ならSSHだけ設定しておけば良いと思います
1. Host側でopensshのインストール
bash
sudo apt install openssh-server
2. Host側でsshの設定をいじる
初期設定だとセキュリティガバガバノーガード戦法のまま全世界に挑戦状を叩きつけることになります
私はチキンなので設定を変えておきます
(今回はviで編集していますが、GUIが使える環境ならgeditで良いです)
bash
cd /etc/ssh/
sudo vi /etc/ssh/sshd_config
ポート変更
22番ポートに総当たり攻撃してくる輩が存在するので、コメントアウトして接続先のポートを変更します
このあたりを参考にして、他のサービスで使われていないポートを適当に選定(例では10022にしています)
#port 22 これをコメントアウトして以下のように書き換える
port 10022
パスワード認証を無効化
パスワード認証は辞書攻撃だとか総当たり攻撃を食らうので公開鍵方式でしか認証できないように設定する
#PasswordAuthentication yes これをコメントアウトして以下のように書き換える
PasswordAuthentication no
Rootログイン無効
Rootでログインしなきゃいけないようなことはローカル環境でやりましょう
sudoで十分です
#PermitRootLogin no これをコメントアウトして以下のように書き換える
PermitRootLogin no
タイムアウトの設定
ぷちぷち接続が切れるのがいやなので
#ClientAliveInterval 0
#ClientAliveCountMax 3
ClientAliveInterval 60
ClientAliveCountMax 3
sshd_configの整合性チェック
編集時におてんばなミスをしていなければ通るはず
bash
sudo sshd -t -f sshd_config
3. 公開鍵の設定
クライアント(接続元)とホスト(接続先)の双方で作業が必要です。
まずクライアント側(接続元)の公開鍵を作成します。
クライアント側(Windows)
公開鍵の作成
PowerShell
ssh-keygen -t ed25519
初期設定ではssh-agentが立ち上がっていないので管理者権限でそのあたりを設定する
PowerShell(管理者モード)
# ssh-agentサービスを設定
Get-Service ssh-agent | Set-Service -StartupType Automatic
Start-Service ssh-agent
# Runnningが帰ってくればOK
Get-Service ssh-agent
# ssh-agentに鍵を登録
ssh-add $env:USERPROFILE\.ssh\id_ed25519
ホスト側(Ubuntu)
クライアントの公開鍵の内容(ssh-ed25519~User@ComputerName)を/home/ユーザー名/.ssh/authorized_keysに追記(なければつくる)
複数のクライアントから接続する必要があるときは改行して追記
bash(ホスト側)
cd /home/ユーザー名/.ssh
# authorized_keysを作ったり追記したりした後は読み書きの権限をユーザーのみに限定しておかないと怒られる
chmod 600 authorized_keys
4. ホスト側でSSHのサービスを開始する
上の設定が全部終わったら満を持してsshサービスを起動します(わくわく)
bash(ホスト側)
sudo systemctl restart sshd.service
5. クライアントからSSHに接続
あとはクライアントから接続できれば成功です。わくわく。
PowerShellでもbashでも同じコマンドでつながるはずです
bash
ssh -p 10022 [email protected]
最初の接続時にはFingerprint合ってる?と聞かれるので、問題なければyesと答えてください
6. VS Codeから繋ぐ
Remote Development拡張機能の中のRemote-SSHが入っていればVS CodeからSSH接続ができます

「SSHファイルを選択」と言われるのでとりあえず「C:\Users\ユーザー名.ssh\config」を選んで以下のように追記します
VS Code
# Read more about SSH config files: https://linux.die.net/man/5/ssh_config
Host hogehoge(接続名)
HostName xxx.xxx.xxx.xxx (ホストのIP or ホスト名)
User host-username(ホスト側ユーザ名)
Port 10022(設定したポート番号)
UserKnownHostsFile /dev/null
PreferredAuthentications publickey
PasswordAuthentication no
IdentityFile /Users/ユーザ名/.ssh/id_ed25519.pub
IdentitiesOnly yes
LogLevel FATAL
ServerAliveInterval 60
あとは接続するだけ

またVSCodeでSSHを使う際、ファイル監視を有効にしているとssh接続の際にサーバーに負荷がかかるらしいので、
設定→Watcher Excludeのパターンに「**」を追加しておく
参考:【VSCode使用者注意】サーバーリソース食い散らかすマンから解放される唯一の方法
おまけ
接続元がUbuntuである場合
接続元がssh-copy-idコマンドを使える場合はホスト側でauthorized_keysを編集する必要がなくてべんり(公開鍵方式にする前にやる必要あり)
bash(クライアント側)
ssh-keygen -t ed25519
ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 10022 [email protected]
RDP接続時に画面が表示されない場合
同じユーザーで他のログインセッションが立ち上がっている場合、他の端末からは画面が見えなくなる。
実機でログインされている場合や、RDP(Xrdp含む)をログアウトせずに他のセッションを繋いだときなどに発生する。
その場合でもSSH接続は可能なので、上記の症状が発生したら適当な端末から以下のコマンドを送信してGUIのセッションをころしてあげると良い(GNOMEの場合)
bash
pkill gnome-session
参考
Ubuntu 22.04サーバー構築入門
SSHサーバのセキュリティを強化したい
sshのセキュリティ設定
Linux サーバー:SSH 設定(2021年2月更新)
SSH接続でのタイムアウト対策
Remote Development using SSH
Visual Studio Code で Remote SSH する。