You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker中Caddy反向代理至本地SSH隧道失效问题求助

解决方案:Caddy容器无法连接EC2主机的SSH隧道

问题核心:你的SSH隧道默认仅绑定EC2主机的127.0.0.1地址,而Caddy容器处于独立的Docker网络中,访问172.17.0.1:9000(Docker网关)时,流量无法转发到绑定在127.0.0.1的隧道端口。以下是三种可行的解决方法:

方案1:修改SSH隧道绑定所有网卡并配置sshd

这种方法让隧道监听EC2主机的所有IP地址,包括Docker网关地址,无需修改容器网络配置。

  1. 修改EC2的sshd配置
    编辑/etc/ssh/sshd_config文件,找到GatewayPorts配置项(如果没有则添加),设置为:

    GatewayPorts yes
    

    保存后重启sshd服务:

    sudo systemctl restart sshd
    
  2. 重新建立SSH隧道
    修改你的隧道脚本,将绑定地址改为0.0.0.0(监听所有网卡):

    tunneldev() {
      emulate -LR bash;
      echo "Tunneling $1 on core server to $2 on localhost";
      ssh -R 0.0.0.0:$1:localhost:$2 -N lab;
    }
    
    tunneldev 9000 3000
    
  3. 验证连通性
    在Caddy容器内执行curl 172.17.0.1:9000/test,确认能正常访问。

方案2:让Caddy使用主机网络模式

将Caddy容器切换到主机网络模式,这样容器直接共享EC2主机的网络栈,可直接访问localhost:9000。

修改你的Docker Compose配置:

caddy:
  image: lucaslorentz/caddy-docker-proxy:ci-alpine
  container_name: caddy
  network_mode: host  # 启用主机网络
  environment:
    - CADDY_INGRESS_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: localhost:9000  # 目标地址改为localhost

注意:启用主机网络后,无需再配置ports映射(容器直接使用主机端口),原networks配置可删除。

方案3:添加iptables端口转发规则

通过iptables将Docker网关的9000端口流量转发到EC2主机的127.0.0.1:9000,无需修改隧道或容器配置。

在EC2主机上执行以下命令:

# 转发外部(容器)访问172.17.0.1:9000的流量到127.0.0.1:9000
sudo iptables -t nat -A PREROUTING -p tcp -d 172.17.0.1 --dport 9000 -j DNAT --to-destination 127.0.0.1:9000
# 转发容器内部访问172.17.0.1:9000的流量到127.0.0.1:9000
sudo iptables -t nat -A OUTPUT -p tcp -d 172.17.0.1 --dport 9000 -j DNAT --to-destination 127.0.0.1:9000

如果需要规则永久生效,可执行sudo iptables-save > /etc/iptables/rules.v4(根据系统配置调整保存路径),并配置开机自动加载。


内容的提问来源于stack exchange,提问作者PGT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 21:05:08