2018年7月16日 星期一

透過 Guacamole 使用遠端桌面連線

2021-05-24 更新: 至 guacamole-1.3.0,因為 Gentoo Linux 的 SSH 升級,guacamole-0.9.14 無法連接。

緣起

有些解決方案,一直都在,但等到某一天,心血來潮,在 Google 用各種關鍵字搜尋,才發現它的存在。

在外面,要連回辦公室的 private IP 的電腦的遠端桌面,真的是很麻煩的事。曾用過自己架的 VPN,但因為內網的設定,只能連上某些 IP 的機器。很多人使用 TeamViewer,但我的網路很快,要繞道 TeamViewer 的伺服器,用起來就變得卡卡的。

想要模仿 TeamViewer,自己架個機器當跳板。在 Google 努力的搜尋,然後,不小心就找到 Guacamole。繼續搜尋安裝和使用的方法,說明,看起來複雜又難理解,要安裝的東西,有 Java,Tomcat,資料庫,... 一堆東西,真是嚇人。

繼續搜尋使用 docker 的 solution,找到 docker-compose.yml。然後,幾分鐘後就看到結果了。先試其中一種作法,但有點不成功,資料庫不能存資料。再另外找其他作法 (guacamole-docker-compose),它裡面有 Nginx,我把這部分砍掉,用現有的 Apache 當反向代理。這個作法,後端是使用 pgsql。

跑起來後,網站的根目錄是 Tomcat 網頁,進入的連結是 http://localhost:32771/guacamole。

預設的 username 是 guacadmin,password 為 guacadmin。進入後,記得先把帳號和密碼改掉。嗯,感謝 docker,讓一切變得簡單了。

我用的 docker-compose.yml 如下。

version: '2.0'

# networks
# create a network 'guacnetwork_compose' in mode 'bridged'
networks:
  guacnetwork_compose:
    driver: bridge

# services
services:
  # guacd
  guacd:
    container_name: guacamole-guacd
    build:
      context: ./
      dockerfile: guacd.dockerfile
    networks:
      guacnetwork_compose:
    restart: always
    volumes:
    - ../work/drive:/drive:rw
    - ../work/record:/record:rw

  # old guacd for connecting Windows Server 2003
  guacd-0.9.14:
    container_name: guacamole-guacd-0.9.14
    image:
      guacamole/guacd:0.9.14
    networks:
      guacnetwork_compose:
    restart: always
    volumes:
    - ../work/drive-0.9.14:/drive:rw
    - ../work/record-0.9.14:/record:rw
  # postgres
  postgres:
    container_name: guacamole-pgsql
    environment:
      PGDATA: /var/lib/postgresql/data
      POSTGRES_DB: guacamole_db
      POSTGRES_PASSWORD: SetYourPasswordHere
POSTGRES_USER: guacamole_user image: postgres:10.4 networks: guacnetwork_compose: restart: always volumes: - ../work/init_db:/docker-entrypoint-initdb.d:ro - ../work/pg_data:/var/lib/postgresql/data:rw # guacamole guacamole: container_name: guacamole-guacamole depends_on: - guacd - guacd-0.9.14 - postgres environment: GUACD_HOSTNAME: guacd POSTGRES_DATABASE: guacamole_db POSTGRES_HOSTNAME: postgres POSTGRES_PASSWORD: X8rNuCrtQfFzpMqrXxHLBXv3 POSTGRES_USER: guacamole_user image: guacamole/guacamole:1.3.0 links: - guacd - guacd-0.9.14 networks: guacnetwork_compose: ports: - 32771:8080/tcp restart: always

使用的 image 要指定版本,不然在遷移系統時,可能下載的 image 版本不一樣,可能就跑不起來了。上面安裝兩個 guacd,要連舊版的 Windows Server 2003 時,將 Guacamole Proxy Parameters (guacd) 的 Hostname 設定為 guacd-0.9.14。

另外,為了在 SSH connection 中顯示中文字,在 guacd image 安裝中文字型, guacd.dockerfile 如下。新版的 guacamole/guacd:1.3.0 是用 Debian 的安裝指令。

FROM guacamole/guacd:1.3.0

# 安裝中文字型,可以在 SSH connection 中,顯示中文
# 必須要同時裝兩種字型

USER root

RUN apt-get update  \
    && apt-get -y install fonts-noto-cjk fonts-noto-cjk-extra \
    && apt-get -y clean
舊的 guacamole/guacd:0.9.14 是用 CentOS 的安裝指令。因為只是要用舊版的 guacd 來連接 Windows Server 2003,所以不需要裝中文字型,下面的 dockerfile 留作參考。
FROM guacamole/guacd:0.9.14

# 安裝中文字型,可以在 SSH connection 中,顯示中文
# 必須要同時裝兩種字型
RUN yum -y install google-noto-sans-cjk-fonts google-noto-cjk-fonts && \
    yum clean all
在目錄的規劃,把 docker 的設定檔放在 docker 目錄下,volume 則放在 work 目錄下,不然因為執行權限,有些 volume 的目錄無法用個人身分讀取,必須用 root 的身份才能建立 image。執行 docker-compose build 就可以 build image 了。

使用之前,要執行 prepare.sh,建立 init/initdb.sql,在第一次使用時,會檢查若尚未建立 db,用來 initialize db。prepare.sh 的內容如下
#!/bin/sh
#
echo "Preparing folder init and creating ./init/initdb.sql"
mkdir ./init >/dev/null 2>&1
chmod -R +x -- ./init
docker run --rm guacamole/guacamole /opt/guacamole/bin/initdb.sh --postgres > ./init/initdb.sql
echo "done"
為了安裝中文,先進入 guacamole,好像是 Debian 系統。但根據 Guacamole ssh font 的討論,應該是在 guacd 加上字型。guacd 是 CentOS,透過指令 docker exec -it guacd_compose bash 進入 container
# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)

-- 列出可用的 Mono CJK 字型
# fc-list | grep 'Noto.*Mono.*CJK.*TC'
/usr/share/fonts/google-noto-cjk/NotoSansCJK-Regular.ttc: Noto Sans Mono CJK TC,Noto Sans Mono CJK TC Regular:style=Regular
/usr/share/fonts/google-noto-cjk/NotoSansCJK-Bold.ttc: Noto Sans Mono CJK TC,Noto Sans Mono CJK TC Bold:style=Bold,Regular

在 SSH connection 設定使用的字型 "Noto Sans Mono CJK TC",就能顯示中文字了。其實,實際使用的結果,不用特別指定字型,只要裝了中文字型,就可以顯示中文了,只是會有點大小不一致。



沒有留言:

張貼留言

網誌存檔