xrdp でRDP Proxy ゲートウェイ を作る話(4)　〜設定編〜


## [前回](https://qiita.com/JUNKER_TOMATO/items/563702a2af8e06721994)まで
Debian GNU/Linux 11上での package build方法をご紹介しました。<br>

RedHat系、debian系のpackage build と インストールをご紹介したので、RDP Proxyとして xrdp を使うための設定方法をご案内します。

## 対象バージョン
記事執筆時点(2022/12/16)で、以下バージョンを対象とします。
* xrdp v0.9.20 
* NeutrinoRDP git hash #836b738

## xrdp の バージョン情報の確認
利用中のxrdpが RDP Proxy mode に対応しているかどうかを確認します。

`xrdp -V` で バージョン番号やbuild オプションを表示できます。
Configure optionsに　`--enable-neutrinordp` 　が含まれていることを確認します。

```bash
# xrdp -V の出力結果
# xrdp -V
Argument 0 - xrdp
Argument 1 - -V
xrdp 0.9.20
  A Remote Desktop Protocol Server.
  Copyright (C) 2004-2020 Jay Sorg, Neutrino Labs, and all contributors.
  See https://github.com/neutrinolabs/xrdp for more information.

  Configure options:
      --build=x86_64-redhat-linux-gnu
      --host=x86_64-redhat-linux-gnu
      --program-prefix=
      --disable-dependency-tracking
      --prefix=/usr
      --exec-prefix=/usr
      --bindir=/usr/bin
      --sbindir=/usr/sbin
      --sysconfdir=/etc
      --datadir=/usr/share
      --includedir=/usr/include
      --libdir=/usr/lib64
      --libexecdir=/usr/libexec
      --localstatedir=/var
      --sharedstatedir=/var/lib
      --mandir=/usr/share/man
      --infodir=/usr/share/info
      --enable-fuse
      --enable-pixman
      --enable-painter
      --enable-vsock
      --enable-ipv6
      --with-socketdir=/run/xrdp
      --with-imlib2
      --enable-neutrinordp
      --enable-devel-logging
      build_alias=x86_64-redhat-linux-gnu
      host_alias=x86_64-redhat-linux-gnu
      CFLAGS=-O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection 
      LDFLAGS=-Wl,-z,relro  -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld
      PKG_CONFIG_PATH=:/usr/lib64/pkgconfig:/usr/share/pkgconfig

  Compiled with OpenSSL 1.1.1k  FIPS 25 Mar 2021
```
これは xrdp project の github に issue を上げる場合に基本的に求められる情報なので憶えておいてください。


## xrdpの設定ファイル

xrdp の設定ファイルの path は build オプションによって決まりますが、前回までにご紹介した rpm/deb package でインストールした場合には、`/etc/xrdp/` 以下に格納されます。

`/etc/xrdp/xrdp.ini` が設定ファイルになります。

xrp.ini は単一ファイルで様々な設定項目が含まれています。
このうち、RDP Proxyの設定はファイル末尾の`[neutrinordp-any]`からのセクションとなります。


```ini
[neutrinordp-any]
name=neutrinordp-any
lib=libxrdpneutrinordp.so
ip=ask
port=ask3389
username=ask
password=ask
```

## RDP Proxyのための基本設定
では実際に xrdp で RDP Proxy を設定していきます。

`[neutrinordp-any]`セクションの各パラメータの意味は以下のようになります。

|パラメータ名|意味|備考|
|:-|:-|:-|
|[neutrinordp-any]|セクション名|次のセクション名が現れるまでがそのセクションの設定となる。|
|name|表示名|xrdp ログインスクリーンに表示される Session 名|
|lib|モジュール指定|RDP Proxy使用時は`libxrdpneutrinordp.so`を指定|
|ip|RDP接続先アドレス|`ask`パラメータは任意入力|
|port|RDP接続先TCPポート番号|`ask3389`は初期値3389として任意入力|
|username|RDP接続先ユーザー名|`ask`で任意入力|
|password|RDP接続先パスワード|`ask`で任意入力|

