首页 > 解决方案 > 使用 to_port 和 from_port 配置为 Terraform 入口/出口映射专用网络端口?

问题描述

我不确定这里的 Terraform 端口转发命名法。如果我在私有网络的 5000 端口上有一个应用程序,我想在端口 8000 上向公众公开 - 我应该设置哪些变量?

会不会是从私网的角度?

from_port: 5000
to_port: 8000

还是公网的视角?

from_port: 8000
to_port: 5000 

如果我的内部应用程序需要响应数据,我是否还需要设置出口值?

示例来自:terraform 简介

resource "aws_security_group" "elb" {
  name = "terraform-example-elb"
  # Allow all outbound
  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
  # Inbound HTTP from anywhere
  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

标签: terraform

解决方案


将安全组 (SG) 视为实例周围的封闭气泡。它与您的实例内部发生的事情无关。它在实例之外运行。

您设置的 SG 规则在此气泡中打孔,指定允许哪些端口上的哪些流量(TCP、UDP)进入实例和实例外部。

在您的情况下,由于您希望允许端口上的传入流量8000到您的实例,您将使用 port 制作一个“洞” 8000

resource "aws_security_group" "elb" {
  name = "terraform-example-elb"
  # Allow all outbound
  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
  # Inbound port 8000 from anywhere
  ingress {
    from_port   = 8000
    to_port     = 8000
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

上述 SG 将允许端口 8000 上的传入流量到您的实例。不允许其他端口,因此from_port == to_port. 一旦允许此流量,您的实例正在执行的操作超出了 SG 范围和规则。因此,通常您必须在实例上安装一个服务器,侦听端口 8000。如果您的应用程序在端口 5000 上运行,那么您需要在实例上使用反向代理,例如 nginx。Nginx 将接受端口 8000 上的连接并将它们重定向到端口 5000 上的应用程序::

client--->SG:8000--->Instance:8000--->Nginx:8000--->Your app:5000

相反,如果你这样写

from_port: 5000
to_port: 8000

您将打开从 5000 到 8000 的所有端口以通过气泡并到达您的实例。


推荐阅读