在K3s集群中通过Traefik反向代理将SSH端口转发到容器

175次阅读
没有评论

问题描述

在K3s集群中运行了一个包括1个主节点和2个工作节点的集群,同时在同一主机(主节点)上运行了一个Docker容器中的Traefik反向代理。Traefik容器实际上已经在80端口和443端口上为不同的子域名提供了TLS的反向代理功能,这部分已经成功运行。用户希望也能够通过SSH连接(仅限于一个子域名),但是迄今为止尝试没有成功。

用户已经采取了以下措施:
1. 开放了22端口,通过UFW允许访问(在Ubuntu 22.04上)。
2. 针对Traefik设置了以下规则(部分内容摘录):

tcp:
  routers:
    giti-ssh:
      entrypoints:
        - "https" # 也尝试过使用ssh entrypoint
      rule: "HostSNI(`*`)"
      tls: {}
      service: giti-ssh
services:
  giti-ssh:
    loadBalancer:
      servers:
        - address: "10.42.0.232:22"
  1. 使用Flannel和MetalLB在K3s中运行,外部IP范围是10.42.0.230-250。
  2. 通过”ip a”命令查看网络接口的信息(部分内容摘录)。

然而,用户尝试连接容器内的SSH服务时遇到问题,用户怀疑这与Traefik的HostSNI设置有关,或者可能涉及iptables的配置问题。

用户的容器已经设置好,用于SSH的服务正在监听22端口,类型为LoadBalancer。用户可以通过Traefik反向代理从另一个服务和IP连接到该容器的443端口,但在22端口上遇到问题,用户认为这与Traefik的HostSNI设置或者iptables配置有关。

相关版本:
– Docker: 最新版本(仅用于测试,计划使用带标签的版本)
– Traefik: 最新版本(仅用于测试,计划使用带标签的版本)
– K3s: v1.24.6+k3s1

用户还尝试连接1932/udp端口(用于Minecraft),因此他认为在非http(s)端口上运行Traefik可能更加复杂。

用户希望能够得到一些关于如何实现此目标的提示和建议。

解决方案

请注意以下操作可能因版本差异或具体实现而异。建议在操作之前做好备份。

方案1

在这种情况下,我们需要在Traefik反向代理上设置适当的规则,以便能够将SSH流量转发到指定的K3s容器上。此外,我们需要确保Traefik监听并处理SSH流量。以下是一种可能的解决方案步骤:

  1. 在Traefik的配置中,我们需要将SSH流量的入口点添加到规则中。我们可以使用tcp入口点并指定适当的规则。请确保规则匹配所需的子域名。

  2. 配置Traefik的服务以将SSH流量转发到K3s容器。这需要确保服务的配置正确,并且服务器的地址和端口与容器的SSH服务一致。

  3. 确保防火墙允许SSH流量通过,这已经在UFW中开放了22端口,但确保没有其他防火墙规则阻止SSH流量。

  4. 验证Traefik的日志,以确保它正在正确地处理SSH流量并将其转发到指定的K3s容器。

以下是一个示例的Traefik配置(部分内容摘录):

# 配置TCP入口点
tcp:
  routers:
    ssh-router:
      entrypoints:
        - "ssh"
      rule: "HostSNI(`ssh.example.com`)"  # 使用所需的子域名
      tls: {}  # 可以留空
      service: ssh-service

# 配置SSH服务
services:
  ssh-service:
    loadBalancer:
      servers:
        - address: "10.42.0.232:22"  # 将此地址和端口设置为目标容器的SSH服务

请注意,上述配置需要根据你的具体情况进行调整。确保将子域名、容器地址和端口等配置与你的环境匹配。

方案2

另一种方法是考虑不经过Traefik,直接在K3s中设置SSH的端口转发。这种方法不需要涉及Traefik的TCP规则配置。以下是一个可能的解决方案步骤:

  1. 在K3s中创建一个Service,将SSH端口(例如22)转发到需要接收SSH连接的容器。

  2. 通过K3s的Service将SSH流量直接转发到容器。

  3. 确保防火墙允许SSH流量通过,确保UFW没有阻止SSH流量。

  4. 验证通过K3s的Service是否可以正确将SSH流量转发到容器。

这种方法可以避免Traefik的TCP规则配置,但需要确保K3s的Service配置正确。

以下是一个示例的K3s Service配置(部分内容摘录):

apiVersion: v1
kind: Service
metadata:
  name: ssh-service
spec:
  ports:
  - protocol: TCP
    port: 22  # 指定要转发的端口
    targetPort: 22  # 指定容器的SSH端口
  selector:
    app: your_ssh_container  # 替换为你的容器的标签

请注意,上述配置需要根据你的具体情况进行调整。确保端口、容

正文完