Setting Up xrdp with Korean Font Support on Ubuntu 24.04

If you’ve just spun up a fresh Ubuntu server and want a full desktop you can reach over RDP — with proper Korean (Hangul) rendering and Chrome ready to go — here’s the complete, copy-paste-friendly walkthrough. Every command below uses environment variables for the server IP, the new user’s name, and password, so you can paste the whole block in one shot without editing anything except the variables at the top.

What you’ll end up with

  • Ubuntu 24.04 LTS with a full XFCE desktop
  • xrdp listening on port 3389, reachable from Windows’ built-in Remote Desktop Connection
  • A non-root user you can log in as
  • Google Chrome, with Korean fonts installed so Hangul actually renders instead of showing as boxes

Step 0 — Set your variables

Run this on your local machine first — it just defines the values the rest of the guide reuses.

export SERVER_IP="203.0.113.10"        # your server's public IP
export NEW_USER="myuser"               # the desktop login you want to create
export NEW_USER_PASSWORD="ChangeMe123!" # a strong password for that user

Step 1 — SSH into the server as root

ssh root@$SERVER_IP

Everything from here runs on the server. Since you’re now in a root shell there, re-export the variables you’ll need (SSH doesn’t carry your local shell’s env vars over automatically):

export NEW_USER="myuser"
export NEW_USER_PASSWORD="ChangeMe123!"

Step 2 — Install xrdp and a desktop environment

apt update
DEBIAN_FRONTEND=noninteractive apt install -y xrdp xfce4 xfce4-goodies

XFCE is a lightweight desktop that plays nicely with xrdp — GNOME/Unity tend to be flakier over RDP.

Step 3 — Create the desktop user

useradd -m -s /bin/bash "$NEW_USER"
echo "$NEW_USER:$NEW_USER_PASSWORD" | chpasswd

Step 4 — Point the session at XFCE

echo "xfce4-session" > /home/$NEW_USER/.xsession
chown $NEW_USER:$NEW_USER /home/$NEW_USER/.xsession

Step 5 — Fix the xrdp/ssl-cert permission gotcha

This one trips almost everybody up: on a fresh install, the xrdp system user usually isn’t in the ssl-cert group, so it can’t read the TLS private key it needs for the RDP handshake. Symptom: the client fails to connect at all, sometimes reported as a generic “I/O error.” Fix:

usermod -aG ssl-cert xrdp
systemctl restart xrdp

Step 6 — Enable and start xrdp, open the firewall

systemctl enable --now xrdp
ufw allow 3389/tcp    # skip if ufw isn't in use

If your server is on a cloud provider (AWS/GCP/Azure/OpenStack/etc.), remember the local firewall isn’t the only gate — you also need to open 3389/tcp inbound in the provider’s security group / firewall rules panel.

Step 7 — Install Google Chrome

cd /tmp
wget -q https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
DEBIAN_FRONTEND=noninteractive apt install -y ./google-chrome-stable_current_amd64.deb
rm -f google-chrome-stable_current_amd64.deb

Step 8 — Install Korean fonts and locale

Without this step, Hangul text in Chrome (and everywhere else) renders as empty boxes (tofu). This installs Noto Sans/Serif CJK, Nanum fonts, and the Korean locale:

DEBIAN_FRONTEND=noninteractive apt install -y fonts-noto-cjk fonts-nanum language-pack-ko
fc-cache -f
locale-gen ko_KR.UTF-8
update-locale

Step 9 — Connect

From Windows, open Remote Desktop Connection (mstsc) and connect to:

$SERVER_IP:3389

Log in with $NEW_USER / $NEW_USER_PASSWORD.

The one-shot script

If you want to run steps 2–8 in a single paste (after SSH’ing in as root and exporting NEW_USER/NEW_USER_PASSWORD), here’s the whole thing back to back:

apt update
DEBIAN_FRONTEND=noninteractive apt install -y xrdp xfce4 xfce4-goodies

useradd -m -s /bin/bash "$NEW_USER"
echo "$NEW_USER:$NEW_USER_PASSWORD" | chpasswd

echo "xfce4-session" > /home/$NEW_USER/.xsession
chown $NEW_USER:$NEW_USER /home/$NEW_USER/.xsession

usermod -aG ssl-cert xrdp
systemctl enable --now xrdp
systemctl restart xrdp
ufw allow 3389/tcp

cd /tmp
wget -q https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
DEBIAN_FRONTEND=noninteractive apt install -y ./google-chrome-stable_current_amd64.deb
rm -f google-chrome-stable_current_amd64.deb

DEBIAN_FRONTEND=noninteractive apt install -y fonts-noto-cjk fonts-nanum language-pack-ko
fc-cache -f
locale-gen ko_KR.UTF-8
update-locale

Troubleshooting: “the desktop connects but immediately closes”

If your first RDP login works fine but every login after that just flashes and disconnects, it’s almost always a stale session: closing the RDP window (instead of logging out from the XFCE menu) leaves the old desktop session running in the background, and the new session’s xfce4-session collides with it over the same D-Bus session bus and exits instantly.

Fix, run as root:

pkill -9 -u "$NEW_USER"
rm -f /tmp/.X11-unix/X10

…and going forward, always Log Out from the desktop menu rather than just closing the RDP client window.

Environment used in this guide: Ubuntu 24.04.4 LTS, xrdp + XFCE4, Google Chrome stable.