Windows版GitHub Actions中SSH隧道27017端口转发失败求助
我在Google Compute Engine上运行了一个MongoDB实例,希望通过Windows版GitHub Actions Runner连接它,插入测试和性能结果。目前尝试建立带端口转发的SSH隧道并测试端口是否开放,GitHub Action步骤如下:
- name: 'Create ssh tunnel' if: (runner.os == 'Windows') run: | gcloud config set auth/impersonate_service_account *****@***.iam.gserviceaccount.com gcloud compute config-ssh $sshTunnelJob = Start-Job -Name SshTunnelJob -ScriptBlock { ssh -o "User=*****_iam_gserviceaccount_com" *****.us-east1-b.**** -vvv -fNT -L 27017:0.0.0.0:27017} Get-Job Receive-Job -Name SshTunnelJob | Format-List -Force -Expand CoreOnly netstat -aon Test-NetConnection localhost -port 27017 gcloud config unset auth/impersonate_service_account gcloud compute config-ssh --remove
预期Test-NetConnection localhost -port 27017能成功,但实际失败,不过转发80端口是成功的。输出信息如下:
WARNING: TCP connect to (::1 : 27017) failed WARNING: TCP connect to (127.0.0.1 : 27017) failed ComputerName: localhost RemoteAddress: ::1 ResolvedAddresses: {::1, 127.0.0.1} PingSucceeded: True PingReplyDetails: System.Net.NetworkInformation.PingReply TcpClientSocket: TcpTestSucceeded: False RemotePort: 27017 TraceRoute: Detailed: False InterfaceAlias: Loopback Pseudo-Interface 1 InterfaceIndex: 1 InterfaceDescription: NetAdapter: NetRoute: MSFT_NetRoute (InstanceID = "DD;9;?B55;55DD55;") SourceAddress: ::1 NameResolutionSucceeded: True BasicNameResolution: {Microsoft.DnsClient.Commands.DnsRecord_AAAA,Microsoft.DnsClient.Commands.DnsRecord_A} LLMNRNetbiosRecords: {} DNSOnlyRecords: {Microsoft.DnsClient.Commands.DnsRecord_A} AllNameResolutionResults: {Microsoft.DnsClient.Commands.DnsRecord_AAAA,Microsoft.DnsClient.Commands.DnsRecord_A} IsAdmin: True NetworkIsolationContext: Loopback MatchingIPsecRules:
想知道遗漏了什么配置?是否GitHub限制了端口?未找到相关端口限制的文档。
1. 修正SSH隧道绑定与目标地址
当前端口转发命令中,本地绑定和目标地址的配置可能存在问题。将命令修改为明确绑定本地回环地址,并指向GCE实例上MongoDB实际监听的地址:
ssh -o "User=*****_iam_gserviceaccount_com" *****.us-east1-b.**** -vvv -fNT -L 127.0.0.1:27017:localhost:27017
- 本地绑定
127.0.0.1避免IPv6优先导致的访问问题 - 目标地址改为
localhost,对应GCE实例上MongoDB默认的监听地址
2. 检查MongoDB监听配置
确认GCE实例上的MongoDB配置文件中,bindIp参数设置为0.0.0.0或者包含localhost,确保MongoDB允许来自本地的隧道连接请求。如果bindIp仅限制为实例的外部IP,隧道转发会无法连接到MongoDB服务。
3. 确保隧道完全建立后再测试
在启动SSH隧道的Job后,添加等待时间,让隧道有足够时间建立连接:
Start-Sleep -Seconds 5
同时查看Receive-Job的输出,检查SSH是否有认证失败、连接被拒绝等报错,这些信息能直接定位隧道是否成功启动。
4. 临时开放Windows防火墙端口
Windows版GitHub Actions Runner的防火墙可能阻止27017端口的入站连接,添加临时规则允许该端口:
New-NetFirewallRule -DisplayName "Allow MongoDB Tunnel" -Direction Inbound -LocalPort 27017 -Protocol TCP -Action Allow
测试完成后再删除规则:
Remove-NetFirewallRule -DisplayName "Allow MongoDB Tunnel"
5. 检查端口占用情况
通过netstat -aon的输出确认27017端口是否被其他进程占用。如果有,停止占用进程或更换一个未被使用的端口进行转发。
内容的提问来源于stack exchange,提问作者monamimani

