AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题

问题[caddy](server)

Martin Hope
claypooj
Asked: 2022-08-21 22:03:17 +0800 CST

Caddy 反向代理 curl 在内部工作,但在外部返回 content-length: 0

  • 1

背景和问题

我正在尝试将 Caddy 设置为其他两个 Web 应用程序和静态文件服务器(都在一台机器上)之间的反向代理。当我curl使用内部 IP 时,它按预期工作,但是当我尝试curl使用外部 IP 时,它返回content-length: 0. 最终,我的问题是为什么会这样?

我没有使用域名,只是直接IP。我知道我可以从一堆不同的 DNS 主机获得一个免费域;我真的宁愿不要。

网络设置

我有一个连接到单个物理服务器的路由器,该服务器是 Caddy 和两个 Web 应用程序的所在地。我将端口 443 从我的路由器转发到安装了 Caddy 的服务器。

curl结果

192.168.1.5是我的内部IP。203.0.113.0表示我的外部 IP(感谢@Nikita Kipriyanov 指出RFC1918和RFC5737)。

看起来这两个请求至少都发送到了 Caddy(基于 HTTP/2 200 行),但我不明白为什么当请求来自外部 IP 时,它什么也不返回。这两个请求都不会在 Caddy 终端输出中产生任何错误。

就像我之前提到的,我没有使用域名,只是直接使用 IP。我不确定这是否与我所看到的问题有关,但在我看来,这无关紧要;我已经告诉过使用该选项curl忽略有关不受信任证书的警告。-k

使用内部 IP 时的输出

admin@server:~$ curl -vk https://192.168.1.5/
*   Trying 192.168.1.5:443...
* TCP_NODELAY set
* Connected to 192.168.1.5 (192.168.1.5) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_128_GCM_SHA256
* ALPN, server accepted to use h2
* Server certificate:
*  subject: [NONE]
*  start date: Aug 21 00:46:28 2022 GMT
*  expire date: Aug 21 12:46:28 2022 GMT
*  issuer: CN=Caddy Local Authority - ECC Intermediate
*  SSL certificate verify result: unable to get local issuer certificate (20), continuing anyway.
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle 0x561a91115210)
> GET / HTTP/2
> Host: 192.168.1.5
> user-agent: curl/7.68.0
> accept: */*
> 
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* Connection state changed (MAX_CONCURRENT_STREAMS == 250)!
< HTTP/2 200 
< content-type: text/html; charset=utf-8
< cross-origin-opener-policy: same-origin
< referrer-policy: same-origin
< server: Caddy
< x-content-type-options: nosniff
< x-frame-options: DENY
< content-length: 2921
< date: Sun, 21 Aug 2022 05:07:17 GMT
 
<!doctype html>
<html lang="en">
  <body>
    <h1>Hello World!</h1>
  </body>
</html>
* Connection #0 to host 192.168.1.5 left intact

使用外部 IP 时的输出

admin@server:~$ curl -vk https://203.0.113.0/
*   Trying 203.0.113.0:443...
* TCP_NODELAY set
* Connected to 203.0.113.0 (203.0.113.0) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_128_GCM_SHA256
* ALPN, server accepted to use h2
* Server certificate:
*  subject: [NONE]
*  start date: Aug 21 00:46:28 2022 GMT
*  expire date: Aug 21 12:46:28 2022 GMT
*  issuer: CN=Caddy Local Authority - ECC Intermediate
*  SSL certificate verify result: unable to get local issuer certificate (20), continuing anyway.
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle 0x55e3ae7aa210)
> GET / HTTP/2
> Host: 203.0.113.0
> user-agent: curl/7.68.0
> accept: */*
> 
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* Connection state changed (MAX_CONCURRENT_STREAMS == 250)!
< HTTP/2 200 
< server: Caddy
< content-length: 0
< date: Sun, 21 Aug 2022 05:08:16 GMT
< 
* Connection #0 to host 203.0.113.0 left intact

球童档案

192.168.1.5是我的内部IP。

我知道 app-one 有两个句柄;存在一个配置问题,即 app-one 丢弃尾随/和重定向,然后导致 app-two(具有包罗万象句柄的那个)匹配,因此修复是为这种情况创建第二个句柄。我很有信心这不是问题。

{
        default_sni 192.168.1.5
}

