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

프라이빗 네트워킹

원문 보기 위키 갱신

이 문서는 조직 내 Fly 앱을 연결하는 IPv6 기반 WireGuard 터널 메시인 6PN과 프라이빗 네트워킹을 설명해요. 앱은 기본적으로 프라이빗 네트워킹을 바로 사용할 수 있고, .internal DNS로 앱·데이터베이스·서비스를 찾을 수 있어요. WireGuard VPN으로 개발용 노트북까지 6PN에 연결할 수 있어요.

출처: 문서

본문

조직의 Fly 앱들은 6PN이라고 불리는 IPv6를 사용하는 WireGuard 터널 메시로 연결돼요. 6PN을 통한 프라이빗 네트워킹은 앱에 기본적으로 항상 사용할 수 있어요. 특별히 할 일이 없어요.

같은 조직 내의 앱들은 6PN에 연결된 특별한 주소(6PN 주소)를 할당받아요. 이 앱들은 6PN 주소 덕분에 서로 통신할 수 있지만, 다른 조직의 앱들은 통신할 수 없어요. Fly.io 플랫폼은 예를 들어 Flycast 주소를 할당할 때처럼 명시적으로 허용하지 않는 한 서로 다른 6PN 사이에서 패킷을 전달하지 않아요.

Fly.io 밖에서 실행되는 앱도 WireGuard를 사용해 여러분의 6PN에 연결할 수 있어요. 개발용 노트북도 6PN에 연결할 수 있어요. 그러려면 Fly.io CLI인 flyctl을 사용해 6PN 주소가 있는 WireGuard 구성을 생성해요.

Fly.io .internal DNS

.internal 도메인을 사용해 앱을 데이터베이스, API 서버, 또는 6PN의 다른 앱에 연결할 수 있어요. .internal에서 제공하는 세밀한 서브도메인과 라우팅이 필요 없고 내부 앱에 Fly Proxy 기능을 쓰고 싶다면, 대신 Flycast를 사용해 보아요.

Fly Machine은 Fly 플랫폼의 커스텀 DNS 서버로 도메인 이름을 해석하도록 구성돼요. 이 DNS 서버는 임의의 DNS 쿼리를 해석할 수 있으므로 google.com도 조회할 수 있어요. 하지만 6PN 주소도 알고 있어서, 조직의 다른 앱에 대한 6PN 주소를 조회할 수 있게 해 줘요. 그 주소들은 커스텀 최상위 도메인 .internal 아래에 살고 있어요.

.internal 아래에는 Fly 조직의 모든 앱에 대한 2차 도메인이 있어요. 예를 들어 앱이 my-app-name이라는 다른 앱과 같은 조직에 있다면, my-app-name.internal에 AAAA 레코드가 존재해요. AAAA 레코드는 my-app-name Fly App에 속한 시작된 Fly Machine들의 모든 6PN 주소를 포함해요. 참고로 라이브러리와 도구마다 다중 주소 AAAA 레코드를 다르게 사용해요. 대부분은 반환된 첫 번째 주소만 사용하지만, 어떤 것은 매 요청마다 항목 사이를 라운드 로빈할 수도 있어요. 더 알고 싶다면 DNS 조회에 사용하는 라이브러리나 도구의 문서를 참고해 보아요.

각 <appname>.internal 도메인에는 그 앱의 시작된 Machine들의 더 정확한 하위 집합을 반환하는 데 사용할 수 있는 추가 서브도메인이 있어요. 예를 들어 리전 이름 한정자를 추가해 특정 리전의 앱 Machine 6PN 주소를 반환할 수 있어요: iad.my-app-name.internal. 이 도메인을 쿼리하면 iad 리전의 my-app-name Machine 6PN 주소가 반환돼요.

일부 .internal 도메인은 AAAA 레코드 대신 Machine, 앱 또는 리전 정보가 담긴 TXT 레코드를 포함해요. 예를 들어 regions.my-app-name.internal로 TXT 레코드를 요청하면 my-app-name이 배포된 리전의 쉼표로 구분된 목록을 받아요. 그리고 _apps.internal에 연결된 TXT 레코드를 요청하면 조직의 모든 앱을 발견할 수 있어요. 이는 앱 이름의 쉼표로 구분된 목록을 반환해요.

