REHL 上的 AWS 端口无法访问

REHL 上的 AWS 端口无法访问

我知道有很多帖子说无法连接到 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'

相关内容