在本文档中,<SERVER> 是指您访问 Vaultwarden 的 IP 或域。如果反向代理和 Vaultwarden 都在同一个系统上运行,只需使用 localhost

默认情况下,Vaultwarden 在端口 80 上侦听 Web (REST API) 流量,在端口 3012 上侦听 WebSocket 流量(如果 启用WebSocket通知 已启用)。反向代理应配置为终止 SSL/TLS 连接(最好在端口 443,HTTPS 的标准端口上)。然后,反向代理根据需要将传入的客户端请求传递到端口 80 或 3012 上的 vaultwarden,并在收到来自 vaultwarden 的响应后,将该响应传递回客户端。

请注意,当您将 vaultwarden 置于反向代理之后时,反向代理和 vaultwarden 之间的连接通常被假定为通过安全的专用网络,因此不需要加密。下面的示例假设您在此配置中运行,在这种情况下,您不应启用 vaultwarden 内置的 HTTPS 功能(即,不应设置 ROCKET_TLS 环境变量)。如果这样做,连接将失败,因为反向代理使用 HTTP 连接到 vaultwarden,但您将 vaultwarden 配置为期望使用 HTTPS。

通常使用 Docker Compose 将容器化服务链接在一起(例如,Vaultwarden 和反向代理)。有关此示例,请参阅 使用Docker Compose 可以使用 Mozilla 的 SSL 配置生成器 生成网络服务器的安全 TLS 协议和密码配置。已知所有支持的浏览器和移动应用程序都可以使用现代配置。

Caddy 2.x

Caddy 2 可以在某些情况下自动启用 HTTPS,检查docs.

在 Caddyfile 语法中,{$VAR} 表示环境变量 VAR 的值。 如果您愿意,也可以直接指定一个值而不是替换一个 env var 值。

  1. {$DOMAIN}:443 {
  2. log {
  3. level INFO
  4. output file {$LOG_FILE} {
  5. roll_size 10MB
  6. roll_keep 10
  7. }
  8. }
  9. # 如果您想通过 ACME(Let's Encrypt 或 ZeroSSL)获得证书,请取消注释。
  10. # tls {$EMAIL}
  11. # 或者,如果您提供自己的证书,则取消注释。你也可以使用这个选项
  12. # 如果您在 Cloudflare 后面运行。
  13. # tls {$SSL_CERT_PATH} {$SSL_KEY_PATH}
  14. # 此设置可能与某些浏览器存在兼容性问题
  15. #(例如,在 Firefox 上下载附件)。尝试禁用此功能
  16. #如果你遇到问题。
  17. encode gzip
  18. # 取消注释以提高安全性(警告:仅在您了解含义时才使用!)
  19. # header {
  20. # # 启用 HTTP 严格传输安全 (HSTS)
  21. # Strict-Transport-Security "max-age=31536000;"
  22. # # 启用跨站点过滤器 (XSS) 并告诉浏览器阻止检测到的攻击
  23. # X-XSS-Protection "1; mode=block"
  24. # # 禁止在框架内渲染站点(点击劫持保护)
  25. # X-Frame-Options "DENY"
  26. # # 防止搜索引擎索引(可选)
  27. # X-Robots-Tag "none"
  28. # # 删除服务器名称
  29. # -Server
  30. # }
  31. # 取消注释以仅允许从本地网络访问管理界面
  32. # @insecureadmin {
  33. # not remote_ip 192.168.0.0/16 172.16.0.0/12 10.0.0.0/8
  34. # path /admin*
  35. # }
  36. # redir @insecureadmin /
  37. # 通知重定向到 websockets 服务器
  38. reverse_proxy /notifications/hub <SERVER>:3012
  39. # 将其他所有内容代理给 Rocket
  40. reverse_proxy <SERVER>:80 {
  41. # 将真正的远程IP发送给Rocket,以便Vaultwarden可以将其放入
  42. # 日志,以便fail2ban 可以禁止正确的IP
  43. header_up X-Real-IP {remote_host}
  44. }
  45. }

lighttpd (by forkbomb9)

  1. server.modules += ( "mod_proxy" )
  2. $HTTP["host"] == "vault.example.net" {
  3. $HTTP["url"] == "/notifications/hub" {
  4. # WebSocket proxy
  5. proxy.server = ( "" => ("vaultwarden" => ( "host" => "<SERVER>", "port" => 3012 )))
  6. proxy.forwarded = ( "for" => 1 )
  7. proxy.header = (
  8. "https-remap" => "enable",
  9. "upgrade" => "enable",
  10. "connect" => "enable"
  11. )
  12. } else {
  13. proxy.server = ( "" => ("vaultwarden" => ( "host" => "<SERVER>", "port" => 4567 )))
  14. proxy.forwarded = ( "for" => 1 )
  15. proxy.header = ( "https-remap" => "enable" )
  16. }
  17. }

在 Vaultwarden 环境中,您必须将IP_HEADER设置为X-Forwarded-For而不是X-Real-IP

Nginx (by shauder)

  1. server {
  2. listen 443 ssl http2;
  3. server_name vault.*;
  4. # Specify SSL config if using a shared one.
  5. #include conf.d/ssl/ssl.conf;
  6. # Allow large attachments
  7. client_max_body_size 128M;
  8. location / {
  9. proxy_pass http://<SERVER>:80;
  10. proxy_set_header Host $host;
  11. proxy_set_header X-Real-IP $remote_addr;
  12. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  13. proxy_set_header X-Forwarded-Proto $scheme;
  14. }
  15. location /notifications/hub {
  16. proxy_pass http://<SERVER>:3012;
  17. proxy_set_header Upgrade $http_upgrade;
  18. proxy_set_header Connection "upgrade";
  19. }
  20. location /notifications/hub/negotiate {
  21. proxy_pass http://<SERVER>:80;
  22. }
  23. # Optionally add extra authentication besides the ADMIN_TOKEN
  24. # If you don't want this, leave this part out
  25. location /admin {
  26. # See: https://docs.nginx.com/nginx/admin-guide/security-controls/configuring-http-basic-authentication/
  27. auth_basic "Private";
  28. auth_basic_user_file /path/to/htpasswd_file;
  29. proxy_set_header Host $host;
  30. proxy_set_header X-Real-IP $remote_addr;
  31. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  32. proxy_set_header X-Forwarded-Proto $scheme;
  33. proxy_pass http://<SERVER>:80;
  34. }
  35. }