**중요:** Fly.io `.internal` 도메인에 대한 모든 AAAA 쿼리는 시작(실행 중)된 Machine에 대한 6PN 정보만 반환해요. Fly Proxy에 의해 자동 중지된 것을 포함해 중지된 Machine은 DNS 쿼리 응답에 포함되지 않아요.

다음 표는 AAAA 쿼리에 사용할 수 있는 .internal 도메인을 보여줘요:

이름 AAAA 응답
<appname>.internal 어떤 리전에서든 앱의 모든 Machine
6PN 주소
top<number>.nearest.of.<appname>.internal 앱에 가장 가까운 상위 number개
Machine의 6PN 주소
<machine_id>.vm.<appname>.internal 앱의 특정
Machine 6PN 주소
<process_group>.process.<appname>.internal 앱의 프로세스 그룹에 있는
Machine 6PN 주소
<region>.<appname>.internal 앱의 리전에 있는
Machine 6PN 주소
global.<appname>.internal <appname>.internal의 별칭
<value>.<key>.kv._metadata.<appname>.internal 일치하는 메타데이터를 가진
Machine 6PN 주소
<peername>._peer.internal 피어의 6PN 주소

다음 표는 TXT 쿼리에 사용할 수 있는 .internal 도메인을 보여줘요:

이름 TXT 응답
vms.<appname>.internal 시작된 앱 Machine의 Machine ID와
리전 이름의 쉼표 구분 목록
all.vms.<appname>.internal 배포된 모든 앱 Machine의 Machine ID와
리전 이름의 쉼표 구분 목록
regions.<appname>.internal 앱에 대해 Machine이 시작된
리전 이름의 쉼표 구분 목록
all.regions.<appname>.internal 앱에 대해 Machine이 배포된
리전 이름의 쉼표 구분 목록
_apps.internal 현재 조직의 모든
앱 이름의 쉼표 구분 목록
_peer.internal 현재 조직의 모든
WireGuard 피어 이름의 쉼표 구분 목록
_instances.internal 현재 조직의 모든 시작된 Machine에 대한
Machine ID, 앱 이름, 6PN 주소, 리전의 쉼표 구분 목록
all._instances.internal 현재 조직의 모든 배포된 Machine에 대한
Machine ID, 앱 이름, 6PN 주소, 리전의 쉼표 구분 목록

.internal 도메인을 사용하는 예시는 fly-examples/privatenet 저장소를 참고해 보아요.

6PN 주소에서 연결 수신하기

Fly Machine을 배포할 때 우리는 Machine의 /etc/hosts 파일에서 Machine의 6PN 주소를 fly-local-6pn으로 별칭을 붙여요.

앱은 6PN 주소로 접근 가능하려면 fly-local-6pn에 바인딩/리슨해야 해요. 예를 들어 포트 8080에서 실행되는 서비스가 있다면, 6PN을 통해 다른 Machine이 접근할 수 있도록 fly-local-6pn:8080에 바인딩해야 해요.

`fly-local-6pn`은 6PN 주소에 대한 것이고, `localhost`는 127.0.0.1에 대한 것이니, 6PN 주소 자체에 직접 바인딩할 수도 있어요.

앱 서비스에 연결에 대해 자세히 알아보아요.

Fly Machine을 Fly.io DNS에 연결하기

커스텀 Fly.io DNS 서버는 항상 IPv6 주소 fdaa::3에서 사용할 수 있어요. 멋지게 하고 싶다면 Machine에 dig를 설치하고 DNS에 직접 쿼리할 수 있어요. 예를 들면:

```bash cmd root@f066b83b:/# dig +short aaaa my-app-name.internal @fdaa::3 ```
fdaa:0:18:a7b:7d:f066:b83b:2

Fly Machine을 배포할 때 우리는 /etc/resolv.conf를 덮어써 DNS 서버를 fdaa::3으로 가리켜요. 이는 Fly.io Machine에 대해 우리가 설정하는 기본 구성이므로, 잘 동작하게 하기 위해 특별히 할 일은 아마 없을 거예요.

드물게 특이한 파일시스템 레이아웃을 가지거나 네임서버를 명시적으로 지적해야 하는 네트워킹 스택을 사용하는 경우처럼, 앱이 직접 Fly.io DNS를 가리켜야 할 수도 있어요. 어떤 Fly Machine에서든 네임서버는 항상 fdaa::3이에요.

6PN 주소 자세히 보기

**참고:** 6PN 주소는 한 Fly Machine을 다른 Machine과 직접 연결하며, Fly Proxy를 우회해요. 프라이빗 네트워크에서 autostop/autostart 같은 Fly Proxy 기능을 사용하려면 [Flycast](/networking/flycast)를 사용할 수 있어요.

대부분의 경우 라우팅에는 .internal DNS만으로 충분해요. 더 복잡한 라우팅이 필요하다면 앱 설계에서 6PN 주소의 구조를 활용할 수도 있어요. 단일 주소 대신 각 Fly Machine은 /112 6PN 서브넷을 할당받는데, 그 구조는 다음과 같아요:

fdaa 16 bits ULA 접두어
network 32 bits 네트워크 식별자
host 32 bits 호스트 서버 식별자
machine 32 bits fly machine 식별자
— 16 bits 자유 공간
**주의:** 6PN 주소는 **정적이 아니며** 여러 이유로 시간이 지남에 따라 바뀌어요. 개별 Fly Machine에 변하지 않는 방법으로 주소를 지정해야 한다면 `.vm..internal` 도메인을 사용할 수 있어요.

6PN 주소의 machine 식별자 부분은 14자리 Machine ID와 관련이 없어요. 둘은 독립적이에요. Fly Machine의 현재 6PN 주소는 환경 변수 FLY_PRIVATE_IP에서 찾을 수 있어요. Machine의 6PN 주소는 정적이 아니므로, Fly Machine의 Machine ID가 특정 6PN 주소에 영구히 매핑된다고 가정하지 마세요. 앱이 새 조직으로 이동하거나 Fly Machine이 새 호스트 서버로 마이그레이션될 때 6PN 주소는 바뀌어요. 하지만 6PN 주소 변경은 재부팅 시에만 일어날 수 있으므로, Machine 시작 시 6PN 주소의 변경을 확인하는 절차를 제공하면 이 이벤트를 처리하기에 충분해요.

커스텀 프라이빗 네트워크

조직 내에 추가 프라이빗 네트워크를 만들 수 있어요. 커스텀 프라이빗 네트워크는 보안을 위해 테넌트나 사용자를 격리해야 할 때 유용해요. 예를 들어 Fly.io 위에서 소프트웨어 서비스 플랫폼을 운영하고 고객이 Machine에서 신뢰할 수 없는 코드를 실행하거나, 모든 고객이 각자 보안이 유지되는 앱을 갖길 원한다면 말이죠.

커스텀 프라이빗 네트워크와 만드는 방법에 대해 자세히 알아보아요.

프라이빗 네트워크 VPN

WireGuard VPN을 사용해 6PN 프라이빗 네트워크에 연결할 수 있어요. WireGuard는 여러분의 각 Fly.io 조직에 연결하고 그 조직의 어떤 앱에도 연결할 수 있는 유연하고 안전한 방법이에요.

프라이빗 네트워크 VPN 설정하기

VPN을 설정하려면 flyctl을 사용해 개인 키가 이미 포함된 터널 구성 파일을 생성해요. 그런 다음 그 파일을 로컬 WireGuard 앱에 로드해 터널을 만들 수 있어요. 터널을 활성화하면 .internal 주소를 해석하는 내부 Fly.io DNS 서비스를 사용하게 되고, 다른 요청은 Google DNS로 전달해 해석해요.

1. WireGuard 앱 설치

설치 옵션은 WireGuard 사이트를 방문해 보아요. 시스템에 적합한 소프트웨어를 설치해요. Windows와 macOS에는 설치할 수 있는 앱이 있어요. Linux 시스템에는 보통 wireguard와 wireguard-tools라는 패키지가 있는데, 둘 다 설치해야 해요.

2. 터널 구성 만들기

터널을 만들려면 다음을 실행해요:

fly wireguard create

WireGuard 터널이 작업할 조직을 선택해요:

? Select organization:  [Use arrows to move, type to filter]
> My Org (personal)
  Test Org (test-org)

fly wireguard create 명령은 WireGuard 서비스를 구성하고, 복구할 수 없는 개인 키가 완비된 터널 구성 파일을 생성해요. 이 구성 파일은 다음 단계에서 사용돼요. 먼저 구성 파일을 저장해요:

