UltraVNCのIPv6対応バージョン
以前TigerVNCを使ってIPv6のリモート操作環境を構築したのですが、もともと筆者はUltraVNCのユーザーでした。TigerVNCを選んだのは当時UltraVNCのIPv6版をうまく稼働させられなかったからです。
今回はそのリベンジをしてみたいと思います。
UltraVNCのIPv6対応版のダウンロードと設定
公式のダウンロードページに「ultravnc 1240 bin zip ipv6」というIPv6版のアプリがありますのでこれを利用します。
2021/11追記
2021年11月時点での最新バージョンは1.3.4.2ですが、1.2.4.0より先IPv6版のバイナリが提供されていません。しかしソースから自分でビルドすることにより対応するバイナリを作成することができるということです。詳細は記事の最後に追記します。
ダウンロードしてファイルを展開するとルートフォルダに「32」と「64」というフォルダがあります。Windowsのアーキテクチャ(32bitか64bit)にしたがってどちらかを選びます。その中にipv6というフォルダがあります。これをどこかわかる場所に移動させます。筆者の場合は、uvncとリネームしてc:¥にコピーしました。
フォルダの中には「winvnc.exe」と「vncviewer.exe」という二つのファイルが存在しますが、「winvnc.exe」をダブルクリックで起動させます。するとタスクバー内に在駐し起動は完了です。この時旧バージョンのUltraVNCサーバーが起動しているとエラーになりますので、サービスを止めてください。ただし作業をリモート操作で行っている場合はサービスを止められないので後述の方法をとります。
もし今回初めて登録したり、ローカル環境で操作していて旧アプリをアンインストールできるなら、新しいOpenVPNのアプリのアイコンを右クリックから「Install Service」で登録できます。サービスモードにしておかないとUACの発生で接続が途切れて以降の処理ができなくなる為サービス化は必須です。
次に設定です。右クリックメニューから「Admin Properties」を選択します。「IPv6 mode」というチェックボックスにチェックを入れ、パスワードを設定します。
「Query on incoming connection」の項目はオプションです。「Display Query Window」のチェックを外せばパスワードの一致だけで常に接続が許可されます。チェックのある状態だと、「Time Out」に秒数を設定してタイムアウト時のアクション(Default Action)を「Refuse(拒否)」と「Accept(許可)」を設定できます。たとえば「タイムアウトを10秒、アクションを拒否」した場合、接続要求を受けたPCの画面に受け付けるか否かの確認メッセージが10秒間表示され、アクションがあればそれに従い、アクションがなければデフォルト値に設定した拒否となります。
前回うまくいかなかった原因と対策
サーバーに接続しにいくにはビューアー「vncviewer.exe」をダブルクリックで起動させます。入力欄にアドレスを入力して接続します。
vncviewer.exeの接続先アドレスの欄に、IPv6のアドレスたとえば「fe80::1」としたり、ブラウザでIPv6を入力するのに習って「[fe80::1]」としても正常に判断してくれないようです。
前回はここで挫折してしまったのですが、これをIPv6アドレスを返すドメイン名(domain.name.jp等)にしてみたところ、IPv6で接続できることがわかりました。
しかし接続したい端末い必ずドメイン名があるとも限りません。その際はhostsファイルを使います。
hostsファイル
hostsファイルはドメイン名とIPアドレスを結びつけるファイルで、WindowsではC:¥Windows¥System32¥drivers¥etc¥hostsにあります。
このファイルにIPv6のアドレスと名前の結びつけを設定しておき、ここで設定した名前でUltraVNCの接続先を入力します。
このhostsファイルはユーザー権限で直接上書き保存できないので、管理者として実行されているメモ帳などのテキストエディタから起動するか、hostsファイルを一旦デスクトップに移動したのちに編集して元の場所に戻します。
執筆時点でのWindows10,11の環境では、hostsファイルでのIPv6の名前解決は、PCがプロバイダ等からIPv6アドレスの配布を受けている状態でないと機能しないようです。配布を受けていなくてもfe80から始まるリンクローカルアドレスは付与されていて、それを使っての疎通はできますが、名前解決はしてくれません。
リモートPCをどうやってアップデートするか
これでUltraVNCでIPv6接続ができるようになりました。今度はこれをリモート端末に配布したいのですが、IPv6版のアプリはインストーラーがありません。通常のOpenVPNのバージョンアップはインストーラーに従って進めて最後に再起動をするだけで、途中で接続が途切れることなく、設定を引きついだ更新作業ができます。
しかし今回の場合は少し難しそうです。サービスとして起動している為、ファイルをそのまま上書きコピーしようとしても、使用中なのでできません。
そこで今回筆者はWindows Admin Centerを使いました。Windows Admin Centerが使えない場合は、後述のリモートPowerShellの方法を利用してください。
またWindows Admin Centerを利用するためには、リモートPCとローカルPCの管理者モードのPowerShellで次のコマンドを入力しておきます。
リモート(操作される)側は次のようにします。
PS >Set-ExecutionPolicy RemoteSigned PS >Set-WSManQuickConfig PS >New-NetFirewallRule -DisplayName "@RPC-setting" -Program "%SystemRoot%\System32\svchost.exe" -Profile Private -Direction Inbound -Protocol TCP -LocalPort RPC -Action Allow
操作する(Windows Admin Center)側は次のようにします。
PS >Set-ExecutionPolicy RemoteSigned PS >winrm quickconfig PS >Set-Item WSMan:\localhost\Client\TrustedHosts *
あとの事前準備としては、UltraVNCのインストーラーを使ってIPv6用の実行ファイルと同じバージョン(1.2.4.0)にアップデートしておいた方がいいと思います。
まず、新しいwinvnc.exeとその設定ファイルUltraVNC.iniをリモートへコピーします。設定ファイルは古いままでも動くと思いますが、ローカルで作成しておいてコピーすることも可能です。その際は設定ファイル内にはフォルダのパス等も記録されていますので、実際の環境と異ならないよう気を付けてください。
Windows Admin Centerからファイルをアップロードするには「ファイル」から目的のフォルダを表示させて、「詳細」「アップロード」とします。ファイルしかアップロードできないようなので、フォルダは「新しいフォルダ」から作成します。
筆者の環境ではWindows Admin Center経由のアップロードはうまくいきませんでした。なので、元のVNCリモートから共有フォルダを作成してセットしました。
次に、Windows Admin Centerを使ってUltraVNCサービスを操作します。「サービス」から「停止」を選択し停止させた後、「詳細」から「スタートアップモード」を「手動」にします。
サービスを止めたら、Windows Admin CenterからPowerShellを使ってWindowsを再起動します。shutdownのfオプションは強制、rは再起動、tは再起動までの時間です。リモート側で使用誰かが使用している場合を想定して少し時間をとっています。秒数指定なので、この場合リモート側には「5分後にシャットダウン」します、と表示されます。
Windows Admin CenterのPowerShellで先にコピーしていたフォルダから、winvnc.exeとその設定ファイルUltraVNC.iniをコピーします。上書きでもいいですが、万が一に備えてバックアップを取っておくのをお勧めします。
# 旧プログラムのフォルダへ移動 PS > cd C:¥Program Files¥uvnc bvba¥UltraVNC # 旧実行ファイルをバックアップ PS > Move-Item winvnc.exe winvnc.exe.old # 旧設定ファイルをバックアップ PS > Move-Item UltraVNC.ini UltraVNC.ini.old # 新ファイルを移動 # ここではc:\uvncにあるものとしています。 PS > Move-Item c:¥uvnc¥winvnc.exe .¥winvnc.exe PS > Move-Item c:¥uvnc¥UltraVNC.ini .¥UltraVNC.ini
¥は環境によりバックスラッシュになります。
Windows Admin Centerからサービスを再度有効にします。サービスを有効にしただけだとまだUACで切断される状態にあるので、一度OSを再起動してください。
Windows Admin Centerが使えない場合
リモートでのPowerShellの環境を構築します。こちらの方法は、「リモート コンピューターの対話操作(Enter-PSSession)」を参考にさせていただきました。
まずリモート(操作される)側で、ユーザーを作成しておきます。筆者はパスワード付きの管理者ユーザーを作成しました。パスワードがないと利用できないと思われます。
リモート(操作される)側のPCで次のコマンドを実行します。WinRemoteManagemant(WinRM)経由で実行されますのでファイアウォールの通過設定をします。
対象はTCP受信の5985番です。
次にPowerShellでコマンドを実行します。これは管理者権限で入力する必要があります。
PS >Set-ExecutionPolicy RemoteSigned -Force ... PS >Set-WSManQuickConfig -Force ...
次にローカル(操作する)側の設定です。
PS >Set-ExecutionPolicy RemoteSigned -Force ... PS >WinRM quickconfig -Force ... PS >Set-Item WSMan:\localhost\Client\TrustedHosts * -Force ...
WinRM quickconfig -ForceのForceオプションが失敗する場合は-qに置き換えます。
これで設定は終了です。
リモートからアクセスするには次のようにします。
この後パスワードを聞かれますので、入力すると接続状態になります。接続状態になるとプロンプトの部分(>の左側)にリモート先のPC名かIPが表示されます。
リモートを終了するにはexitとします。
PowerShellでサービスを止める
PowerShellでサービスを止めるには次のようにします。
表示名を使いたいときはNameをDisplayNameにします。UltraVNCのデフォルトはどちらも同じ「uvnc_service」になっていると思います。
Get-Serviceとするとサービスの一覧も取得できますので、見つからない際は実行してみてください。
サービスを停止させたら今度は自動スタートを止めます。
「Manual」の部分を「Automatic」にすると自動、「Disabled」にすると無効にできます。
ファイルの移動やコピー、再起動の仕方はWindows Admin Centerの時と同様です。
失敗談
一度はスタートアップにショートカットを置く方法をとったのですが、この形だとリモートでUAC認証をすることができずに、サービスに登録しようとしたときのUAC発生で何もできなくなってしまいました。
荒業として、プログラムのあるフォルダを書き込み権限のある状態で共有しておき、OS再起動をタイマーでかけながら、ファイル共有経由でwinvnc.exeの上書きコピーを実行し、エラー&再試行を繰り返すという方法があります。リモートサービスはOS終了時にファイル共有サービスより早く終了するようで、筆者が試した時はうまくコピーできました。この時新しいファイルもリモート側に用意しておく方が成功の確率は上がると思います。
追記2021/03
今までの最新バージョンは1.3.1RCとリリース候補だったののですが、2020年12月に1.3.2という1.2.4の次の正式版がリリースされたようです。しかしこのリリースのリンクからダウンロードできるバイナリにはIpV6対応のものは存在しないようです。
加えて、一つ差出人不明でメッセージをいただきました。ありがとうございました。
接続時のIPアドレスの欄に、
という風に:を-に置き換えた上で.ipv6-literal.netをつけて試してみてくださいとのことでした。
この方法は「¥¥fe80--1234-5678-9abc-def.ipv6-literal.net」といったように、Windowsから共有フォルダにIpV6でアクセスする際に有効な方法です。
加えて、このアドレスに対してpingを送ってみるとちゃんと戻ってきます。
しかし筆者の環境では、ultraVNCでこの方法で接続することは不可能でした。
IPv6対応バイナリのビルド
新しいバージョンにIPv6のバイナリが同梱されないので気になっていたのですが、UltraVNC forumによれば、自分でビルドする必要があるそうです。
ソースコードはgithub:「UltraVNC」に存在しています。
ビルドにはVisual Studioの2017か2019のProffesional版と、nasm assembler compiler が必要なようです。
Visual Studioはリンクページからダウンロードでき、個人ならCommunitiy版を無料で利用できますが、最新版(2022)しかダウンロードできません。この状態でなんとかならないかと試してみたところ、何とか稼働するwinvnc.exeを作ることができましたのでその方法を紹介します。ただし、エラーをいろいろ無視しているのでどこかで問題がでるのかもしれません。
- プロジェクトのクローン
Visual Studioと、NASMのインストールが終わったら、Visual Studioを起動してプロジェクトのクローンを選択し先に案内した、UltraVNCのgithubのURLを入力してプロジェクトを作成します。
- コンバート
ソリューションエクスプローラーからUltraVNC¥winvnc¥winvncVS2017.slnを選択します。「サポート外」というメッセージが出ます。OKを押すとコンバートウィザードが表示されますので、規定値のまま変換します。
一部でエラーがでますが、そのまま進めます。
- ビルド
上部タブの構成を「Release」「x64」を選択した状態で「ビルド」から「ソリューションのビルド」を選択します。多くのワーニングやエラーが出ますが無視してかまいません。
そのあと、今度はソリューションエクスプローラーで、winvncを選択した状態にし、ここで構成を「IPV6」「x64」に変え、「ビルド」から「winvncのビルド」を選択します。
いくつかのエラーの中で「cannot open include file 'afxres.h'」と表示されている行をWクリックして、エラーのソースを表示(winvnc.rc)
Qiita:「afxres.hの代替ヘッダ」を参考にafxres.hの記述ををwinres.hに変更して保存します。
再度「ビルド」から「winvncのビルド」を実行します。これもエラーになりますが、winvnc.exeは作成されます。デフォルトだとC:¥Users¥ユーザー名¥source¥repos¥UltraVNC¥winvnc¥winvnc¥x64¥IPV6にファイルが出力されます。
- コピー
UltraVNCが起動している場合は停止させます(在駐アイコンを右クリックして「Stop Service」を選択します)
元のプログラム(デフォルトだとC:¥Program Files¥uvnc bvba¥UltraVNCにあります)を上書きします。
- 確認
PCを再起動して、Admin Propertiesで「IPv6 mode」のチェックボックスが利用できることを確認します。
疎通テストは先に紹介したようにhostsファイルを使って宛先を設定して行ってください。
先にRelease構成でソリューションをビルドしないと必要なファイルができないのでこのような作業になりました。ビルドのエラーをしっかり解析すればもう少しスマートにできるのかもしれません。
もしハイスペックなPC環境を持っているならMicrosoftが無料で提供している仮想化されたWindowsの開発環境を利用すれば、ヘッダの差し替えも不要でもっとスマートにできると思います。筆者の場合は残念ながらマシンスペックが足らずまともに動きませんでした。
参考にさせていただきましたサイトの皆様、ありがとうございました。