【Guacamole中文文档】二、用户指南 —— 4.代理Guacamole
代理Guacamole
像大多數web應用程序一樣,Guacamole可以放在反向代理后面。對于Guacamole的生產部署,強烈建議這樣做。它提供了靈活性,且如果代理針對SSL進行了正確配置,還可以提供加密。
代理隔離了本機應用程序中的特權操作,這些操作可以在不再需要時安全地丟棄這些特權,僅將Java用于非特權任務。在Linux和UNIX系統上,進程必須以root權限運行,才能偵聽1024以下的任何端口,包括標準HTTP和HTTPS端口(分別為80和443)。如果servlet容器改為偵聽更高的端口,例如默認端口8080,那么它可以作為降低權限的用戶運行,從而允許反向代理承擔root特權的負擔。作為本機應用程序,反向代理可以在端口打開后進行系統調用,以安全地丟棄root權限;像Tomcat這樣的Java應用程序則無法做到這一點。
準備你的servlet容器
你的servlet容器很可能已經默認配置為偵聽端口8080上的HTTP連接。如果是這種情況,且你已經可以從web瀏覽器通過端口8080訪問Guacamole,則無需對其配置進行任何進一步更改。
如果你改變了這一點,或許是為了在AJP上代理Guacamole,請把它改回來。不支持在AJP上使用Guacamole,眾所周知它會產生問題,即:
conf/server.xml中的Connector條目應如下所示:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"URIEncoding="UTF-8"redirectPort="8443" />確保如上指定URIEncoding="UTF-8"屬性,以確保web應用程序正確地接收連接名、用戶名等。如果要創建的連接的名稱或參數值中包含西里爾文、中文、日文或其他非拉丁字符,則該屬性是必需的。
設置遠程IP值
默認情況下,當Tomcat位于反向代理后面時,它看到的客戶端的遠程IP地址是代理的IP地址,而不是原始客戶端的遠程IP地址。為了讓托管在Tomcat中的應用程序(如Guacamole)能夠看到客戶端的真實IP地址,必須同時配置反向代理和Tomcat。
因為Guacamole中的遠程IP地址用于審核用戶登錄和連接,并且可能用于身份驗證,所以直接控制代理服務器或者明確信任它非常重要。通過X-Forwarded-For報頭傳遞遠程IP地址,與大多數HTTP報頭一樣,攻擊者可以嘗試欺騙該報頭,以操縱web服務器的行為,獲得對系統的未經授權訪問,或試圖偽裝攻擊源的主機或IP地址。
最后一個警告:如果在你的反向代理和訪問Guacamole的客戶端之間存在其他上游代理服務器,那么可能無法按預期的想法工作。其他代理或防火墻可能會屏蔽客戶端的IP地址,如果這些代理或防火墻的配置不在你的控制范圍內,你可能最終會看到多個客戶端似乎來自同一IP地址或主機。確保在配置系統和查看提供的數據時考慮到這一點。
將Tomcat配置為通過X-Forwarded-For報頭中的反向代理提供的遠程IP地址,需要Tomcat稱之為Value的配置項。在本例中,它是RemoteIpValve,在conf/server.xml文件的<Host>部分進行配置:
<Valve className="org.apache.catalina.valves.RemoteIpValve"internalProxies="127.0.0.1"remoteIpHeader="x-forwarded-for"remoteIpProxiesHeader="x-forwarded-by"protocolHeader="x-forwarded-proto" />internalProxies的值應該設置為任一且所有反向代理都可以直接訪問該Tomcat實例的代理的IP地址或地址。通常與Tomcat同在一個系統上運行,但在其他情況下(如,運行在Docker容器中時),它可能在不同的系統或容器上運行,且可能需要設置為反向代理系統的真實IP地址。僅允許internalProxies或trustedProxies參數中列出的代理服務器控制遠程IP地址信息。
該配置中的其他參數允許你控制哪些來自代理服務器的用于各種遠程主機信息的報頭,如下所示:
-
remoteIpHeader
用于查詢發起請求的客戶端的客戶端IP地址的報頭。標準值為X-Forwarded-For,也可以配置為任何你喜歡的報頭。該報頭中的IP地址將可用于request.getRemoteAddr()方法中的Java應用程序。
-
remoteIpProxiesHeader
用以查詢轉發請求的代理服務器的IP地址的報頭。默認值為X-Forwarded-By,但可以配置為適合你環境的任意報頭。僅當trustedProxies參數中列出了使用的代理時,Value才允許該值。否則,此報頭將不可用。
-
protocolHeader
用以查詢客戶端用于連接服務的協議的報頭。默認值為X-Forwarded-Proto,但可以配置為符合你環境的任意報頭。
除了配置Tomcat來正確處理這些報頭之外,還可能需要適當配置你的反向代理來發送報頭。你可以在《Nginx》章節找到這方面的說明,Apache web服務默認會傳遞它。
Nginx
Nginx可以作為反向代理,從1.3版開始就支持WebSocket的開箱即用。Apache和Nginx都需要一些額外的配置以便WebSocket代理能正常工作。
代理Guacamole
Nginx確實支持WebSocket代理,但由于WebSocket協議的性質,需要顯式設置Connection和Upgrade這兩個HTTP報頭。從Nginx文檔中:
NGINX通過允許在客戶端和后端服務器之間建立隧道來支持WebSocket。為了讓NGINX將Upgrade請求從客戶端發送到后端服務器,必須顯式設置Upgrade和Connection報頭......代理配置應在一個專用的location塊下,聲明托管Guacamole的后端,并明確指定前面提到的Connection和Upgrade報頭:
location /guacamole/ {proxy_pass http://HOSTNAME:8080;proxy_buffering off;proxy_http_version 1.1;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection $http_connection;access_log off; }此處,HOSTNAME是托管你的servlet容器的機器的主機名或IP地址,8080是servlet容器配置使用的端口。你需要將這些值正確的配置為與你的服務匹配的內容。
Tomcat與RemoteIpValve相關的配置,記錄在《設置遠程IP值》章節, 如果希望將X-Forwarded-For報頭傳遞給web應用程序服務器,并可供其中運行的應用程序使用, proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;這一行非常重要。
?重點: 別忘了指定“proxy_buffering off”。包括Nginx在內的大多數代理都會緩存通過連接發送的所有數據,直到連接關閉后再將數據發送到客戶端。由于Guacamole的HTTP隧道依賴于通過開放連接將數據流傳輸到客戶端,過度的緩存會有效地阻止Guacamole連接,使Guacamole變得無用。如果沒有指定“proxy_buffering off”選項,Guacamole可能無法運轉。變更路徑
如果你希望在Nginx下通過不同于/guacamole/的路徑來提供Guacamole服務,最簡單的方法是簡單地重命名.war文件。例如,如果打算在/new-path/提供Guacamole服務,你需要:
將guacamole.war重命名為new-path.war。
更新Nginx配置中的路徑為新的路徑:
location /new-path/ {proxy_pass http://HOSTNAME:8080;proxy_buffering off;proxy_http_version 1.1;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection $http_connection;access_log off; }或者,可以稍微更改下配置,變為在外部處理不同位置的請求,同時仍在/guacamole/上處理內部請求:
location /new-path/ {proxy_pass http://HOSTNAME:8080/guacamole/;proxy_buffering off;proxy_http_version 1.1;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection $http_connection;access_log off; }調整文件上傳限制
通過Nginx代理Guacamole時,可能會遇到Nginx對文件上傳設置的默認限制問題(1MB)。收到的錯誤可能是非直觀的(例如,權限被拒絕),但可能表明存在這些限制。可以在location塊中設置client_max_body_size參數,以配置最大文件上傳大小:
location /guacamole/ {proxy_pass http://HOSTNAME:8080;proxy_buffering off;proxy_http_version 1.1;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection $http_connection;client_max_body_size 1g;access_log off; }Apache和mod_proxy
Apache支持通過mod_proxy 進行反向代理配置。2.4.5或更高版本的Apache同樣支持通過名為mod_proxy_wstunnel 的子模塊代理WebSocket。這兩個模塊都需要啟用,Guacamole的代理才能正常運行。
缺少mod_proxy_wstuunel,仍然可以代理Guacamole,但Guacamole將不能使用WebSocket。它將轉而使用HTTP隧道,從而導致性能下降。
代理Guacamole
配置Apache代理HTTP請求需要使用mod_proxy模塊提供的ProxyPass 和ProxyPassReverse 指令。這些指令描述了HTTP通信應該如何路由到代理后面的web服務器:
<Location /guacamole/>Order allow,denyAllow from allProxyPass http://HOSTNAME:8080/guacamole/ flushpackets=onProxyPassReverse http://HOSTNAME:8080/guacamole/ </Location>此處,HOSTNAME是托管你的servlet容器的機器的主機名或IP地址,8080是servlet容器配置使用的端口。你需要將這些值正確的配置為與你的服務匹配的內容。
?重點: 別忘了“flushpackets=on”選項。包括mod_proxy在內的多數代理都會緩存通過連接發送的所有數據,直到連接關閉后再將數據發送到客戶端。由于Guacamole的HTTP隧道依賴于通過開放連接將數據流傳輸到客戶端,過度的緩存會有效地阻止Guacamole連接,使Guacamole變得無用。如果沒有指定“flushpackets=on”選項,Guacamole可能無法運轉。代理WebSocket隧道
Apache不會自動代理WebSocket連接,但你可以使用Apache 2.4.5和更高版本利用mod_proxy_wstunnel單獨代理它們。啟用mod_proxy_wstunnel后,可以添加一個次要的location部件,該部件明確地代理位于/Guacamole/WebSocket-tunnel的Guacamole WebSocket隧道:
<Location /guacamole/>Order allow,denyAllow from allProxyPass http://HOSTNAME:8080/guacamole/ flushpackets=onProxyPassReverse http://HOSTNAME:8080/guacamole/ </Location><Location /guacamole/websocket-tunnel>Order allow,denyAllow from allProxyPass ws://HOSTNAME:8080/guacamole/websocket-tunnelProxyPassReverse ws://HOSTNAME:8080/guacamole/websocket-tunnel </Location>如果沒有這一點,Guacamole仍然可以通過使用正常的HTTP來工作,但網絡延遲將在用戶輸入方面更加明顯,性能可能更低。
?重點: “/guacamole/websocket”隧道的Location部件必須放置在其余Guacamole的Location部件之后。Apache評估所有Location部件,將優先考慮匹配的最后一個部分。如果首先是"/guacamole/websocket-tuunel"部件,"/guacamole/"部件反而能匹配,WebSocket卻無法正確代理。變更路徑
如果你希望在Apache下通過不同于/guacamole/的路徑來提供Guacamole服務,最簡單的方法是簡單地重命名.war文件。例如,如果打算在/new-path/提供Guacamole服務,你需要:
將guacamole.war重命名為new-path.war。
更新Apache配置中的路徑為新的路徑:
<Location /new-path/>Order allow,denyAllow from allProxyPass http://HOSTNAME:8080/new-path/ flushpackets=onProxyPassReverse http://HOSTNAME:8080/new-path/ </Location><Location /new-path/websocket-tunnel>Order allow,denyAllow from allProxyPass ws://HOSTNAME:8080/new-path/websocket-tunnelProxyPassReverse ws://HOSTNAME:8080/new-path/websocket-tunnel </Location>或者,可以稍微更改下配置,變為在外部處理不同位置的請求,同時仍在/guacamole/上處理內部請求:
<Location /new-path/>Order allow,denyAllow from allProxyPass http://HOSTNAME:8080/guacamole/ flushpackets=onProxyPassReverse http://HOSTNAME:8080/guacamole/ </Location><Location /new-path/websocket-tunnel>Order allow,denyAllow from allProxyPass ws://HOSTNAME:8080/guacamole/websocket-tunnelProxyPassReverse ws://HOSTNAME:8080/guacamole/websocket-tunnel </Location>禁用隧道請求的日志記錄
如果WebSocket不可用,Guacamole將轉而使用基于HTTP的隧道。Guacamole HTTP隧道的工作原理是通過多個短期流傳輸連續的數據流,每個流都與一個單獨的HTTP請求相關聯。默認情況下,Apache將記錄這些請求中的每一個,從而導致訪問日志相當臃腫。
充滿相同隧道請求的日志文件幾乎沒有價值,因此建議顯式禁用這些請求的日志記錄。Apache確實提供了一種匹配URL模式的方法,并根據URL是否匹配來設置環境變量。然后,可以將日志記錄限制為缺少此環境變量的請求:
SetEnvIf Request_URI "^/guacamole/tunnel" dontlog CustomLog /var/log/apache2/guac.log common env=!dontlog注意,如果你在不同于/guacamole/的路徑下提供Guacamole,則需要相應地更改上述Request_URI的值。
總結
以上是生活随笔為你收集整理的【Guacamole中文文档】二、用户指南 —— 4.代理Guacamole的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IOC和DI的关系
- 下一篇: 小说:凡人修仙路基础