# Set reverse DNS for a floating IP

> Give a floating IP a PTR record so lookups of the address return your hostname.

Source: https://docs.coritan.com/floating-ips/reverse-dns/

In the dashboard:

- /dashboard/networking/ips/…/ptr: https://www.coritan.com/dashboard/networking/ips

*Reverse DNS* answers the question "which hostname belongs to this address?". Set it for a floating IP so that a lookup of the address returns your hostname, such as `mail.example.com`. Mail servers check it before they accept mail, and tools such as `traceroute` show it.

Each address has one reverse DNS record, stored as a `PTR` record. A subnet has one record for each usable host.

## Before you begin

- The floating IP must be on your account. It does not need to be attached.
- Choose a fully qualified hostname that you control, such as `mail.example.com`. If you have no domain, you can use a name under a free coritan.gg name, as [Claim a free coritan.gg name](/proxies/coritan-gg-names/) describes.
- For mail, the hostname also needs an `A` record that points at the address. [Make the name resolve both ways](#make-the-name-resolve-both-ways) explains how.
- You can change reverse DNS as often as you like, but you cannot remove it once it is set.

## Set reverse DNS for a single address

1. In the [dashboard](https://www.coritan.com/dashboard/networking), go to **Floating IPs**, open the address and select the **Reverse DNS** tab.
2. Type the hostname in the field, such as `mail.example.com`. A trailing dot is optional.

   If you hold a coritan.gg name, the chips under the field offer names under it, such as `ip-203-0-113-10.survival-smp.coritan.gg`. Select a chip to fill the field.
3. Check the **Published record** preview. It shows the address's reverse name, such as `10.113.0.203.in-addr.arpa`, and the hostname it will return.
4. Select **Save reverse DNS**.

A message confirms the change, such as `Reverse DNS for 203.0.113.10 set to mail.example.com.`

## Set reverse DNS for a host of a subnet

1. Open the subnet and select the **Reverse DNS** tab. You can also open the **Hosts** tab, open a host's actions menu and select **Set reverse DNS**, which opens the tab with that host chosen.
2. Under **Host**, choose the host. The list marks attached hosts with `(attached)`, and the hint under it says what the host is attached to.
3. Type the hostname and select **Save reverse DNS**.

The list offers only the usable hosts. The network, gateway and broadcast addresses of a subnet have no reverse DNS of their own, as [How subnets work](/floating-ips/subnets/) explains.

## Make the name resolve both ways

The `PTR` record only answers lookups of the address. Mail servers also look up the hostname and expect it to return the same address. Create an `A` record for the hostname that points at the address:

- For a domain on Coritan DNS, add the record on the domain's DNS records, as [Add, edit and delete DNS records](/websites/dns/manage-dns-records/) describes. For a domain elsewhere, add it at your DNS provider.
- For a name under your coritan.gg name, tick **Also give the address a name** on the **Attach** tab when you attach the address, as [Attach and detach a floating IP](/floating-ips/attach-and-detach/) describes. For an address that is already attached, add the record to the name's zone as for any other domain.

Then check both directions from any machine with `dig`:

```bash
dig -x 203.0.113.10 +short
dig mail.example.com A +short
```

The first command prints `mail.example.com.` and the second prints `203.0.113.10`.

## Result

The **Reverse DNS** tab shows the saved hostname in the field and in the **Published record** preview. The **Overview** tab shows it under **Reverse DNS**.

We publish the record in the reverse zone that covers the address, when we host that zone. Our nameservers then answer with the new hostname once you save it. Resolvers that looked the address up earlier can return the old answer until it expires.

The record belongs to the address. It stays when you detach the address or move it to another instance or server.

## Troubleshooting

`Enter a hostname`
: The field is empty. Type a hostname.

`Use a fully qualified name, for example mail.example.com`
: The hostname has no dot. Type the full name, including the domain.

`Empty label in hostname`
: The hostname has two dots in a row, or starts with a dot. Remove the extra dot.

`Each label is at most 63 characters` or `Hostnames are at most 253 characters`
: A part of the hostname between dots, or the whole hostname, is too long. Choose a shorter name.

A message that ends `is not a valid label`
: A part of the hostname has a character other than a letter, a digit or a hyphen, or starts or ends with a hyphen. Remove the character.

**Save reverse DNS** is greyed out
: The hostname is the one already saved, or it breaks one of the rules above.

`No usable hosts`
: We could not list the subnet's hosts. [Contact support](/support/conversations/) with the subnet's address.

`dig -x` returns nothing or an old hostname
: A resolver may still hold the old answer. Ask our nameserver directly with `dig -x 203.0.113.10 @ns1.coritan.com +short`. If it prints your hostname, wait for the resolver's copy to expire. If it prints nothing, or `dig` reports `REFUSED`, we do not host the reverse zone for the address, so the record is saved but not published. [Contact support](/support/conversations/) with the address.

Mail servers still reject your mail
: The hostname's `A` record is missing or points at another address. Check both directions as [Make the name resolve both ways](#make-the-name-resolve-both-ways) shows.

## Related

- [Attach and detach a floating IP](/floating-ips/attach-and-detach/)
- [How subnets work](/floating-ips/subnets/)
- [Add, edit and delete DNS records](/websites/dns/manage-dns-records/)
- [Claim a free coritan.gg name](/proxies/coritan-gg-names/)

## With the API

`GET /api/v1/client/ips/{service_id}/ptr` returns the reverse DNS record of a floating IP:

```bash
curl https://api.coritan.com/api/v1/client/ips/214/ptr \
  -H "Authorization: Bearer $CORITAN_TOKEN"
```

```json
{
  "id": 12,
  "inventory_id": 901,
  "hostname": "mail.example.com",
  "address": "203.0.113.10",
  "version": "ipv4",
  "service_id": 214,
  "created_at": "2026-09-25T10:00:00",
  "updated_at": "2026-09-25T10:00:00"
}
```

An address with no reverse DNS returns `{"hostname": null, "ip_service_id": 214}`. For a subnet, name the host with the `host_address` query parameter, such as `?host_address=203.0.113.18`, or with `host_inventory_id`, the host's `id` from the subnet's host list.

`PATCH /api/v1/client/ips/{service_id}/ptr` sets the record:

```bash
curl -X PATCH https://api.coritan.com/api/v1/client/ips/214/ptr \
  -H "Authorization: Bearer $CORITAN_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"hostname": "mail.example.com"}'
```

| Field | Meaning |
| --- | --- |
| `hostname` | Required. A fully qualified hostname of 1–253 characters. We store it in lower case, without a trailing dot. |
| `host_address` | Subnets only. The host whose record you set. |
| `host_inventory_id` | Subnets only. The host's `id` from the subnet's host list, in place of `host_address`. |

The response is the saved record, as `GET` returns it.

| Response | When |
| --- | --- |
| `422` with `PTR hostname must be a fully-qualified domain name` | The hostname has no dot. |
| `422` with `PTR hostname must be a valid FQDN` | A part of the hostname breaks the rules in [Troubleshooting](#troubleshooting). |
| `422` with `PTR hostname is required` | The hostname is blank. |
| `422` with `Subnet PTR requires host_address or host_inventory_id` | The floating IP is a subnet and the request named no host. |
| `422` with `Address is reserved (network/broadcast/gateway) and cannot be attached` | The host is one of the subnet's reserved addresses. |
| `404` with a message that starts `Host in block` | The address is not part of the subnet. |
| `403` with `You do not own this service` | The service is on another account. |
| `409` with `Service is terminated or pending termination` | The floating IP has been cancelled. |

The [Floating IPs API reference](/api/reference/client/floating-ips/#op-patch-api-v1-client-ips-service-id-ptr) lists every field.

## API

- `GET /api/v1/client/ips/{service_id}/ptr`: Get PTR (https://docs.coritan.com/api/reference/client/floating-ips/#op-get-api-v1-client-ips-service-id-ptr)
- `PATCH /api/v1/client/ips/{service_id}/ptr`: Set PTR (https://docs.coritan.com/api/reference/client/floating-ips/#op-patch-api-v1-client-ips-service-id-ptr)
