NeutrinoRDP-any(RDP-Proxy)モードの不具合について

601 views
Skip to first unread message

TOMATO JUNKER

unread,
May 31, 2020, 1:31:38 PM5/31/20
to 日本xrdpユーザ会 (The "xrdp" Users' Group Japan)
こんにちは。TOMATOと申します。

WindowsPCのGatewayとして xrdp を使うため、NeutrinoRDP-any(RDP-Proxy)モードを試しています。
ほとんどのディストリビューションではライブラリがFreeRDPと衝突するためなのか NeutirnoRDP はconfigureオプションで無効にされています。
そこで Alpine Linux をベースにNeutrinoRDP-anyモードを有効にしたxrdp が稼働する Docker コンテナを作成してみました。


dockerfile作成の為に Alpine Linux用のapkパッケージも作成したのでsrcpkg 共々以下に置きました。


この NeutrinoRDP-any モードでいくつか不具合と思われる事象に遭遇しましたのでご報告いたします。

1)日本語キーボードを使っているにも関わらず、Proxy接続先のWindowsにログイン後に接続先が英語キー配列になってしまう。
  既にコンソールやmstsc.exeなどで一度ログイン済み(切断状態)のWindows10 1909に NeutrinoRDP-any で接続すると正しく日本語キーボードのmapになりますが、
  再起動直後など未ログイン状態で初めて NeutrinoRDP-any で接続すると usキーボード配列となってしまいます。
  (経験上iOSやAndroidのRDP ClientからWindowsにログインするときに類似事象があります。)

  ワークアラウンドとして Windows側のレジストリを編集して
  HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts\00000411 以下の 
  Layout File キーの値を KBDJPN.DLL から kbd106.DLL に変更しておけば
  初ログイン、切断状態からのログインのどちらでも常に日本語キーマップになります。
  
2)Proxy接続先のWindowsにログイン後、マウスカーソルが黒い四角になってしまう
  ユーザ会の過去ログにもある、
  xrdp.ini の new_cursors=false で対処を試みましたが、効果がありませんでした。

  FreeRDP側のissues https://github.com/FreeRDP/FreeRDP/issues/5337# でも報告されているように
  ワークアラウンドとして Windows側のコントロールパネルで
  [その他のマウスオプション]-[ポインター]を開き「ポインターの影を有効にする」のチェックボックスを OFFにする
  ことで対処できました。

3)Proxy接続先のWindowsにログイン時に壁紙が表示できない
  切り分けのためXorgでGUI接続しNeutrinoRDP版xfreerdp で適切なオプションをつけて接続すると壁紙は表示されました。
  xrdp から 内部でNeutrinoRDPが呼び出されるときに壁紙などのオプションが無効になっているようです。
  これを制御するxrdp.iniパラメータはあるのでしょうか?

  ワークアラウンドは特にありませんが、VDI的に使う用途なので割り切って使っています。


接続元:Windows10 Pro 1909  x64 mstsc.exe
xrdp :ubuntu 20.04 版 docker-io 上に alpine 3.11 をベースとした コンテナ
    xrdp 0.9.13  , NeutrinoRDP Devel (#bb24cee)を APKBUILDでbuild
接続先:ESXi 6.7 上の Windows10 Enterprise 1909 x64

このようなRDP Proxy では Apache Guacamole が注目を集めていますが、
ブラウザベースのGuacamoleは現行バージョンでは「全角/半角」キーのハンドリングに難があり、
日本語入力に大きな支障があります。
この点、 キー入力が安定した mstsc.exe でProxy接続が可能な xrdp に優位性があると考えています。

meta

unread,
Jun 1, 2020, 10:32:50 PM6/1/20
to 日本xrdpユーザ会 (The "xrdp" Users' Group Japan)
こんにちは、ご報告ありがとうございます。

NeutrinoRDPは実は古いバージョンのFreeRDPのforkで、当時は様々な事情があって
FreeRDPをforkするという選択をしたのですが、FreeRDPに回帰してFreeRDP 2.0で
RDP-Proxyモードを実現しようという計画があります。

計画はあるものの、手が足りておらず手を付けられていない状態です。


この NeutrinoRDP-any モードでいくつか不具合と思われる事象に遭遇しましたのでご報告いたします。

1)日本語キーボードを使っているにも関わらず、Proxy接続先のWindowsにログイン後に接続先が英語キー配列になってしまう。
  既にコンソールやmstsc.exeなどで一度ログイン済み(切断状態)のWindows10 1909に NeutrinoRDP-any で接続すると正しく日本語キーボードのmapになりますが、
  再起動直後など未ログイン状態で初めて NeutrinoRDP-any で接続すると usキーボード配列となってしまいます。
  (経験上iOSやAndroidのRDP ClientからWindowsにログインするときに類似事象があります。)

  ワークアラウンドとして Windows側のレジストリを編集して
  HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts\00000411 以下の 
  Layout File キーの値を KBDJPN.DLL から kbd106.DLL に変更しておけば
  初ログイン、切断状態からのログインのどちらでも常に日本語キーマップになります。

これは、NeutrinoRDPがクライアントから受け取ったキー配列情報を尊重せず、US配列で上書きしてProxy先に接続
しにいってることが原因と推測します。RDP-Proxyモードについては、とりあえず動くというレベルのもので
実装が甘い部分が多くあります。

 
2)Proxy接続先のWindowsにログイン後、マウスカーソルが黒い四角になってしまう
  ユーザ会の過去ログにもある、
  xrdp.ini の new_cursors=false で対処を試みましたが、効果がありませんでした。

  FreeRDP側のissues https://github.com/FreeRDP/FreeRDP/issues/5337# でも報告されているように
  ワークアラウンドとして Windows側のコントロールパネルで
  [その他のマウスオプション]-[ポインター]を開き「ポインターの影を有効にする」のチェックボックスを OFFにする
  ことで対処できました。

