> ## 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 Free Tier Server Preparation

> Prepare an Ubuntu Data Relay Link server with an OCI Always Free-eligible VM and a persistent Reserved Public IPv4 address.

# OCI Free Tier Data Relay Link Server

This guide takes you from an empty OCI tenancy to a working **Data Relay Link v2.2.1** server and the first SSH client. It reuses the actual OCI Console screenshots from the original deployment guide while updating all commands and product behavior to the current Data Relay Link stable release.

<Note>
  OCI Console labels, Free Tier eligibility, capacity, and pricing can change. Treat the current Console's **Always Free Eligible** indicator and cost estimate as the final source before creating resources. Oracle also documents that idle Always Free compute instances may be reclaimed after a sustained low-usage period, so do not treat a Free Tier VM as an SLA-backed production host without reviewing the current OCI policy.
</Note>

## What you will build

```mermaid theme={null}
flowchart TD
    U[Remote user] -->|SSH / HTTP / HTTPS / TCP service port| PUB[OCI Reserved Public IPv4]
    C[Remote Data Relay Link client\nbehind NAT/firewall] -->|Outbound TCP 443 / WSS| PUB
    PUB --> VM[Ubuntu 24.04\nData Relay Link server]
    VM -->|public 443| FE[single-443 frontend]
    FE -->|loopback 7000| RS[relay backend]
    FE -->|loopback 6099| ENR[Enrollment / management]
    VM --> PORTS[Published service ports\n6000-6098]
```

The high-resolution architecture diagram below shows the same deployment from the operator's point of view: one OCI Reserved Public IP fronts the Data Relay Link server, while each remote client publishes one or more local or reachable LAN services through its assigned persistent public ports.

<img src="https://mintcdn.com/data-relay/FV_3T9UHjZ1eRGYX/images/oci/53.png?fit=max&auto=format&n=FV_3T9UHjZ1eRGYX&q=85&s=2c7382e9de32b0fb16374fdd67884238" alt="Data Relay Link SSH access architecture using an OCI Reserved Public IP" width="1448" height="1086" data-path="images/oci/53.png" />

For this OCI walkthrough we use **Enterprise single-443** because it gives a simple public policy:

| Public ingress | Purpose                                                        |
| -------------- | -------------------------------------------------------------- |
| TCP 22         | OCI server administration; restrict to your admin IP `/32`     |
| TCP 443        | Data Relay Link control over WSS + enrollment/management HTTPS |
| TCP 6000-6098  | Published client services; restrict further when practical     |
| TCP 6099       | **Do not expose** in single-443                                |
| TCP 7000       | **Do not expose** in single-443                                |

Direct mode is also fully supported. In Direct mode, TCP 6099 is a separate public enrollment/management endpoint.

## 10-minute map

| Step | OCI / Data Relay Link action | Value used in this guide                                      |
| ---: | ---------------------------- | ------------------------------------------------------------- |
|    1 | Create VCN                   | `data-relay-vcn` / `10.0.0.0/16`                              |
|    2 | Internet Gateway + route     | `0.0.0.0/0` → Internet Gateway                                |
|    3 | Create public subnet         | `data-relay-public-subnet` / `10.0.0.0/24`                    |
|    4 | Security List                | admin SSH, `443`, `6000-6098`                                 |
|    5 | Create VM                    | Ubuntu 24.04 x86\_64 / `VM.Standard.E2.1.Micro` when eligible |
|    6 | Public address               | attach a **Reserved Public IPv4**                             |
|    7 | SSH                          | `ubuntu@<RESERVED-IP>`                                        |
|    8 | Install Data Relay Link      | immutable `v2.2.1`                                            |
|    9 | Verify                       | `drlink doctor` + listener checks                             |
|   10 | Add first client             | current one-line Zero-Touch enrollment                        |

# Part I — Build the OCI network and VM

## 1. Open Virtual Cloud Networks

From the OCI Home page, enter **Networking → Virtual Cloud Networks**. The image below is the **original Picture 1** from the field-deployment Word guide; it is used without conversion or downscaling.

<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="Picture 1. OCI Home - enter Networking / Instances" width="1580" height="1120" data-path="images/oci/1.png" />

## 2. Create the VCN, Internet Gateway, route, subnet, and ingress rules

Use these values:

