terraform - Terraform - 允许除特定端口之外的所有出站端口?
问题描述
我在 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"]
}
但这需要定义具体的范围,这需要定义一些额外的出口规则。也许有更好的方法吗?例如,我可以在哪里定义规则以允许所有端口然后排除一些?
解决方案
例如,我可以定义规则以允许所有端口,然后排除一些
这开始触及 AWS 安全组的限制,因为它们只能指定允许规则而不是拒绝规则,并且每个组只能有 60 个入站规则和 60 个出站规则(每个组总共 120 个规则)。
理想情况下,您可以定义这样的变量
variable "excluded_ports" { default=[25,465] }
然后可以使用它来构建类似于您在问题中发布的aws_security_group_rule 资源(即从/到 0-24、26-464 和 466-65535 的块)。不幸的是,这将是相当困难的,并且如果可能的话,会导致基于提供的变量生成来自/到端口的丑陋/骇人听闻的方式。这是因为在最新 (v0.11) 版本的 Terraform 中当前不支持对列表元素的映射(参考这个 terraform issue和this one),但是 Terraform v0.12 将使这些类型的操作更容易。
推荐阅读
- c++ - 使用移动和复制语义时,函数匹配如何工作?
- python - 使用带有选项的 selenium chrome webdriver 时出现 WebDriverException 错误
- json - 如何在多个键相等的情况下使用 Python 正确解析嵌套的 json
- android - Android:录制音频以供以后将背景流式传输到语音到文本?
- angular - 添加附加点时,agm-polygon 不更新
- testing - 在 github 操作中测试 helm 图表
- mongodb - MongoDB - 聚合 - 查找和匹配后更新
- python - 为什么显示此 QLabel?
- teamcity - anaconda 在激活时即时运行脚本
- c++ - 如何使这个递归函数从给定的起始位置返回最小的整数?