過去記事にて、MacからUbuntu18.04にリモート接続を実現する為の設定方法を投稿しました。しかし、この方法では、Ubuntu18.04側でログインをしている状態でなければ、Ubuntuサーバーにリモートで接続出来ません。なぜならば、Vinoを用いるこの方法では画面共有をしているだけだからです。これでは接続時に毎回Ubuntu側でログインをしておかなければならず、大変不便です。本記事ではTightVNCを用いてVNCサーバーをUbuntu上に構築し、本来のRemote Desktop環境実現を目指します。
この記事の方法はUbuntu20.04でも有効です.
- 参考
環境情報
今回は、以下の環境に参考記事を参考にして構築します。Ubuntu 20.04を対象にした構築方法を紹介している記事ですが、Ubuntu 18.04でも問題無く構築出来ました。
- macOS Big Sur 11.04
- Ubuntu 18.04.5 LTS
構築方法
参考記事の構築方法を参考に構築を進めます。筆者の環境では過去の構築でVinoがインストールされていたので、競合を避けるため、アンインストールを実施してからセットアップを開始しました。
sudo apt remove -y vino
Xfceデスクトップ環境パッケージのインストール
リモート接続で使用するデスクトップ環境をインストールします。
sudo apt install -y xfce4 xfce4-goodies
インストール途中にディスプレイマネージャーの選択が求められます.筆者は特にこだわりが無いため,gdm3
(最初から選択されている)を選択しました.
VNCサーバーをインストール
VNC(Virtual Network Computing)サーバーをUbuntuサーバーにインストールします。
sudo apt install -y tightvncserver
VNCアクセスパスワードの設定
アクセスパスワードを設定します。以下のコマンドを実行します。
vncserver
パスワードの設定が求められます。6〜8文字のパスワードを設定します。8文字以上設定した場合は切り捨てられる仕様になっています。このままでは脆弱なパスワードですが、接続のセキュリティを担保するために、この後の行程でSSHトンネルを確立した上で接続を行います。
$ vncserver
You will require a password to access your desktops.
Password:
Verify:
Would you like to enter a view-only password (y/n)? n
New 'X' desktop is your_hostname:1
Creating default startup script /home/user/.vnc/xstartup
Starting applications specified in /home/user/.vnc/xstartup
Log file is /home/user/.vnc/your_hostname:1.log
VNCサーバーインスタンスの停止
起動時に使用する実行ファイル(兼構成ファイル)を編集するため、一旦サーバーインスタンスを停止します。
vncserver -kill :1
実行結果
$ vncserver -kill :1
Killing Xtightvnc process ID 5293
実行ファイルのバックアップ
実行ファイルを編集する前に、オリジナルのバックアップを作成します。
cp ~/.vnc/xstartup ~/.vnc/xstartup.bak
実行ファイルの編集
実行ファイル(xstartup
)を開きます。
vim ~/.vnc/xstartup
以下の様に編集します。
#!/usr/bin/env bash
xrdb $HOME/.Xresources
startxfce4 &
編集後,実行ファイルとするために実行権限を付与します.
chmod +x ~/.vnc/xstartup
VNCサーバーの再起動
実行ファイルの編集が完了したら、再起動します。以下のコマンドを実行します。ここで-localhost
オプションを使用して、ループバックインターフェイスにバインドしています。これで、インストールされているサーバーから発信された接続のみを許可します。これは接続のセキュリティを担保するため、この後設定するSSHトンネルを用いた接続を前提としているためです。
vncserver -localhost
以下の実行結果のyour_hostname:1
の:1
は次のSSHトンネル確立時に重要な情報となります。実行環境によっては、:2
や:3
が表示される場合も有ります。(特にVNCサーバーのインスタンスを複数起動した場合)
$ vncserver -localhost
New 'X' desktop is your_hostname:1
Starting applications specified in /home/user/.vnc/xstartup
Log file is /home/user/.vnc/your_hostname:1.log
SSHトンネルを介してクライアント端末からアクセス
SSHトンネルを介してクライアント端末からUbuntuサーバーにアクセス出来ることを確認します。ここでは、事前にUbuntuサーバーとクライアント端末間でSSH接続の設定が出来ているものとします。このコマンドの意味は、クライアント端末の59000番へのアクセスがSSHを解してUbuntu端末の5901番ポートに転送(ポートフォワード)されることを意味しています。ここでは、クライアント端末の59000
番ポートを使用しましたが、環境によっては、既に使用済みの可能性も有ります。確認方法はlsof
コマンドを用います。未使用の場合、以下のコマンドを実行しても何も表示されません。
sudo lsof -i:59000
ここでUbuntuサーバー側のポート番号(例では5901
)について、VNCサーバーの再起動処理の説明部分で、:1
の番号に注目することを述べました。もし、:2
や:3
の場合は、各々5902
、5903
となります。これらは、ディスプレイポートと呼ばれており、サーバーインスタンスを区別する目的で付与されます。
ssh -L 59000:localhost:5901 -C -N -l user your_server_ip
その他のオプションの解説は参考記事で詳しく解説されているので、ここでは割愛します。
クライアント端末から接続
MacでFinderアプリを起動し、command + K
を打鍵します。以下のウィンドウが表示されます。VNC接続の接続先としてlocalhost:59000
を指定します。
ログインパスワードの入力
接続に成功すると以下の様にパスワードの入力が求められます。最初に設定したログインパスワードを入力します。
接続完了
接続に成功したら初回接続のみ、以下の様なダイアログが表示されます。ここではデフォルト設定を使用する
をクリックします。
接続設定が完了しました。CentOS
ライクなUIですが、無事起動しました。筆者がリモート接続専用のXWindowsシステムをセットアップしていたことが理解出来たのは、設定を終えた後でした。。。
ウィンドウ解像度が低いと感じだ場合は,一旦サーバインスタンスを終了し,以下の様に設定を変更します.
sudo vim /usr/bin/vncserver
Default configuration of the TightVNC Server:
を探します.そして$geometry
を変更します.筆者は以下の様に設定しました.
# Default configuration of the TightVNC Server:
# $geometry = "1024x768";
$geometry = "1920x1080";
- 参考
システムサービス化
systemdサービスとして実行するようにします。こうすることで、サーバーを再起動した場合でも、確実にVNCサーバーが起動するように設定出来ます。
ユニットファイルを作成
/etc/systemd/system/vncserver@.service
というファイルを作成します。
sudo touch /etc/systemd/system/vncserver@.service
作成したら、中身を以下の様に編集します。解像度を1920x1080、24ビットカラーとしました。
User
,Group
,WorkingDirectory
,PIDFile
のuserは環境に合った価を設定して下さい.
[Unit]
Description=Start TightVNC server at startup
After=syslog.target network.target
[Service]
Type=forking
User=user
Group=user
WorkingDirectory=/home/user
PIDFile=/home/user/.vnc/%H:%i.pid
ExecStartPre=-/usr/bin/vncserver -kill :%i > /dev/null 2>&1
ExecStart=/usr/bin/vncserver -depth 24 -geometry 1920x1080 -localhost :%i
ExecStop=/usr/bin/vncserver -kill :%i
[Install]
WantedBy=multi-user.target
ユニットファイルを認識させる
編集が完了したら、ユニットファイルを認識させます。以下のコマンドを実行します。
sudo systemctl daemon-reload
ユニットファイルを有効化
ユニットファイルを有効にします。以下のコマンドを実行します。
sudo systemctl enable vncserver@1.service
@記号に続く1
は、サービスが表示される表示番号を示します。本記事の環境では、デフォルトの:1
です。
実行結果
$ sudo systemctl enable vncserver@1.service
Created symlink /etc/systemd/system/multi-user.target.wants/vncserver@1.service → /etc/systemd/system/vncserver@.service.
VNCサーバーの実行中インスタンスを停止
現在実行中のVNCサーバーインスタンスを停止します。
vncserver -kill :1
systemdサービスの開始
以下のコマンドを実行し、systemdサービスとして起動します。完了後、再度リモート接続出来るか確認します。
sudo systemctl start vncserver@1
起動確認
以下のコマンドで起動を確認出来ます。
sudo systemctl status vncserver@1
実行結果
$ sudo systemctl status vncserver@1
● vncserver@1.service - Start TightVNC server at startup
Loaded: loaded (/etc/systemd/system/vncserver@.service; indirect; vendor preset: enabled)
Active: active (running) since Sun 2021-07-18 16:05:34 JST; 58s ago
Process: 6750 ExecStart=/usr/bin/vncserver -depth 24 -geometry 1920x1080 -localhost :1 (code=exited, status=0/SUCCESS)
Process: 6737 ExecStartPre=/usr/bin/vncserver -kill :1 > /dev/null 2>&1 (code=exited, status=2)
Main PID: 6763 (Xtightvnc)
...
SSHトンネルも永続化
ものは序でと、SSHトンネルの永続化も行います。接続毎にsshコマンドを実行することは非常に煩雑ですので、良い方法はないかと探っているとautossh
というコマンドを実行すると良いとのこと。正しい、デフォルトではMacにインストールされていないので、ここではHomebrewを用いてインストールします。
autosshのインストール
Homebrewを用いてインストールします。
brew install autossh
トンネル永続化の実行
以下のコマンドを実行します。ssh
の部分をautossh -M 0 -f
に置き換えただけです。(-M 0
はモニタポートオプション0指定で良い様です。-f
はバックグランドで実行)
autossh -M 0 -f -L 59000:localhost:5901 -C -N -l user your_server_ip
終了する場合は以下のコマンドを実行します。
killall autossh
トンネルを終了した後、接続を試みると以下の様なダイアログが表示されます。
トンネルを再度有効化してログインした結果、無事再ログイン出来ました。
2021/8/9追記: 再起動後も自動的にSSHトンネルを確立
以下のスクリプトを作成しました。
#!/usr/bin/env bash
sleep 180
autossh -M 0 -f -L 59000:localhost:5901 -C -N -l user your_server_ip
再起動後、自動実行される様にCronジョブを追加します。
crontab -e
$ crontab -l
TERM=xterm
@reboot スクリプトファイルのパス
まとめ
本記事ではMacをクライアント端末とし、Ubuntuサーバーにリモート接続するための環境構築を行いました。CentOSライクなXWindowシステムが構築され、無事SSHトンネルを経由して接続出来ました。構築を進める過程で、ディスプレイポートの説明を見落としており、なかなか接続出来ずに悶々し、時間を要しました。。。 マニュアルは注意して読まないと思わぬ落とし穴にはまってしまうことを改めて痛感しました。。。(反省)
Reference