```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. Create the VCN

Open **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="Picture 2. Select Create VCN in Virtual Cloud Networks" width="1579" height="383" data-path="images/oci/2.png" />

Set the VCN name to `data-relay-vcn` and the IPv4 CIDR to `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="Picture 3. Configure the VCN name and IPv4 CIDR" width="1581" height="1050" data-path="images/oci/3.png" />

### 2-2. Create the Internet Gateway

In the new `data-relay-vcn`, open the **Gateways** tab and create an 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="Picture 4. Create an Internet Gateway from the VCN Gateways tab" width="1582" height="1076" data-path="images/oci/4.png" />

Use `data-relay-internet-gateway` as the example gateway name.

<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="Picture 5. Internet Gateway name example: data-relay-internet-gateway" width="1576" height="230" data-path="images/oci/5.png" />

### 2-3. Add the Internet route to the default route table

Open the **Routing** tab and select `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="Picture 6. Select the default route table from the VCN Routing tab" width="1581" height="483" data-path="images/oci/6.png" />

Choose **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="Picture 7. Add a route rule" width="1580" height="479" data-path="images/oci/7.png" />

Add the following route:

```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="Picture 8. Add the 0.0.0.0/0 route through the Internet Gateway" width="1579" height="510" data-path="images/oci/8.png" />

Confirm that the route rule is present after saving.

<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="Picture 9. Confirm the applied route rule" width="1583" height="543" data-path="images/oci/9.png" />

### 2-4. Start creating the public subnet

Open the **Subnets** tab and select **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="Picture 10. Start creating the public subnet" width="1582" height="496" data-path="images/oci/10.png" />

### 2-5. Configure the public subnet

Create the public subnet with the following values:

```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="Picture 11. Configure the public subnet" width="1583" height="982" data-path="images/oci/11.png" />

### 2-6. Configure the Security List

Open the VCN's **Security Lists** page.

<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="Picture 12. Open the VCN Security Lists page" width="1579" height="1078" data-path="images/oci/12.png" />

Review the ingress rules on the **Default Security List**.

<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="Picture 13. Review the Default Security List ingress rules" width="1579" height="902" data-path="images/oci/13.png" />

For Data Relay Link in single-443 mode, add TCP 443 and the published-service range TCP 6000-6098. Keep SSH 22 for administration, preferably restricted to your administrator public 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="Picture 14. Add ingress rules for TCP 443 and TCP 6000-6098" width="1579" height="1040" data-path="images/oci/14.png" />

Confirm that the ingress rules were applied.

<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="Picture 15. Confirm the applied ingress rules" width="1579" height="983" data-path="images/oci/15.png" />

### Recommended single-443 ingress

| Protocol | Destination port | Source                                     | Purpose                             |
| -------- | ---------------: | ------------------------------------------ | ----------------------------------- |
| TCP      |               22 | **your admin public IP/32**                | SSH administration                  |
| TCP      |              443 | client networks or `0.0.0.0/0` if required | WSS control + enrollment/management |
| TCP      |        6000-6098 | only networks/users that need the services | published services                  |

<Warning>
  In **single-443** mode, do not create public OCI ingress or DNAT for **6099** or **7000**. They are internal loopback backends. Also do not blindly copy a broad `All Protocols` rule from a generic OCI tutorial.
</Warning>

If you do not want the whole `6000-6098` range exposed, allow only the service ports that are actually assigned, and constrain source CIDRs where possible.

## 3. Create the Ubuntu compute instance

Recommended values for this walkthrough:

```text theme={null}
Name           data-relay-link-server
Image          Canonical Ubuntu 24.04 LTS x86_64
Shape          VM.Standard.E2.1.Micro (when Console marks it eligible/free)
VCN            data-relay-vcn
Subnet         data-relay-public-subnet
Boot volume    default
```

Before creating the Compute Instance, confirm that the VCN, Internet Gateway, route, public subnet, and Security List created above are ready, then open **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="Picture 16. Confirm the network resources and open Compute" width="1582" height="1016" data-path="images/oci/16.png" />

### 3-1. Enter the basic Compute Instance settings

Start on **Create compute instance** and confirm the instance name and 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="Picture 17. Compute Instance basic settings" width="1581" height="560" data-path="images/oci/17.png" />

### 3-2. Select Canonical Ubuntu 24.04

Choose **Change image** and select Canonical Ubuntu 24.04. Treat the image/version currently shown in OCI Console as authoritative.

<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="Picture 18. Select the Ubuntu image" width="1580" height="1052" data-path="images/oci/18.png" />

Unless your environment requires something different, keep the Security settings at their defaults.

<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="Picture 19. Security settings - use the defaults unless required otherwise" width="1584" height="670" data-path="images/oci/19.png" />

### 3-3. Select the VCN and public subnet

Under Primary VNIC, select the `data-relay-vcn` and `data-relay-public-subnet` created earlier.

<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="Picture 20. Select the existing data-relay-vcn and data-relay-public-subnet" width="1578" height="905" data-path="images/oci/20.png" />

### 3-4. Disable automatic public IPv4 and configure the SSH key

Because this guide attaches a Reserved Public IP later, turn off **Automatically assign public IPv4 address**. Then upload an existing SSH public key or let OCI generate a new key pair, and store the private key securely.

<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="Picture 21. Disable automatic public IPv4 and create/download the SSH key" width="1577" height="879" data-path="images/oci/21.png" />

### 3-5. Review the boot volume

Unless you have a separate storage requirement, keep the boot-volume settings at their defaults.

<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="Picture 22. Boot Volume settings - keep the defaults unless required otherwise" width="1581" height="1049" data-path="images/oci/22.png" />

### 3-6. Review before creating the instance

Confirm that the image is Ubuntu 24.04 and that the shape, VCN/subnet, and SSH key match the intended configuration before creating the 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="Picture 23. Review the Ubuntu 24.04 and VM.Standard.E2.1.Micro configuration" width="1580" height="1042" data-path="images/oci/23.png" />

### 3-7. Confirm the created instance and Free/Eligible indicator

Confirm the instance state in the Compute Instances list.

<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="Picture 24. Confirm the created instance in the instance list" width="1582" height="488" data-path="images/oci/24.png" />

The **Always Free** indicator shown in the original screenshot reflects the OCI Console at the time of the field deployment. Current Free Tier/Eligible status can vary by region and tenancy, so use the current Console's eligibility and cost display as the final authority.

<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="Picture 25. Confirm the Always Free indicator and select the created instance" width="1583" height="473" data-path="images/oci/25.png" />

Important points from the original deployment:

* choose the existing `data-relay-vcn`
* choose `data-relay-public-subnet`
* allow OCI to assign the **private IPv4** automatically
* turn off **Automatically assign public IPv4 address** for the final persistent-IP design
* generate/download or upload an SSH public key
* if OCI generated the key pair, store the private key securely; do not assume it can be downloaded again later
* keep the boot volume simple unless you have another storage requirement

<Warning>
  `VM.Standard.E2.1.Micro` availability and Free Tier treatment are tenancy/region dependent. If the Console does not show it as eligible at creation time, do not assume this guide makes it free.
</Warning>

## 4. Attach a Reserved Public IPv4

From the instance details page, open **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="Picture 26. Open the instance Networking page and Primary VNIC" width="1582" height="890" data-path="images/oci/26.png" />

In the VNIC, open **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="Picture 27. Open VNIC IP administration and the Primary Private IP" width="1580" height="581" data-path="images/oci/27.png" />

If an ephemeral public IP is currently attached, edit the private IP and select **No public IP** first.

<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="Picture 28. Select No public IP in Edit Private IP Address" width="1579" height="675" data-path="images/oci/28.png" />

Confirm that no public IP is currently assigned.

<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="Picture 29. Confirm that the public IP is unassigned" width="1581" height="589" data-path="images/oci/29.png" />

Edit the private IP again and choose:

```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="Picture 30. Create and attach a new Reserved Public IP" width="1579" height="1050" data-path="images/oci/30.png" />

A Reserved Public IP is the address you should treat as the persistent public entry point for Data Relay Link. OCI performs the public/private mapping outside the Ubuntu guest, so `ip addr` on the VM normally shows the private `10.x.x.x` address rather than the public address.

Confirm that the Reserved Public IP is attached to the Primary Private IP. The public IP value in this screenshot has been masked before publication.

<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="Picture 31. Confirm the Reserved Public IP is attached" width="2133" height="618" data-path="images/oci/31.png" />

<Note>
  Picture 32 (successful SSH session) from the original Word guide is still not published because it contains field connection details. The SSH procedure below uses the `<RESERVED-PUBLIC-IP>` placeholder instead.
