前回の続き
前回から続いた内容なので、7から始まる連続した段落番号をつけている。
7. ポートフォワーディングを設定する
前回「クラウドでVNCサーバ&クライアントを構成する Part 1」は、Linuxサーバ側の設定を行った。ここからはWindowsクライアント側の設定を行う。
以下の接続形態の中で、1と2ではポートフォワーディングが必要になる。また3のときでも、通信を暗号化したいときや、途中に踏み台があるときはポートフォワーディングが必要だ。
- インターネット経由(踏み台なし)
- インターネット経由(踏み台あり)
- 専用線/インターネットVPN
7-1. ポートフォワーディングとは
SSHポートフォワーディングは、SSHトンネリングとも呼ばれ、特定のポートに届いたパケットを別ホストの別ポートに転送する機能である。
たとえばHTTP(80)やSQL*Net(1521)は、それぞれ決められたポートを使用する。SSHポートフォワーディングを使用すると、通常使用するポートではなく、SSH(22)の経路を利用して疎通できる。
そのためSSHしか疎通できないネットワークでも、追加でポートを開けることなしに、さまざまなアプリケーションを利用できる。
おもなメリットは以下のとおり。
- 必要最低限のポートを開ければよい
- 暗号化通信に対応していないソフトウェアのパケットも、SSHの機能で暗号化できる
- パスワードログインを前提としているソフトウェアも、SSH公開鍵認証方式を利用できる
- SSHログインしているホストよりも、さらに先のホストにも転送できる。そのため踏み台サーバが前提の環境にも対応できる
7-2. ポートフォワーディングの仕組みを理解する
ポートフォワーディングには、さまざまな方式がある。今回はローカルポートフォワーディングについて、2つの例を説明する。
ポートフォワーディング例1(ログインホストと転送先ホストが同じ場合)
一番基本的なポートフォワーディングの利用例である。
リモートホスト上で稼働する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(ログインホストと転送先ホストが異なる場合)
応用編としては以下の構成も可能である。ログインホストと転送先ホストが異なる例だ。
この方式で直接ログインするのは、中間にあるログインホスト(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でポートフォワーディングを設定する
-
左のツリーから[Connection]-[Data]を選択し、[When username is not specified]が[Prompt]になっていることを確認する。そして[Auto-login username]に前回設定したVNCのユーザーを設定する。
-
左のツリーから[SSH]-[Tunnels]を選択する。[Source port]と[Destination]に、次の書式で入力する。
Source port:「転送元ポート」
Destination:「転送先ホストのIPアドレス:転送先ポート」
入力が終わったら**[Add]**をクリックして、テキストボックスに
L転送元ポート 転送先ホストのIPアドレス:転送先ポート
が追加されていることを確認する。
**ヒント:**ログインホストと転送先ホストが同じときは、転送先ホストはIPアドレスでなく、localhostでもよい。また以下のように複数設定できる
-
左のツリーで[SSH]を選択する。この作業は必須ではないが [Don’t start a shell or command at all]にチェックを付ける。チェックすると、ログインしたセッションではコマンドが実行できなくなり、ポートフォワーディング用に実行していることを明確に区別できる。
-
左のツリーで一番上の[Session]を選択する。この接続を区別する名前をつけて**[Save]**をクリックして保存する。
-
接続に成功すると以下のように表示される。[Don’t start a shell or command at all]にチェックを付けているときは、プロンプトは表示されず、コマンドも実行できない。
-
ポートフォワーディングが動作していることは、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でポートフォワーディングを設定する
-
[設定]メニューから[SSH転送]を選択する。
-
次の3箇所に入力して、**[OK]**をクリックする。
ローカルポート :「転送元ポート」
リモート側ホスト:「転送先ホストのIPアドレス」
ポート :「転送先ポート」
-
次回起動したときも登録した設定が使えるように、[設定]メニューから[設定の保存]を選択する。
-
ポートフォワーディングの設定が終わったので、[設定]メニューから[SSH認証]を選択する。必要な項目を設定してログインする。
-
ポートフォワーディングの確認方法はPuTTYを参考にすること。
8. VNCクライアントでVNCサーバに接続する
これでの設定がすべて終わった。VNCクライアントを起動して、VNCサーバに接続する。
8-1. VNCクライアントをダウンロードする
VNCクライアントが無いときは、先にダウンロードする。VNCクライアントにはインストーラーが必要なものもあるが、配置するだけで利用できるTigerVNCを使用する。
8-2.VNCクライアントで接続する
-
初期画面が表示されるので、接続方法に応じて以下のように入力する。たとえばポートフォワードでディスプレイ番号1に接続するときは
localhost:5901
と入力して、**[Connect]**をクリックする。
ポートフォワード使用:localhost:<ポートフォワードのポート番号>
直接接続:VNCサーバのIPアドレス:<VNCサーバのポート番号>
-
このあとのステップは6系と7系では異なるので、別々に説明する。
8-3. デスクトップ環境を設定する(7系Linux OS)
はじめてログインしたユーザーは初期設定が表示される。以下の手順に従って設定すること。1度設定すれば、2回目以降は表示されない。
-
オンラインアカウントとの連携が必要なときは設定する。サーバ利用では通常不要なので、そのまま右上の**[次へ]**をクリックする。
-
初期設定が終わったので**[Oracle Linux Serverを使い始める]**をクリックする。OSユーザーが同じであれば、次回以降は表示されない。
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におけるパスワード生成方法」参考にしてほしい。
もし設定に時間がかかり、スクリーンロックされたときはVNCサーバを再起動すること。
systemctl restart vncserver-opc@:<display-number>.service
8-4. デスクトップ環境を設定する(6系Linux OS)
6系Linux OSでは、7系のような初期設定画面はない。ただし、スクリーンロックの問題はあるので無効化する。またデスクトップ環境固有のパッケージアップデートチェックが有効になっているので無効化する。
8-4-1. スクリーンロックを無効化する(6系Linux OS)
-
以下の画面が表示されているときはスクリーンロックされている。そのときは
service vncserver restart
でVNCサーバを再起動する。
-
yum install gconf-editor -y
でGNOME設定エディタをインストールする。 -
メニューバーから[Applications]-[System Tools]-[Configuration Editor]を選択する。
-
左のツリーから[apps]-[panel]-[global]を選択する。
disable_log_out
とdisable_lock_screen
の2つにチェックを入れる。
ヒント:設定ファイルでスクリーンロックを無効化する
GUIツールで設定する方法を紹介したが、設定ファイルを使用する方法もある。エディタで以下のファイルを開き、disable_log_out
とdisable_lock_screen
を探して以下のように変更する。変更が終わったらVNCサーバを再起動する。
vi /etc/gconf/schemas/panel-global.schemas
<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>★この行
<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)
8-5. VNCデスクトップ環境で英語キーボード配列になっているとき
ssh接続のときはデフォルトで日本語キーボードを利用できる。しかしVNCやVcXsrvなどのGUIクライアントでは英語配列になっていることがある。そのときの変更を紹介する。
8-5-1. RHEL7系の場合
- 現在の設定は以下のコマンドで確認できる。
# 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系の場合は以下のようにファイルを変更する。
KEYTABLE="us"
MODEL="pc105+inet"
LAYOUT="us"
KEYBOARDTYPE="pc"
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