But you may have missed a hidden gem: your machine may already have a second rate-limit path for free, through a combination of a public IPv4 address and a public IPv6 address. By default, the browser or operating system may choose one of them behind the scenes based on availability, speed, routing, or other connection conditions. Assuming you currently have IPv6, you may try to force Firefox to use IPv4 as the public IP by disabling IPv6 in:
about:config → network.dns.disableIPv6 → click false to change it to true → Ctrl + F5 to refresh the page.
Firefox is not telling the router to “force IPv4.” When Firefox uses a website’s A record, it has selected an IPv4 destination. The ISP may still tunnel or translate that traffic internally, but from the website’s point of view, the connection arrives as IPv4.
IPv6 cannot directly terminate on a publicly IPv4-only website under today’s standard internet protocols because IPv4 and IPv6 are separate protocol families with different packet formats, addressing, and routing systems. A hostname with only an A record is publicly IPv4-only: IPv6 clients have no IPv6 address to connect to for that hostname.
If an AAAA record is later added for an IPv6-capable CDN, reverse proxy, or load balancer, the public service becomes IPv6-capable, even if the origin server behind it remains IPv4-only. In that setup, the client connects to the front end over IPv6, and the front end separately connects to the origin over IPv4.
A mixed IPv6-source-to-IPv4-destination packet could theoretically exist, but it would be a new hybrid protocol that normal routers, firewalls, operating systems, and servers do not understand. In practice, crossing between IPv6 and IPv4 requires network-layer translation, such as NAT64 or 464XLAT, or tunneling/encapsulation, such as DS-Lite.
Normal Firefox:
ask DNS for A + AAAA records of the target website
IPv6 exists
choose the website's IPv6 address: 2001:db8::10
connect from the client's IPv6 address: 2001:db8:1234:5678::abcd → rate limit hit
Firefox with network.dns.disableIPv6 = true:
do not use the IPv6 result
use the website's IPv4 A record: 203.0.113.10
connect from the client's public IPv4 address: 203.0.113.38 → fresh rate limit
A and AAAA commands to check the target website and what IP the target website sees from your machine:
echo "== DNS records of target ==" dig +short A example.com dig +short AAAA example.com echo "== Kernel route/source choice ==" ip -4 route get 203.0.113.10 ip -6 route get 2001:db8::10 echo "== Public IP seen by external service =="curl -4 https://ifconfig.mecurl -6https://ifconfig.me
Output:
== DNS records of target ==
203.0.113.10 # website IPv4 address
2001:db8::10 # website IPv6 address
== Kernel route/source choice ==
203.0.113.10 via 192.168.0.1 dev wlo1 src 192.168.0.15
# destination = website IPv4, source = local LAN IPv4
2001:db8::10 via fe80::1 dev wlo1 src 2001:db8:1234:5678::abcd
# destination = website IPv6, source = client IPv6
== Public IP seen by external service ==
203.0.113.38 # public IPv4 seen by website
2001:db8:1234:5678::abcd # public IPv6 seen by website*Although the curl test uses a different website from your target website, your public source IP usually stays the same for a given IP version on a direct connection: normal routing forwards packets toward the destination without rewriting the source address at each hop. The source IP changes mainly when something on your side or in the access path remaps it, such as NAT, CGNAT, a VPN, or a forward proxy. IPv6 privacy or temporary addresses can also rotate over time even without NAT or VPN. Separately, what the target website's internal server logs show may differ if the site is behind a CDN, load balancer, or reverse proxy: the public-facing edge may see the real client IP, while the origin server may only see the proxy's IP unless it restores the visitor IP from trusted forwarded headers such as X-Forwarded-For, X-Real-IP, or CF-Connecting-IP.
To check whether the target website may be behind a CDN or proxy, resolve the hostname and check who owns the returned IP address. A Cloudflare-owned IP usually means the site is Cloudflare-proxied, so origin logs may differ from what curl shows.
$ dig A example.com +short203.0.113.10203.0.113.11$ whois203.0.113.10| grep -i cloud NetName: CLOUDFLARENET ... RAbuseEmail: abuse@cloudflare.com RTechEmail: rir@cloudflare.com RNOCEmail: noc@cloudflare.com $
This check is only a clue, not a perfect proof. A domain can use Cloudflare DNS without proxying web traffic, and some websites may use other CDN, load balancer, or reverse proxy providers. You can also check HTTP response headers with curl -I https://example.com; headers such as server: cloudflare, cf-ray, or cf-cache-status are strong signs of Cloudflare proxying.
For Cloudflare-proxied sites, the origin may see a Cloudflare/proxy IP unless it restores the real visitor IP from trusted headers. Rate-limiting by proxy IP is usually a weak setup because many visitors may share the same CDN/proxy address. A properly configured site should rate-limit by the real visitor IP from headers such as CF-Connecting-IP or a properly validated X-Forwarded-For; in that case, the public IPv4/IPv6 shown by curl -4/-6 https://ifconfig.me is more relevant to the target site's rate limit.
However, Firefox does not provide a matching network.dns.disableIPv4 setting for forcing IPv6-only browsing. The options are less direct:
1. Test with an IPv6-capable website and confirm the result with an IP-checking page.
2. Make sure network.dns.disableIPv6 is set to false.
3. Turn off Firefox DNS over HTTPS if it causes Firefox to behave differently from the system resolver.
4. Prefer IPv6 at the system level through /etc/gai.conf, although this affects more than Firefox and is not a Firefox-only switch.
5. For strict IPv6-only testing, use a separate network namespace, VM, VPN, or firewall rule to make IPv4 unavailable, then launch Firefox inside that environment.
Some websites may rate-limit by account session, cookie, or browser fingerprint, so changing from IPv6 to IPv4 may also need to be combined with a different account.
