Guacamole 에서 "로그인이 실패했습니다" 가 뜰 때, 실패한 것이 Guacamole 웹 로그인인지 연결 대상(RDP 서버) 로그인인지부터 가른다. 둘은 전혀 다른 층이고 고치는 곳도 다르다.
브라우저 → Tomcat(guacamole.war) → JDBC 인증 확장 → PostgreSQL ← 웹 로그인
↓
guacd → RDP/VNC/SSH → 대상 서버 ← 연결 로그인
웹 로그인이 실패하면 목록 화면까지 가지 못한다. 목록은 보이는데 연결을 열 때 실패하면 아래쪽 층이다.
여기를 헷갈리는 일이 잦다. GUACAMOLE_HOME(기본값 /etc/guacamole) 아래에는 성격이 다른 두 디렉터리가 있다[1].
| 디렉터리 | 넣는 것 |
|---|---|
extensions/ |
Guacamole 확장 .jar. 기동 시 이 디렉터리의 모든 .jar 을 읽는다 |
lib/ |
확장이 필요로 하는 서드파티 라이브러리. JDBC 드라이버는 여기에 둔다 |
JDBC 드라이버를 extensions/ 에 넣으면 확장으로 읽으려다 실패하고, 인증은 여전히 동작하지 않는다.
ls -l /etc/guacamole/extensions/
ls -l /etc/guacamole/lib/
curl -L -o /etc/guacamole/lib/postgresql.jar \
https://jdbc.postgresql.org/download/postgresql-42.7.8.jar
chown tomcat:tomcat /etc/guacamole/lib/postgresql.jar
chmod 644 /etc/guacamole/lib/postgresql.jar
GUACAMOLE_HOME 을 Tomcat 이 실제로 읽고 있는가환경 변수는 Tomcat 프로세스에 전달돼야 한다. 셸에서 export 해 놓고 systemd 로 띄우면 전달되지 않는다.
grep -i 'GUACAMOLE_HOME' /opt/apps/apache-tomcat-*/logs/catalina.out
tr '\0' '\n' < /proc/$(pgrep -f org.apache.catalina.startup.Bootstrap | head -1)/environ | grep GUACAMOLE
systemd 유닛이라면 Environment=GUACAMOLE_HOME=/etc/guacamole 를, setenv.sh 를 쓴다면 거기에 둔다.
java -cp /etc/guacamole/lib/postgresql.jar org.postgresql.Driver
Error: Main method not found in class org.postgresql.Driver
이 메시지는 정상이다. JDBC 드라이버 클래스에는 main 메서드가 없으므로 직접 실행하면 언제나 이렇게 나온다. 드라이버가 깨졌다는 뜻이 아니므로 이 결과로 판단하지 않는다. 확인해야 할 것은 세 가지다.
lib/ 에 파일이 있고 Tomcat 계정이 읽을 수 있는가GUACAMOLE_HOME 을 읽고 있는가psql -h 127.0.0.1 -U guacamole -d guacamole -c '\dt' | head
DB 스키마가 없으면 인증 확장이 로드돼도 로그인은 실패한다. 스키마와 기본 계정이 들어 있는지 본다.
psql -h 127.0.0.1 -U guacamole -d guacamole -c \
"select entity_id, name from guacamole_entity limit 5;"
Guacamole 에서만 실패하고 다른 클라이언트로는 붙는다면 대상 서버가 아니라 연결 설정이나 세션 정책 쪽이다. 먼저 같은 호스트에서 xfreerdp 로 직접 붙어 본다.
xfreerdp /v:<host> /u:<user> /cert-ignore /sec:nla
xfreerdp 는 되는데 Guacamole 만 안 되면 연결 파라미터를 본다. 특히 security 값(nla · tls · rdp · any) 과 ignore-cert 가 대상 서버 설정과 맞아야 한다. 서버에서 NLA 를 껐다면 Guacamole 쪽도 NLA 를 요구하지 않게 둔다. 서버 쪽 레지스트리 값은 RDP SecurityLayer 와 NLA 레지스트리 값 에 있다.
ERRINFO_DISCONNECTED_BY_OTHER_CONNECTION (0x00000005)
Another user connected to the server, forcing the disconnection of the current connection.
같은 계정으로 다른 세션이 이미 열려 있어 밀려난 것이다. Windows 클라이언트 에디션은 동시 원격 세션을 하나만 허용한다. 붙어 있는 세션을 확인하고 정리한다.
qwinsta
logoff <세션ID>
그룹 정책 편집기에서 컴퓨터 구성 → 관리 템플릿 → Windows 구성 요소 → 원격 데스크톱 서비스 트리가 아예 보이지 않는다면 에디션 제한이다. 원격 데스크톱 세션 호스트 정책은 클라이언트 에디션에 없다. 여러 사람이 동시에 붙어야 하는 용도라면 서버 에디션을 쓴다.
tail -f /opt/apps/apache-tomcat-*/logs/catalina.out
journalctl -u guacd -f
guacamole.properties 에서 로그 수준을 올리면 인증 확장의 동작이 보인다.
# error, warning, info, debug, trace
lib/ 배치와 실제 DB 접속으로 판단하는 편이 확실하다.guacamole.properties 점검과 guacd 연결 거부.GUACAMOLE_HOME 디렉터리 구조 — 2026-09-20 확인. https://guacamole.apache.org/doc/gug/configuring-guacamole.html ↩︎