VNet
VNet은 프록시 서비스의 공개 주소 아래에서 사용 가능한 TCP 애플리케이션에 대한 연결을 자동으로 프록시합니다. 사용자가 teleport.example.com에서 사용 가능한 프록시 서비스를 통해 클러스터에 로그인했다고 가정합니다.
VNet은 프록시 서비스의 공개 주소 아래에서 사용 가능한 TCP 애플리케이션에 대한 연결을 자동으로 프록시합니다. 이 가이드는 사용자 지정 공개 주소를 가진 앱을 지원하도록 VNet을 구성하는 방법을 설명합니다.
작동 방식#
사용자가 teleport.example.com에서 사용 가능한 프록시 서비스를 통해 클러스터에 로그인했다고 가정합니다. 해당 클러스터에 연결된 리프 클러스터가 있습니다. 이 클러스터에는 leaf.example.com에서 사용 가능한 자체 프록시 서비스가 있습니다. VNet이 시작되면 해당 도메인과 그 하위 도메인 모두에 대한 DNS 쿼리를 캡처합니다.
A 및 AAAA 쿼리는 두 클러스터에 등록된 애플리케이션의 public_addr과 매칭됩니다. 매칭되는 애플리케이션이 있고 해당 애플리케이션이 TCP 애플리케이션으로 등록되어 있으면, VNet은 앱에 대한 연결이 프록시될 가상 IP 주소로 응답합니다. 그 외의 경우 쿼리는 OS에서 사용하는 기본 DNS 서버로 전달됩니다.
사용자 지정 public_addr이 설정된 앱에 대한 연결을 VNet이 전달하도록 하려면, Auth Service의 VNet 구성을 업데이트하여 일치하는 DNS 영역을 포함해야 합니다.
사전 요구 사항#
-
A running Teleport (v16.0.0 or higher) cluster. If you want to get started with Teleport, sign up for a free trial or set up a demo environment.
-
The
tctlandtshclients.Installing `tctl` and `tsh` clients
-
Determine the version of your Teleport cluster. The
tctlandtshclients must be at most one major version behind your Teleport cluster version. Send a GET request to the Proxy Service at/v1/webapi/findand use a JSON query tool to obtain your cluster version. Replace with the web address of your Teleport Proxy Service:$ TELEPORT_DOMAIN= $ TELEPORT_VERSION="$(curl -s https://$TELEPORT_DOMAIN/v1/webapi/find | jq -r '.server_version')" -
Follow the instructions for your platform to install
tctlandtshclients:
-
To check that you can connect to your Teleport cluster, sign in with tsh login, then
verify that you can run tctl commands using your current credentials.
For example, run the following command, assigning to the domain name of the Teleport Proxy Service in your cluster and to your Teleport username:
$ tsh login --proxy= --user=
$ tctl status
# Cluster (=teleport.url=)
# Version (=teleport.version=)
# CA pin (=presets.ca_pin=)
If you can connect to the cluster and run the tctl status command, you can use your
current credentials to run subsequent tctl commands from your workstation.
If you host your own Teleport cluster, you can also run tctl commands on the computer that
hosts the Teleport Auth Service for full permissions.
- 클러스터에 연결된 TCP 애플리케이션.
- 관리하는 도메인 이름.
이 가이드에서는 TCP 애플리케이션 접근 가이드의 예시 앱을 사용하여 를 사용자 지정 DNS 영역으로 에서 VNet을 통해 접근할 수 있도록 합니다.
1/3단계. 사용자 지정 DNS 영역 구성#
VNet 구성을 편집합니다:
$ tctl edit vnet_config
사용자 지정 DNS 영역을 추가합니다. 이 예에서 앱의 public_addr은 tcp-app.company.test이므로 suffix로 company.test를 설정합니다. 구성의 spec 섹션에 custom_dns_zones 필드가 포함되어야 합니다:
kind: vnet_config
metadata:
name: vnet-config
# …
spec:
+ custom_dns_zones:
+ - suffix:
# …
version: v1
suffix가 앱의 public_addr보다 정확히 한 단계 위의 도메인을 가리킬 필요는 없습니다. 어느 수준의 중첩이든 작동합니다. 예를 들어 tcp-app.foo.bar.qux.test 아래에 앱을 두고 suffix를 bar.qux.test로 설정할 수 있습니다.
2/3단계. 앱의 public_addr 설정#
애플리케이션 서비스 구성 파일 /etc/teleport.yaml에서 애플리케이션의 public_addr 필드를 설정합니다:
version: v3
# …
app_service:
# …
apps:
- name: "tcp-app"
uri: tcp://localhost:5432
+ public_addr: ""
teleport 데몬을 재시작합니다:
$ sudo systemctl reload teleport
3/3단계. 연결#
VNet을 시작하면 일반적으로 사용하는 애플리케이션 클라이언트를 사용하여 사용자 지정 public_addr로 애플리케이션에 연결할 수 있습니다. 클러스터를 변경하는 동안 VNet이 이미 실행 중이었다면 재시작이 필요할 수 있습니다.
$ psql postgres://postgres@tcp-app.company.test/postgres
다음 단계#
IPv4 CIDR 범위 구성#
각 클러스터에는 VNet이 해당 클러스터의 애플리케이션에 IP 주소를 할당할 때 사용하는 구성 가능한 IPv4 CIDR 범위가 있습니다. 루트 클러스터와 리프 클러스터는 다른 범위를 사용할 수 있습니다. 기본값은 100.64.0.0/10이며 VNet 구성의 ipv4_cidr_range 필드를 설정하여 변경할 수 있습니다.
VNet 구성을 편집합니다:
$ tctl edit vnet_config
구성의 spec 섹션에서 ipv4_cidr_range 필드를 편집합니다:
kind: vnet_config
metadata:
name: vnet-config
# …
spec:
+ ipv4_cidr_range: "100.64.0.0/10"
# …
version: v1
시작할 때 VNet은 가상 네트워크 장치에 IPv4 주소를 할당해야 합니다. 주소를 선택하기 위해 VNet은 임의로 루트 클러스터를 선택하여 사용자가 로그인한 해당 클러스터에서 사용하는 범위에서 주소를 선택합니다. 클러스터가 사용자 지정 범위를 사용하지만 사용자가 관리하지 않는 다른 클러스터에 로그인되어 있는 경우, VNet이 해당 클러스터 중 하나에서 제공하는 범위에서 TUN 장치의 주소를 선택할 수 있습니다.
리프 클러스터 앱 구성#
사용자 지정 public_addr을 통해 리프 클러스터 앱에 접근할 수 있도록 하려면 리프 클러스터에 직접 로그인하면서 동일한 단계를 따라야 합니다.
$ tsh login --proxy=leaf.example.com --user=email@example.com
VNet을 통한 웹 앱 접근#
VNet은 아직 웹 앱을 공식적으로 지원하지 않습니다. 그러나 모든 웹 앱은 TCP를 통해 제공되므로, VNet을 통해 사용할 수 있도록 웹 앱을 TCP 앱으로 변환할 수 있습니다. 애플리케이션의 uri를 https:// 대신 tcp://를 사용하도록 변경해야 합니다.
VNet을 통한 일반 HTTP 웹 앱 또는 API 노출은 권장하지 않습니다. 신뢰할 수 없는 웹사이트는 DNS 리바인딩 공격을 사용하여 브라우저의 동일 출처 정책을 우회하고 VNet IP 주소로 일반 HTTP 요청을 발행할 가능성이 있습니다. 일반 HTTP 접근에 VNet을 사용하지 않거나 DNS 리바인딩 공격에 대한 다음 완화 조치 중 하나 이상을 구현하는 것을 강력히 권장합니다:
- 이러한 API를 HTTPS 또는 다른 프로토콜로 업그레이드
- HTTP 서버에서 Host 헤더 허용 목록 적용
- HTTP 웹사이트에 대한 브라우저 접근 차단
Teleport 웹 앱을 TCP 앱으로 변환할 때 몇 가지 주의 사항이 더 있습니다:
- Teleport 웹 UI는 HSTS를 사용합니다. 애플리케이션이 프록시 서비스의 하위 도메인에서 제공될 경우 HTTPS를 사용해야 하며, 일반 HTTP를 통한 브라우저 접근이 불가능합니다. 이 가이드에서 위에 설명된 대로 사용자 지정
public_addr을 프록시 주소의 하위 도메인이 아닌 주소로 설정하여 이 문제를 해결할 수 있습니다. - HTTPS 애플리케이션은 자체적으로 TLS 연결을 처리하고 앱
public_addr에 대한 유효한 인증서가 있어야 합니다. - JWT 토큰, 리디렉트 및 헤더 재작성은 TCP 앱에서 사용할 수 없습니다.
- Teleport는 감사 로그에서 TCP 앱의 세션 시작과 종료를 기록하지만 세션 청크는 캡처되지 않습니다.
VNet은 TCP 연결로 추가적인 작업을 수행하지 않으며, 대상 애플리케이션의 uri로 직접 터널링한다는 것을 이해하는 것이 중요합니다. 애플리케이션 레이어 프로토콜은 전적으로 앱 자체와 클라이언트에 의해 결정됩니다.
