> ## Documentation Index
> Fetch the complete documentation index at: https://link.datarelay.run/llms.txt
> Use this file to discover all available pages before exploring further.

# OCI 무료티어 서버 준비

> 고정 공인 IP나 무료 서버가 없다면 OCI Always Free VM과 Reserved Public IPv4를 사용해 Data Relay Link 서버용 Ubuntu Linux를 준비합니다.

# OCI 무료티어 Data Relay Link 서버 구축

이 가이드는 빈 OCI 환경에서 시작해 **Data Relay Link v2.2.1 서버를 만들고 첫 번째 SSH Client를 연결하는 단계까지** 한 번에 설명합니다. 화면은 기존 OCI 구축 문서에서 실제로 사용했던 OCI Console 스크린샷을 재사용하고, Data Relay Link 명령과 동작 설명만 현재 stable 기준으로 업데이트했습니다.

<Note>
  OCI Console 메뉴명, Free Tier 정책, 리전별 capacity와 가격은 바뀔 수 있습니다. 실제 생성 직전 Console의 **Always Free Eligible** 표시와 예상 비용을 최종 기준으로 확인하세요. Oracle은 장기간 사용량이 낮은 Always Free Compute Instance를 회수할 수 있다고 명시하므로, 현재 OCI 정책을 확인하지 않은 채 Free Tier VM을 SLA가 보장되는 운영 서버로 가정하지 마세요.
</Note>

## 최종 구성

```mermaid theme={null}
flowchart TD
    U[외부 사용자] -->|SSH / HTTP / HTTPS / TCP 서비스 포트| PUB[OCI Reserved Public IPv4]
    C[원격 Data Relay Link Client\nNAT/방화벽 뒤] -->|Outbound TCP 443 / WSS| PUB
    PUB --> VM[Ubuntu 24.04\nData Relay Link Server]
    VM -->|Public 443| FE[single-443 frontend]
    FE -->|loopback 7000| S[relay backend]
    FE -->|loopback 6099| ENR[Enrollment / Management]
    VM --> PORTS[Published service ports\n6000-6098]
```

이 OCI 예제는 외부 정책을 단순하게 만들기 위해 **Enterprise single-443**를 사용합니다.

| Public ingress | 용도                                                             |
| -------------- | -------------------------------------------------------------- |
| TCP 22         | OCI 서버 관리용 SSH. 가능하면 관리자 IP `/32`로 제한                          |
| TCP 443        | Data Relay Link control over WSS + Enrollment/Management HTTPS |
| TCP 6000-6098  | Client가 게시한 서비스. 필요하면 실제 사용 포트/source만 허용                      |
| TCP 6099       | single-443에서는 **외부 공개 금지**                                     |
| TCP 7000       | single-443에서는 **외부 공개 금지**                                     |

Direct 모드도 stable 지원입니다. Direct를 선택하면 TCP 6099가 별도의 Public Enrollment/Management HTTPS 포트가 됩니다.

## 10분 퀵맵

| 순서 | 작업                       | 이 가이드의 값                                                    |
| -: | ------------------------ | ----------------------------------------------------------- |
|  1 | VCN 생성                   | `data-relay-vcn` / `10.0.0.0/16`                            |
|  2 | Internet Gateway + Route | `0.0.0.0/0` → Internet Gateway                              |
|  3 | Public Subnet            | `data-relay-public-subnet` / `10.0.0.0/24`                  |
|  4 | Security List            | 관리용 SSH, `443`, `6000-6098`                                 |
|  5 | Compute Instance         | Ubuntu 24.04 x86\_64 / eligible일 때 `VM.Standard.E2.1.Micro` |
|  6 | Public 주소                | **Reserved Public IPv4** 연결                                 |
|  7 | SSH 접속                   | `ubuntu@<RESERVED-IP>`                                      |
|  8 | Data Relay Link 설치       | immutable `v2.2.1`                                          |
|  9 | 검증                       | `drlink doctor` + listener 확인                               |
| 10 | 첫 Client                 | 현재 Zero-Touch one-line Enrollment                           |

