Linux間のリモートデスクトップを構築した話
こんにちは!
相変わらずジャンクで買ったPCをいじって遊んでいるわけですが、今回は新たに買った2台目のPCにリモートデスクトップ接続をしたことについて書いていきたいと思います。
リモートデスクトップとは
ご存知の方も多いと思いますが、PCの「リモートデスクトップ」というのは、あるPCから別のPCに接続し、リモートから操作できる機能です。企業のIT担当者が各社員のPCのトラブル対応をしたり、サーバー室においてあるサーバーPCにリモートから接続したりといったケースで使われることが多いと思います。ネットワークにさえ繋がっていれば場所を問わずに別のPCを操作できるので、なかなか便利な機能の一つです。
今回はこのリモートデスクトップの設定についての記事ですが、そもそもなぜリモートデスクトップを使おうと思ったかというと、前回の記事にも書いたように、新たに購入したネットブックは常時起動のファイルサーバーとして使いたいからです。おいおい記事にしていこうと思っていますが、このネットブックはサーバーとしてディスプレイやキーボード等を外して使うつもりなので、もう一台のPCから遠隔で操作できると便利なわけです。もちろん、外付けのディスプレイ等を繋げば良いのですが、ちょっとした確認のためにそれをするのは流石にちょっと面倒です。。。
というわけで、今回はメインのPC(Linux mint)からサーバー用ネットブック(xubuntu)を遠隔で操作するための設定を備忘録的に書いていきます。Windows → LinuxやLinux → Windowsの資料はネット上にも多く見つけられたのですが、Linux → Linuxでの設定法はあまり多くなかったので、おなじことをしようとして詰まっている方の参考になれば幸いです。
動作環境
サーバー側PC: xubuntu 18.04
クライアント側PC: Linux Mint 19.3
リモートデスクトップ設定
今回のリモートデスクトップの全体の構成としては、サーバー側では「x11vnc」というソフトを使ってVNC(Virtual Network Computing)サーバーを立て、クライアント側では「Remmina」というリモートデスクトップビューワをつかいます(どちらもUbuntuの標準パッケージに入っているフリーのソフトウェアです)。
まずはサーバー側の設定です。早速x11vncをインストールしていきます。
$ sudo apt-get install x11vnc
無事にインストールできたらパスワードの設定及びサーバーの起動。
$ mkdir ~/.x11vnc # x11vnc用のフォルダ作成
$ x11vnc -storepasswd {PASS} ~/.x11vnc/passwd # パスワードの設定
$ x11vnc -forever -display :0 -rfbauth ~/.x11vnc/passwd # x11vncの起動
これでvncサーバーが立てられたわけですが、この設定はPCの電源を落とすと無効になってしまいます。PCを再起動するたびにコマンドを打つのは面倒なので、PCの起動と同時に自動的にサーバーを起動するように設定しておきます。
$ mkdir ~/bin # スクリプトを入れる適当なフォルダを作成
$ touch ~/bin/x11vnc.sh # スクリプトファイル作成
$ chmod 777 ~/bin/x11vnc.sh # 実行できるように権限を変更
$ vim ~/bin/x11vnc.sh # スクリプトファイルを編集
こうして作成したファイルに
x11vnc -forever -display :0 -rfbauth ~/.x11vnc/passwd
と書き込んだら、自動起動するアプリとしてこの「x11vnc.sh」を設定しておきます。自動起動の設定自体はディストリビューション(デスクトップ環境)にもよると思いますが、だいたい設定用のGUI経由でできるはずです。xubuntuの場合は「設定マネージャー→セッションと起動→自動開始アプリケーション」を開くと設定できました。これで、いつでもx11vncが起動している状態にできました。
そして忘れてはいけないのがファイアーフォールの設定。初めて設定したときはこの設定をしていなくてちょっと詰まりました。ネットワークストレージのときと同じミスをしていますねw とはいえ、うまく接続できなかったときに、問題がファイアーウォールにあることにすぐに気づいたあたり、ちょっと成長している気はしていますw
$ sudo firewall-cmd --permanent --zone=public --add-rich-rule="rule family="i\pv4" source address="192.168.179.0/24" port protocol="tcp" port="5900" accept" # 自宅ネットワークのプライベートipを指定してポート開放
$ sudo firewall-cmd --reload # ファイアーウォールの有効化
続いてクライアント側の設定です。こちらはあまりやることは多くなく、ビューワソフトである「Remmina」とそのvncプラグインをインストールすれば良いだけです。
$ sudo apt-get install remmina
$ sudo apt-get install remmina-plugin-vnc
「Remmina」の操作自体は単純で、プロトコルとしてVNCを指定した上で、接続先として対象PCのIPアドレスを入力、画質やサイズは適当に設定して接続すればOK。
設定がうまくいっていれば、このような感じでリモート接続ができるはずです。実際にメインPCのマウスやキーボードからリモートで操作できるようになるので、サーバー側でディスプレイやキーボードなどを接続している必要がないわけですね。なかなか便利です。
とまあ、ここまででリモートデスクトップ自体は構築できたわけですが、ここからもう少し改良が必要です。というのも、VNCは暗号化されていない平文での通信を使用しているので、セキュリティについて手を加えていきます。正直言って(無線とはいえ)個人のプライベートネットワーク内の通信を傍受される可能性があるのかと考えると極めて怪しいと思っていますが、半分以上は勉強と仕組みの理解のためにやった感じですねw
SSHの設定
先に書いたとおりVNCは平文での通信なわけですが、SSHという暗号化通信を経由して接続することができるようなので、その設定をすすめていきます。ちなみにSSHというのは「Secure SHell」の略称で、主にリモートでのシェル間通信に用いられるプロトコルです。SSHというと通常はCLI(コマンドラインインターフェース)で用いられていると思いますが、その通信プロトコルを利用してリモートデスクトップの情報をやりとりするというわけですね。
リモートデスクトップの設定と同様、まずはサーバー側の設定です。
$ sudo apt-get install openssh-server # opensshのインストール
$ chmod 700 ~/.ssh # ssh設定フォルダの権限変更
$ sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bk # 設定ファイルのバックアップ
$ sudo vim /etc/ssh/sshd_config # 設定ファイルの編集
ここでsshd_config内に「PermitRootLogin no」を追加します。コメントアウトされている部分のコメントを外して、noに設定すればOKです。内容としてはSSHでのRoot権限でのログインを拒否するもので、セキュリティの観点からの設定ですね。まあ、個人でつかうものであればそこまでナーバスになる必要もないと思っていますがw ちなみにこれは別にこのタイミングでやる必要はなく、あとでまたこのファイルを編集するタイミングがあるので、そのときにまとめてやってもOK。
そして、クライアント側から鍵を受け取るための準備もしておきます。
$ mkdir ~/.ssh/Keys # 鍵受領用のフォルダ作成
$ chmod 777 ~/.ssh/Keys # 権限変更
$ touch ~/.ssh/authorized_keys # 認証鍵用ファイル作成
$ sudo systemctl restart sshd.service # sshの再起動(設定の有効化】
続いてクライアント側の設定です。クライアント側には「oepnssh-client」というパッケージのインストールが必要ですが、今回使ったLinux mint 19.3ではデフォルトでインストールされていたので、改めてインストールする必要はありませんでした。
クライアント側でまずするべきことは、鍵の作成です。
$ ssh-keygen -t rsa # 鍵の作成
ここでパスフレーズを聞いてくるので、適当に設定しておきます(詳しくはよくわかりませんが、なしでも問題ないらしいです)。このコマンドを入力すると「~/.ssh」の中に公開鍵と秘密鍵が生成されるので、公開鍵をサーバー側に転送します。
$ spc ~/.ssh/id_rsa.pub {サーバー側USER名}@192.168.179.7:~/.ssh/Keys # サーバー側に公開鍵を転送
$ chmod 700 ~/.ssh # sshフォルダの権限変更
{サーバー側USER名}はサーバー側のログインユーザーで、@以降のipアドレスは環境によって適切に変更して下さい。このときに要求されるパスワードは、上記のログインユーザーのパスワードを入力すればOK。
ここまでできたらまたサーバー側に戻って以下の設定を行います。
$ cat .ssh/Keys/id_rsa.pub >> .ssh/authorized_keys # 受領した鍵を認証鍵に登録
$ chmod 600 ~/.ssh/authorized_keys # 認証鍵ファイルの権限変更
これでsshの設定ができたので、クライアントから下記を打ち込んでSSHのログインができるかどうかを確認します。
$ ssh {サーバー側USER名}@192.168.179.7 # SSHの接続テスト
このコマンドを打ち込んで、パスワードを打ち込むことなく無事にログインできれば公開鍵による認証ができています。余談ですが、このSSHの設定では権限の設定がミソらしく、サーバー側のauthorized_keysを600に、クライアント側のsshフォルダを700にしていないと上手く接続できないようです。
ここまででsshの設定ができているはずなので、あとは「Remmina」の設定をいじるだけです。
こんな感じで「SSH Tunnel」タグから、「SSHトンネルを有効にする」「公開鍵」を選択し、ユーザー名としてサーバー側のユーザー名を入力すればOK。これで先ほどと同じようにリモートデスクトップ接続ができれば、SSHでの通信ができています。
ここまで無事に設定できたら、セキュリティ向上のためパスワードでの認証を無効にし、公開鍵方式のみ受け入れ可能としておきます。設定ファイルは先程一度設定した「/etc/ssh/sshd_config」。
$ sudo vim /etc/ssh/sshd_config
このファイルの「PasswordAuthentication」をnoに設定すればパスワード認証を無効化し、鍵認証を使ったログインしか認められなくなります。ちなみに、先程「PermitRootLogin」をnoに設定していない場合は、このときにまとめてやってしまいましょう。
SSHのポート変更
ここまでで終わっても良いのですが、もう少しだけ設定に手を加えます。具体的には、SSHの通信ポートをデフォルトである「22」番から変更します。SSHのデフォルト値が22であることは周知の事実なので、22のままにしておくとそこに攻撃を加えられやすいという理由で、ポート番号を変更して使うのが一般的のようです。まあ、正直にいうと、今回の使い方でそこまでする必要があるのかは疑問ですが、これも勉強がてらということで設定してみました。今回はポート番号を22から2222に変更します。
まずはサーバー側のsshの設定を変更します。設定ファイルは先程と同様に「/etc/ssh/sshd_config」。「#Port 22」と書いてある部分の#を外し、「Port 2222」としておけばOK。これでsshの受け入れポートが22から2222に変更する設定ができたので、sshを再起動して設定を有効化します。
$ sudo systemctl restart sshd.service
ssh側の設定はこれで良いですが、sshが2222ポートの通信を受け入れるためには、もう一つやることが有ります。そう、ファイアーウォールです。
$ sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh2222.xml # ssh.xmlファイルをもとに、ssh2222設定用のファイルを作る
$ sudo vim /etc/firewalld/services/ssh2222.xml # ssh2222.xmlを編集する。
具体的な編集内容は「<port protocol="tcp" port="22"/>」という部分を「<port protocol="tcp" port="2222"/>」に変更します。ssh2222というサービスをファイアーウォール内でport 2222と紐付けているわけですね。ここまで設定できたらファイアーウォールの設定を行います。
$ sudo firewall-cmd --permanent --add-service=ssh2222 # ssh2222をファイアーウォールを飛び越えて通信できるように登録
$ sudo firewall-cmd --permanent --remove-service=ssh # sshのポート22を閉じる
$ sudo firewall-cmd --reload # フィアーウォール設定の有効化
これでようやくサーバー側の設定はすべて終了です。
クライアント側の設定はリモートデスクトップ自体と同様にかなり簡単です。さきほどと同じように「Remmina」を開いてトンネル設定をポート22ではなくカスタムに変更。「{USER}@192.168.179.7:2222」と入力すれば先程までと同様にリモートアクセスが可能です(ipアドレスは環境に応じて変更する)。
まとめ
今回はLinux間でリモートデスクトップの設定を行ったときのことを書きました。まあ、リモートとは言っても物理的距離はせいぜい1mくらいではありますが、常時モニターなどを繋がなくても良いのはなかなかいい感じです。特に今住んでいる部屋はかなり狭く、あんまり大きいものを家に常設したくないので、リモートデスクトップはなかなか便利ですね。ファイルサーバーもそうですが、ゆくゆくはVPN等を使って外部から自宅ネットワークに接続するように設定したいところです。
また、この記事ではサクサク設定できているように見えますが、例によってここでの設定はかなり時間がかかっています。ほぼ一日仕事ですねw 冒頭にも書きましたが、linux同士でのリモートデスクトップ通信は意外と情報が少なかったのが大変でした。自分としてはそれはそれで楽しかったのですが、単純にマニュアルをなぞれば良いと言うわけではないので、どうしてもきちんとその中身を理解しなければならないので、その辺りが楽しめるかどうかがlinuxに向いているかどうかが分かれるところかなぁなんて思ってしまいました。
それでは、また!