<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Yağız Yorulmazlar</title>
    <description>The latest articles on DEV Community by Yağız Yorulmazlar (@frenzyfunky).</description>
    <link>https://dev.to/frenzyfunky</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F789482%2F70ab538b-0285-463a-9ebc-c8c9ea735357.jpeg</url>
      <title>DEV Community: Yağız Yorulmazlar</title>
      <link>https://dev.to/frenzyfunky</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/frenzyfunky"/>
    <language>en</language>
    <item>
      <title>Monitor a site behind Cloudflare without false alarms</title>
      <dc:creator>Yağız Yorulmazlar</dc:creator>
      <pubDate>Sun, 15 Nov 2026 07:50:05 +0000</pubDate>
      <link>https://dev.to/frenzyfunky/monitor-a-site-behind-cloudflare-without-false-alarms-3nj7</link>
      <guid>https://dev.to/frenzyfunky/monitor-a-site-behind-cloudflare-without-false-alarms-3nj7</guid>
      <description>&lt;p&gt;&lt;em&gt;I build &lt;a href="https://uup.dev/" rel="noopener noreferrer"&gt;You Up?&lt;/a&gt;, an uptime monitoring service, so this guide comes from that work. It was first published on &lt;a href="https://uup.dev/monitor-behind-cloudflare/" rel="noopener noreferrer"&gt;uup.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Use a monitor that your bot filter can recognize, and that confirms a failure before it alerts you. Every request You Up? sends is signed, and Cloudflare lists our probe as a verified bot, so it can tell our checks from the bots it is there to stop. When a check still fails, other locations look before you hear anything. Allowing our addresses by hand is only the fallback.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why monitors get blocked
&lt;/h2&gt;

&lt;p&gt;A bot filter is there to stop automated traffic, and an uptime check is automated traffic. It comes from a server, on a fixed schedule, and it runs no JavaScript. To a filter that does not know it, it looks like the bots the filter was put there to stop. So the filter answers it with something other than your page:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A refusal. Cloudflare's error 1020, Access denied, means that a security feature the site's owner set up blocked the request. (&lt;a href="https://developers.cloudflare.com/support/troubleshooting/http-status-codes/cloudflare-1xxx-errors/error-1020/" rel="noopener noreferrer"&gt;developers.cloudflare.com/support/troubleshooting/http-status-codes/cloudflare-1xxx-errors/error-1020&lt;/a&gt;, checked 13 November 2026) Cloudflare sends error 1020 with the HTTP status 403. (&lt;a href="https://developers.cloudflare.com/support/troubleshooting/http-status-codes/cloudflare-1xxx-errors/error-1020/" rel="noopener noreferrer"&gt;developers.cloudflare.com/support/troubleshooting/http-status-codes/cloudflare-1xxx-errors/error-1020&lt;/a&gt;, checked 13 November 2026)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A challenge: a page that asks the visitor to prove it is a person, which a monitor cannot do. When Cloudflare answers with a challenge in place of the page, its response carries the header cf-mitigated, set to challenge. (&lt;a href="https://developers.cloudflare.com/cloudflare-challenges/challenge-types/challenge-pages/detect-response/" rel="noopener noreferrer"&gt;developers.cloudflare.com/cloudflare-challenges/challenge-types/challenge-pages/detect-response&lt;/a&gt;, checked 13 November 2026)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A rate limit, when checks from several places add up.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these is your page, so a monitor that cannot tell them apart says your site is down. Your visitors see nothing wrong. That is a false alarm, and your server did nothing to cause it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the usual workarounds cost
&lt;/h2&gt;

&lt;p&gt;The usual advice is to let the monitor through by hand. Better Stack's guide for sites behind Cloudflare advises allowing its addresses and its User-Agent. (&lt;a href="https://betterstack.com/community/questions/whitelisting-better-stack-ip-cloudflare" rel="noopener noreferrer"&gt;betterstack.com/community/questions/whitelisting-better-stack-ip-cloudflare&lt;/a&gt;, checked 13 November 2026) Each way of doing it costs you something:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Allowing the monitor’s addresses. It works, but the list is yours to keep current. When the monitor adds or replaces a server, checks from the new address are blocked until you add it, and you hear about that as an outage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Allowing its User-Agent or a header. Anybody can copy a header. A rule that lets through every request that carries it lets through anybody who sends it, the bots you wanted to stop included.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Turning the bot filter off. That trades a false alarm for real bot traffic.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How You Up? gets through
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Every request is signed.&lt;/strong&gt; Our probe signs each request with Web Bot Auth, an open method, being standardized at the IETF, that lets a server or a bot filter check that a request came from the bot it names. A header can be copied; a signature that checks cannot be made by anybody else. Cloudflare uses Web Bot Auth, a signature on each request, to verify bots. (&lt;a href="https://developers.cloudflare.com/bots/reference/bot-verification/web-bot-auth/" rel="noopener noreferrer"&gt;developers.cloudflare.com/bots/reference/bot-verification/web-bot-auth&lt;/a&gt;, checked 13 November 2026)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cloudflare verifies the probe.&lt;/strong&gt; The You Up? probe is a Cloudflare verified bot: see &lt;a href="https://radar.cloudflare.com/bots/directory/uup" rel="noopener noreferrer"&gt;its entry in Cloudflare Radar’s bots directory&lt;/a&gt;. Cloudflare can tell our checks from the bots its rules are there to stop, without a list of addresses from you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A failure is confirmed before you hear about it.&lt;/strong&gt; When a check fails, the location that saw it tries again a few seconds later. When that fails too, the Monitor’s other locations look at once. You get an alert only when the failure is confirmed from other locations, so a filter that turns away one location now and then does not wake you. See &lt;a href="https://uup.dev/no-false-alarms/" rel="noopener noreferrer"&gt;alerts only for a real outage&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You see who answered.&lt;/strong&gt; When only one location gets a refusal, the Monitor says so, and links the steps to let our checks through. When a failure is confirmed, the alert says where the request stopped, and names a service such as Cloudflare when it answered in place of your server. You can tell a refusal from a site that is down.&lt;/p&gt;

&lt;h2&gt;
  
  
  Free watches from one location
&lt;/h2&gt;

&lt;p&gt;Free watches from one location, so it has no other location to ask. It still tries again before it tells you, so one turned-away request does not wake you, but a filter that keeps turning that location away can. Every paid Plan watches from five locations, and confirms each failure from the others.&lt;/p&gt;

&lt;h2&gt;
  
  
  If your rules still block us
&lt;/h2&gt;

&lt;p&gt;A rule of your own can still turn our checks away, and not every bot filter checks signatures yet. A rule that turns away every location is confirmed like any other failure, so it does need fixing. Then allowing our checks is the fallback:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Allow requests from the addresses on &lt;a href="https://uup.dev/probe/#where-it-comes-from" rel="noopener noreferrer"&gt;our probe’s page&lt;/a&gt;, the IPv6 ones as well as the IPv4 ones.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Skip bot checks and rate limits for them.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Watch your Monitor’s next checks. They show whether every location gets through.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://uup.dev/probe/#steps-for-each-service" rel="noopener noreferrer"&gt;The steps for each service&lt;/a&gt;, on the probe’s page, show where this is done in Cloudflare, Akamai, DataDome, AWS WAF, Vercel and the other tools sites use most, and in nginx and Apache. When an address of ours is added or replaced, that page changes first. A script that keeps an allowlist current can read &lt;a href="https://uup.dev/probe/ips.txt" rel="noopener noreferrer"&gt;the same addresses as plain text&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Cloudflare's Bot Fight Mode cannot be bypassed or skipped by custom rules. (&lt;a href="https://developers.cloudflare.com/bots/get-started/bot-fight-mode/" rel="noopener noreferrer"&gt;developers.cloudflare.com/bots/get-started/bot-fight-mode&lt;/a&gt;, checked 13 November 2026) If it turns our checks away, see &lt;a href="https://uup.dev/probe/#allow-cloudflare" rel="noopener noreferrer"&gt;the Cloudflare steps&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.uup.dev/probe/allow-our-probe/" rel="noopener noreferrer"&gt;Allow our probe, in the Docs&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Do I need to allow your addresses before I start?
&lt;/h3&gt;

&lt;p&gt;No. Add a Monitor and watch its first checks. If every location gets through, you need no rule. If a location gets a refusal or a challenge, follow the steps on &lt;a href="https://uup.dev/probe/#how-to-allow-it" rel="noopener noreferrer"&gt;our probe’s page&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  What does a check send?
&lt;/h3&gt;

&lt;p&gt;A User-Agent that contains &lt;code&gt;uup/1.0&lt;/code&gt; and links to our probe’s page, an &lt;code&gt;X-Uup-Check&lt;/code&gt; header that names the check, and the three headers of the signature. A server that ignores the signature works as it did before. Nothing else about the request changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is You Up? the only monitor that signs its requests?
&lt;/h3&gt;

&lt;p&gt;No. Uptime.com publishes a Web Bot Auth key directory too. (&lt;a href="https://uptime.com/.well-known/http-message-signatures-directory" rel="noopener noreferrer"&gt;uptime.com/.well-known/http-message-signatures-directory&lt;/a&gt;, checked 13 November 2026) Web Bot Auth is an open method, and any monitor can sign with it.&lt;/p&gt;

&lt;h3&gt;
  
  
  What if my firewall is not Cloudflare?
&lt;/h3&gt;

&lt;p&gt;The signature works the same way for any server or bot filter that checks it. For one that does not check it yet, our probe’s page has &lt;a href="https://uup.dev/probe/#steps-for-each-service" rel="noopener noreferrer"&gt;steps for each service&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>cloudflare</category>
      <category>monitoring</category>
      <category>devops</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