!!!! WARNING: Output includes private key. Private keys cannot be recovered !!!!
!!!! after creating the peer; if you lose the key, you’ll need to remove    !!!!
!!!! and re-add the peering connection.                                     !!!!
? Filename to store WireGuard configuration in, or 'stdout':  mypeer.conf
Wrote WireGuard configuration to 'mypeer.conf'; load in your WireGuard client

저장한 구성 파일은 만든 피어와 같은 이름을 사용할 것을 권장해요. .conf 확장자를 추가해 다양한 WireGuard 앱이 터널 구성 파일로 인식하게 해요. 참고로 이름(.conf 확장자 제외)은 Linux에서 인터페이스 이름의 최대 길이인 15자를 넘지 않아야 해요.

**중요:** `_peer.internal`나 `._peer.internal` 쿼리처럼 피어를 이름으로 상호작용하려면 터널을 만들 때 이름을 지정해야 해요.

fly wireguard create 명령에서 region과 name을 지정하지 않으면 기본값이 사용돼요. 기본 생성 이름은 interactive-*로 시작하고, 우리는 DNS에서 interactive-*를 필터링해요(그 양이 엄청나기 때문이에요).

피어 이름과 리전을 지정하려면 먼저 fly platform regions를 실행해 사용 가능한 리전을 확인해요. Gateway 열에 체크 표시가 있는 리전을 선택해요.

그런 다음 실행해요: fly wireguard create [your-org] [region] [peer-name]

3. 터널 가져오기

Windows

WireGuard 앱을 실행해요. Import tunnel(s) from file을 클릭해요. 구성 파일을 선택해요. WireGuard 앱이 터널의 세부 사항을 표시해요. Activate를 클릭해 터널을 온라인으로 전환해요.

macOS

WireGuard 앱을 실행해요. Import tunnel(s) from file을 클릭해요. 구성 파일을 선택하고 Import를 클릭해요. OS가 WireGuard가 VPN 구성을 추가하려 한다고 프롬프트할 수 있는데, Allow를 클릭해요. WireGuard 앱이 터널의 세부 사항을 표시해요. Activate를 클릭해 터널을 온라인으로 전환해요.

Ubuntu Linux

wg-quick이 설치되어 있지 않다면 아래 명령을 실행해요. Ubuntu 18.04~22.04에는 openresolv도 필요해요.

sudo apt install wireguard-tools openresolv

구성 파일을 /etc/wireguard로 복사해요. root/sudo 권한이 필요해요:

sudo cp basic.conf /etc/wireguard

wg-quick을 실행해 이름으로(즉, .conf 확장자를 빼고) 연결을 up 시켜요. 예를 들면:

