I am having trouble configuring Guacamole with Apache. The set up I have is a
small network behind a firewall/NAT router (running pfsense). HTTPS requests go
to an external address and non-standard port that the router converts using NAT
to an internal address and standard port for HTTPS (443). The local machine
servicing requests to this internal address/port pair runs SSLH, which is a
SSH/HTTPS protocol multiplexor. The SSLH daemon parses the first part of each
protocol packet and decides to forward it to either the sshd daemon or the
installed apache web server. In the latter case it sends to port 4443, on which
apache is listening. I know this works, since I can login to the machine via
ssh from an external address and HTTPS requests to the configured virtual
machine display properly.
The problem occurs when I attempt to access guacamole with an HTTPS request of:
https://<machine dns name>:<external port that NAT translates to
443>/guacamole. This does not work. The file 000-default.conf in
/etc/apache/sites-enabled is:
# Comment out the port 80 virtual host block
<IfDefine IgnoreBlockComment>
<VirtualHost *:80>
# The ServerName directive sets the request scheme, hostname and port
that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request's Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.
#ServerName www.example.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
# For most configuration files from conf-available/, which are
# enabled or disabled at a global level, it is possible to
# include a line for only one particular virtual host. For example the
# following line enables the CGI configuration for this host only
# after it has been globally disabled with "a2disconf".
#Include conf-available/serve-cgi-bin.conf
</VirtualHost>
</IfDefine>
<VirtualHost localhost:4443>
ServerName server
DocumentRoot /mnt/raid5/webserver/sites/MOserver
Header always unset X-Frame-Options
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Location /guacamole/>
Order allow,deny
Allow from all
ProxyPass http://127.0.0.1:4822/guacamole/ flushpackets=on
ProxyPassReverse http://127.0.0.1:4822/guacamole/
</Location>
<Location /websocket-tunnel>
Order allow,deny
Allow from all
#Require all granted
ProxyPass ws://127.0.0.1:4822/guacamole/websocket-tunnel
ProxyPassReverse ws://127.0.0.1:4822/guacamole/websocket-tunnel
</Location>
SSLEngine on
SSLCertificateFile /root/.acme.sh/*.mountolive.com/fullchain.cer
SSLCertificateKeyFile
/root/.acme.sh/*.mountolive.com/*.mountolive.com.key
</VirtualHost>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
I tried to follow the instructions here:
https://guacamole.apache.org/doc/0.9.7/gug/proxying-guacamole.html#apache
However, the port suggested for guacamole listening (8080) is used by Tomcat,
so I changed it to 4822, which is the default port for guacamole.
The configuration file for guacamole is:
# MySQL properties
mysql-hostname: 127.0.0.1
mysql-port: 3306
mysql-database: guacamole_db
mysql-username: guacamole_user
mysql-password: xxxxxxxxxx
Before sending a request to guacamole, this is the listening profile of the
machine:
dnessett@Mount:/etc/apache2/sites-enabled$ sudo lsof -i -P -n | grep LISTEN
systemd-r 819 systemd-resolve 13u IPv4 18298 0t0 TCP 127.0.0.53:53
(LISTEN)
sslh 970 sslh 3u IPv4 24819 0t0 TCP *:443 (LISTEN)
vsftpd 979 root 3u IPv6 24699 0t0 TCP *:21 (LISTEN)
sslh 1094 sslh 3u IPv4 24819 0t0 TCP *:443 (LISTEN)
java 1095 tomcat 41u IPv6 30012 0t0 TCP *:8080 (LISTEN)
sshd 1115 root 3u IPv4 27938 0t0 TCP *:22 (LISTEN)
sshd 1115 root 4u IPv6 27940 0t0 TCP *:22 (LISTEN)
mysqld 1117 mysql 33u IPv4 23476 0t0 TCP 127.0.0.1:3306
(LISTEN)
apache2 1156 root 4u IPv6 24859 0t0 TCP *:4443 (LISTEN)
guacd 1350 root 4u IPv4 23482 0t0 TCP 127.0.0.1:4822
(LISTEN)
apache2 1831 www-data 4u IPv6 24859 0t0 TCP *:4443 (LISTEN)
apache2 1833 www-data 4u IPv6 24859 0t0 TCP *:4443 (LISTEN)
apache2 1834 www-data 4u IPv6 24859 0t0 TCP *:4443 (LISTEN)
apache2 1835 www-data 4u IPv6 24859 0t0 TCP *:4443 (LISTEN)
apache2 1836 www-data 4u IPv6 24859 0t0 TCP *:4443 (LISTEN)
cupsd 1845 root 6u IPv6 33375 0t0 TCP [::1]:631
(LISTEN)
cupsd 1845 root 7u IPv4 33376 0t0 TCP 127.0.0.1:631
(LISTEN)
dnessett@Mount:/etc/apache2/sites-enabled$
As is clear, tomcat is listening on 8080, apache is listening on 4443, sslh is
listening on 443 and guacamole is listening on 4822.
The apache2 status is:
dnessett@Mount:/etc/apache2/sites-enabled$ sudo systemctl status apache2
● apache2.service - The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset:
enabled)
Drop-In: /lib/systemd/system/apache2.service.d
└─apache2-systemd.conf
Active: active (running) since Sun 2022-12-18 13:26:17 MST; 21min ago
Process: 1827 ExecReload=/usr/sbin/apachectl graceful (code=exited,
status=0/SUCCESS)
Process: 971 ExecStart=/usr/sbin/apachectl start (code=exited,
status=0/SUCCESS)
Main PID: 1156 (apache2)
Tasks: 6 (limit: 4915)
CGroup: /system.slice/apache2.service
├─1156 /usr/sbin/apache2 -k start
├─1831 /usr/sbin/apache2 -k start
├─1833 /usr/sbin/apache2 -k start
├─1834 /usr/sbin/apache2 -k start
├─1835 /usr/sbin/apache2 -k start
└─1836 /usr/sbin/apache2 -k start
Dec 18 13:26:12 Mount systemd[1]: Starting The Apache HTTP Server...
Dec 18 13:26:17 Mount systemd[1]: Started The Apache HTTP Server.
Dec 18 13:31:13 Mount systemd[1]: Reloading The Apache HTTP Server.
Dec 18 13:31:13 Mount systemd[1]: Reloaded The Apache HTTP Server.
And guacamole status is:
dnessett@Mount:/etc/apache2/sites-enabled$ sudo systemctl status guacd
● guacd.service - LSB: Guacamole proxy daemon
Loaded: loaded (/etc/init.d/guacd; generated)
Active: active (running) since Sun 2022-12-18 13:26:20 MST; 22min ago
Docs: man:systemd-sysv-generator(8)
Process: 1330 ExecStart=/etc/init.d/guacd start (code=exited,
status=0/SUCCESS)
Tasks: 1 (limit: 4915)
CGroup: /system.slice/guacd.service
└─1350 /usr/local/sbin/guacd -p /var/run/guacd.pid
Dec 18 13:26:19 Mount systemd[1]: Starting LSB: Guacamole proxy daemon...
Dec 18 13:26:20 Mount guacd[1332]: Guacamole proxy daemon (guacd) version 1.3.0
started
Dec 18 13:26:20 Mount guacd[1330]: Starting guacd: guacd[1332]: INFO:
Guacamole proxy daemon (guacd) version 1.3.0 started
Dec 18 13:26:20 Mount guacd[1330]: SUCCESS
Dec 18 13:26:20 Mount guacd[1350]: Listening on host 127.0.0.1, port 4822
Dec 18 13:26:20 Mount systemd[1]: Started LSB: Guacamole proxy daemon.
I started tcpdump and then sent the following URL to the apache server (through
sslh):
https://<external machine dns name>:22553/guacamole
<https://server.mountolive.com:22553/guacamole> (22553 is the port that NAT
translates to 4430
The tcpdump result was:
dnessett@Mount:~$ !2387
sudo tcpdump -i lo
[sudo] password for dnessett:
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
13:52:00.506283 IP localhost.52746 > localhost.4443: Flags [S], seq 3330538823,
win 65495, options [mss 65495,sackOK,TS val 2893776088 ecr 0,nop,wscale 7],
length 0
13:52:00.506297 IP localhost.4443 > localhost.52746: Flags [S.], seq
1284121790, ack 3330538824, win 65483, options [mss 65495,sackOK,TS val
2893776088 ecr 2893776088,nop,wscale 7], length 0
13:52:00.506310 IP localhost.52746 > localhost.4443: Flags [.], ack 1, win 512,
options [nop,nop,TS val 2893776088 ecr 2893776088], length 0
13:52:00.506461 IP localhost.52748 > localhost.4443: Flags [S], seq 2774947261,
win 65495, options [mss 65495,sackOK,TS val 2893776088 ecr 0,nop,wscale 7],
length 0
13:52:00.507463 IP localhost.44102 > localhost.domain: 189+ [1au] PTR?
1.1.168.192.in-addr.arpa. (53)
13:52:00.507504 IP localhost.domain > localhost.49765: 15030 1/0/1 PTR
pfSense.localdomain. (86)
13:52:00.507708 IP localhost.domain > localhost.44102: 189 1/0/1 PTR
pfSense.localdomain. (86)
13:52:00.507862 IP localhost.40055 > localhost.domain: 17111+ [1au] PTR?
53.0.0.127.in-addr.arpa. (52)
13:52:00.508152 IP localhost.51341 > localhost.domain: 39632+ [1au] PTR?
27.1.168.192.in-addr.arpa. (54)
13:52:00.508335 IP localhost.51907 > localhost.domain: 8297+ [1au] PTR?
27.1.168.192.in-addr.arpa. (54)
13:52:00.508560 IP localhost.domain > localhost.51341: 39632 2/0/1 PTR Mount.,
PTR Mount.local. (98)
13:52:00.508866 IP localhost.domain > localhost.51907: 8297 2/0/1 PTR Mount.,
PTR Mount.local. (98)
13:52:00.509201 IP localhost.52746 > localhost.4443: Flags [P.], seq 1:518, ack
1, win 512, options [nop,nop,TS val 2893776091 ecr 2893776088], length 517
13:52:00.509231 IP localhost.4443 > localhost.52746: Flags [.], ack 518, win
508, options [nop,nop,TS val 2893776091 ecr 2893776091], length 0
13:52:00.509504 IP localhost.52748 > localhost.4443: Flags [P.], seq
2774947262:2774947779, ack 252338501, win 512, options [nop,nop,TS val
2893776091 ecr 2893776088], length 517
13:52:00.509541 IP localhost.4443 > localhost.52748: Flags [.], ack 517, win
508, options [nop,nop,TS val 2893776091 ecr 2893776091], length 0
13:52:00.511236 IP localhost.4443 > localhost.52746: Flags [P.], seq 1:257, ack
518, win 512, options [nop,nop,TS val 2893776093 ecr 2893776091], length 256
13:52:00.511248 IP localhost.52746 > localhost.4443: Flags [.], ack 257, win
510, options [nop,nop,TS val 2893776093 ecr 2893776093], length 0
13:52:00.511558 IP localhost.4443 > localhost.52748: Flags [P.], seq 1:257, ack
517, win 512, options [nop,nop,TS val 2893776093 ecr 2893776091], length 256
13:52:00.511572 IP localhost.52748 > localhost.4443: Flags [.], ack 257, win
510, options [nop,nop,TS val 2893776093 ecr 2893776093], length 0
13:52:00.519467 IP localhost.52748 > localhost.4443: Flags [P.], seq 517:597,
ack 257, win 512, options [nop,nop,TS val 2893776101 ecr 2893776093], length 80
13:52:00.519474 IP localhost.52746 > localhost.4443: Flags [P.], seq 518:1370,
ack 257, win 512, options [nop,nop,TS val 2893776101 ecr 2893776093], length 852
13:52:00.519681 IP localhost.4443 > localhost.52748: Flags [P.], seq 257:336,
ack 597, win 512, options [nop,nop,TS val 2893776101 ecr 2893776101], length 79
13:52:00.519724 IP localhost.4443 > localhost.52746: Flags [P.], seq 257:336,
ack 1370, win 512, options [nop,nop,TS val 2893776101 ecr 2893776101], length 79
13:52:00.520139 IP localhost.4443 > localhost.52746: Flags [P.], seq 336:894,
ack 1370, win 512, options [nop,nop,TS val 2893776102 ecr 2893776101], length
558
13:52:00.520158 IP localhost.52746 > localhost.4443: Flags [.], ack 894, win
512, options [nop,nop,TS val 2893776102 ecr 2893776101], length 0
13:52:00.553688 IP localhost.52746 > localhost.4443: Flags [P.], seq 1370:2143,
ack 894, win 512, options [nop,nop,TS val 2893776135 ecr 2893776101], length 773
13:52:00.562965 IP localhost.52748 > localhost.4443: Flags [.], ack 336, win
512, options [nop,nop,TS val 2893776145 ecr 2893776101], length 0
13:52:00.572809 IP localhost.4443 > localhost.52746: Flags [P.], seq 894:17548,
ack 2143, win 512, options [nop,nop,TS val 2893776154 ecr 2893776135], length
16654
13:52:00.614946 IP localhost.52746 > localhost.4443: Flags [.], ack 17548, win
512, options [nop,nop,TS val 2893776197 ecr 2893776154], length 0
13:52:05.577989 IP localhost.4443 > localhost.52746: Flags [P.], seq
17548:17572, ack 2143, win 512, options [nop,nop,TS val 2893781160 ecr
2893776197], length 24
13:52:05.578013 IP localhost.52746 > localhost.4443: Flags [.], ack 17572, win
512, options [nop,nop,TS val 2893781160 ecr 2893781160], length 0
13:52:05.578095 IP localhost.4443 > localhost.52746: Flags [F.], seq 17572, ack
2143, win 512, options [nop,nop,TS val 2893781160 ecr 2893781160], length 0
13:52:05.578155 IP localhost.52746 > localhost.4443: Flags [F.], seq 2143, ack
17573, win 512, options [nop,nop,TS val 2893781160 ecr 2893781160], length 0
13:52:05.578193 IP localhost.4443 > localhost.52746: Flags [.], ack 2144, win
512, options [nop,nop,TS val 2893781160 ecr 2893781160], length 0
^C
35 packets captured
78 packets received by filter
8 packets dropped by kernel
dnessett@Mount:~$
As is apparent, the apache server (listening on 4443) is sending traffic to
localhost.52748, not to localhost:4822. This leads me to believe that the
Virtual Host in the apache configuration is improperly configured, but, as I
said, I was just following the suggested configuration specified by the
guacamole tutorial.
If anyone can see the mistake, I would greatly appreciate some help in
rectifying it.