`name`は xrdp のログインダイアログに出てくる `Session`のリストボックスに表示される名前です。<br>
`lib` は xrdpログインスクリーンから読み出すモジュールの指定です。
`libxrdpneutrinordp.so` が NeutrinoRDPライブラリを用いて RDP Proxyを実行するモジュールです。このモジュールを指定したセクションは RDP Proxy として動作します。
`ip` `port` `username` `password` は RDP Proxy 接続先の情報を示します。

`ask`を指定するとxrdpログインスクリーン上での任意入力となります。
`ask`直後に値を書くと、初期値がセットされた状態になります。
`ask`を入れずに値を書くと、そのパラメータは固定値となり、ログインスクリーン上に表示されません。


標準の状態では以下のような画面になります。
![xrdp3-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114505/45a4b886-0d42-75a4-47d4-043f841e2cd4.jpeg)

## RDP Proxyのための追加設定
ここまでの設定で　xrdp の RDP Proxyで対象のリモートホストに接続はできますが、実運用上で様々な問題が出てきます。
実用性を高めるための追加設定をしていきます。コメントアウトされたパラメータを有効にしていくことで対応できます。
一部を有効にして対応していきます。

### パフォーマンス設定
|パラメータ名|推奨値|意味と解説|
|:-|:-|:-|
|enable_dynamic_resizing|`false`|RDPクライアントの画面サイズを変更したときに動的に表示領域を追従させる。コメントにある通り、NeutrinoRdp が対応していないため`false`を指定する|
|perf.allow_client_experiencesettings|`true`|RDPクライアント側の`パフォーマンス`設定をProxy先に伝えるか。デフォルトでは送信しないので、壁紙やフォントが最低限のものになる。後述の`perf.cursor_shadow`パラメータを機能させるために `true`にする。|
|perf.wallpaper<br>perf.font_smoothing<br>perf.desktop_composition<br>perf.full_window_drag<br>perf.menu_anims<br>perf.themes|好みに合わせて。|これらの設定はxrdp側でパフォーマンス設定を固定する。`mstsc.exe`の`パフォーマンス`タブの設定に対応する。![xrdp3-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114505/ca6ad70c-c697-8ce6-02b2-945ea3210d77.jpeg)|
|perf.cursor_shadow|`false`|マウスカーソルの影の有効無効の設定。NeutrinoRDP側の問題でマウスカーソルが黒い四角形になってしまう問題の回避のため`false`にする。|

### キーボードレイアウト設定
xrdp RDP Proxyのデフォルトではクライアント側のキーボードレイアウト情報をProxy先のRDPサーバに送信しません。
日本語キーボードを持つクライアントから RDP Proxy でリモートWindowsに接続すると、US 101/104 ASCIIキーボード配列として認識されてしまいます。リモートWindows側のレジストリを変更して106/109 日本語キーボードレイアウトに変更する回避策がありますが、それを行わずとも日本語キーボードレイアウトとして認識できるようになります。

|パラメータ名|推奨値|意味と解説|
|:-|:-|:-|
|neutrinordp.allow_client_keyboardLayout|`true`|RDPクライアント側のキーボードレイアウト情報をProxy先に送信するか否か。日本語キーボードを持つRDPクライアントを使う場合は`true`にする。|
|neutrinordp.override_keyboardLayout_mask|0x0000FFFF|RDPクライアントが日本語Windowsの場合、サードパーティ製日本語IMEのインストールをした場合にkbd_layout情報の上位2byteが変化する。これをマスクして下位2byteのみとすることでkbd_layoutの値を常に一定にする。Proxy経由の接続先がWindowsの場合は設定しなくても問題ないが、xrdpの時には設定しても良い。|



### 実際の設定例

今回ご紹介した設定項目を活用した具体的設定例です。

```
[RDP-Proxy-WinClient]
name=RDP-Proxy-forWin
lib=libxrdpneutrinordp.so
ip=ask192.168.0.
port=ask3389
username=ask
password=ask
enable_dynamic_resizing=false
perf.allow_client_experiencesettings=true
perf.full_window_drag=false
perf.menu_anims=false
perf.cursor_shadow=false
neutrinordp.allow_client_keyboardLayout=true
```

## まとめ
今回はxrdp を RDP-Proxyとして利用する場合の設定についてご紹介しました。

## 次回予告
未定です。（local pam認証を使った 設定方法をご紹介するかもしれません。）