https://192.168.1.5:443 {
        handle /file-server/* {
                root * /var/
                file_server browse
        }

        handle /app-one/* {
                reverse_proxy /app-one/* localhost:30000
        }

        handle /app-one {
                reverse_proxy /app-one localhost:30000
        }

        handle {
                reverse_proxy * localhost:8000
        }
}
caddy
  • 0 个回答
  • 115 Views
Martin Hope
Windowlicker
Asked: 2021-03-04 05:42:33 +0800 CST

无论 Caddyfile 中的地址如何,Caddy 总是尝试绑定到端口 80

  • 1

Caddy v2.2.1 似乎不尊重给定地址的端口Caddyfile:

myfinedomain.com:9999 {
    respond "Nothing to see here. Srsly."
}

启动 caddy 只会导致以下错误(取自日志):

{"level":"info","ts":1614777947.500496,"logger":"http","msg":"enabling automatic HTTP->HTTPS redirects","server_name":"srv0"}
{"level":"info","ts":1614777947.5004952,"logger":"tls.cache.maintenance","msg":"started background certificate maintenance","cache":"0xc0002d2380"}
run: loading initial config: loading new config: http app module: start: tcp: listening on :80: listen tcp :80: bind: address already in use
start: caddy process exited with error: exit status 1
{"level":"info","ts":1614778157.9187949,"msg":"using provided configuration","config_file":"/usr/local/etc/caddy/Caddyfile","config_adapter":"caddyfile"}
{"level":"info","ts":1614778157.9210048,"logger":"admin","msg":"admin endpoint started","address":"tcp/localhost:2019","enforce_origin":false,"origins":["[::1]:2019","127.0.0.1:2019","localhost:2019"]}
{"level":"info","ts":1614778157.9213488,"logger":"http","msg":"enabling automatic HTTP->HTTPS redirects","server_name":"srv0"}
{"level":"info","ts":1614778157.92195,"logger":"tls.cache.maintenance","msg":"started background certificate maintenance","cache":"0xc0002be3f0"}
run: loading initial config: loading new config: http app module: start: tcp: listening on :80: listen tcp :80: bind: address already in use
start: caddy process exited with error: exit status 1

因此,caddy 似乎尝试绑定到端口 80,这是不应该的。

该文档将端口列为地址的有效选项。

对这里可能缺少的东西的想法表示赞赏。

caddy
  • 1 个回答
  • 2323 Views
Martin Hope
Lance McCarthy
Asked: 2020-09-27 06:06:45 +0800 CST

如何使用 Caddy 通过反向代理维护所有标头

  • 2

我使用 Caddy 作为反向代理,因此我只需要在我的网关中打开 2 个端口(一个用于 http,一个用于 https)。

我更喜欢使用80and 443,但我的 UniFi USG(网关)会干扰 443 并破坏 SSL。如果我选择另一个端口并为此添加一个端口转发,它工作正常......但这对于我需要的每条服务器路由都是不合理的,因为我的防火墙会变成瑞士奶酪。

所以反向代理是完美的。我将只打开 2 个端口:88然后444转到反向代理。在 Caddy 中,我可以轻松地在 Caddyfile 中设置目标端口:

// DNS points to the gateway's IP
mysubdomain.mydomain.com {
    reverse_proxy {
      to https://192.168.1.IP:443
      transport http {
          read_buffer 4096
      }
    {
}

问题

在我的第一次尝试中,我的 SSL 不起作用(感谢代理修改的标头),所以我查看了Caddy Reverse Proxy Headers文档,发现他们确实修改了 2 个标头:

  • 它添加或扩充X-Forwarded-For标题字段。
  • 它设置X-Forwarded-Proto标题字段。

我使用什么值以便 Caddy 传递原始值,或者不添加任何内容?

当前配置

这是我目前拥有的,我应该使用什么来确保不更改或添加 X-Forwarded 标头?

mysubdomain.mydomain.com {
    reverse_proxy {
      to https://192.168.1.IP:443
      transport http {
          read_buffer 4096
      }
    {
    header_up Host {http.request.host}
    header_up X-Real-IP {http.request.remote.host}
    header_up X-Forwarded-For { ?? }
    header up X-Forwarded-Port { ?? }
    header_up X-Forwarded-Proto { ?? }
}

跟进问题:除了我设置的设置之外,我还应该使用其他设置吗?

reverse-proxy caddy
  • 1 个回答
  • 4011 Views
Martin Hope
ruben1691
Asked: 2020-09-18 10:45:56 +0800 CST

设备 -> 设备流量在网络内部被阻止

  • 0

我遇到了一个奇怪的问题,我已经尝试理解和修复了几个小时。

我有三台主要机器,它们是这样设置的:

  • M1:Raspberry pi 3 (raspbian lite),运行 caddy 作为反向代理/静态 Web 服务器。--network hostCaddy 带着标志在 docker 内部运行。该设备为非常小的静态网站提供服务,并将流量重定向到 M2 和 M3。这是唯一暴露在互联网上的设备。
  • M2:小型服务器(Ubuntu 18.04),用于部署客户端的应用程序和其他东西。所有应用都使用docker部署,流量从M1进来,转发到本机
  • M3:运行 Plex 和其他我需要从外部访问的日常应用程序的小型服务器。再一次,所有流量都来自 M1 并被重定向到这台机器(一台旧笔记本电脑)

我遇到了一个问题,即 M1 既不能访问 M2 也不能访问 M3。首先,重定向不起作用,即当我尝试访问 M2 和 M3 上的数据时,我得到一个空白页。如果我尝试使用简单的从 M1 访问 M2 或 M3 curl,我无法连接到它们中的任何一个,并出现以下错误:curl: (7) Failed to connect to <M2> port 7000: No route to host.

尝试从 M2/M3 访问托管在 M1 上的网站可以正常工作,但访问其他任何内容(即简单的 REST 服务器)会返回与以前相同的问题,即No route to host错误。

这些是我尝试过的事情:

  1. 在所有机器上禁用防火墙:没有运气,和以前一样的问题
  2. 禁用路由器上的防火墙:再次没有运气
  3. 关闭非必要服务:没有工作

我还安装了带有PIVPN的 WireGuard ,并且正确安装了everyhting,但同样的事情发生了。握手成功,IP 显示为来自家里的 IP,但流量并没有真正转发,因为当我尝试访问路由器的管理面板时它不起作用。

似乎有什么东西阻止了设备访问网络上的其他设备。除了禁用所有不同的防火墙之外,不幸的是我不知道如何进行。有谁知道它可能是什么?

ubuntu networking curl raspbian caddy
  • 2 个回答
  • 219 Views
Martin Hope
unixandria
Asked: 2020-08-18 17:26:13 +0800 CST

使用 caddy 自托管 gitlab

  • 1

我正在尝试安装和托管 gitlab,但它需要并引入 Nginx。这很好,除了我使用 Caddy 并且 Caddy 不能很好地与 Nginx 配合使用,并且必须禁用 Nginx 才能启动。

我非常喜欢 Caddy,尤其是内置的文件服务器,所以完全切换到 Nginx 不是一种选择。我也没有兴趣尝试进行防火墙重定向以尝试在非标准端口上使用 Nginx。

有没有办法在没有 nginx 的情况下使用 gitlab,例如 Caddy?没有官方文档,我从在线论坛尝试的最后一件事完全破坏了我的 gitlab 安装,并且只与我没有使用的 Apache 有关

我的系统是运行 Ubuntu 20.04 的专用云服务器。

ubuntu gitlab caddy
  • 2 个回答
  • 1198 Views
Martin Hope
William Swanson
Asked: 2020-06-18 10:22:24 +0800 CST

当发生冲突时,Caddy 会选择哪个匹配器?

  • 2

Caddyfile 中的指令可以具有将它们限制为特定请求的“匹配器”。这让 Caddy 2 为不同的路径提供不同的内容,但是当多个指令匹配同一个请求时会发生什么?

如果我想使用 Caddy 2 为一个主要是静态的网站提供服务,但将一个/api/区域转发给某个 Node.js 进程,我的 Caddyfile 可能如下所示:

fake-example.edge.app {
  root * /var/www/example
  reverse_proxy /api/* localhost:9000
  file_server *
}

请求/api/user将同时匹配 thefile_server *和reverse_proxy /api/*匹配器,因此不清楚该请求是转到文件系统还是 Node.js 进程。

我在 Caddy 2 文档中找不到任何描述应该发生什么的内容。在我自己的测试中,结果似乎取决于指令在文件中出现的顺序,较早的条目“获胜”。应该发生什么?如果它是“未定义的行为”,是否有更好的方法来编写此文件以避免歧义?

reverse-proxy caddy
  • 2 个回答
  • 1495 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve