Zone Access Rules
IP Access Rules allow you to block, challenge, or whitelist traffic based on IP address, IP range, ASN, or country at the zone level.
Overview
Access the Zone Access Rules API through cf.Zones.AccessRules:
public class FirewallService(ICloudflareApiClient cf)
{
public async Task BlockIpAsync(string zoneId, string ipAddress)
{
await cf.Zones.AccessRules.CreateAsync(zoneId,
new CreateAccessRuleRequest(
Mode: AccessRuleMode.Block,
Configuration: new IpConfiguration(ipAddress),
Notes: "Blocked by automation"
));
}
}
Creating Access Rules
Block an IP Address
var rule = await cf.Zones.AccessRules.CreateAsync(zoneId,
new CreateAccessRuleRequest(
Mode: AccessRuleMode.Block,
Configuration: new IpConfiguration("192.168.1.1"),
Notes: "Malicious actor"
));
Challenge an IP Range
var rule = await cf.Zones.AccessRules.CreateAsync(zoneId,
new CreateAccessRuleRequest(
Mode: AccessRuleMode.Challenge,
Configuration: new CidrConfiguration("10.0.0.0/8"),
Notes: "Suspicious network"
));
Block by ASN
var rule = await cf.Zones.AccessRules.CreateAsync(zoneId,
new CreateAccessRuleRequest(
Mode: AccessRuleMode.Block,
Configuration: new AsnConfiguration("AS12345"),
Notes: "Known bad ASN"
));
Block by Country
var rule = await cf.Zones.AccessRules.CreateAsync(zoneId,
new CreateAccessRuleRequest(
Mode: AccessRuleMode.Block,
Configuration: new CountryConfiguration("XX"),
Notes: "Geo-blocking"
));
Whitelist an IP
var rule = await cf.Zones.AccessRules.CreateAsync(zoneId,
new CreateAccessRuleRequest(
Mode: AccessRuleMode.Whitelist,
Configuration: new IpConfiguration("10.0.0.1"),
Notes: "Office IP - bypass all security"
));
Listing Access Rules
List with Pagination
var page = await cf.Zones.AccessRules.ListAsync(zoneId,
new ListAccessRulesFilters
{
Mode = AccessRuleMode.Block,
Page = 1,
PerPage = 50
});
foreach (var rule in page.Items)
{
Console.WriteLine($"{rule.Configuration.Value}: {rule.Mode}");
}
List All Rules
await foreach (var rule in cf.Zones.AccessRules.ListAllAsync(zoneId))
{
Console.WriteLine($"{rule.Id}: {rule.Configuration.Target} = {rule.Configuration.Value}");
}
Filter by Configuration
var filters = new ListAccessRulesFilters
{
ConfigurationTarget = AccessRuleTarget.Ip,
ConfigurationValue = "192.168.1.1"
};
await foreach (var rule in cf.Zones.AccessRules.ListAllAsync(zoneId, filters))
{
// Process matching rules
}
Getting a Specific Rule
var rule = await cf.Zones.AccessRules.GetAsync(zoneId, ruleId);
Console.WriteLine($"Mode: {rule.Mode}, Created: {rule.CreatedOn}");
Updating Access Rules
var updated = await cf.Zones.AccessRules.UpdateAsync(zoneId, ruleId,
new UpdateAccessRuleRequest(
Mode: AccessRuleMode.Challenge,
Notes: "Changed from block to challenge"
));
Deleting Access Rules
await cf.Zones.AccessRules.DeleteAsync(zoneId, ruleId);
Models Reference
AccessRuleMode (Extensible Enum)
AccessRuleMode defines the action to take when an access rule matches:
| Known Value | API Value | Description |
|---|---|---|
Block |
block |
Block all requests (returns 403) |
Challenge |
challenge |
Present interactive CAPTCHA challenge |
JsChallenge |
js_challenge |
Present JavaScript challenge |
ManagedChallenge |
managed_challenge |
Cloudflare dynamically chooses challenge type |
Whitelist |
whitelist |
Allow requests, bypass all security checks |
using Cloudflare.NET.Security.Firewall.Models;
// Use static properties for IntelliSense support
var mode = AccessRuleMode.Block;
// Extensible for future modes
AccessRuleMode customMode = "new-mode";
AccessRuleTarget (Extensible Enum)
The target type for access rule configuration. This is an extensible enum used in ListAccessRulesFilters.
| Known Value | Description |
|---|---|
Ip |
Single IPv4 or IPv6 address |
IpRange |
CIDR notation range |
Asn |
Autonomous System Number |
Country |
Two-letter country code |
Configuration Types
Use polymorphic configuration types to create rules for different targets:
| Type | Target | Example |
|---|---|---|
IpConfiguration |
Single IP | new IpConfiguration("192.168.1.1") |
CidrConfiguration |
IP range | new CidrConfiguration("10.0.0.0/8") |
AsnConfiguration |
ASN | new AsnConfiguration("AS12345") |
CountryConfiguration |
Country code | new CountryConfiguration("US") |
AccessRule
| Property | Type | Description |
|---|---|---|
Id |
string |
Unique identifier |
Mode |
AccessRuleMode |
Action to take |
Configuration |
AccessRuleConfiguration |
Match target |
Notes |
string? |
Optional notes |
AllowedModes |
IReadOnlyList<AccessRuleMode> |
Available modes |
Scope |
Scope |
Rule scope (zone/account) |
CreatedOn |
DateTimeOffset? |
Creation timestamp |
ModifiedOn |
DateTimeOffset? |
Last modification |
Common Patterns
Bulk Block IPs
public async Task BlockIpsAsync(string zoneId, IEnumerable<string> ips, string reason)
{
foreach (var ip in ips)
{
await cf.Zones.AccessRules.CreateAsync(zoneId,
new CreateAccessRuleRequest(
Mode: AccessRuleMode.Block,
Configuration: new IpConfiguration(ip),
Notes: reason
));
}
}
Find and Remove Rule
public async Task UnblockIpAsync(string zoneId, string ip)
{
var filters = new ListAccessRulesFilters
{
ConfigurationTarget = AccessRuleTarget.Ip,
ConfigurationValue = ip
};
await foreach (var rule in cf.Zones.AccessRules.ListAllAsync(zoneId, filters))
{
await cf.Zones.AccessRules.DeleteAsync(zoneId, rule.Id);
}
}
Required Permissions
| Permission | Scope | Level |
|---|---|---|
| Firewall Services | Zone | Write |