ADVERTISEMENT

Protecting your home network from iOS 14's Private Address feature

Published Aug 14, 2020 11:24 am

Written by Prof. Rom Feria

Apple will be releasing iOS 14 and iPadOS 14 in less than two months, and one of the privacy features that is baked in is the Private Address toggle, which is turned on by default. What Private Address does is to randomize your device’s MAC address to prevent malicious players from fingerprinting you like TikTok. Overall, this is great for privacy, but not for home networks that has network-wide controls to protect users from trackers.

Currently, I have Firewalla, Circle with Disney and Pi-Hole on my home network to protect everyone against adtech and surveillance capitalists. All devices at home are registered, with set IP addresses assigned via their MAC addresses through Pi-Hole acting as DHCP server. 

When I installed iOS 14 beta on my iPhone 11, I got alerts from Circle about an unknown device joining the network. iOS 14 Private Address was turned on, and what it does is generate MAC addresses every 24 hours — so the next day, another unknown device joined my network. Argh! This is a nightmare considering that I get alerts even if authorized users are connecting, which makes it difficult to know if my home network has been compromised.

I thought of several ways of solving this issue before iOS 14 and iPadOS 14 get officially released. The most obvious way is to turn off Private Address on all devices, but it is easier said than done, specially if you have teenagers! There has to be a better way.

I considered restricting MAC addresses on the WiFi Access Point/Router — to prevent devices from connecting to your wireless network. Perfect solution, but there has to be a better way since adding a new MAC address requires rebooting the access point/router.

One possible solution that I have explored is going the Pi-Hole route, considering that I have configured it to be the DHCP server to map IP address for every registered MAC address. However, with Private Address turned on, a new MAC address will still get an IP address, albeit not within the known addresses. 

Fortunately, Pi-Hole’s can be configured to ignore unknown MAC addresses via a simple text-based configuration. Tweaking the configuration file does not even need a reboot (no router or Pi-Hole reboot). The configuration can be found at /etc/dnsmasq.d. If you don’t have the file 04-pihole-static-dhcp.conf, you can create it using your favorite Linux editor, I prefer vi. The content format is simple:

dhcp-host=,,,

Example:

dhcp-host=AA:AA:AA:AA:AA:AA,10,0.0.1,iPhone11,4h

Which assigns the IP address 10.0.0.1 to a device named iPhone 11 and with MAC address AA:AA:AA:AA:AA:AA, and valid for 4 hours.

I listed all the known and authorized devices at home. However, this still does not solve the original issue, those unauthorized MAC addresses. At the end of the configuration, after listing all authorized MAC address, you add a catch-all rule:

dhcp-host=*:*:*:*:*:*,ignore

This matches all MAC addresses that are not listed above this rule and IGNORES it, i.e., does not give it an IP address to use on the network.

Lo and behold, it works! Adding a new MAC address requires editing the same file (do not use the Pi-Hole web interface as it adds any new entry at the bottom, after the ignore line) and reloading it. Nothing to reboot!

For the meantime, this solution gets the job done, until maybe I get a network firewall appliance that allows me to better control the network. 

ADVERTISEMENT
.most-popular .layout-ratio{ padding-bottom: 79.13%; } @media (min-width: 768px) and (max-width: 1024px) { .widget-title { font-size: 15px !important; } }

{{ articles_filter_1561_widget.title }}

.most-popular .layout-ratio{ padding-bottom: 79.13%; } @media (min-width: 768px) and (max-width: 1024px) { .widget-title { font-size: 15px !important; } }

{{ articles_filter_1562_widget.title }}

.most-popular .layout-ratio{ padding-bottom: 79.13%; } @media (min-width: 768px) and (max-width: 1024px) { .widget-title { font-size: 15px !important; } }

{{ articles_filter_1563_widget.title }}

{{ articles_filter_1564_widget.title }}

.mb-article-details { position: relative; } .mb-article-details .article-body-preview, .mb-article-details .article-body-summary{ font-size: 17px; line-height: 30px; font-family: "Libre Caslon Text", serif; color: #000; } .mb-article-details .article-body-preview iframe , .mb-article-details .article-body-summary iframe{ width: 100%; margin: auto; } .read-more-background { background: linear-gradient(180deg, color(display-p3 1.000 1.000 1.000 / 0) 13.75%, color(display-p3 1.000 1.000 1.000 / 0.8) 30.79%, color(display-p3 1.000 1.000 1.000) 72.5%); position: absolute; height: 200px; width: 100%; bottom: 0; display: flex; justify-content: center; align-items: center; padding: 0; } .read-more-background a{ color: #000; } .read-more-btn { padding: 17px 45px; font-family: Inter; font-weight: 700; font-size: 18px; line-height: 16px; text-align: center; vertical-align: middle; border: 1px solid black; background-color: white; } .hidden { display: none; }
function initializeAllSwipers() { // Get all hidden inputs with cms_article_id document.querySelectorAll('[id^="cms_article_id_"]').forEach(function (input) { const cmsArticleId = input.value; const articleSelector = '#article-' + cmsArticleId + ' .body_images'; const swiperElement = document.querySelector(articleSelector); if (swiperElement && !swiperElement.classList.contains('swiper-initialized')) { new Swiper(articleSelector, { loop: true, pagination: false, navigation: { nextEl: '#article-' + cmsArticleId + ' .swiper-button-next', prevEl: '#article-' + cmsArticleId + ' .swiper-button-prev', }, }); } }); } setTimeout(initializeAllSwipers, 3000); const intersectionObserver = new IntersectionObserver( (entries) => { entries.forEach((entry) => { if (entry.isIntersecting) { const newUrl = entry.target.getAttribute("data-url"); if (newUrl) { history.pushState(null, null, newUrl); let article = entry.target; // Extract metadata const author = article.querySelector('.author-section').textContent.replace('By', '').trim(); const section = article.querySelector('.section-info ').textContent.replace(' ', ' '); const title = article.querySelector('.article-title h1').textContent; // Parse URL for Chartbeat path format const parsedUrl = new URL(newUrl, window.location.origin); const cleanUrl = parsedUrl.host + parsedUrl.pathname; // Update Chartbeat configuration if (typeof window._sf_async_config !== 'undefined') { window._sf_async_config.path = cleanUrl; window._sf_async_config.sections = section; window._sf_async_config.authors = author; } // Track virtual page view with Chartbeat if (typeof pSUPERFLY !== 'undefined' && typeof pSUPERFLY.virtualPage === 'function') { try { pSUPERFLY.virtualPage({ path: cleanUrl, title: title, sections: section, authors: author }); } catch (error) { console.error('ping error', error); } } // Optional: Update document title if (title && title !== document.title) { document.title = title; } } } }); }, { threshold: 0.1 } ); function showArticleBody(button) { const article = button.closest("article"); const summary = article.querySelector(".article-body-summary"); const body = article.querySelector(".article-body-preview"); const readMoreSection = article.querySelector(".read-more-background"); // Hide summary and read-more section summary.style.display = "none"; readMoreSection.style.display = "none"; // Show the full article body body.classList.remove("hidden"); } document.addEventListener("DOMContentLoaded", () => { let loadCount = 0; // Track how many times articles are loaded const offset = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; // Offset values const currentUrl = window.location.pathname.substring(1); let isLoading = false; // Prevent multiple calls if (!currentUrl) { console.log("Current URL is invalid."); return; } const sentinel = document.getElementById("load-more-sentinel"); if (!sentinel) { console.log("Sentinel element not found."); return; } function isSentinelVisible() { const rect = sentinel.getBoundingClientRect(); return ( rect.top < window.innerHeight && rect.bottom >= 0 ); } function onScroll() { if (isLoading) return; if (isSentinelVisible()) { if (loadCount >= offset.length) { console.log("Maximum load attempts reached."); window.removeEventListener("scroll", onScroll); return; } isLoading = true; const currentOffset = offset[loadCount]; window.loadMoreItems().then(() => { let article = document.querySelector('#widget_1690 > div:nth-last-of-type(2) article'); intersectionObserver.observe(article) loadCount++; }).catch(error => { console.error("Error loading more items:", error); }).finally(() => { isLoading = false; }); } } window.addEventListener("scroll", onScroll); });

Sign up by email to receive news.