# Part I — OCI 네트워크와 VM 만들기

## 1. Virtual Cloud Networks로 이동

OCI Home에서 **Networking → Virtual Cloud Networks**로 이동합니다. 아래 화면은 기존 실구축 Word 문서의 **그림 1 원본 이미지**입니다. 이미지 변환이나 축소본을 사용하지 않습니다.

<img src="https://mintcdn.com/data-relay/86C_LEoilY3X3c1b/images/oci/1.png?fit=max&auto=format&n=86C_LEoilY3X3c1b&q=85&s=29667844e6b442de29632844bee91c88" alt="그림 1. OCI Home 화면 - Networking/Instances 메뉴 진입" width="1580" height="1120" data-path="images/oci/1.png" />

## 2. VCN, Internet Gateway, Route, Public Subnet, Ingress 구성

다음 값을 사용합니다.

```text theme={null}
VCN name             data-relay-vcn
VCN IPv4 CIDR         10.0.0.0/16
Internet Gateway      data-relay-internet-gateway
Default route         0.0.0.0/0 -> Internet Gateway
Public subnet         data-relay-public-subnet
Public subnet CIDR    10.0.0.0/24
Subnet type           Regional / Public
```

### 2-1. VCN 생성

**Virtual Cloud Networks → Create VCN**으로 이동합니다.

<img src="https://mintcdn.com/data-relay/86C_LEoilY3X3c1b/images/oci/2.png?fit=max&auto=format&n=86C_LEoilY3X3c1b&q=85&s=d9428f5992da911947b340069e83daac" alt="그림 2. Virtual Cloud Networks에서 Create VCN 선택" width="1579" height="383" data-path="images/oci/2.png" />

VCN 이름은 `data-relay-vcn`, IPv4 CIDR은 `10.0.0.0/16`으로 설정합니다.

<img src="https://mintcdn.com/data-relay/86C_LEoilY3X3c1b/images/oci/3.png?fit=max&auto=format&n=86C_LEoilY3X3c1b&q=85&s=75c39f71f0528fb6ee93374c37df9abc" alt="그림 3. VCN 이름과 IPv4 CIDR 설정" width="1581" height="1050" data-path="images/oci/3.png" />

### 2-2. Internet Gateway 생성

생성한 `data-relay-vcn`의 **Gateways** 탭에서 Internet Gateway를 생성합니다.

<img src="https://mintcdn.com/data-relay/86C_LEoilY3X3c1b/images/oci/4.png?fit=max&auto=format&n=86C_LEoilY3X3c1b&q=85&s=54510adf087b0869aff4e7446e9efe76" alt="그림 4. VCN의 Gateways 탭에서 Internet Gateway 생성" width="1582" height="1076" data-path="images/oci/4.png" />

Internet Gateway 이름은 예제 기준 `data-relay-internet-gateway`입니다.

<img src="https://mintcdn.com/data-relay/86C_LEoilY3X3c1b/images/oci/5.png?fit=max&auto=format&n=86C_LEoilY3X3c1b&q=85&s=148c9e27b17b71229b3f3a630cbc752d" alt="그림 5. Internet Gateway 이름 예: data-relay-internet-gateway" width="1576" height="230" data-path="images/oci/5.png" />

### 2-3. Default Route Table에 인터넷 경로 추가

**Routing** 탭에서 `Default Route Table for data-relay-vcn`을 선택합니다.

<img src="https://mintcdn.com/data-relay/86C_LEoilY3X3c1b/images/oci/6.png?fit=max&auto=format&n=86C_LEoilY3X3c1b&q=85&s=abac4a8bd6a6d1ad121c3a5fd9036446" alt="그림 6. VCN Routing 탭에서 Default Route Table 선택" width="1581" height="483" data-path="images/oci/6.png" />

**Route Rules → Add Route Rules**를 선택합니다.

<img src="https://mintcdn.com/data-relay/86C_LEoilY3X3c1b/images/oci/7.png?fit=max&auto=format&n=86C_LEoilY3X3c1b&q=85&s=561fa46fe8d6c322427829df70578e4e" alt="그림 7. Route Rules에서 Add Route Rules 선택" width="1580" height="479" data-path="images/oci/7.png" />

다음 값으로 인터넷 경로를 추가합니다.

```text theme={null}
Target Type        Internet Gateway
Destination CIDR   0.0.0.0/0
Target             data-relay-internet-gateway
```

<img src="https://mintcdn.com/data-relay/86C_LEoilY3X3c1b/images/oci/8.png?fit=max&auto=format&n=86C_LEoilY3X3c1b&q=85&s=451768d14317d594a62f2dd327512ebd" alt="그림 8. Internet Gateway로 0.0.0.0/0 경로 추가" width="1579" height="510" data-path="images/oci/8.png" />

추가 후 Route Rule이 정상 반영되었는지 확인합니다.

<img src="https://mintcdn.com/data-relay/86C_LEoilY3X3c1b/images/oci/9.png?fit=max&auto=format&n=86C_LEoilY3X3c1b&q=85&s=875392a54de74d39c7f89b103ca67c4b" alt="그림 9. Route Rule 적용 결과" width="1583" height="543" data-path="images/oci/9.png" />

### 2-4. Public Subnet 생성 시작

**Subnets** 탭에서 **Create Subnet**을 선택합니다.

<img src="https://mintcdn.com/data-relay/86C_LEoilY3X3c1b/images/oci/10.png?fit=max&auto=format&n=86C_LEoilY3X3c1b&q=85&s=0c40366c81467e081b53dc0f68feaf3a" alt="그림 10. VCN Subnets 탭에서 Create Subnet 선택" width="1582" height="496" data-path="images/oci/10.png" />

### 2-5. Public Subnet 상세 설정

Public Subnet은 다음 값으로 생성합니다.

```text theme={null}
Name           data-relay-public-subnet
Subnet Type    Regional
IPv4 CIDR      10.0.0.0/24
Route Table    Default Route Table for data-relay-vcn
Subnet Access  Public Subnet
```

<img src="https://mintcdn.com/data-relay/86C_LEoilY3X3c1b/images/oci/11.png?fit=max&auto=format&n=86C_LEoilY3X3c1b&q=85&s=28cd5adff105c75c019964d00dc7ea2d" alt="그림 11. Public Subnet 설정" width="1583" height="982" data-path="images/oci/11.png" />

### 2-6. Security List 설정

생성한 VCN의 **Security Lists** 메뉴로 이동합니다.

<img src="https://mintcdn.com/data-relay/86C_LEoilY3X3c1b/images/oci/12.png?fit=max&auto=format&n=86C_LEoilY3X3c1b&q=85&s=b7972871a10d0539b5cf7d93a4b31141" alt="그림 12. VCN Security Lists 메뉴" width="1579" height="1078" data-path="images/oci/12.png" />

**Default Security List**의 Ingress Rules를 확인합니다.

<img src="https://mintcdn.com/data-relay/86C_LEoilY3X3c1b/images/oci/13.png?fit=max&auto=format&n=86C_LEoilY3X3c1b&q=85&s=8a7f386f94a0448661c3e2402025f70c" alt="그림 13. Default Security List의 Ingress Rules" width="1579" height="902" data-path="images/oci/13.png" />

Data Relay Link single-443 기준으로 TCP 443과 Published Service 범위인 TCP 6000-6098을 추가합니다. SSH 22는 기존 관리용 규칙을 유지하되 가능하면 관리자 공인 IP `/32`로 제한합니다.

<img src="https://mintcdn.com/data-relay/86C_LEoilY3X3c1b/images/oci/14.png?fit=max&auto=format&n=86C_LEoilY3X3c1b&q=85&s=cb1c4411d6821409bb13d133c58ce04d" alt="그림 14. Ingress Rule 추가 - TCP 443 및 TCP 6000-6098" width="1579" height="1040" data-path="images/oci/14.png" />

추가 후 Ingress Rule이 정상 반영되었는지 확인합니다.

<img src="https://mintcdn.com/data-relay/86C_LEoilY3X3c1b/images/oci/15.png?fit=max&auto=format&n=86C_LEoilY3X3c1b&q=85&s=d7ec25fc932b728e61bb1166dc202f59" alt="그림 15. Ingress Rule 적용 결과" width="1579" height="983" data-path="images/oci/15.png" />

### single-443 권장 Ingress

| Protocol | Destination port | Source                                 | 용도                                  |
| -------- | ---------------: | -------------------------------------- | ----------------------------------- |
| TCP      |               22 | **관리자 공인 IP/32**                       | SSH 관리                              |
| TCP      |              443 | 필요한 Client network 또는 필요 시 `0.0.0.0/0` | WSS control + Enrollment/Management |
| TCP      |        6000-6098 | 실제 서비스가 필요한 source                     | Published services                  |

<Warning>
  **single-443에서는 6099와 7000을 OCI Public Ingress에 열지 않습니다.** 두 포트는 서버 내부 loopback backend입니다. 또한 다른 OCI 예제 화면의 `All Protocols` 규칙을 그대로 복사하지 말고 위 Data Relay Link용 최소 규칙을 사용하세요.
</Warning>

`6000-6098` 전체를 미리 열고 싶지 않다면 실제 배정된 서비스 포트만 열고 source CIDR도 제한할 수 있습니다.

## 3. Ubuntu Compute Instance 생성

이 가이드의 권장값:

```text theme={null}
Name           data-relay-link-server
Image          Canonical Ubuntu 24.04 LTS x86_64
Shape          VM.Standard.E2.1.Micro (Console에서 Free/Eligible로 표시될 때)
VCN            data-relay-vcn
Subnet         data-relay-public-subnet
Boot volume    기본값
```

Compute Instance를 만들기 전에 앞에서 생성한 VCN, Internet Gateway, Route, Public Subnet, Security List가 준비되어 있는지 확인한 뒤 **Compute → Instances**로 이동합니다.

<img src="https://mintcdn.com/data-relay/86C_LEoilY3X3c1b/images/oci/16.png?fit=max&auto=format&n=86C_LEoilY3X3c1b&q=85&s=f01a44375439557c2b1e6699f0abec54" alt="그림 16. 생성한 네트워크 리소스 확인 후 Compute로 이동" width="1582" height="1016" data-path="images/oci/16.png" />

### 3-1. Compute Instance 기본 정보

**Create compute instance** 화면에서 이름과 placement를 확인합니다.

<img src="https://mintcdn.com/data-relay/86C_LEoilY3X3c1b/images/oci/17.png?fit=max&auto=format&n=86C_LEoilY3X3c1b&q=85&s=71a2ad9a6e83b3d6ed2f683bea565b22" alt="그림 17. Compute Instance 기본 정보" width="1581" height="560" data-path="images/oci/17.png" />

### 3-2. Canonical Ubuntu 24.04 선택

**Change image**를 눌러 Canonical Ubuntu 24.04 이미지를 선택합니다. 이미지/버전은 OCI Console의 현재 표시를 최종 기준으로 확인하세요.

<img src="https://mintcdn.com/data-relay/86C_LEoilY3X3c1b/images/oci/18.png?fit=max&auto=format&n=86C_LEoilY3X3c1b&q=85&s=dae3f5bd9e6849216c68f1a8b5445961" alt="그림 18. Ubuntu 이미지 선택" width="1580" height="1052" data-path="images/oci/18.png" />

Security 설정은 별도 요구가 없다면 기본값을 사용합니다.

<img src="https://mintcdn.com/data-relay/86C_LEoilY3X3c1b/images/oci/19.png?fit=max&auto=format&n=86C_LEoilY3X3c1b&q=85&s=a5980a2012f3d32e9a5b246dc12d9061" alt="그림 19. Security 설정 화면 - 기본값 사용" width="1584" height="670" data-path="images/oci/19.png" />

### 3-3. VCN과 Public Subnet 선택

Primary VNIC에서 앞에서 만든 `data-relay-vcn`과 `data-relay-public-subnet`을 각각 선택합니다.

<img src="https://mintcdn.com/data-relay/86C_LEoilY3X3c1b/images/oci/20.png?fit=max&auto=format&n=86C_LEoilY3X3c1b&q=85&s=d777232804293fd985dc2f5d4a5d84d7" alt="그림 20. 기존 data-relay-vcn과 data-relay-public-subnet 선택" width="1578" height="905" data-path="images/oci/20.png" />

### 3-4. Public IPv4 자동할당 해제 및 SSH Key 설정

최종적으로 Reserved Public IP를 사용할 것이므로 **Automatically assign public IPv4 address**는 끕니다. 이어서 기존 SSH public key를 넣거나 OCI에서 새 key pair를 생성하고 private key를 안전하게 보관합니다.

<img src="https://mintcdn.com/data-relay/86C_LEoilY3X3c1b/images/oci/21.png?fit=max&auto=format&n=86C_LEoilY3X3c1b&q=85&s=591137a9098957f8ca9aa2299560bdc6" alt="그림 21. Public IPv4 자동 할당 비활성화 및 SSH Key 생성/다운로드" width="1577" height="879" data-path="images/oci/21.png" />

### 3-5. Boot Volume 확인

별도 스토리지 요구사항이 없다면 Boot Volume은 기본값을 사용합니다.

<img src="https://mintcdn.com/data-relay/86C_LEoilY3X3c1b/images/oci/22.png?fit=max&auto=format&n=86C_LEoilY3X3c1b&q=85&s=06ae9c87efc28d0b814725179caceb9d" alt="그림 22. Boot Volume 설정 - 기본값 사용" width="1581" height="1049" data-path="images/oci/22.png" />

### 3-6. Instance 생성 전 Review

Image가 Ubuntu 24.04이고 Shape, VCN/Subnet, SSH Key가 의도한 값인지 확인한 뒤 Instance를 생성합니다.

<img src="https://mintcdn.com/data-relay/86C_LEoilY3X3c1b/images/oci/23.png?fit=max&auto=format&n=86C_LEoilY3X3c1b&q=85&s=f25c69d3bd694c46294e05048aea764c" alt="그림 23. Review - Ubuntu 24.04 및 VM.Standard.E2.1.Micro 확인" width="1580" height="1042" data-path="images/oci/23.png" />

### 3-7. 생성된 Instance 및 Free/Eligible 표시 확인

Instance 목록에서 생성 상태를 확인합니다.

<img src="https://mintcdn.com/data-relay/86C_LEoilY3X3c1b/images/oci/24.png?fit=max&auto=format&n=86C_LEoilY3X3c1b&q=85&s=552e3dd06093119e7aa0bc4faffff2de" alt="그림 24. 생성된 Instance 목록" width="1582" height="488" data-path="images/oci/24.png" />

기존 화면의 **Always Free** 표시는 당시 OCI Console의 예시입니다. 현재 Free Tier/Eligible 여부는 리전과 tenancy 정책에 따라 달라질 수 있으므로 현재 Console의 비용/자격 표시를 최종 기준으로 확인하세요.

<img src="https://mintcdn.com/data-relay/86C_LEoilY3X3c1b/images/oci/25.png?fit=max&auto=format&n=86C_LEoilY3X3c1b&q=85&s=5bdad9eae766fa9de36fd99648e5ae8e" alt="그림 25. Instance의 Always Free 표시 확인 및 생성된 인스턴스 선택" width="1583" height="473" data-path="images/oci/25.png" />

중요한 부분은 다음입니다.

* 기존 `data-relay-vcn` 선택
* `data-relay-public-subnet` 선택
* Private IPv4는 자동 할당
* 최종 고정 IP 구성을 위해 **Automatically assign public IPv4 address를 끔**
* 기존 SSH public key를 넣거나 OCI에서 새 key pair 생성
* OCI가 key를 생성했다면 private key를 즉시 안전하게 보관
* 별도 요구가 없다면 Boot Volume은 기본값 유지

<Warning>
  `VM.Standard.E2.1.Micro`가 실제로 무료인지와 생성 가능한지는 리전/tenancy 상태에 따라 달라집니다. 생성 화면에서 Eligible/비용 표시가 다르면 이 문서만 보고 무료라고 가정하지 마세요.
</Warning>

## 4. Reserved Public IPv4 연결

Instance 상세 화면에서 **Networking → Primary VNIC**로 이동합니다.

<img src="https://mintcdn.com/data-relay/86C_LEoilY3X3c1b/images/oci/26.png?fit=max&auto=format&n=86C_LEoilY3X3c1b&q=85&s=3c026e58221c14b3086cbc2c2dd86f76" alt="그림 26. Instance → Networking → Primary VNIC 확인" width="1582" height="890" data-path="images/oci/26.png" />

VNIC에서 **IP administration → Primary Private IP**를 선택합니다.

<img src="https://mintcdn.com/data-relay/86C_LEoilY3X3c1b/images/oci/27.png?fit=max&auto=format&n=86C_LEoilY3X3c1b&q=85&s=3fe903411d80c7cf367ee4167ec7b03c" alt="그림 27. VNIC → IP administration → Primary Private IP" width="1580" height="581" data-path="images/oci/27.png" />

기존 Ephemeral Public IP가 있다면 Edit에서 **No public IP**를 선택해 먼저 해제합니다.

<img src="https://mintcdn.com/data-relay/86C_LEoilY3X3c1b/images/oci/28.png?fit=max&auto=format&n=86C_LEoilY3X3c1b&q=85&s=99d6faa0ac882c9ad0476a76202eb4fc" alt="그림 28. Edit Private IP Address에서 No public IP 선택" width="1579" height="675" data-path="images/oci/28.png" />

Public IP가 미할당 상태인지 확인합니다.

<img src="https://mintcdn.com/data-relay/86C_LEoilY3X3c1b/images/oci/29.png?fit=max&auto=format&n=86C_LEoilY3X3c1b&q=85&s=29e65b2a5dbdca29772997218f6f7d6d" alt="그림 29. Public IP 미할당 상태" width="1581" height="589" data-path="images/oci/29.png" />

다시 Edit에서 다음 값을 선택합니다.

```text theme={null}
Public IP type        Reserved public IP
Option                Create new Reserved IP Address
Name                  data-relay-reserved-public-ip
```

<img src="https://mintcdn.com/data-relay/86C_LEoilY3X3c1b/images/oci/30.png?fit=max&auto=format&n=86C_LEoilY3X3c1b&q=85&s=f2accede5bbf5389c5c4af4231cec739" alt="그림 30. 새 Reserved Public IP 생성 및 연결" width="1579" height="1050" data-path="images/oci/30.png" />

이 Reserved Public IP가 Data Relay Link의 지속적인 공인 진입점이 됩니다. OCI에서는 Public IP가 Ubuntu NIC에 직접 설정되는 것이 아니라 OCI 측에서 private VNIC 주소와 매핑되기 때문에 Ubuntu의 `ip addr`에서는 `10.x.x.x` 같은 Private IP만 보이는 것이 정상입니다.

Reserved Public IP가 Primary Private IP에 정상 연결되었는지 확인합니다. 아래 그림 31의 공인 IP 값은 공개 문서용으로 마스킹된 화면입니다.

<img src="https://mintcdn.com/data-relay/fPSMQYB-eNtHu5GB/images/oci/31.png?fit=max&auto=format&n=fPSMQYB-eNtHu5GB&q=85&s=6dff61551f05e1a6db2026c9a457ac7f" alt="그림 31. Reserved Public IP 연결 완료 확인" width="2133" height="618" data-path="images/oci/31.png" />

<Note>
  기존 Word 문서의 그림 32(SSH 접속 성공)는 실환경 접속 정보가 포함되어 있어 아직 공개하지 않습니다. 아래 SSH 절차에서는 `<RESERVED-PUBLIC-IP>` placeholder를 사용합니다.
</Note>

## 5. Ubuntu SSH 접속

OCI Ubuntu 기본 계정은 일반적으로 `ubuntu`입니다.