取り急ぎこちらはのコメントで、情報ありがとうございます。
 
3)Proxy接続先のWindowsにログイン時に壁紙が表示できない
  切り分けのためXorgでGUI接続しNeutrinoRDP版xfreerdp で適切なオプションをつけて接続すると壁紙は表示されました。
  xrdp から 内部でNeutrinoRDPが呼び出されるときに壁紙などのオプションが無効になっているようです。
  これを制御するxrdp.iniパラメータはあるのでしょうか?

  ワークアラウンドは特にありませんが、VDI的に使う用途なので割り切って使っています。


こちらも、キー配列同様クライアントから受け取った壁紙などのオプション情報をそのままProxy先に送信するべきですね。
xrdp.iniで設定可能にしても良いですが。できればFreeRDP 2.0に移行したいということもあり、NeutrinoRDPモード
にこれ以上の積極的な修正は考えていないのですが、クライアントからの情報をそのままパスするという処理は
FreeRDPでもNeutrinoRDPでも大差はないと思うので取り組む価値はありますね。

TOMATO JUNKER

unread,
Jun 2, 2020, 8:35:33 AM6/2/20
to 日本xrdpユーザ会 (The "xrdp" Users' Group Japan)
metaさん、早急なお返事をいただき、恐れ入ります。

NeutrinoRDPは実は古いバージョンのFreeRDPのforkで、当時は様々な事情があって
FreeRDPをforkするという選択をしたのですが、FreeRDPに回帰してFreeRDP 2.0で
RDP-Proxyモードを実現しようという計画があります。

計画はあるものの、手が足りておらず手を付けられていない状態です。


xrdpは WindowsからのLinuxGUIログインで使われることが多いため、
RDP-Proxyモードの利用頻度はそう多くはないと認識しています。
FreeRDP2.x化、気長にお待ちいたします。
 
これは、NeutrinoRDPがクライアントから受け取ったキー配列情報を尊重せず、US配列で上書きしてProxy先に接続
しにいってることが原因と推測します。RDP-Proxyモードについては、とりあえず動くというレベルのもので
実装が甘い部分が多くあります。

ありがとうございます。
補足ですが、たとえProxy接続先をレジストリでLayout File を kbd106.DLL に設定していたとしても、
英語キーボードが接続された日本語Windows10 home 1909のmstsc.exeで
xrdpのRDP-Proxy接続をすると、特に問題なく英語キーボードmapで動作いたしました。

 
3)Proxy接続先のWindowsにログイン時に壁紙が表示できない

こちらも、キー配列同様クライアントから受け取った壁紙などのオプション情報をそのままProxy先に送信するべきですね。
xrdp.iniで設定可能にしても良いですが。できればFreeRDP 2.0に移行したいということもあり、NeutrinoRDPモード
にこれ以上の積極的な修正は考えていないのですが、クライアントからの情報をそのままパスするという処理は
FreeRDPでもNeutrinoRDPでも大差はないと思うので取り組む価値はありますね。

こちらもぜひに、と言いたいところですが、他の課題もあるかと思いますので
無理ない範囲でご検討いただければ幸いです。

今回、DockerもAlpineも初体験でしたが、xrdpは特に問題なくbuildできてしまいました。
これも過去のご尽力のゆえと感謝しております。
 
 

junker...@gmail.com

