6
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

クラウドでVNCサーバ&クライアントを構成する Part 2

Last updated at Posted at 2019-06-27

前回の続き

前回から続いた内容なので、7から始まる連続した段落番号をつけている。

7. ポートフォワーディングを設定する

前回「クラウドでVNCサーバ&クライアントを構成する Part 1」は、Linuxサーバ側の設定を行った。ここからはWindowsクライアント側の設定を行う。

以下の接続形態の中で、1と2ではポートフォワーディングが必要になる。また3のときでも、通信を暗号化したいときや、途中に踏み台があるときはポートフォワーディングが必要だ。

  1. インターネット経由(踏み台なし)
  2. インターネット経由(踏み台あり)
  3. 専用線/インターネットVPN

7-1. ポートフォワーディングとは

SSHポートフォワーディングは、SSHトンネリングとも呼ばれ、特定のポートに届いたパケットを別ホストの別ポートに転送する機能である。

たとえばHTTP(80)やSQL*Net(1521)は、それぞれ決められたポートを使用する。SSHポートフォワーディングを使用すると、通常使用するポートではなく、SSH(22)の経路を利用して疎通できる。

そのためSSHしか疎通できないネットワークでも、追加でポートを開けることなしに、さまざまなアプリケーションを利用できる。

おもなメリットは以下のとおり。

  • 必要最低限のポートを開ければよい
  • 暗号化通信に対応していないソフトウェアのパケットも、SSHの機能で暗号化できる
  • パスワードログインを前提としているソフトウェアも、SSH公開鍵認証方式を利用できる
  • SSHログインしているホストよりも、さらに先のホストにも転送できる。そのため踏み台サーバが前提の環境にも対応できる

7-2. ポートフォワーディングの仕組みを理解する

ポートフォワーディングには、さまざまな方式がある。今回はローカルポートフォワーディングについて、2つの例を説明する。

ポートフォワーディング例1(ログインホストと転送先ホストが同じ場合)
一番基本的なポートフォワーディングの利用例である。
portfowarding01.png
リモートホスト上で稼働するWebサーバに接続するときは、上図のようにポートフォワーディングを設定する。

ローカルホスト上のWebブラウザのURIにhttp://localhost:80と入力する。httpリクエストはsshの22番ポートを経由してリモートホストの80番ポートに転送され、Webページを表示できる。

OpenSSHのシンタックスは以下のとおり。PuTTYやTera Termでは少し指定方法は違うが、重要なので理解しておくこと。

ssh -L [ローカルホストの待ち受けIP:]転送元ポート:転送先ホスト:転送先ポート ログインホスト

# 基本。ローカルホストの待ち受けIPは省略可能。
ssh -L 80:hostb:80 hostb

# 「転送先ホスト」は、ログインホストからの相対的な位置になる。
# この例のようにlocalhostと書いても、hostbと同じ意味になる。
ssh -L 80:localhost:80 hostb

# 転送先ポートは、転送先ホストで稼働するソフトウェアに一致させる
# 必要がある。しかしローカルホストの転送元ポートは、利用していない
# ポートならば何でもよい。
ssh -L 8080:hostb:80 hostb

ポートフォワーディング例2(ログインホストと転送先ホストが異なる場合)
応用編としては以下の構成も可能である。ログインホストと転送先ホストが異なる例だ。
portfowarding02-2.png
この方式で直接ログインするのは、中間にあるログインホスト(Host B)なので、踏み台サーバのある環境に似ている。

たとえば転送先ホスト(Host C)でOracle Databaseが稼働しているとする。このとき、ローカルホスト上で稼働するOracle SQL Developerから、ログインホスト(Host B)を経由して、Oracle Databaseに接続できる。

ssh -L 1521:hostc:1521 hostb

この接続形態で重要なことが2つある。

  • 暗号化されるのは、ローカルホストとログインホストの間だけ
  • ログインホストと転送先ホストの間は、転送先ポート(通常22番以外)で通信し、暗号化されない

このような特性があるため、転送先ホスト(Host C)では、22番だけでなく「転送先ポート」も開ける必要がある。暗号化されないことについては、クラウドの中でクローズドネットワークだから問題ないだろう。

どうしても暗号化するならば、多段SSHしたうえでポートフォワーディングとなるが、本題ではないので触れない。

ここまで理解できれば、あとは設定するだけだ。次に利用環境に応じたポートフォワーディングの設定方法を説明する。

