2 votes

Site web basé sur Websocket derrière un proxy inverse dans IIS

J'essaie de faire fonctionner un site web basé sur des sockets web qui est proxé inversement par un serveur IIS.

Situation

  • IIS v10.0.19041.1 en cours d'exécution Windows 10 Pro .
  • Certificat SSL de LetsEncrypt et installé/géré par Win-ACME dans IIS.
  • FoundryVTT v0.7.3 serveur dédié fonctionnant dans un FreeNAS 11.4-RELEASE-p2 jail (il s'agit du site web basé sur la technologie websocket).
  • FoundryVTT utilise socket.io para node.js .
  • Le serveur FoundryVTT se trouve à IP 192.168.2.36 y Port 30000 .

Observation

  • Le serveur FoundryVTT fonctionne correctement sur le réseau local.
  • Le certificat SSL est valide et fonctionnel et le serveur est accessible depuis le réseau étendu.
  • Tout fonctionne correctement lors du chargement de la page de configuration de FoundryVTT via le WAN, mais dès que j'ai saisi ma clé d'accès administrateur, une page de configuration vide s'affiche. La communauté FoundryVTT mentionne qu'il s'agit d'un problème connu avec des proxies mal configurés. Empty Setup page
  • En observant le trafic web à l'aide de Fiddler v5.0.2020.18177, je constate que j'obtiens une réponse HTTP 101 pour passer au protocole websocket. Fiddler websocket response
  • Un double-clic sur la capture ne me permet pas d'aller dans l'onglet websocket pour y inspecter le trafic. Je soupçonne qu'aucune connexion n'est établie car je vois plusieurs autres réponses du protocole 101 switch après la première initiale, avec de légers délais entre les deux.

Qu'ai-je essayé ?

  • J'ai vérifié que la fonctionnalité WebSocket Protocol est installée. Windows Features - WebSocket Protocol

  • J'ai vérifié que les websockets sont activés sur mon site web dans IIS. IIS - Configuration Editor - webSocket

  • J'ai essayé de jouer avec la fonction web.config en suivant diverses suggestions faites par des personnes sur l'internet (i.e. cette , cette y cette ). web.config tel qu'il est actuellement :

      <?xml version="1.0" encoding="UTF-8"?>
      <configuration>
          <system.webServer>
              <rewrite>
                  <rules>
                      <clear />
                      <rule name="Web Socket Reverse" enabled="true" stopProcessing="true">
                          <match url="ws:///example.com:30000(.*)" />
                          <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
                          </conditions>
                          <action type="Rewrite" url="ws://192.168.2.36:30000/{R:1}" />
                      </rule>
                      <rule name="Web Socket Reverse 2" enabled="true" stopProcessing="true">
                          <match url="wss://example.com:30000(.*)" />
                          <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
                          </conditions>
                          <action type="Rewrite" url="wss://192.168.2.36:30000/{R:1}" />
                      </rule>
                      <rule name="HTTPS redirect" enabled="true" stopProcessing="true">
                          <match url="(.*)" />
                          <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
                              <add input="{HTTPS}" pattern="^OFF$" />
                          </conditions>
                          <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" />
                      </rule>     
                      <rule name="FoundryVTT proxy" stopProcessing="true">
                        <match url="(.*)" />
                        <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
                          <add input="{HTTP_HOST}" pattern="example.com" />
                        </conditions>
                        <action type="Rewrite" url="http://192.168.2.36:30000/{R:1}" />
                        <serverVariables>
                          <set name="HTTP_X_ORIGINAL_ACCEPT_ENCODING" value="{HTTP_ACCEPT_ENCODING}" />
                          <set name="HTTP_ACCEPT_ENCODING" value="" />
                        </serverVariables>
                      </rule>
                      <rule name="RequestBlockingRule1" enabled="true" patternSyntax="Wildcard" stopProcessing="true">
                          <match url="*" />
                          <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
                              <add input="{URL}" pattern="*" />
                              <add input="{HTTP_HOST}" pattern="example.com" negate="true" />
                          </conditions>
                          <action type="CustomResponse" statusCode="403" statusReason="Forbidden: Access is denied." statusDescription="You do not have permission to view this directory or page using the credentials that you supplied." />
                      </rule>
                  </rules>
                  <outboundRules>
                      <rule name="RestoreAcceptEncoding" preCondition="NeedsRestoringAcceptEncoding">
                        <match serverVariable="HTTP_ACCEPT_ENCODING" pattern="^(.*)" />
                        <conditions logicalGrouping="MatchAll" trackAllCaptures="true" />
                        <action type="Rewrite" value="{HTTP_X_ORIGINAL_ACCEPT_ENCODING}" />
                      </rule>
                      <rule name="ReverseProxyOutboundRule1" preCondition="ResponseIsHtml1">
                          <match filterByTags="A, Form, Img" pattern="^http(s)?://192.168.2.36:30000/(.*)" />
                          <action type="Rewrite" value="http{R:1}://example.com/{R:2}" />
                      </rule>
                      <preConditions>
                        <preCondition name="ResponseIsHtml1">
                          <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
                        </preCondition>
                        <preCondition name="NeedsRestoringAcceptEncoding">
                          <add input="{HTTP_X_ORIGINAL_ACCEPT_ENCODING}" pattern=".+" />
                        </preCondition>
                      </preConditions>
                    </outboundRules>
                  <rewriteMaps>
                      <!--{MapProtocol:{HTTPS}}-->
                      <rewriteMap name="MapProtocol">
                          <add key="on" value="https" />
                          <add key="off" value="http" />
                      </rewriteMap>
                  </rewriteMaps>
              </rewrite>
              <urlCompression doStaticCompression="false" doDynamicCompression="false" />
          </system.webServer>
      </configuration>
  • J'ai redémarré le site web IIS, utilisé le mode incognito dans mon navigateur, désactivé les modules complémentaires et utilisé un autre navigateur.

  • J'ai consulté des guides sur la manière de le configurer pour NGINX , Caddy y Apache comme inspiration (IIS n'est pas présent sur le wiki).

  • J'ai posé des questions sur leur chat Discord, mais personne ne semble en savoir assez sur IIS.

