Edited at

CentOS7にWindowsからVNCで接続する方法

CentOS7にWindowsからVNC接続する必要が出てきて、いろいろ動かなくてハマったのでメモとして残す。個人的にはVNC接続にこだわらなければXRDP使ったほうが手っ取り早いとは思う...


検証環境


  • CentOSマシン : CentOS7(1708) 64bit (minimal-install)

  • Windowsマシン : Windows10(1804) 64bit

  • VNCソフト : UltraVNC v1.2.2.1

マシンへの基本的なOSインストールは完了しているものとする。


UltraVNCのインストール(Windows側作業)

WindowsマシンへUltraVNCをインストールする。

インストールウィザードでは少なくとも"UltraVNC Viewer"を選択していること。(他は任意でOK)


VNCのセットアップ(CentOS側作業)


GUIコンポーネント(GNOME Desktop)のインストール

CentOSを最小インストールしている場合、GUIに関連するモジュールが不足する。

以下のコマンドにて関連モジュールを一括インストール可能。

# yum groups install "GNOME Desktop"

なお、元から"GNOME Desktop"モードでインストールしている場合は不要。

上記作業後はGUI絡みの設定が別途発生するが、それに関してはこちらを参照すること。


TigerVNCのインストール

# yum install tigervnc-server


パスワード設定

VNC接続させたいユーザーにログインした状態で以下のコマンドを実行してパスワードを設定する。今回はrootなのでそのまま実行しているが、別ユーザーであればsu -などでそのユーザーに切り替えること。

# vncpasswd

Password: (任意のパスワード)
Verify: (任意のパスワード再入力)
Would you like to enter a view-only password (y/n)? n (見るだけのアクセス権が必要であればyとしてパスワードを設定すること)
A view-only password is not used


ファイアウォール(firewalld)にてVNC通信を許可

VNCはTCPの5900+セッション番号を使用する模様。

今回はセッション1しか使わないため、TCP:5901を許可する。

# firewall-cmd --permanent --add-port=5901/tcp

# firewall-cmd --reload
# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: ssh dhcpv6-client
ports: 5901/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

ファイアウォールが無効な環境では設定の必要なし。


VNCの起動確認

セッション番号1番として一時的に起動させ、接続確認を行う。

# vncserver :1

xauth: file /root/.Xauthority does not exist

New 'hostname:1 (root)' desktop is hostname:1

Creating default startup script /root/.vnc/xstartup
Creating default config /root/.vnc/config
Starting applications specified in /root/.vnc/xstartup
Log file is /root/.vnc/hostname:1.log

# vncserver -list

TigerVNC server sessions:

X DISPLAY # PROCESS ID
:1 プロセス番号

Windows機にて"UltraVNC Viewer"を起動し、"VNC Server"の欄に接続先IP/FQDN:VNCポート番号と入力してから"Connect"を押す。

接続できればパスワードを求められるので、設定しておいたVNCパスワードを入力する。

問題なければGUIが表示される。ここまで確認ができたらこの画面はそのまま閉じる。

問題なく確認が終われば、一時起動させていたプロセスを停止させる。

# vncserver -kill :1

Killing Xvnc process ID プロセス番号
# vncserver -list

TigerVNC server sessions:

X DISPLAY # PROCESS ID


VNCの自動起動化

サービスとして登録し、OS起動時に自動的に起動するようにする。

# cp -p /lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@:1.service

# vi /etc/systemd/system/vncserver@:1.service
# systemctl daemon-reload
# systemctl start vncserver@:1.service
# systemctl enable vncserver@:1.service
Created symlink from /etc/systemd/system/multi-user.target.wants/vncserver@:1.service to /etc/systemd/system/vncserver@:1.service.


/etc/systemd/system/vncserver@:1.service

※コメント部省略

[Unit]
Description=Remote desktop service (VNC)
After=syslog.target network.target

[Service]
Type=forking
User=root ← <USER>をrootに変更
PAMName=login ← 追記

# Clean any existing files in /tmp/.X11-unix environment
ExecStartPre=-/usr/bin/vncserver -kill %i
ExecStart=/usr/bin/vncserver %i
PIDFile=/root/.vnc/%H%i.pid ← /home/<USER>を/rootに変更(他のユーザーは<USER>を置き換えるだけで良い)
ExecStop=-/usr/bin/vncserver -kill %i

[Install]
WantedBy=multi-user.target


上記作業後、再度Windows機からVNCアクセスを試行して問題なければ作業完了。


ハマった箇所


PIDファイルの位置

rootでVNC接続できるようにしようと考えたが、サービスファイル中のユーザー名設定にて何も考えずに<USER>rootにするとサービスが起動しない。

理由は単純で、そのままユーザー名だけ置き換えると存在しない場所にPIDファイルの場所が指定されてしまう。きちんと存在するパスにすること。

【NG】

PIDFile=/home/root/.vnc/%H%i.pid

【OK】
PIDFile=/root/.vnc/%H%i.pid

こんなミスをするのはコピペ厨の自分だけだとは思う。/home/rootなんて無いよね...


メニューバーが表示されない

VNC接続でき、いざツールを使うぞ!と思ったらWindowsのタスクバーに当たると思われるメニュー類が全く表示されていない。

解決するにはサービス定義ファイルの[Service]セクションにPAMName=loginと書かなければならない模様。

サービス定義を書き換えたらsystemctl daemon-reloadを忘れずに。

参考: https://qiita.com/HiroshiAkutsu/items/6856e84c6efc126b801c

※2018年中旬頃のアップデートでFixされてたはず。


ログアウトできない

VNC接続後に画面を閉じようとし、普通に画面右上のメニューからログアウトをクリックしても反応しない。これに関しては特に気にせずVNCセッションを切ってしまえば良いかと諦めることにした。