我知道有很多帖子说无法连接到 AWS ec2 实例,但这个不太一样。它类似于什么原因导致出现‘连接被拒绝’消息?但这不能解决我的问题。
我对 ec2 实例有相当多的经验,但这是我第一次尝试使用 REHL。
这是我的设置:
- 我有一台机器 A,上面有一个 apache 服务器,监听端口 80
- 机器 A 也通过反向隧道连接到 AWS EC2 服务器 S:
ssh -v -NTR 1101:localhost:80 someUser@myAwsIp -o ExitOnForwardFailure=yes
- 服务器 S 具有以下端口转发:
iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 1101
简单来说,所有通过端口 80 进入 S 的流量都应该通过端口 80 进入 A。但这并不奏效。也就是说,当我curl myAwsIp:80
从机器 B 运行时,curl 返回“连接被拒绝”。
一些基本事实:
- 我确信 IP 是正确的,因为我通过 ssh 进入服务器来运行这些命令
- 我没有 iptables 规则来删除任何内容。“filter”和“nat”表都完全设置为“ACCEPT”(除了上面提到的规则)
- 我已在 EC2 管理控制台上打开了端口 80。它看起来像这样:
端口 协议 源
80 TCP 0.0.0.0/0 22 TCP 0.0.0.0/0
- 我对 semanage 不是很熟悉,但从网上搜索我发现这可能是一个问题。运行时
semanage port -l | grep 80
我可以看到“http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000”这一行,这应该足以让 curl 请求通过,对吗?
我的调试表明:
- httpd 服务器正在运行,并在正确的端口上监听,因为当我在 S 上登录并运行时,
curl localhost:1101
我得到了我的网页 - 转发应该可以工作,因为当我
nc -kl 1101
在 S 上运行时(而不是 ssh 端口转发),并且当我curl myAwsIp:80
从我的机器 B 运行时,我会在 netcat 上收到传入的连接请求。
但是当我从我的机器 B 运行时curl myAwsIp:80
,curl 仍然返回“连接被拒绝”(当然没有 nc 运行)
我错过了什么???谢谢你的帮助!这真令人沮丧!请注意,这个完全相同的设置在另一个 AWS EC2 实例上运行,但安装了 Amazon-linux……两者之间有这么大的区别吗?
答案1
有几个原因导致我们不建议使用 ssh 端口转发将用户的请求发送到生产服务器。
由于您没有端到端 TCP 连接,您的服务器将永远看不到客户端的 IP 地址。这意味着您的日志永远不会显示正确的客户端 IP 地址,这可能会使您将来调试问题变得更加困难。
此外,增加的复杂性还会引入新的可能故障场景,最终导致服务可靠性降低。
在您的特定设置中,您还错误地配置了 ssh 端口转发,这将导致其无法正常工作。端口转发正在监听localhost
(::1
和/或127.0.0.1
)。但它需要转发的连接到达的是外部 IP 地址,因此连接总是会被拒绝。
为了使 ssh 端口转发正常工作,你必须将此行添加到你的/etc/ssh/sshd_config
GatewayPorts clientspecified
此外,您的端口转发需要指定一个监听地址,例如如下所示:
-R '[2001:db8::1]:1101:localhost:80' -R '192.0.2.3:1101:localhost:80'