Terraform AWS NLB TLS 直通

Terraform AWS NLB TLS Passthrough

我正在使用 terraform 在 AWS 中为我​​的 K3S 集群配置基础设施。我已经在端口 80 和 443 上配置了一个带有两个侦听器的 NLB,并带有适当的自签名证书。这行得通。我可以通过 nlb 访问集群中的 HTTP 服务。

resource "tls_private_key" "agents" {
  algorithm = "RSA"
}

resource "tls_self_signed_cert" "agents" {
  key_algorithm         = "RSA"
  private_key_pem       = tls_private_key.agents.private_key_pem
  validity_period_hours = 24

  subject {
    common_name  = "my hostname"
    organization = "My org"
  }

  allowed_uses = [
    "key_encipherment",
    "digital_signature",
    "server_auth"
  ]
}

resource "aws_acm_certificate" "agents" {
  private_key      = tls_private_key.agents.private_key_pem
  certificate_body = tls_self_signed_cert.agents.cert_pem
}


resource "aws_lb" "agents" {
  name               = "basic-load-balancer"
  load_balancer_type = "network"

  subnet_mapping {
    subnet_id     = aws_subnet.agents.id
    allocation_id = aws_eip.agents.id
  }
}

resource "aws_lb_listener" "agents_80" {
  load_balancer_arn = aws_lb.agents.arn
  protocol = "TCP"
  port     = 80

  default_action {
    type             = "forward"
    target_group_arn = aws_lb_target_group.agents_80.arn
  }
}

resource "aws_lb_listener" "agents_443" {
  load_balancer_arn = aws_lb.agents.arn
  protocol = "TLS"
  port     = 443
  certificate_arn = aws_acm_certificate.agents.arn

  default_action {
    type             = "forward"
    target_group_arn = aws_lb_target_group.agents_443.arn
  }
}

resource "aws_lb_target_group" "agents_80" {
  port     = 30000
  protocol = "TCP"
  vpc_id   = var.vpc.id

  depends_on = [
    aws_lb.agents
  ]
}
resource "aws_lb_target_group" "agents_443" {
  port     = 30001
  protocol = "TCP"
  vpc_id   = var.vpc.id

  depends_on = [
    aws_lb.agents
  ]
}

resource "aws_autoscaling_attachment" "agents_80" {
  autoscaling_group_name = aws_autoscaling_group.agents.name
  alb_target_group_arn   = aws_lb_target_group.agents_80.arn
}

resource "aws_autoscaling_attachment" "agents_443" {
  autoscaling_group_name = aws_autoscaling_group.agents.name
  alb_target_group_arn   = aws_lb_target_group.agents_443.arn
}

那是我的代码的精简版。

我已将入口控制器配置为分别在 NodePorts 30000 和 30001 上侦听 HTTP 和 HTTPS。这也行。

不起作用的是 NLB 正在终止 TLS,但我需要它来传递。我这样做是为了可以访问 Kubernetes 仪表板(以及其他应用程序),但仪表板需要 https 才能登录,如果 tls 在 nlb 处终止,我将无法提供。

我需要帮助配置 nlb 以进行直通。我搜索了又搜索,找不到任何示例。如果有人知道如何配置它,最好获得一些 tf 代码,或者甚至只是了解在 AWS 中实现它的适当方法,以便我可以在 tf 中自己实现它。

您需要 TLS 直通,还是只需要 NLB 和服务器之间的 TLS 通信?或者您是否只需要配置您的服务器以了解初始连接是 TLS?

对于 TLS 直通,您需要在服务器上安装 SSL 证书,然后从负载平衡器中删除该证书。您可以将负载均衡器上的端口 443 侦听器的协议从“TLS”更改为“TCP”。这不是 AWS 上非常典型的设置,您不能在此配置中使用免费的 AWS ACM SSL 证书,您必须在服务器上使用 Let's Encrypt 之类的东西。

对于 NLB 和服务器之间的 TLS 通信,您可以在服务器上安装一个证书,self-signed 证书就可以了,然后只需将负载平衡器上的目标组设置更改为指向到服务器上的安全端口。

如果您只想让服务器知道初始连接协议是 TLS,您可以将服务器配置为使用负载均衡器传递的 x-forwarded-proto header 来确定连接是否正常是安全的。