7-3. ポートフォワーディングを設定する

ポートフォワーディングの設定は、PuTTYとTera Termのそれぞれについて説明する。ただし踏み台サーバまでSSH鍵認証で接続できていることを前提にする。

7-3-1. PuTTYでポートフォワーディングを設定する

  1. PuTTYを起動し、ログイン先ホストに接続する設定をロードする。
    putty-vnc01.png

  2. 左のツリーから[Connection]-[Data]を選択し、[When username is not specified]が[Prompt]になっていることを確認する。そして[Auto-login username]に前回設定したVNCのユーザーを設定する。
    putty-vnc02.png

  3. 左のツリーから[SSH]-[Tunnels]を選択する。[Source port]と[Destination]に、次の書式で入力する。
    Source port:「転送元ポート」
    Destination:「転送先ホストのIPアドレス:転送先ポート」
    入力が終わったら**[Add]**をクリックして、テキストボックスに
    L転送元ポート 転送先ホストのIPアドレス:転送先ポート
    が追加されていることを確認する。
    putty-vnc03-2.png
    **ヒント:**ログインホストと転送先ホストが同じときは、転送先ホストはIPアドレスでなく、localhostでもよい。また以下のように複数設定できる
    putty-vnc03-3.PNG

  4. 左のツリーで[SSH]を選択する。この作業は必須ではないが [Don’t start a shell or command at all]にチェックを付ける。チェックすると、ログインしたセッションではコマンドが実行できなくなり、ポートフォワーディング用に実行していることを明確に区別できる。
    putty-vnc04.png

  5. 左のツリーで一番上の[Session]を選択する。この接続を区別する名前をつけて**[Save]**をクリックして保存する。
    putty-vnc05.png

  6. ウインドウ下の**[Open]**をクリックして接続を開始する。
    putty-vnc06.PNG

  7. 接続に成功すると以下のように表示される。[Don’t start a shell or command at all]にチェックを付けているときは、プロンプトは表示されず、コマンドも実行できない。
    SnapCrab_129146215211 - PuTTY_2019-6-27_19-50-34_No-00.png

  8. ポートフォワーディングが動作していることは、Windowsのnetstatコマンドで確認できる。コマンド・プロンプトから以下のように実行する。この例では、ローカルホストの5901ポートでTCP(IPv4とIPv6)を待ち受けしていることがわかる。

C:\Users\foo> netstat -ant| findstr  5901
  TCP    127.0.0.1:5901        0.0.0.0:0              LISTENING       ホスト内
  TCP    [::1]:5901            [::]:0                 LISTENING       ホスト内

**注意:**これでわかるのは転送元ポートがリスニングされていることだけだ。希望する先頭先ホストに転送されることまではわからない。またIPv4の同じポートをリスニングしているしている行が複数あるときは、誤動作の原因になるのでPuTTYを停止する。

9.次は「7. VNCサーバに接続する」に進む。ウィンドウをクローズすると、ポートフォワーディングも終了してしまう。このまま続けるときはクローズしないこと。

7-3-2. Tera Termでポートフォワーディングを設定する

  1. Tera Termを起動する。[新しい接続]が表示されるので**[キャンセル]**をクリックしてダイアログを閉じる。
    teraterm-vnc01.png

  2. [設定]メニューから[SSH転送]を選択する。

  3. [SSHポート転送]ウィンドウが表示されたら**[追加]**をクリックする。
    teraterm-vnc03.png

  4. 次の3箇所に入力して、**[OK]**をクリックする。
    ローカルポート :「転送元ポート」
    リモート側ホスト:「転送先ホストのIPアドレス」
    ポート     :「転送先ポート」
    teraterm-vnc04.png

  5. 登録が終わると、リストに表示される。PuTTYと同様に複数設定できる。
    teraterm-vnc05.png

  6. 次回起動したときも登録した設定が使えるように、[設定]メニューから[設定の保存]を選択する。

  7. 標準の設定ファイルに保存して問題ないときは**[保存]**をクリックする。
    teraterm-vnc07-1.PNG

  8. ポートフォワーディングの設定が終わったので、[設定]メニューから[SSH認証]を選択する。必要な項目を設定してログインする。
    teraterm-vnc08.png

  9. ポートフォワーディングの確認方法はPuTTYを参考にすること。

8. VNCクライアントでVNCサーバに接続する

