Terraform-允许除特定端口外的所有出站端口吗?

时间:2018-10-14 08:40:29

标签: terraform terraform-provider-aws

我已在Terraform中定义了这个AWS安全组:

resource "aws_security_group" "sg" {
  name = "${var.name}"
  description = "${var.description}"
  vpc_id = "${data.terraform_remote_state.vpc.vpc_id}"

  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  ingress {
    from_port   = 443
    to_port     = 443
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  ingress {
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = ["${var.ext_blocks}"]
  }

  egress {
    from_port       = 0
    to_port         = 0
    protocol        = "-1"
    cidr_blocks     = ["0.0.0.0/0"]
  }
}

使用此配置,任何端口都可以用作传出/出站。但是,如果要排除某些端口,推荐的方法是什么?

假设我要排除端口25和465,所以我可以做类似的事情(而不是使用允许任何端口的出口规则):

  egress {
    from_port       = 0
    to_port         = 24
    protocol        = "-1"
    cidr_blocks     = ["0.0.0.0/0"]
  }
  egress {
    from_port       = 26
    to_port         = 464
    protocol        = "-1"
    cidr_blocks     = ["0.0.0.0/0"]
  }
  egress {
    from_port       = 466
    to_port         = 65535
    protocol        = "-1"
    cidr_blocks     = ["0.0.0.0/0"]
  }

但是这需要定义特定的范围,这需要定义一些额外的出口规则。也许有更好的方法吗?例如,在哪里我可以定义规则以允许所有端口,然后排除某些端口?

1 个答案:

答案 0 :(得分:1)

  

例如,我可以定义规则以允许所有端口,然后排除某些端口

这开始遇到AWS安全组的限制,因为它们可以only specify allow rules and not deny rules,而您可以only have 60 inbound and 60 outbound rules per group(每条总共120条规则)。

理想情况下,您可以定义这样的变量

variable "excluded_ports" { default=[25,465] }

然后可以用来构建aws_security_group_rule resources,类似于您在问题中发布的内容(即0 / 24、26-464和466-65535的块)。不幸的是,这将是相当困难的,并且如果可能的话,将导致以提供的变量为基础来生成from / to端口的丑陋/骇人听闻的方式。这是因为最新版本(v0.11)的Terraform版本(参考this terraform issuethis one)目前不支持在列表元素上进行映射,但是Terraform v0.12将使这些类型的操作更加容易