본문으로 바로가기 본문 바로가기
WIKI 기술 지식 베이스

커스텀 사설 네트워크 (Custom private networks)

원문 보기 위키 갱신

커스텀 사설 네트워크를 사용해 사용자, 데이터, 또는 코드를 격리할 수 있어요. 이 문서에서는 커스텀 6PN을 만들고, 서로 다른 네트워크의 앱들을 연결하며, 관리자로서 특정 네트워크의 Machine에 직접 접근하는 방법을 알려드려요.

커스텀 사설 네트워크를 사용해 사용자, 데이터, 또는 코드를 격리할 수 있어요.

모든 조직은 기본 사설 네트워크(6PN)를 가지며, 그 네트워크의 모든 앱은 .internal 도메인을 사용해 사적으로 통신할 수 있어요. 새 앱을 만들 때 조직 내의 별개의 커스텀 6PN에 배치하도록 선택할 수 있어요. 서로 다른 6PN의 앱은 명시적으로 구성하지 않는 한 절대 통신할 수 없어요.

출처: 문서

본문

커스텀 사설 네트워크를 언제 사용할까

커스텀 사설 네트워크(6PN)는 단일 조직 내 테넌트 격리를 위한 좋은 해결책이에요. Fly.io 위에서 무언가-as-a-Service 플랫폼을 운영한다면, 고객별로 커스텀 6PN에 앱을 만들어 격리할 수 있어요. 예를 들어, 서비스의 고객 인스턴스마다, 또는 플랫폼에서 신뢰할 수 없는 코드를 실행하는 각 고객마다 커스텀 6PN에 앱을 둘 수 있어요. 고객 Machine은 자기 앱 안에서(또는 자기 네트워크의 앱들 사이에서) 자유롭게 통신할 수 있지만, 다른 6PN의 Machine이나 앱에는 닿을 수 없어요.

청구와 앱 관리 요구사항에 따라, 테넌트 또는 고객 격리를 위해 고객별 별도 조직이 더 나은 선택일 수 있어요. 통합 청구(unified billing)를 사용해 여러 조직의 청구를 관리하거나, 각 조직이 별도로 청구되게 할 수 있어요.

네트워크 이름과 ID

네트워크 이름은 조직 내에서 고유해요. 이름을 처음 지정할 때 네트워크 ID를 그 이름과 영구적으로 연결하며, 조직 내에서 그 네트워크 ID를 재사용하지 않아요. 앱을 만들 때 기존 네트워크 이름을 지정하면, 그 앱을 연결된 네트워크에 배치해요.

커스텀 6PN의 모든 앱을 파괴해도 네트워크는 기술적으로 여전히 존재해요.

커스텀 6PN 이름을 지을 때 공식을 사용하는 것이 모범 사례예요. 특히 많을 예정이거나 각 커스텀 6PN에 두 개 이상의 앱을 추가해야 한다면요. 예를 들어 customerID-network 또는 appName-someID-network 같은 형식이에요. 네트워크 이름은 문자, 숫자, 대시를 가질 수 있지만 문자로 시작해야 해요.

커스텀 사설 네트워크 만들기

기존 앱을 커스텀 6PN에 추가하거나 앱의 6PN을 변경할 수 없어요. 앱은 하나의 6PN에만 존재할 수 있어요.

POST /v1/apps 요청으로 앱을 만들 때 Machines API로 커스텀 6PN을 만들 수 있어요.

예를 들어:

curl -i -X POST \\
    -H "Authorization: Bearer ***" -H "Content-Type: application/json" \\
    "${FLY_API_HOSTNAME}/v1/apps" \\
  -d '{
      "app_name": "my-app-name",
      "org_slug": "personal",
      "network": "my-custom-network-name"
    }'

API 사용에 대한 자세한 내용은 Machines API 문서를 참조하세요.

앱을 만들 때 flyctl로 커스텀 6PN을 만들 수 있어요:

fly apps create <app name> --network <network name>

fly apps create 명령은 Machine이 없는 "빈" 앱을 만들어요. flyctl 또는 Machines API를 사용해 앱의 Machine을 수동으로 만들어야 해요.

서로 다른 6PN의 앱 연결하기

서로 다른 6PN의 사설 앱은 명시적으로 구성하지 않으면 통신할 수 없어요.

공개 앱

앱에 공개적으로 접근 가능한 서비스가 있다면, 서로 다른 6PN의 앱들이 공개 IP 주소를 사용해 그 서비스에 닿을 수 있어요.