unread,
Jun 20, 2021, 5:13:50 AM6/20/21
to 日本xrdpユーザ会 (The "xrdp" Users' Group Japan)
およそ一年ぶりの返信となります。

自分の管理下にある検証環境への踏み台として xrdp RDP-Proxyを1年ほど運用してきましたが、
より多くの従業員に使える環境を整える必要に迫られ、運用上の諸々の課題に対処するために
本家のgithub に いくつかのPR を上げさせていただきました。 
私の素人パッチを丁寧に直していただいた@matt335672 さんにはとても感謝しています。

さて。昨年ご報告した3つの問題のうち、以下2つについては
 現在Open中のPR #1903 にて performance_flag を上書きするxrdp.iniオプションの追加で
xrdp側で対処できる見通しがつきました。

>2)Proxy接続先のWindowsにログイン後、マウスカーソルが黒い四角になってしまう
  RDP proxyモジュール内でマウスカーソル設定が32x32pixelにハードコーディングされていることが根本原因。
  → xrdp.ini で マウスカーソルの影を無効にするperformance_flagを立てられるようにすることで
    管理者がワークアラウンド対応ができるようにする
>3)Proxy接続先のWindowsにログイン時に壁紙が表示できない
  → mstsc の エクスペリエンス設定を受け入れられるようにしてユーザが設定変更可能にするとともに
    xrdp.iniで管理者が壁紙を強制的に有効化できるようにする

今、最後の懸案である以下の問題に取り組み始めたところです
>1)日本語キーボードを使っているにも関わらず、Proxy接続先のWindowsにログイン後に接続先が英語キー配列になってしまう。

metaさんが有効にしていただいた github の discussions にて議論してから取り掛かるのが好ましいとは思いますが、
私が英語が不得手すぎることと、本件は日本語キーボードでの問題となるため、
本家のdiscussions/PR に臨む前に
まずはこちらでmetaさんにご相談させていただいて方向性を定めたいのですが、よろしいでしょうか。

よろしくお願いいたします。
2020年6月2日火曜日 21:35:33 UTC+9 junker...@gmail.com:

meta

unread,
Jun 20, 2021, 9:43:16 PM6/20/21
to 日本xrdpユーザ会 (The "xrdp" Users' Group Japan)
ありがとうございます。後ほど目を通します。

RDP proxy は以前から存在はするもののユーザーが少なくあまりテストされてこなかった
ため、色々直していただいて助かります。NeutrinoRDPはFreeRDP 2.0で置き換えることも
検討しているのですが、今回対応していただいている部分はFreeRDPに移行後も役に立つ
と思います。

2021年6月20日日曜日 18:13:50 UTC+9 junker...@gmail.com:

junker...@gmail.com

unread,
Jun 21, 2021, 11:57:45 PM6/21/21
to 日本xrdpユーザ会 (The "xrdp" Users' Group Japan)
metaさん。ありがとうございます。

NeutrinoRDP RDP-Proxy  モードでの日本語キーボードレイアウト対応について相談させていただきたいのは、以下の点です。

この対応は neutrinordp/xrdp-neutrinordp.c 内で対処可能と判断しています。

まず、RDP Client側のキーボードレイアウトはmod構造体の以下メンバ変数で参照できます。
mod->client_info.keyboard_type, mod->client_info.keyboard_subtype, mod->client_info.keylayout

Proxy接続時に設定されるキーボードレイアウトは settings構造体の以下メンバ変数で定義されますが、
settings->kbd_type, settings->kbd_subtype, settings->kbd_fn_keys, settings->kbd_layout
xrdp-neutrinordp.c 内では特に変数をセットしていないため、Neutrinordpのデフォルト値の0x00となり、
英語配列になっていると認識しています。

これらの構造体変数をxrdp-neutrinordp.c内で橋渡しすれば、
Proxy接続時のキーボードレイアウトをRDP Clientに合わせられそうです。
テストコードを組んでみたところうまくいきました。

metaさんの長年の経験から見解をいただきたいのは以下の点です

1)keybordlayoutの代入値について
 手元のテストコードでは mod->client_info.keylayout を
 そのまま  settings->kbd_layout に代入しているのですが、
 metaさんのosc2016 tokyo springでの発表資料を見ると、
 上位16bitはIME登録順で不定のため、
 上位16bitをマスクして下位16bit分を切り出してからセットしたほうが適切と思いました。

 この場合、少し気になるのは US Dvorak (0x00010409)がUS(0x0409)になってしまうことです。
 US Dvorak配列を使ったことがないのでどういう結果になるのか想像できないのですが、
 settings->kbd_layout にセットするのは下位17bitとしたほうが好ましいでしょうか。
 
2)ファンクションキー数設定について
 ファンクションキー数を指定する settings->kbd_fn_keys 変数がありますが、
 mod->client_info構造体変数からは取れないようですので
  一般的な 12 固定で定義してしまおうと考えています
 この処置は何か別の問題を引き起こすでしょうか。