```bash theme={null}
chmod 600 ~/Downloads/<private-key-file>
ssh -i ~/Downloads/<private-key-file> ubuntu@<RESERVED-PUBLIC-IP>
```

접속 후:

```bash theme={null}
uname -m
cat /etc/os-release
systemctl --version
```

를 확인합니다.

```text theme={null}
Architecture   x86_64
OS             Ubuntu 24.04 LTS
PID 1          systemd
```

# Part II — Data Relay Link v2.2.1 설치

## 6. 최소 패키지와 Host Firewall 확인

```bash theme={null}
sudo apt update
sudo apt -y install curl ca-certificates

timedatectl status
sudo ufw status
sudo iptables -S INPUT
```

<Warning>
  예전 실환경 메모에는 해당 장비에 맞춰 `iptables INPUT`을 비우는 절차가 있었습니다. **현재 가이드에서는 `iptables -F` 또는 INPUT 기본정책 변경을 일반 설치 절차로 권장하지 않습니다.** OCI Security List/NSG와 Ubuntu Host Firewall은 서로 별도의 보안 경계이므로 필요한 포트만 환경에 맞게 명시적으로 허용하세요.
</Warning>

## 7. immutable stable v2.2.1 설치

```bash theme={null}
curl -fsSL \
  https://raw.githubusercontent.com/xdr-labs/frp-auto-deploy/v2.2.1/dist/bootstrap-server.sh \
  | sudo bash
```

설치 질문에서 이 OCI 예제는 **Enterprise single-443**를 선택합니다. 결과 구조는 다음과 같습니다.

```text theme={null}
Public host                  <RESERVED-PUBLIC-IP 또는 DNS>
Deployment mode              Enterprise single-443
Public control               TCP 443
Data Relay Link backend                  127.0.0.1:7000
Public Enrollment/Management HTTPS 443
Allocator backend            127.0.0.1:6099
Published service range      TCP 6000-6098
Bundled relay engine                    0.71.0
Project                       2.2.1
```

예전 사이트의 `v2.1.0` 환경변수 설치 명령을 그대로 사용하지 마세요. 현재 field 설치 기준은 위의 immutable **v2.2.1** bootstrap과 현재 installer 질문입니다.

## 8. Server 상태 확인

```bash theme={null}
sudo drlink show version
sudo drlink show status
sudo drlink doctor
```

single-443 listener도 확인합니다.

```bash theme={null}
sudo ss -lntp | grep -E ':(443|6099|7000)\b'
```

의도된 노출 구조:

```text theme={null}
0.0.0.0:443       public frontend
127.0.0.1:7000    frps backend
127.0.0.1:6099    allocator backend
```

외부 Mac/Linux 등에서:

```bash theme={null}
nc -vz -w 3 <RESERVED-PUBLIC-IP> 443
```

를 실행해 Public 443도 확인합니다. Client를 붙이기 전 `drlink doctor`에 blocking failure가 없어야 합니다.

## 9. 재부팅 후 영속성 확인

```bash theme={null}
sudo reboot
```

다시 접속 후:

```bash theme={null}
sudo drlink show status
sudo drlink doctor
sudo ss -lntp | grep -E ':(443|6099|7000)\b'
```

를 확인합니다. 정상 update/reboot는 identity나 service reservation을 새로 만들게 해서는 안 됩니다.

# Part III — 첫 번째 Client 연결

## 10. Zero-Touch SSH Enrollment 생성

Data Relay Link Server에서:

```bash theme={null}
sudo drlink create enrollment \
  --one-line \
  --ssh \
  --ssh-user <CLIENT에 실제 존재하는 계정> \
  --label <CLIENT-LABEL>
```

서버가 출력한 **one-line 명령 전체를 그대로** Client에서 실행합니다. 직접 bootstrap payload를 다시 조립하지 마세요.

<Warning>
  생성된 Zero-Touch 명령에는 만료시간이 있는 one-time bootstrap credential이 들어 있으므로 사용/만료 전까지 secret처럼 취급합니다. 공개 채팅, 문서, 티켓에 실제 살아 있는 명령을 남기지 마세요.