```bash cmd wg-quick up mypeer ```
[#] ip link add mypeer type wireguard
[#] wg setconf mypeer /dev/fd/63
[#] ip -6 address add fdaa:0:4:a7b:ab6:0:a:102/120 dev mypeer
[#] ip link set mtu 1420 up dev mypeer
[#] resolvconf -a tun.mypeer -m 0 -x
[#] ip -6 route add fdaa:0:4::/48 dev mypeer

WireGuard를 통해 Fly.io DNS에 연결

DNS 서버 주소는 WireGuard 연결에서 Machine과 다르다. 여러 WireGuard 연결을 실행할 수 있기 때문이에요. 여러분의 개발용 노트북은 여러 조직에 WireGuard로 연결될 수 있지만, Machine은 그럴 수 없어요.

WireGuard 연결의 DNS 서버 주소는 flyctl이 생성하는 WireGuard 터널 구성의 일부예요. 플랫폼 WireGuard 도구가 그 구성에서 DNS를 자동으로 읽어 구성할 수도 있고 아닐 수도 있어요. fly wireguard create 명령이 생성한 WireGuard 구성 파일의 예시예요:

[Interface]
PrivateKey = [redacted]
Address = fdaa:0:18:a7b:d6b:0:a:2/120
DNS = fdaa:0:18::3

맞혔을 거예요. 바로 DNS 줄이에요. 여러분의 DNS 서버 주소도 fdaa:로 시작하지만, 다음 두 부분은 조직의 네트워크에 고유해요. 모든 6PN 주소는 조직의 네트워크 ID로 접두사가 붙는데, 그 부분이 주소를 조직에 고정하는 부분이에요.

우리의 모든 WireGuard DNS 주소는 다음 패턴을 따라요: 조직 접두어를 가져와 끝에 ::3을 붙이는 거예요. 이 예시에서 WireGuard 피어 주소는:

fdaa:0:18:a7b:d6b:0:a:2

6PN 접두어는 :로 구분된 처음 3부분이므로, 이 예시의 DNS 서버 주소는 다음과 같아요:

fdaa:0:18::3

WireGuard 연결에서 dig로 DNS를 탐색하려면 DNS 서버 주소를 제공해요. 예를 들면:

```bash cmd root@f066b83b:/# dig +short aaaa my-app-name.internal @fdaa:0:18::3 ```
fdaa:0:18:a7b:7d:f066:b83b:2

VPN 터널 테스트

dig 도구가 설치되어 있다면 _apps.internal에 대한 TXT 쿼리가 연결된 조직의 모든 앱을 보여줘요:

```bash cmd dig +noall +answer _apps.internal txt ```
_apps.internal.		5	IN	TXT	"my-app-name,my-app-name-0,my-app-name-1"

피어 이름과 주소도 쿼리할 수 있어요:

```bash cmd dig +short txt _peer.internal @fdaa:0:18::3 ```
"my-peer"
```bash cmd dig +short aaaa my-peer._peer.internal @fdaa:0:18::3 ```
fdaa:0:18:a7b:7d:f066:b83b:102

앱에서 시작된 모든 Machine의 6PN 주소를 쿼리해요:

dig +short aaaa my-app-name.internal

Fly.io에서 WireGuard 관리

터널 나열

조직에 설정된 모든 터널을 나열하려면 fly wireguard list를 실행해요. 명령줄에서 조직을 제공하거나 프롬프트에서 조직을 선택할 수 있어요.

터널 제거

터널을 제거하려면 fly wireguard remove를 실행해요. 명령줄에서 조직과 터널 이름을 지정하거나 둘 다 프롬프트받을 수 있어요.

WireGuard VPN 연결 문제 해결

Fly.io 호스팅 앱에 연결하는 데 문제가 있나요? 무언가에 연결할 수 없을 때는 무엇이 작동하고 무엇이 작동하지 않는지의 기준선을 세우는 것이 도움이 돼요.

Fly.io VPN에 연결되어 있나?

로컬로 연결되어 있으면 dig 명령을 실행해 연결이 접근할 수 있는 모든 앱을 나열할 수 있어요.

```bash cmd dig _apps.internal TXT +short ```
my-app,my-app-db

결과가 반환되면 Fly.io의 조직에 VPN 연결이 있고 결과가 모든 앱 이름을 나열하는 것이에요.

결과가 반환되지 않으면 WireGuard VPN 연결이 열려 있지 않거나 조직에 실행 중인 앱이 없는 거예요.

올바른 Fly.io 조직에 연결되어 있나?

WireGuard 연결은 특정 조직에 대해 만들어져요. 각 조직의 네트워크는 다른 조직과 격리되어 있어요. Fly.io에 VPN 연결이 있을 수 있지만, 앱이 있는 조직이 아닌 다른 조직일 수 있어요. 기본적으로 여러분은 personal 조직에서 작업해요. 앱이 비즈니스 중심 조직이나 공유 조직에 있다면 VPN 연결이 앱이 살고 있는 조직인지 확인해야 해요.

앱의 Machine을 핑해 볼 수도 있어요.

Mac 버전:

ping6 my-app.internal

Linux 버전:

ping -6 my-app.internal

핑이 성공하면 애플리케이션의 Machine이 실행 중인 조직과 같은 조직에 VPN 연결이 있는 것이에요.

핑이 실패하면 애플리케이션이 배포된 조직을 확인해 보아요.

```bash cmd fly status ```
App
  Name     = my-app
  Owner    = my-biz
  Hostname = my-app.fly.dev
  Image    = my-app:deployment-0123456789

Machines
PROCESS ID              VERSION REGION  STATE   ROLE    CHECKS  LAST UPDATED
app     90706e10f12094  10      ord     started                 2024-04-16T20:20:59Z

Owner가 조직이에요. 이 예시에서는 my-biz예요.

그런 다음 WireGuard 연결이 같은 조직인지 확인해 보아요. 확실히 하려면 현재 연결을 제거하고 조직을 명시적으로 지정해 다시 만들 수 있어요.

더 알아보기 (Learn more)