これでの設定がすべて終わった。VNCクライアントを起動して、VNCサーバに接続する。

8-1. VNCクライアントをダウンロードする

VNCクライアントが無いときは、先にダウンロードする。VNCクライアントにはインストーラーが必要なものもあるが、配置するだけで利用できるTigerVNCを使用する。

  1. githubのTigerVNCのページを表示する。
    https://github.com/TigerVNC/tigervnc/releases

  2. ページ下のhttps://binary.com/tigervnc/stable/...をクリックする。
    tigervnc01.PNG

  3. 自分の環境に応じたバージョンをダウンロードする。ダウンロードしたファイルは適切なフォルダに配置すること。
    tigervnc02.PNG

8-2.VNCクライアントで接続する

  1. VNCクライアントを起動する。
    tigervncclinet01.PNG

  2. 初期画面が表示されるので、接続方法に応じて以下のように入力する。たとえばポートフォワードでディスプレイ番号1に接続するときはlocalhost:5901と入力して、**[Connect]**をクリックする。
    ポートフォワード使用:localhost:<ポートフォワードのポート番号>
    直接接続VNCサーバのIPアドレス:<VNCサーバのポート番号>
    vnc01.png

  3. 接続に成功するとVNCパスワードの入力画面が表示される。vncpasswdで設定したパスワードを入力する。
    vnc02.png

  4. このあとのステップは6系と7系では異なるので、別々に説明する。

8-3. デスクトップ環境を設定する(7系Linux OS)

はじめてログインしたユーザーは初期設定が表示される。以下の手順に従って設定すること。1度設定すれば、2回目以降は表示されない。

  1. 日本語をチェックして、右上の**[次へ]**をクリックする。
    vnc03.png

  2. 日本語(かな漢字)をチェックして、右上の**[次へ]**をクリックする。
    vnc04.png

  3. プライバシーのオン/オフを選択して、右上の**[次へ]**をクリックする。
    vnc05.png

  4. オンラインアカウントとの連携が必要なときは設定する。サーバ利用では通常不要なので、そのまま右上の**[次へ]**をクリックする。
    vnc06.png

  5. 初期設定が終わったので**[Oracle Linux Serverを使い始める]**をクリックする。OSユーザーが同じであれば、次回以降は表示されない。
    vnc07.png

  6. Getting Stared画面が表示される。右上の**[X]**をクリックして閉じる。
    vnc09.png

8-3-1. スクリーンロックを無効化する(7系Linux OS)

VNCサーバを起動したままにしておくとスクリーンロックがかかり、OSユーザーのパスワードが要求される。OSユーザーにはパスワード設定されていないので、この状況を回避するには以下の2つの対策がある。

  • スクリーンロックを無効化する
  • OSユーザーにパスワードを設定する

sshd_configを確認すると、SSHのパスワード認証は無効化されている。そのためOSユーザーにパスワードを設定しても、外部からパスワード認証でSSH接続される危険性はない。

grep ^PasswordAuthentication /etc/ssh/sshd_config
---以下画面出力---
PasswordAuthentication no

今回は「スクリーンロックを無効化する」方法を説明する。パスワードを設定する方法は「意外に複雑なパスワード生成事情とLinuxにおけるパスワード生成方法」参考にしてほしい。

  1. メニューバーから[Applications]-[System Tools]-[Settings]を選択する。
    vnc11.png

  2. 左のリストから[Privacy]を選択し、[Screen Lock]をクリックする。
    vnc12.png

  3. ダイアログが表示されるので、Automatic Screen LockをOFFに設定する。
    vnc13.PNG

  4. ウインドウを閉じると[Screen Lock]がoffになっている。
    vnc14.png

もし設定に時間がかかり、スクリーンロックされたときはVNCサーバを再起動すること。

systemctl restart vncserver-opc@:<display-number>.service

8-4. デスクトップ環境を設定する(6系Linux OS)

6系Linux OSでは、7系のような初期設定画面はない。ただし、スクリーンロックの問題はあるので無効化する。またデスクトップ環境固有のパッケージアップデートチェックが有効になっているので無効化する。

8-4-1. スクリーンロックを無効化する(6系Linux OS)

  1. ロックされていないデスクトップ画面。
    vnc60.png

  2. 以下の画面が表示されているときはスクリーンロックされている。そのときはservice vncserver restartでVNCサーバを再起動する。
    vnc61.png

  3. yum install gconf-editor -yでGNOME設定エディタをインストールする。

  4. メニューバーから[Applications]-[System Tools]-[Configuration Editor]を選択する。
    vnc62.PNG

  5. 左のツリーから[apps]-[panel]-[global]を選択する。disable_log_outdisable_lock_screenの2つにチェックを入れる。
    vnc63.PNG

