リモートデスクトップ環境を構築したい Part.1 SSH編 (Ubuntu 22.04 LTS)
Ubuntu 22.04 LTS でのSSHベースのリモートデスクトップ環境構築手順 Part.1。VPN経由でのアクセス設定を解説。
お外でお家とか会社だとかの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にしています) vi
#port 22 これをコメントアウトして以下のように書き換える
port 10022
パスワード認証を無効化
#PasswordAuthentication yes これをコメントアウトして以下のように書き換える
PasswordAuthentication no
Rootログイン無効
Rootでログインしなきゃいけないようなことはローカル環境でやりましょう sudoで十分です vi
#PermitRootLogin no これをコメントアウトして以下のように書き換える
PermitRootLogin no
タイムアウトの設定
ぷちぷち接続が切れるのがいやなので vi
#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 する。