Flycast를 사용한 사설 앱

Flycast 사설 IPv6 주소를 사용해 한 6PN의 앱을 다른 6PN에 노출할 수 있어요. 하지만 그 앱은 자체 네트워크에서는 Flycast를 통해 접근할 수 없어요. Flycast 주소를 할당할 때 --network 옵션을 사용해 요청이 시작될 네트워크 이름을 지정하세요. 예를 들어:

fly ips allocate-v6 --private --network custom-network-name

Flycast 사용에 대해 자세히 알아보세요.

fly-replay 응답 헤더로 요청 전달하기

fly-replay 응답 헤더는 Fly Proxy에게 HTTP 요청을 조직의 다른 앱이나 Machine으로 전달하라고 알려줘요. fly-replay를 사용해 커스텀 6PN의 고객 앱이나 Machine에 요청을 전달할 수 있으며, 그들을 공개적으로 노출할 필요가 없어요.

예를 들어, 공개 "라우터" 앱에서 HTTP 요청을 받은 다음, 그 요청을 서로 다른 고객 6PN의 특정 앱이나 Machine으로 전달할 수 있어요. 고객 앱은 요청을 받을 포트를 노출하도록 서비스가 구성되어 있어야 해요. 고객 앱에 공개 IP 주소가 없는지 확인하세요. Machines API나 fly apps create로 만든 앱은 기본적으로 공개 IP를 얻지 않지만, fly launch로 만든 대부분의 앱은 얻어요.

fly-replay 응답 헤더 사용에 대해 자세히 알아보세요.

커스텀 6PN의 Machine에 직접 연결하기

멀티테넌트 설정의 관리자라면 고객 문제를 해결해야 할 수도 있어요. flyctl의 네트워킹 명령을 사용해 조직 내 고객 6PN의 Machine에 닿을 수 있어요:

  • fly ssh console --app <app name> 또는 fly ssh console --machine <machine id>로 앱 Machine에 SSH로 접속. fly ssh console 문서 참조.
  • fly ssh sftp 명령으로 앱 Machine의 파일 작업. fly ssh sftp 문서 참조.
  • fly proxy <local:remote> [remote_host] --app <app name>으로 앱 Machine에 WireGuard 터널 생성. fly proxy 문서 참조.

앱 또는 Machine이 어떤 네트워크에 있는지 확인하기

조직의 모든 앱에 대한 네트워크 이름을 검색할 수 있고, 사설 IPv6 주소를 검사해 앱이나 Machine이 서로 다른 네트워크에 있는지 확인할 수도 있어요.

네트워크 이름 얻기

현재 앱의 네트워크 이름을 얻는 유일한 방법은 Machines API로 조직의 모든 앱을 나열하는 것이에요.

GET /v1/apps?org_slug=<org name>

예시 응답:

{
    "total_apps": 22,
    "apps": [
        {
            "id": "682kqp63x4k9d543",
            "name": "aged-cherry-366",
            "machine_count": 4,
            "volume_count": 2,
            "network": "default"
        },
        {
            "id": "704e9387kyy13xgn",
            "name": "muddy-violet-667",
            "machine_count": 2,
            "volume_count": 2,
            "network": "test-network"
        },
...

API 사용에 대한 자세한 내용은 Machines API 문서를 참조하세요.

사설 IPv6 주소에 포함된 네트워크 ID

각 6PN은 네트워크 ID로 식별되며, 이는 각 사설 IPv6 주소의 32비트에 인코딩돼요.

두 Machine의 사설 IPv6 주소를 비교해 서로 다른 네트워크에 있는지 확인할 수 있어요. Machine의 6PN 주소는 다음 방법 중 하나로 얻을 수 있어요:

모든 Fly.io 사설 IPv6 주소는 fdaa로 시작해요. fdaa 뒤의 32비트가 6PN을 식별해요. 예를 들어, 다음 주소들은 서로 다른 6PN의 Machine에 속해요:

Machine 1: fdaa:2:45b:a7b:174:db43:d3c6:2
Machine 2: fdaa:9:d844:a7b:e:33bd:e8b1:2

Machine 1의 네트워크 ID는 :2:45b:에, Machine 2의 네트워크 ID는 :9:d844:에 포함돼 있어요.

Flycast 주소도 같은 32비트 그룹에 네트워크 ID를 포함해요. fly ips list를 실행해 앱의 사설 IPv6 주소를 얻으세요.

6PN 주소에 대해 자세히 알아보세요.

더 알아보기 (Learn more)