如果您遇到 504 Gateway Timeout 问题,请通过向 server { 部分添加更长的超时时间来告诉 nginx 等待更长时间的保管库,例如:

  1. proxy_connect_timeout 777;
  2. proxy_send_timeout 777;
  3. proxy_read_timeout 777;
  4. send_timeout 777;

Nginx with sub-path (by BlackDex)

在此示例中,Vaultwarden 将通过 https://bitwarden.example.tld/vault/ 提供 如果你想使用任何其他子路径,比如 bitwardensecret-vault,你应该在下面的例子中更改 /vault/ 以匹配。

为此,您需要配置您的DOMAIN变量以使其匹配,因此它应该如下所示:

  1. ; 添加子路径!否则这是行不通的!
  2. DOMAIN=https://bitwarden.example.tld/vault/
  1. # 在这里定义服务器IP和端口。
  2. upstream vaultwarden-default { server 127.0.0.1:8080; }
  3. upstream vaultwarden-ws { server 127.0.0.1:3012; }
  4. # 将 HTTP 重定向到 HTTPS
  5. server {
  6. listen 80;
  7. listen [::]:80;
  8. server_name vaultwarden.example.tld;
  9. return 301 https://$host$request_uri;
  10. }
  11. server {
  12. listen 443 ssl http2;
  13. listen [::]:443 ssl http2;
  14. server_name vaultwarden.example.tld;
  15. # Specify SSL Config when needed
  16. #ssl_certificate /path/to/certificate/letsencrypt/live/vaultwarden.example.tld/fullchain.pem;
  17. #ssl_certificate_key /path/to/certificate/letsencrypt/live/vaultwarden.example.tld/privkey.pem;
  18. #ssl_trusted_certificate /path/to/certificate/letsencrypt/live/vaultwarden.example.tld/fullchain.pem;
  19. client_max_body_size 128M;
  20. ## Using a Sub Path Config
  21. # Path to the root of your installation
  22. location /vault/ {
  23. proxy_set_header Host $host;
  24. proxy_set_header X-Real-IP $remote_addr;
  25. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  26. proxy_set_header X-Forwarded-Proto $scheme;
  27. proxy_pass http://vaultwarden-default;
  28. }
  29. location /vault/notifications/hub/negotiate {
  30. proxy_set_header Host $host;
  31. proxy_set_header X-Real-IP $remote_addr;
  32. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  33. proxy_set_header X-Forwarded-Proto $scheme;
  34. proxy_pass http://vaultwarden-default;
  35. }
  36. location /vault/notifications/hub {
  37. proxy_set_header Upgrade $http_upgrade;
  38. proxy_set_header Connection $http_connection;
  39. proxy_set_header X-Real-IP $remote_addr;
  40. proxy_pass http://vaultwarden-ws;
  41. }
  42. # Optionally add extra authentication besides the ADMIN_TOKEN
  43. # If you don't want this, leave this part out
  44. location ^~ /vault/admin {
  45. # See: https://docs.nginx.com/nginx/admin-guide/security-controls/configuring-http-basic-authentication/
  46. auth_basic "Private";
  47. auth_basic_user_file /path/to/htpasswd_file;
  48. proxy_set_header Host $host;
  49. proxy_set_header X-Real-IP $remote_addr;
  50. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  51. proxy_set_header X-Forwarded-Proto $scheme;
  52. proxy_pass http://vaultwarden-default;
  53. }
  54. }

Nginx (by ypid)

Ansible 库存示例,使用 DebOps 将 nginx 配置为 Vaultwarden 的反向代理。我选择在 URL 中使用 PSK 以提高安全性,以免将 API 暴露给 Internet 上的每个人,因为客户端应用程序尚不支持客户端证书(我已对其进行了测试)。注意:使用subpath/PSK需要对源代码打补丁重新编译,参考:https://github.com/dani-garcia/vaultwarden/issues/241#issuecomment-436376497。 /admin 未经测试。有关安全的子路径托管的一般讨论,请参阅:https://github.com/debops/debops/issues/1233

  1. bitwarden__fqdn: 'vault.example.org'
  2. nginx__upstreams:
  3. - name: 'bitwarden'
  4. type: 'default'
  5. enabled: True
  6. server: 'localhost:8000'
  7. nginx__servers:
  8. - name: '{{ bitwarden__fqdn }}'
  9. filename: 'debops.bitwarden'
  10. by_role: 'debops.bitwarden'
  11. favicon: False
  12. root: '/usr/share/vaultwarden/web-vault'
  13. location_list:
  14. - pattern: '/'
  15. options: |-
  16. deny all;
  17. - pattern: '= /ekkP9wtJ_psk_changeme_Hr9CCTud'
  18. options: |-
  19. return 307 $scheme://$host$request_uri/;
  20. ## 然后,nginx 也需要设置所有安全 HTTP 标头。
  21. # - pattern: '/ekkP9wtJ_psk_changeme_Hr9CCTud/'
  22. # options: |-
  23. # alias /usr/share/vaultwarden/web-vault/;
  24. - pattern: '/ekkP9wtJ_psk_changeme_Hr9CCTud/'
  25. options: |-
  26. proxy_set_header Host $host;
  27. # proxy_set_header X-Real-IP $remote_addr;
  28. # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  29. proxy_set_header X-Forwarded-Proto $scheme;
  30. proxy_set_header X-Forwarded-Port 443;
  31. proxy_pass http://bitwarden;
  32. ##不要使用图标功能,只要它显示来自域
  33. ## 我们对服务器的凭据。
  34. - pattern: '/ekkP9wtJ_psk_changeme_Hr9CCTud/icons/'
  35. options: |-
  36. access_log off;
  37. log_not_found off;
  38. deny all;

Nginx (NixOS)(by tklitschi)

NixOS nginx 配置示例。有关 NixOS 部署的更多信息,请参阅 部署 Wiki 页面

  1. { config, ... }:
  2. {
  3. security.acme.acceptTerms = true;
  4. security.acme.email = "me@example.com";
  5. security.acme.certs = {
  6. "vw.example.com" = {
  7. group = "vaultwarden";
  8. keyType = "rsa2048";
  9. allowKeysForGroup = true;
  10. };
  11. };
  12. services.nginx = {
  13. enable = true;
  14. recommendedGzipSettings = true;
  15. recommendedOptimisation = true;
  16. recommendedProxySettings = true;
  17. recommendedTlsSettings = true;
  18. virtualHosts = {
  19. "vw.example.com" = {
  20. forceSSL = true;
  21. enableACME = true;
  22. locations."/" = {
  23. proxyPass = "http://localhost:8812"; #changed the default rocket port due to some conflict
  24. proxyWebsockets = true;
  25. };
  26. locations."/notifications/hub" = {
  27. proxyPass = "http://localhost:3012";
  28. proxyWebsockets = true;
  29. };
  30. locations."/notifications/hub/negotiate" = {
  31. proxyPass = "http://localhost:8812";
  32. proxyWebsockets = true;
  33. };
  34. };
  35. };
  36. };
  37. }

Apache (by fbartels)

请记住启用 mod_proxy_wstunnelmod_proxy_http,例如:a2enmod proxy_wstunnela2enmod proxy_http

  1. <VirtualHost *:443>
  2. SSLEngine on
  3. ServerName bitwarden.$hostname.$domainname
  4. SSLCertificateFile ${SSLCERTIFICATE}
  5. SSLCertificateKeyFile ${SSLKEY}
  6. SSLCACertificateFile ${SSLCA}
  7. ${SSLCHAIN}
  8. ErrorLog ${APACHE_LOG_DIR}/bitwarden-error.log
  9. CustomLog ${APACHE_LOG_DIR}/bitwarden-access.log combined
  10. RewriteEngine On
  11. RewriteCond %{HTTP:Upgrade} =websocket [NC]
  12. RewriteRule /notifications/hub(.*) ws://<SERVER>:3012/$1 [P,L]
  13. ProxyPass / http://<SERVER>:80/
  14. ProxyPreserveHost On
  15. ProxyRequests Off
  16. RequestHeader set X-Real-IP %{REMOTE_ADDR}s
  17. </VirtualHost>

Apache in a sub-location (by ss89)

修改您的 docker 启动以包含子位置。

  1. ; 添加子位置!否则这是行不通的!
  2. DOMAIN=https://$hostname.$domainname/$sublocation/

确保您在 apache 配置中的某处加载了 websocket 代理模块。 它看起来像:

  1. LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so`

在某些操作系统上,您可以使用 a2enmod,例如:a2enmod proxy_wstunnela2enmod proxy_http

  1. <VirtualHost *:443>
  2. SSLEngine on
  3. ServerName $hostname.$domainname
  4. SSLCertificateFile ${SSLCERTIFICATE}
  5. SSLCertificateKeyFile ${SSLKEY}
  6. SSLCACertificateFile ${SSLCA}
  7. ${SSLCHAIN}
  8. ErrorLog ${APACHE_LOG_DIR}/error.log
  9. CustomLog ${APACHE_LOG_DIR}/access.log combined
  10. <Location /$sublocation/> #adjust here if necessary
  11. RewriteEngine On
  12. RewriteCond %{HTTP:Upgrade} =websocket [NC]
  13. RewriteRule /notifications/hub(.*) ws://<SERVER>:3012/$1 [P,L]
  14. ProxyPass http://<SERVER>:80/$sublocation/
  15. ProxyPreserveHost On
  16. RequestHeader set X-Real-IP %{REMOTE_ADDR}s
  17. </Location>
  18. </VirtualHost>

Traefik v1 (docker-compose example)

  1. labels:
  2. - traefik.enable=true
  3. - traefik.docker.network=traefik
  4. - traefik.web.frontend.rule=Host:bitwarden.domain.tld
  5. - traefik.web.port=80
  6. - traefik.hub.frontend.rule=Host:bitwarden.domain.tld;Path:/notifications/hub
  7. - traefik.hub.port=3012
  8. - traefik.hub.protocol=ws

Traefik v2 (docker-compose example by hwwilliams)

Traefik v1 labels migrated to Traefik v2

  1. labels:
  2. - traefik.enable=true
  3. - traefik.docker.network=traefik
  4. - traefik.http.routers.bitwarden-ui.rule=Host(`bitwarden.domain.tld`)
  5. - traefik.http.routers.bitwarden-ui.service=bitwarden-ui
  6. - traefik.http.services.bitwarden-ui.loadbalancer.server.port=80
  7. - traefik.http.routers.bitwarden-websocket.rule=Host(`bitwarden.domain.tld`) && Path(`/notifications/hub`)
  8. - traefik.http.routers.bitwarden-websocket.service=bitwarden-websocket
  9. - traefik.http.services.bitwarden-websocket.loadbalancer.server.port=3012

迁移标签加上 HTTP 到 HTTPS 重定向

这些标签假设 Traefik 中为端口 80 和 443 定义的入口点分别是webwebsecure

这些标签还假设您已经在 Traefik 中定义了一个默认的证书解析器。

  1. labels:
  2. - traefik.enable=true
  3. - traefik.docker.network=traefik
  4. - traefik.http.middlewares.redirect-https.redirectScheme.scheme=https
  5. - traefik.http.middlewares.redirect-https.redirectScheme.permanent=true
  6. - traefik.http.routers.bitwarden-ui-https.rule=Host(`bitwarden.domain.tld`)
  7. - traefik.http.routers.bitwarden-ui-https.entrypoints=websecure
  8. - traefik.http.routers.bitwarden-ui-https.tls=true
  9. - traefik.http.routers.bitwarden-ui-https.service=bitwarden-ui
  10. - traefik.http.routers.bitwarden-ui-http.rule=Host(`bitwarden.domain.tld`)
  11. - traefik.http.routers.bitwarden-ui-http.entrypoints=web
  12. - traefik.http.routers.bitwarden-ui-http.middlewares=redirect-https
  13. - traefik.http.routers.bitwarden-ui-http.service=bitwarden-ui
  14. - traefik.http.services.bitwarden-ui.loadbalancer.server.port=80
  15. - traefik.http.routers.bitwarden-websocket-https.rule=Host(`bitwarden.domain.tld`) && Path(`/notifications/hub`)
  16. - traefik.http.routers.bitwarden-websocket-https.entrypoints=websecure
  17. - traefik.http.routers.bitwarden-websocket-https.tls=true
  18. - traefik.http.routers.bitwarden-websocket-https.service=bitwarden-websocket
  19. - traefik.http.routers.bitwarden-websocket-http.rule=Host(`bitwarden.domain.tld`) && Path(`/notifications/hub`)
  20. - traefik.http.routers.bitwarden-websocket-http.entrypoints=web
  21. - traefik.http.routers.bitwarden-websocket-http.middlewares=redirect-https
  22. - traefik.http.routers.bitwarden-websocket-http.service=bitwarden-websocket
  23. - traefik.http.services.bitwarden-websocket.loadbalancer.server.port=3012

HAproxy (by BlackDex)

将这些行添加到您的 haproxy 配置中。

  1. frontend vaultwarden
  2. bind 0.0.0.0:80
  3. option forwardfor header X-Real-IP
  4. http-request set-header X-Real-IP %[src]
  5. default_backend vaultwarden_http
  6. use_backend vaultwarden_ws if { path_beg /notifications/hub } !{ path_beg /notifications/hub/negotiate }
  7. backend vaultwarden_http
  8. # Enable compression if you want
  9. # compression algo gzip
  10. # compression type text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript
  11. server vwhttp 0.0.0.0:8080
  12. backend vaultwarden_ws
  13. server vwws 0.0.0.0:3012

HAproxy (by @williamdes)

将这些行添加到您的 HAproxy 配置中。

  1. backend static-success-default
  2. mode http
  3. errorfile 503 /usr/local/etc/haproxy/static/index.static.default.html
  4. errorfile 200 /usr/local/etc/haproxy/static/index.static.default.html
  5. frontend http-in
  6. bind *:80
  7. bind *:443 ssl crt /acme.sh/domain.tld/domain.tld.pem
  8. option forwardfor header X-Real-IP
  9. http-request set-header X-Real-IP %[src]
  10. default_backend static-success-default
  11. # Define hosts
  12. acl host_bitwarden_domain_tld hdr(Host) -i bitwarden.domain.tld
  13. ## 找出使用哪个
  14. use_backend vaultwarden_http if host_bitwarden_domain_tld !{ path_beg /notifications/hub } or { path_beg /notifications/hub/negotiate }
  15. use_backend vaultwarden_ws if host_bitwarden_domain_tld { path_beg /notifications/hub } !{ path_beg /notifications/hub/negotiate }
  16. backend vaultwarden_http
  17. # 如果需要,启用压缩
  18. # 压缩算法 gzip
  19. # 压缩类型 text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript
  20. # 如果您在 docker-compose 中使用 haproxy,则可以使用容器主机名
  21. server vw_http 0.0.0.0:8080
  22. backend vaultwarden_ws
  23. # 如果您在 docker-compose 中使用 haproxy,则可以使用容器主机名
  24. server vw_ws 0.0.0.0:3012

HAproxy inside PfSense (by @RichardMawdsley)

作为 GUI 设置,下面的详细信息说明供您在需要的地方添加。

  • 假设您已经有基本的 HTTP>HTTPS 重定向设置 基本设置

后端创建

Backend 1:

  1. Mode Name Forwardto Address Port Encrypt(SSL) SSL checks Weight Actions
  2. active Vaultwarden Address+Port: IPADDRESSHERE 80 no no

Backend 2:

  1. Mode Name Forwardto Address Port Encrypt(SSL) SSL checks Weight Actions
  2. active Vaultwarden-Notifications Address+Port: IPADDRESSHERE 3012 no no

前端创建 - 1 - 域

ACCESS CONTROL LIST

  1. ACL00
  2. Host matches:
  3. no
  4. no
  5. FQDN.com - NOTE: This needs to be your root domain.
  6. ACL00
  7. Path starts with:
  8. no
  9. yes
  10. /big-ass-randomised-test-that-really-no-one-is-ever-going-to-type-DONT-USE-THIS-LINE-THOUGH-make-your-own-up
  11. ACL01
  12. Host matches:
  13. no
  14. no
  15. VAULTWARDEN.MYDOMAIN.COM
  16. ACL01
  17. Host matches:
  18. no
  19. no
  20. EXAMPLE-OTHER-SUB-DOMAIN-1.MYDOMAIN.COM
  21. ACL01
  22. Host matches:
  23. no
  24. no
  25. EXAMPLE-OTHER-SUB-DOMAIN-2.MYDOMAIN.COM

ACTIONS - 1 - Domain

  1. http-request allow
  2. See below
  3. ACL01
  4. http-request deny
  5. See below
  6. ACL00

前端创建 - 2 - VaultWarden

ACCESS CONTROL LIST

  1. ACL1
  2. Path starts with:
  3. no
  4. yes
  5. /notifications/hub
  6. ACL2
  7. Path starts with:
  8. no
  9. no
  10. /notifications/hub/negotiate
  11. ACL3
  12. Path starts with:
  13. no
  14. no
  15. /notifications/hub
  16. ACL4
  17. Path starts with:
  18. no
  19. yes
  20. /notifications/hub/negotiate
  21. ACL5
  22. Path starts with:
  23. no
  24. no
  25. /admin

ACTIONS - 2 - VaultWarden

  1. Use Backend
  2. See below
  3. ACL1
  4. backend: VaultWarden
  5. Use Backend
  6. See below
  7. ACL2
  8. backend: VaultWarden
  9. Use Backend
  10. See below
  11. ACL3
  12. backend: VaultWarden-Notifications
  13. Use Backend
  14. See below
  15. ACL4
  16. backend: VaultWarden-Notifications
  17. http-request deny
  18. See below
  19. ACL5

Updates

  1. 30/07 以上更新 - 我在第一个配置之后意识到,因为 ACL1-4 `Not`,他们正在将任何东西与他们的行动相匹配。所以 BlahBlahMcGee.FQDN.com 正在通过。这不是故意的,所以上面添加了 ACL5 来解决这个问题,它还消除了对默认后端的需要。
  2. 30/07 再次更新 - ^ 是的,没用。这一切都源于 HaProxy 不允许在 ACL 中使用`AND`。叹。现在有了上面的内容,您就可以为根域配置一个前端。这有一个否认本身,以及任何未指定的内容。因此,如果您要通过多个其他子域,则需要将它们全部添加到 ACL01 下。现在一切正常!

Important Notes

  1. 1) 您必须使域前端与允许列表中的任何其他子域保持同步
  2. 2) 在域前端,ACL01 必须位于 Actions 表的顶部 - 或至少高于 ACL00
  3. 3) ACL 名称的重复使用是有意的。不,我没有打错它们。 ACL00ACL01

OPTIONAL

  1. 上述 ACL5 拒绝访问 /admin 门户。我不是特别喜欢没有任何形式的 2FA 且只有密码的管理门户。因此,当我不使用它时,我只是拒绝访问。如果我需要它,请取消阻止,完成所需的工作并重新阻止。

完成! - 去测试!

This in turn will add the equivilent of below to your config (note this is an extract for example).

  1. acl ACL00 var(txn.txnhost) -m str -i VAULTWARDEN.MYDOMAIN.COM
  2. acl ACL00 var(txn.txnpath) -m beg -i /big-ass-randomised-test-that-really-no-one-is-ever-going-to-type-DONT-USE-THIS-LINE-THOUGH-make-your-own-up
  3. acl ACL01 var(txn.txnhost) -m str -i EXAMPLE-OTHER-SUB-DOMAIN-1.MYDOMAIN.COM
  4. acl ACL01 var(txn.txnhost) -m str -i EXAMPLE-OTHER-SUB-DOMAIN-2.MYDOMAIN.COM
  5. acl ACL1 var(txn.txnpath) -m beg -i /notifications/hub
  6. acl ACL2 var(txn.txnpath) -m beg -i /notifications/hub/negotiate
  7. acl ACL3 var(txn.txnpath) -m beg -i /notifications/hub
  8. acl ACL4 var(txn.txnpath) -m beg -i /notifications/hub/negotiate
  9. acl ACL5 var(txn.txnpath) -m beg -i /admin
  10. http-request allow if ACL01
  11. http-request deny if !ACL00
  12. http-request deny if !ACL5
  13. http-request deny if ACL5
  14. use_backend VaultWarden_ipvANY if !ACL1
  15. use_backend VaultWarden_ipvANY if ACL2
  16. use_backend VaultWarden-Notifications_ipvANY if ACL3
  17. use_backend VaultWarden-Notifications_ipvANY if !ACL4

为了进行测试,如果您在浏览器中导航到 /notifications/hub,那么您应该会看到一个页面,上面写着WebSocket 协议错误:无法解析 WebSocket 密钥。……这意味着它可以正常工作! - 所有其他子页面都应该出现 Rocket 错误。