如何从Docker容器内部访问主机上AWS SSM端口转发的服务
根因分析
默认情况下SSM端口转发会话仅绑定主机的127.0.0.1回环地址,仅能接收主机本地进程发起的请求。Docker容器访问172.17.0.1的流量来源于docker网桥,不属于本地回环地址的请求范围,因此会被拒绝,表现为端口未开放。
解决方案
- 方案1:修改SSM端口转发的绑定地址(最直接)
启动SSM会话时新增localAddress参数,指定监听所有网卡地址0.0.0.0,示例命令如下:
aws ssm start-session \ --target <EC2实例ID> \ --document-name AWS-StartPortForwardingSession \ --parameters "portNumber=[<目标服务远程端口>],localPortNumber=[<本地监听端口>],localAddress=[0.0.0.0]"
配置完成后SSM会监听主机所有网卡的对应端口,Docker容器通过172.17.0.1:<端口>即可正常访问。
注意:如果主机直接暴露在公网,使用该方案时建议搭配防火墙规则,仅允许信任IP段访问SSM监听端口,避免资源泄露。
- 方案2:本地端口转发(更安全,仅开放给Docker网络)
如果不想将SSM端口暴露到公网,可通过socat工具仅在Docker网关地址上做一层转发:
- 主机上安装socat:
apt install socat(Debian/Ubuntu)或yum install socat(CentOS/RHEL) - 运行转发命令:
socat TCP-LISTEN:<本地端口>,bind=172.17.0.1,fork TCP:127.0.0.1:<SSM本地监听端口>
该方案仅允许Docker网络内的请求访问SSM转发端口,不会暴露到外部网络。
- 方案3:容器使用host网络模式
启动容器时指定--net=host参数,容器将直接复用主机的网络栈,直接通过localhost:<SSM监听端口>即可访问资源,无需调整SSM配置。该方案适合开发测试环境使用,生产环境需评估网络隔离需求。
验证步骤
配置完成后可先在主机上执行ss -tulpn | grep <监听端口>,确认对应端口的监听地址为0.0.0.0或172.17.0.1即可。如果仍无法访问,需检查主机防火墙(iptables/ufw)是否允许Docker网桥的流量访问对应端口。
内容的提问来源于stack exchange,提问作者Maximilian Speicher
相关产品推荐
相关产品推荐