</Warning>

Data Relay Link는 Client의 SSH 계정, password, SSH key, `sshd`를 생성하지 않습니다. `--ssh-user`의 계정과 SSH 서비스는 Client에 이미 존재해야 합니다.

## 11. Client 상태와 실제 SSH 확인

Client:

```bash theme={null}
sudo drlink show version
sudo drlink show status
sudo drlink show services
sudo drlink doctor
```

Server:

```bash theme={null}
sudo drlink show clients
sudo drlink show client <CLIENT-ID>
sudo drlink show client <CLIENT-ID> services
```

실제 연결:

```bash theme={null}
ssh -p <할당된-PUBLIC-SERVICE-PORT> <CLIENT-USER>@<RESERVED-PUBLIC-IP>
```

**Public Service Port는 Client가 직접 고르는 값이 아닙니다.** Server가 service에 대해 할당하고 persistent reservation으로 유지합니다.

# 최종 체크리스트

* [ ] `data-relay-vcn` / `10.0.0.0/16`
* [ ] Internet Gateway 생성
* [ ] `0.0.0.0/0 → Internet Gateway` Route
* [ ] `data-relay-public-subnet` / `10.0.0.0/24`
* [ ] SSH 22는 관리자 source에 맞게 제한
* [ ] TCP 443 Public reachability 확인
* [ ] Published service port는 필요한 범위/source만 허용
* [ ] single-443에서 6099/7000 Public 비노출
* [ ] Ubuntu 24.04 x86\_64 VM Running
* [ ] Reserved Public IPv4 연결
* [ ] 외부 SSH 성공
* [ ] Data Relay Link 2.2.1 / Data Relay Link 0.71.0 확인
* [ ] `drlink doctor` blocking failure 없음
* [ ] 443/6099/7000 listener 노출 구조 정상
* [ ] reboot 후 상태 유지
* [ ] 첫 Zero-Touch Client Enrollment 성공
* [ ] 할당된 Public SSH Port로 실제 접속 성공

## 장애를 두 구간으로 나누기

서비스 연결 실패 시 다음 두 테스트를 분리하면 원인을 빠르게 찾을 수 있습니다.

```bash theme={null}
# 외부 workstation: Internet -> Data Relay Link Server
nc -vz -w 3 <RESERVED-PUBLIC-IP> <PUBLIC-SERVICE-PORT>

# Data Relay Link Client: Client -> Local/LAN Target
nc -vz -w 3 <TARGET-IP> <TARGET-PORT>
```

첫 번째가 실패하면 OCI/Security List/Public endpoint를, 두 번째가 실패하면 Client와 내부 Target 사이의 routing/firewall/service를 봅니다.

## 다음 단계

<CardGroup cols={2}>
  <Card title="서비스 게시" icon="network-wired" href="/ko/guides/services">
    SSH, HTTP, HTTPS, Custom TCP 또는 내부 LAN의 다른 서버를 공개합니다.
  </Card>

  <Card title="방화벽 & NAT" icon="shield-halved" href="/ko/deployment/firewall-nat">
    Direct, Public/Listen 분리 NAT, single-443 차이를 비교합니다.
  </Card>
</CardGroup>

## OCI 공식 참고 문서

* [Oracle Cloud Always Free Resources](https://docs.oracle.com/en-us/iaas/Content/FreeTier/freetier_topic-Always_Free_Resources.htm)
* [Launching Your First Linux Instance](https://docs.oracle.com/en-us/iaas/Content/Compute/tutorials/first-linux-instance/overview.htm)
* [Public IP Addresses](https://docs.oracle.com/en-us/iaas/Content/Network/Tasks/managingpublicIPs.htm)
* [Creating a Reserved Public IP](https://docs.oracle.com/en-us/iaas/Content/Network/Tasks/reserved-public-ip-create.htm)
* [Assigning a Reserved Public IP](https://docs.oracle.com/en-us/iaas/Content/Network/Tasks/reserved-public-ip-assign.htm)