P.S.
FreeRDP 2.0 への置き換えについてはローカルブランチなどで既に仕掛かっている感じでしょうか?

私は職業プログラマではなく、C言語も初心者レベルですが・・・
一連のパッチ作成で xrdp-neutrinordp.c のソース構成を少し把握できたので、
リファクタリングではなくマイグレーション前提であれば何かお手伝いできるかもしれません。

よろしくお願いいたします。
2021年6月21日月曜日 10:43:16 UTC+9 meta:

meta

unread,
Jun 25, 2021, 12:40:14 AM6/25/21
to 日本xrdpユーザ会 (The "xrdp" Users' Group Japan)
1)keybordlayoutの代入値について
 手元のテストコードでは mod->client_info.keylayout を
 そのまま  settings->kbd_layout に代入しているのですが、
 metaさんのosc2016 tokyo springでの発表資料を見ると、
 上位16bitはIME登録順で不定のため、
 上位16bitをマスクして下位16bit分を切り出してからセットしたほうが適切と思いました。

 この場合、少し気になるのは US Dvorak (0x00010409)がUS(0x0409)になってしまうことです。
 US Dvorak配列を使ったことがないのでどういう結果になるのか想像できないのですが、
 settings->kbd_layout にセットするのは下位17bitとしたほうが好ましいでしょうか。

keyLayoutの値の上位ビットについては、MSの資料を見てもよくわからない部分が多いのですが
下位ビットが取りうる値は以下で全てです。
日本語の場合、0x00010411や0xE02n0411という値になりますので、17bitマスクだと0x00010411に
対応できないのではないかと思います。keyboardTypeというキーボードの種類を表す値もありますので、
それが7であるかどうかで場合分けしてマスク長と変えるという方法もありかもしれません。
 
2)ファンクションキー数設定について
 ファンクションキー数を指定する settings->kbd_fn_keys 変数がありますが、
 mod->client_info構造体変数からは取れないようですので
  一般的な 12 固定で定義してしまおうと考えています
 この処置は何か別の問題を引き起こすでしょうか。

こちらは特に問題はないと考えています。
 
P.S.
FreeRDP 2.0 への置き換えについてはローカルブランチなどで既に仕掛かっている感じでしょうか?

私は職業プログラマではなく、C言語も初心者レベルですが・・・
一連のパッチ作成で xrdp-neutrinordp.c のソース構成を少し把握できたので、
リファクタリングではなくマイグレーション前提であれば何かお手伝いできるかもしれません。

ローカルブランチで開発を始めた段階でして、まだほとんど動くコードとしては存在しません。

TOMATO JUNKER

unread,
Jun 27, 2021, 11:47:45 AM6/27/21
to xrd...@googlegroups.com
metaさんありがとうございます。

ご教示いただきありがとうございます。
単純にkeylayoutをマスクしてはいけないのですね。
functionキーについてもありがとうございました。

mod->client_info.keylayout をそのまま  settings->kbd_layout に代入するようにし、
日本語キーボードのときのみマスクを設定するようにしてみます。
さらにxrdp.ini のオプションで管理者がマスク値を設定できるようにする機能を
debug用に追加したいと思います。

FreeRDP2への対応の件は状況の共有をありがとうございます。
このキーボード問題が片付けば、いったん当面の課題が片付くので
RDP Proxyにおける 動的reiseze や HiDPI対応について
どうすれば実現できるか考えてみようと思っていたのですが
ソースの検討に留め、PRなどは少し保留しようと思います。

ありがとうございました。

2021年6月25日(金) 13:40 meta <me...@vmeta.jp>:
--
日本xrdpユーザ会: http://xrdp.vmeta.jp/
---
このメールは Google グループのグループ「日本xrdpユーザ会 (The "xrdp" Users' Group Japan)」のトピックを登録しているユーザーに送られています。
このトピックの登録を解除するには https://groups.google.com/d/topic/xrdp-jp/jQwaevSjM4s/unsubscribe にアクセスしてください。
このグループを退会し、グループのすべてのトピックの登録を解除するには xrdp-jp+u...@googlegroups.com にメールを送信してください。
このディスカッションをウェブ上で閲覧するには https://groups.google.com/d/msgid/xrdp-jp/5116ba2f-9431-46b5-b2d1-ed39bcb0e247n%40googlegroups.com にアクセスしてください。
Reply all
Reply to author
Forward
0 new messages