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网关地址,无需修改容器网络配置。
修改EC2的sshd配置
编辑/etc/ssh/sshd_config文件,找到GatewayPorts配置项(如果没有则添加),设置为:GatewayPorts yes保存后重启sshd服务:
sudo systemctl restart sshd重新建立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验证连通性
在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
相关产品推荐
相关产品推荐

