nginx Docker中的caddy反向代理到本地机器的隧道不工作

3npbholx  于 5个月前  发布在  Nginx
关注(0)|答案(1)|浏览(110)

对于开发来说,很多平台都提供了webhook事件,但需要HTTPS和有效的域名。很多人使用ngrok,但我手头有一个EC2示例,它允许我为webhook获取一个非随机子域。
我在nginx上做了以下工作:

subdomain -> ec2 instance running nginx as a process -> tunnel -> local machine

字符串
更改是在使用caddy-docker-proxy的docker示例中从nginx移动到caddy

subdomain -> docker/caddy-docker-proxy running on ec2 instance -> tunnel -> local machine


这是我的球童设置:

caddy:
    image: lucaslorentz/caddy-docker-proxy:ci-alpine
    container_name: caddy
    ports:
      - 80:80
      - 443:443
    environment:
      - CADDY_INGRESS_NETWORKS=caddy
    networks:
      - caddy
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - caddy_data:/data
    restart: unless-stopped
    labels:
      caddy_0: dev.domain.com
      caddy_0.reverse_proxy: 172.17.0.1:9000


我可以根据日志确认caddy从子域获取请求。我还可以确认如果我从EC2示例curl localhost:9000/test,它可以工作。
这意味着运行caddy-docker-proxy的docker容器和主机/EC2示例之间存在断开连接。
以下是来自Caddy的错误日志:

{
  "level": "error",
  "ts": 1695592513.784038,
  "logger": "http.log.error",
  "msg": "dial tcp :9000: connect: connection refused",
  "request": {
    "remote_ip": "redacted",
    "remote_port": "60083",
    "client_ip": "redacted",
    "proto": "HTTP/2.0",
    "method": "GET",
    "host": "dev.domain.com",
    "uri": "/test",
    "headers": {
      "Sec-Fetch-User": [
        "?1"
      ],
      "Accept-Encoding": [
        "gzip, deflate, br"
      ],
      "Accept-Language": [
        "en-US,en;q=0.9,de;q=0.8"
      ],
      "Sec-Ch-Ua": [
        "\"Chromium\";v=\"116\", \"Not)A;Brand\";v=\"24\", \"Google Chrome\";v=\"116\""
      ],
      "Sec-Ch-Ua-Mobile": [
        "?0"
      ],
      "Sec-Ch-Ua-Platform": [
        "\"macOS\""
      ],
      "Upgrade-Insecure-Requests": [
        "1"
      ],
      "User-Agent": [
        "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36"
      ],
      "Accept": [
        "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7"
      ],
      "Sec-Fetch-Site": [
        "none"
      ],
      "Sec-Fetch-Mode": [
        "navigate"
      ],
      "Cache-Control": [
        "max-age=0"
      ],
      "Sec-Fetch-Dest": [
        "document"
      ]
    },
    "tls": {
      "resumed": false,
      "version": 772,
      "cipher_suite": 4865,
      "proto": "h2",
      "server_name": "dev.domain.com"
    }
  },
  "duration": 0.00028104,
  "status": 502,
  "err_id": "ra595z5i9",
  "err_trace": "reverseproxy.statusError (reverseproxy.go:1248)"
}


我从我的MacBook运行我的隧道:

tunneldev() {
  emulate -LR bash;
  echo "Tunneling $1 on core server to $2 on localhost";
  ssh -R $1:localhost:$2 -N lab;
}

tunneldev 9000 3000


感觉我只需要再做一个设置就可以让docker容器通过隧道正确发送流量,但是找不到。

sauutmhj

sauutmhj1#

您面临的连接问题与网络接口的错误组合有关。

172.17.0.1
      Docker container                        EC2 Machine
   ┌────────────────────┐        ┌──┐  ┌───────────────────────┐
   │                    │        │  │  │                       │
   │       Caddy        ├───────►│  ├──┼────► Nothing          │
   │                    │        │  │  │                       │
   └────────────────────┘        │  │  │                       │
                                 └──┘  │                       │
                                       │                       │
                                       │                       │         Dev Machine
                                 ┌──┐  │                       │     ┌─────────────────┐
                                 │  │  │      SSH tunnel       │     │                 │
                                 │  ├──┼───────────────────────┼────►│   Dev Server    │
                                 │  │  │                       │     │                 │
                                 │  │  │                       │     └─────────────────┘
                                 │  │  │    ┌──────────────┐   │
                                 │  │  │    │              │   │
                                 │  │◄─┼────┤     Curl     │   │
                                 │  │  │    │              │   │
                                 │  │  │    └──────────────┘   │
                                 │  │  │                       │
                                 └──┘  └───────────────────────┘

                               127.0.0.1

字符串
您的docker容器被认为是与您的EC2示例不同的主机。这就是为什么在Caddy配置中,您通过使用其在docker子网(172.17.0.1)上的IP来定位主机。因此,从docker容器到主机的流量通过与docker相关的网络接口进入主机。
您的SSH -R port:ip:port反向端口转发命令绑定到主机(127.0.0.1)的Telnet接口,这既是因为您没有在命令中指定任何其他内容,也是因为您的SSH服务器可能不允许任何其他内容。
由于您的转发端口是在容器发送流量到的与docker相关的网络接口上打开的,因此docker容器无法连接到它。
要修复端口绑定,您可以通过使用较长的-R ip:port:ip:port标志来告诉SSH在特定接口上打开端口,该标志允许您选择要在主机上绑定的IP(本例中为docker接口的IP 172.17.0.1)。这样,端口将在正确的接口上打开。
要允许执行此命令,您需要将服务器的SSHd配置选项GatewayPorts设置为clientspecified,而不是默认值off,该值将您限制为NTFS接口。
危险:不要GatewayPorts设置为yes,这将暴露所有接口上的转发端口,包括面向Internet的公共接口。
您的curl测试命令需要调整为使用IP而不是localhost(解析为127.0.0.1),因为没有任何东西会监听到127.0.0.1接口。
标签:https://serverfault.com/questions/379344/selecting-interface-for-ssh-port-forwarding

相关问题