ヒント:設定ファイルでスクリーンロックを無効化する
GUIツールで設定する方法を紹介したが、設定ファイルを使用する方法もある。エディタで以下のファイルを開き、disable_log_outdisable_lock_screenを探して以下のように変更する。変更が終わったらVNCサーバを再起動する。

vi /etc/gconf/schemas/panel-global.schemas
237行目付近をfalseからtrueに変更する
        <key>/schemas/apps/panel/global/disable_lock_screen</key>
        <applyto>/apps/panel/global/disable_lock_screen</applyto>
        <owner>panel</owner>
        <type>bool</type>
        <default>true</default>★この行
250行目付近をfalseからtrueに変更する
        <key>/schemas/apps/panel/global/disable_log_out</key>
        <applyto>/apps/panel/global/disable_log_out</applyto>
        <owner>panel</owner>
        <type>bool</type>
        <default>true</default>★この行

8-4-2. パッケージアップデートチェックを無効化する(6系Linux OS)

  1. yumの自動アップデートチェックが有効になっていると、手動のyumの妨げになるので無効化する。[System]-[Preferences]-[Software Updates]をクリックする。
    vnc64.png

  2. [Never]を選択して[Close]をクリックする。
    vnc65.PNG

8-5. VNCデスクトップ環境で英語キーボード配列になっているとき

ssh接続のときはデフォルトで日本語キーボードを利用できる。しかしVNCやVcXsrvなどのGUIクライアントでは英語配列になっていることがある。そのときの変更を紹介する。

8-5-1. RHEL7系の場合

  1. 現在の設定は以下のコマンドで確認できる。
# localectl
   System Locale: LANG=en_US.utf8
       VC Keymap: us
      X11 Layout: us

2.日本語キーボードに変更するときは次のように入力する。

localectl set-keymap jp106

3.変更後の状態を確認すると次のとおり。

# localectl
   System Locale: LANG=en_US.UTF-8
       VC Keymap: jp106
      X11 Layout: jp
       X11 Model: jp106
     X11 Options: terminate:ctrl_alt_bksp

なお、すでにVNCサーバーを起動しているときにはsystemctl restartで再起動が必要だ。

8-5-2. RHEL6系の場合

6系の場合は以下のようにファイルを変更する。

/etc/sysconfig/keyboard(修正前)
KEYTABLE="us"
MODEL="pc105+inet"
LAYOUT="us"
KEYBOARDTYPE="pc"
/etc/sysconfig/keyboard(修正後)
KEYTABLE="jp106"
MODEL="jp106"
LAYOUT="jp"
KEYBOARDTYPE="pc"

9. まとめ

  • VNCを使うと、WindowsクライアントでLinuxのフルデスクトップ環境を利用できる
  • VNCクライアント(TigerVNC)はファイルを配置するだけで使えるので、管理者権限を持っていないWindowsクライアントでも利用できる
  • ポートフォワーディングを併用すると、VNCの通信を暗号化できるだけでなく、クラウドのようなネットワークにも対応できる

9. コピペ用コマンドまとめ(7系Linux OS)

7系Linux OSでのVNCサーバの設定をまとめる。OCI以外では、opcをec2-userやazureuserなどに変更すること。

# デスクトップ環境をインストール
yum groupinstall graphical-server-environment -y

# VNCサーバをインストール
yum install tigervnc-server mesa-libEGL -y

# ユニットファイルをコピー。ファイル名やOSユーザー名は適宜変更すること
cp /usr/lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver-opc@.service

# ユニットファイルを修正
sed -i -e '32,50 s/<USER>/opc/' /etc/systemd/system/vncserver-opc@.service

su - opc
vncpasswd

★ここまでが1回目のコピペ用★

# VNCサービス起動
systemctl start vncserver-opc@:1.service

# 環境に応じてファイアウォール設定
# ログインホストと転送先ホストが異なるときや、直接接続のときはポートを開ける
firewall-cmd --add-service=vnc-server --permanent --zone=public
firewall-cmd --reload

# ファイアウォールの設定確認
firewall-cmd --list-all
6
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?