Un extrait du journal IIS lors de la visite du site web FoundryVTT :

    2020-10-12 16:04:13 192.168.2.11 POST /setup X-ARR-CACHE-HIT=0&X-ARR-LOG-ID=8c5986c1-768f-4833-b71b-04ed4bae47f1&SERVER-STATUS=302 443 - SOMEHOST.net Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/86.0.4240.75+Safari/537.36 https://example.com/setup 302 0 0 35
    2020-10-12 16:04:13 192.168.2.11 GET /setup X-ARR-CACHE-HIT=0&X-ARR-LOG-ID=fddb90ae-27b7-4cce-b3b0-a6864d451514&SERVER-STATUS=200 443 - SOMEHOST.net Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/86.0.4240.75+Safari/537.36 https://example.com/setup 200 0 0 25
    2020-10-12 16:04:13 192.168.2.11 GET /css/style.css X-ARR-CACHE-HIT=0&X-ARR-LOG-ID=0a2d276f-6985-4fd7-9d21-1e4f63cacb80&SERVER-STATUS=304 443 - SOMEHOST.net Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/86.0.4240.75+Safari/537.36 https://example.com/setup 304 0 0 26
    2020-10-12 16:04:13 192.168.2.11 GET /fonts/fontawesome/css/all.min.css X-ARR-CACHE-HIT=0&X-ARR-LOG-ID=78f40fa3-22bd-47ac-8987-03ec7ea70a5d&SERVER-STATUS=304 443 - SOMEHOST.net Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/86.0.4240.75+Safari/537.36 https://example.com/setup 304 0 0 23
    2020-10-12 16:04:13 192.168.2.11 GET /scripts/jquery.min.js X-ARR-CACHE-HIT=0&X-ARR-LOG-ID=f94993ac-23a7-4b71-8db9-45b564c91a40&SERVER-STATUS=304 443 - SOMEHOST.net Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/86.0.4240.75+Safari/537.36 https://example.com/setup 304 0 0 22
    2020-10-12 16:04:13 192.168.2.11 GET /scripts/handlebars.min.js X-ARR-CACHE-HIT=0&X-ARR-LOG-ID=cf0118b0-6a3d-4fb1-8654-abfbcfc6af35&SERVER-STATUS=304 443 - SOMEHOST.net Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/86.0.4240.75+Safari/537.36 https://example.com/setup 304 0 0 21
    2020-10-12 16:04:13 192.168.2.11 GET /scripts/handlebars-intl.min.js X-ARR-CACHE-HIT=0&X-ARR-LOG-ID=b76f116d-213f-44b8-9479-8ed79157c623&SERVER-STATUS=304 443 - SOMEHOST.net Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/86.0.4240.75+Safari/537.36 https://example.com/setup 304 0 0 21
    2020-10-12 16:04:13 192.168.2.11 GET /scripts/foundry.js X-ARR-CACHE-HIT=0&X-ARR-LOG-ID=94e56a90-ae3e-4095-bb40-00ae04033be1&SERVER-STATUS=304 443 - SOMEHOST.net Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/86.0.4240.75+Safari/537.36 https://example.com/setup 304 0 0 27
    2020-10-12 16:04:13 192.168.2.11 GET /scripts/howler.min.js X-ARR-CACHE-HIT=0&X-ARR-LOG-ID=31c85a47-e7f8-40e6-b242-79377bb9136f&SERVER-STATUS=304 443 - SOMEHOST.net Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/86.0.4240.75+Safari/537.36 https://example.com/setup 304 0 0 27
    2020-10-12 16:04:13 192.168.2.11 GET /scripts/pixi.min.js X-ARR-CACHE-HIT=0&X-ARR-LOG-ID=ffb1b3d7-00cf-4d68-8cf9-e3e87bf6b811&SERVER-STATUS=304 443 - SOMEHOST.net Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/86.0.4240.75+Safari/537.36 https://example.com/setup 304 0 0 27
    2020-10-12 16:04:13 192.168.2.11 GET /scripts/socket.io.slim.js X-ARR-CACHE-HIT=0&X-ARR-LOG-ID=4f937d01-ead6-437c-9e4e-fc050ccd2556&SERVER-STATUS=304 443 - SOMEHOST.net Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/86.0.4240.75+Safari/537.36 https://example.com/setup 304 0 0 27
    2020-10-12 16:04:13 192.168.2.11 GET /scripts/tinymce.min.js X-ARR-CACHE-HIT=0&X-ARR-LOG-ID=343bfaca-427e-47a1-a168-b4250f62fc0e&SERVER-STATUS=304 443 - SOMEHOST.net Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/86.0.4240.75+Safari/537.36 https://example.com/setup 304 0 0 27
    2020-10-12 16:04:13 192.168.2.11 GET /socket.io/ session=ne19sc1orug1dsk7ndn1u4i7&EIO=3&transport=websocket&X-ARR-CACHE-HIT=0&X-ARR-LOG-ID=7afb0d81-b323-4e94-8ae7-c1a90bc2ef1c&SERVER-STATUS=101 443 - SOMEHOST.net Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/86.0.4240.75+Safari/537.36 - 502 5 12152 53

2voto

Neijwiert Points 83

Apparemment, IIS ne peut donc pas gérer le permessage-deflate (voir cette question ) pour l'extension Sec-WebSocket-Extensions l'en-tête. La solution consiste à effacer l'en-tête, car c'est la seule extension utilisée par FoundryVTT :

<serverVariables>
  <set name="HTTP_SEC_WEBSOCKET_EXTENSIONS" value="" />
</serverVariables>

N'oubliez pas d'ajouter HTTP_SEC_WEBSOCKET_EXTENSIONS comme variable serveur autorisée pour votre site.

Web Socket Reverse , Web Socket Reverse 2 y ReverseProxyOutboundRule1 ne sont pas nécessaires pour que FoundryVTT fonctionne avec IIS.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X