</Note>

## 5. Test SSH access

For OCI Ubuntu images the default account is normally `ubuntu`:

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

Then verify the host:

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

Expected for this guide:

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

# Part II — Install Data Relay Link v2.2.1

## 6. Prepare only the packages you need

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

Check time and the host firewall before installation:

```bash theme={null}
timedatectl status
sudo ufw status
sudo iptables -S INPUT
```

<Warning>
  The older field notes contained an environment-specific procedure that flushed the Ubuntu `INPUT` chain. **Do not blindly run `iptables -F` or change the default INPUT policy just for Data Relay Link.** OCI Security Lists/NSGs and the Ubuntu host firewall are separate security boundaries; configure each deliberately for your environment.
</Warning>

## 7. Install the immutable stable release

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

For this OCI walkthrough, choose **Enterprise single-443** when the installer asks for topology. Conceptually the result is:

```text theme={null}
Public host                  <RESERVED-PUBLIC-IP or 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/tested relay engine             0.71.0
Project                       2.2.1
```

Do not copy the v2.1.0 environment-variable installation command from the old guide. The current field path is the immutable **v2.2.1** installer above and its current interactive questions.

## 8. Verify the server

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

For single-443, also inspect the listeners:

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

The important exposure model is:

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

From another machine on the Internet:

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

`drlink doctor` should have no blocking failure before onboarding clients.

## 9. Verify reboot persistence

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

After reconnecting:

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

The services and listener topology should return without re-enrollment or manual reconstruction.

# Part III — Connect the first client

## 10. Generate a Zero-Touch SSH enrollment

On the Data Relay Link server:

```bash theme={null}
sudo drlink create enrollment \
  --one-line \
  --ssh \
  --ssh-user <EXISTING-CLIENT-USER> \
  --label <CLIENT-LABEL>
```

The command printed by the server contains a short-lived, one-time bootstrap credential. **Copy the exact generated command** to the remote client instead of reconstructing it manually.

<Warning>
  Treat a generated Zero-Touch command as sensitive until it expires or is used. Do not paste a live ticket into public chat, documentation, or issue trackers.
</Warning>

On the client, run the generated line. Data Relay Link does not create the SSH user or `sshd`; they must already exist.

## 11. Verify the client and connect

On the client:

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

On the server:

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

Then use the assigned persistent public service port:

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

The **client does not manually choose the public port**. The Data Relay Link server allocates and persists the service reservation.

# Final checklist

* [ ] VCN `10.0.0.0/16` exists
* [ ] Internet Gateway exists
* [ ] default route has `0.0.0.0/0 → Internet Gateway`
* [ ] public subnet `10.0.0.0/24` exists
* [ ] admin SSH is restricted appropriately
* [ ] public TCP 443 is reachable
* [ ] service ports are allowed only as broadly as required
* [ ] 6099/7000 are not publicly exposed in single-443
* [ ] Ubuntu 24.04 x86\_64 VM is running
* [ ] Reserved Public IPv4 is attached
* [ ] SSH to the VM succeeds
* [ ] Data Relay Link reports project 2.2.1 / bundled relay engine 0.71.0
* [ ] `drlink doctor` has no blocking finding
* [ ] listener exposure matches the selected topology
* [ ] state survives reboot
* [ ] first Zero-Touch client enrolls and the assigned SSH public port works

## Troubleshooting split

When a published service cannot be reached, test both halves independently:

```bash theme={null}
# From an external workstation: Internet -> Data Relay Link server
nc -vz -w 3 <RESERVED-PUBLIC-IP> <PUBLIC-SERVICE-PORT>

# From the Data Relay Link client: client -> local/LAN target
nc -vz -w 3 <TARGET-IP> <TARGET-PORT>
```

This quickly separates an OCI/public-ingress problem from a client-to-target problem.

## Next steps

<CardGroup cols={2}>
  <Card title="Publish Services" icon="network-wired" href="/guides/services">
    Add SSH, HTTP, HTTPS, custom TCP, or services on other LAN hosts.
  </Card>

  <Card title="Firewall & NAT" icon="shield-halved" href="/deployment/firewall-nat">
    Compare Direct, public/listen NAT separation, and single-443.
  </Card>
</CardGroup>

## Official OCI references

* [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)
