Skip to content

Use BYOIP with Magic Transit and CDN

Magic Transit customers using BYOIP can also benefit from the performance, reliability, and security that Cloudflare offers for HTTP-based applications.

This documentation covers using the Cloudflare API to configure service bindings within Cloudflare’s IP Address Management framework. Service bindings allow BYOIP customers to selectively route traffic on a per-IP address basis to the CDN pipeline (which includes Cache, Web Application Firewal (WAF), and more).

It is also possible to define service bindings to route traffic to the Spectrum pipeline selectively. However, this is not in the scope of this guide.

It is important to note that traffic routed to the CDN pipeline is protected at Layers 3 and 4 by the inherent DDoS protection capabilities native to the CDN pipeline.

Before you begin

Efficiency is paramount when planning how you will implement service bindings. Implementing service bindings through an aggregated CIDR block is strongly recommended.

Example

Magic Transit protected prefix: 203.0.113.100/24

IPs to upgrade to the CDN:

203.0.113.16 203.0.113.17 203.0.113.18 203.0.113.19 203.0.113.20 203.0.113.21 203.0.113.22 203.0.113.23

Best practice: Add one discrete CDN service binding for 203.0.113.16 with a /29 netmask.

Once a service binding is created (or deleted), it will take four to six hours to propagate across Cloudflare’s global network. Services for the IP addresses in scope will likely be disrupted during this window.

1. Get account information

  1. Log in to your Cloudflare account and get your account ID and API token. The token permissions should include Account - IP Prefixes - Edit.
  2. Make a GET request to the List Services endpoint and take note of the id associated with the CDN service.
  3. Use the List Prefixes endpoint and take note of the id associated with the prefix (cidr) you will configure.

At this point, continuing the example, you should have a mapping similar to the following:

VariablesDescription
{service_id}The ID of the CDN service within Cloudflare.

Example: 969xxxxxxxx000xxx0000000x00001bf
{prefix_id}The ID of the Magic Transit protected prefix (203.0.113.100/24) you want to configure.

Example: 6b25xxxxxxx000xxx0000000x0000cfc
  1. To confirm you currently only have a Magic Transit service binding and that it spans across your entire prefix, make a GET request to the List Service Bindings endpoint. Replace the {prefix_id} in the URI path by the actual prefix ID you got from the previous step.

Terminal window
curl https://api.cloudflare.com/client/v4/accounts/{account_id}/addressing/prefixes/{prefix_id}/bindings \
--header "Authorization: Bearer <API_TOKEN>"

2. Create service binding

  1. Make a POST request to the Create service binding endpoint, indicating the IP address you want to bind to the CDN. Specify the corresponding network mask as needed.

Continuing the example, 203.0.113.100/32 designates an IP address that is within the Magic Transit protected prefix 203.0.113.0/24.

Replace the {prefix_id} in the URI with your prefix ID from previous steps. Within the request body, the cidr value should correspond to the IP address or subnet that you are configuring for use with CDN.

Terminal window
curl https://api.cloudflare.com/client/v4/accounts/{account_id}/addressing/prefixes/{prefix_id}/bindings \
--header "Authorization: Bearer <API_TOKEN>" \
--header "Content-Type: application/json" \
--data '{
"cidr": "203.0.113.100/32",
"service_id": <SERVICE_ID>
}'

In the response body, the initial provisioning state should be provisioning.

{
"errors": [],
"messages": [],
"success": true,
"result": {
"cidr": "203.0.113.100/32",
"id": <CDN_SERVICE_BINDING_ID>,
"provisioning": {
"state": "provisioning"
},
"service_id": <SERVICE_ID>,
"service_name": "CDN"
}
}

You can periodically check the service binding status using the List Service Bindings endpoint.

3. Create address maps

Once you have configured your IPs to have CDN service, you can use address maps to specify which IPs should be used by Cloudflare in DNS responses when a record is proxied.

You can choose between two different scopes:

  • Account-level: uses the address map for all proxied DNS records across all of the zones within an account.

  • Zone-level: uses the address map for all proxied DNS records within a zone.

  1. Log in to the Cloudflare dashboard and select your account.
  2. Go to IP Addresses > Address Maps.
  3. Select Create an address map.
  4. Choose the scope of the address map.
  5. Add the zones and IP addresses that you want to map.
  6. Name your address map.
  7. Review the information and select Save and Deploy.

4. Create DNS records

To create a DNS record in the dashboard:

  1. Log in to the Cloudflare dashboard and select an account and domain.
  2. Go to DNS > Records.
  3. Select Add record.
  4. Choose an address (A/AAAA) record type.
  5. Complete the required fields, setting the Proxy status to proxied.
  6. Select Save.

While the DNS record proxy status and address map will determine how Cloudflare’s authoritative DNS responds to requests for your hostnames, the IP addresses specified in A/AAAA records will determine how Cloudflare reaches the configured origin.

Example

TypeNameIP addressProxy statusTTL
Awww203.0.113.150ProxiedAuto

At this point, if an address map for a zone example.com specifies that Cloudflare should use 203.0.113.100 for proxied records and the above record exists in the same zone, you can expect the following:

  1. Cloudflare responds to DNS requests with 203.0.113.100.

  2. Cloudflare proxies requests through the CDN and then routes the requests via GRE or CNI to the origin server 203.0.113.150 (Magic Transit protected prefix).

  3. Depending on whether Magic Transit is implemented with direct server return model or with Magic Transit egress, the origin server responds back to Cloudflare either:

    • Directly over the Internet in a Magic Transit direct server return model
    • Back through the Magic GRE tunnel(s) in a Magic Transit egress model
  4. As the HTTP response egresses the Cloudflare network back to the client side, the source IP address of the response becomes 203.0.113.100 (the IP address that the HTTP request originally landed on).

Having the same IP address as ingress IP (defined in the address map) and origin IP (listed in the DNS record) will not cause any loops.

Example

Assuming 203.0.113.100 was also the origin IP, the DNS record would look like the following:

TypeNameIP addressProxy statusTTL
Awww203.0.113.100ProxiedAuto

5.(Optional) Add layer 7 functionality

Leverage other features according to your needs: