【问题标题】:How Is Port Forwarding Working on AWS without Security Group Rules?端口转发如何在没有安全组规则的情况下在 AWS 上运行?
【发布时间】:2022-11-16 00:03:43
【问题描述】:
使用 Ubuntu 22.04 运行 AWS EC2 实例。我还在那里运行一个用于 python 开发的 jupyter 服务器,并使用 ssh 隧道从我本地的 Ubuntu 笔记本电脑连接到它。
#!/usr/bin/env bash
# encoding:utf-8
SERVER=98.209.63.973 # My EC2 instance
# Tunnel the jupyter service
nohup ssh -N -L localhost:8081:localhost:8888 $SERVER & # 8081:Local port 8888:remote port
但是,我从来没有通过安全组规则打开ec2实例的8888端口。在那种情况下端口转发是如何工作的?不应该被阻止吗?
【问题讨论】:
标签:
amazon-web-services
amazon-ec2
ssh-tunnel
aws-security-group
【解决方案1】:
您刚刚发现了关于安全组的一个不明显的事情:它们适用于网络接口,而不是实例。这总是让熟悉 IP 表来实现防火墙的人感到惊讶。
一个 EC2 实例有一个或多个弹性网络接口允许它在 VPC 中进行通信。每个 EC2 实例必须有一个主网络接口和最多 4 个 (iirc) 辅助接口。每个网络接口至少有一个永久分配的私有 IP。
通过 API 启动实例时,您可以指定网络接口配置,并且这些接口会在实例启动之前创建(您也可以将现有网络接口附加到新实例)。我相信您也可以通过控制台附加辅助接口,但通常您只需指定安全组和子网,并将其应用于主接口。
要记住的重要一点是网络接口与实际的虚拟机是分开的。例如,当您停止实例时,网络接口与物理 VM 分离;当您再次启动该实例时,网络接口将附加到新 VM。通常,当您终止 VM 时,实例的网络接口会被破坏,但这不是必需的。
现在回答您的实际问题:当您建立 SSH 隧道时,您告诉它将流量路由到 localhost。使流量停留在 VM 的网络堆栈内;它不跨越网络接口。因此,不会应用附加到该接口的安全组。我相信,如果您使用实例的私有 IP 配置隧道,您会发现流量被阻止。
一般来说,转发到localhost 是一件好事,因为这意味着您的服务(如 Jupyter Notebook)不需要将自己暴露给本地网络。
参考: