{"id":10235,"date":"2026-08-15T00:18:00","date_gmt":"2026-08-14T22:18:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/toolbox\/ip-anonymization-masking-tester\/"},"modified":"2026-08-15T00:18:00","modified_gmt":"2026-08-14T22:18:00","slug":"ip-anonymization-masking-tester","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/ip-anonymization-masking-tester\/","title":{"rendered":"IP Anonymization &#038; Masking Tester"},"content":{"rendered":"<div class=\"gtm-analyser-container\" style=\"background: var(--bg-panel, #1e1e24); padding: 25px; border-radius: 8px; border: 1px solid var(--border, #2a2a35);\">\n<p style=\"color: var(--text-secondary, #a0a0b0); margin-bottom: 20px;\">Truncating the last octet is the usual recipe in server-side containers and in the conversions APIs of Meta, LinkedIn and TikTok. This tool shows the result, the size of the group that remains, and the cases where the masking never had a real address to work on.<\/p>\n<p>    <label for=\"ip-eingabe\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">IP addresses, one per line<\/label><br \/>\n    <textarea id=\"ip-eingabe\" class=\"form-control\" style=\"width: 100%; height: 120px; padding: 12px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; font-size: 0.85rem; box-sizing: border-box;\" placeholder=\"203.0.113.45\n2001:db8:85a3::8a2e:370:7334\"><\/textarea><\/p>\n<div style=\"display: flex; gap: 12px; flex-wrap: wrap; margin-top: 15px; align-items: flex-end;\">\n<div style=\"flex: 1; min-width: 200px;\">\n            <label for=\"ip-v4\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">IPv4 masking<\/label><br \/>\n            <select id=\"ip-v4\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; box-sizing: border-box;\"><option value=\"32\">keep all four octets (\/32)<\/option><option value=\"24\" selected>drop the last octet (\/24)<\/option><option value=\"16\">keep two octets (\/16)<\/option><option value=\"8\">keep one octet (\/8)<\/option><option value=\"0\">drop the address entirely<\/option><\/select>\n        <\/div>\n<div style=\"flex: 1; min-width: 200px;\">\n            <label for=\"ip-v6\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">IPv6 masking<\/label><br \/>\n            <select id=\"ip-v6\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; box-sizing: border-box;\"><option value=\"128\">keep the full address (\/128)<\/option><option value=\"64\">keep the network part (\/64)<\/option><option value=\"56\">keep \/56<\/option><option value=\"48\" selected>keep \/48<\/option><option value=\"32\">keep \/32<\/option><option value=\"0\">drop the address entirely<\/option><\/select>\n        <\/div>\n<\/p><\/div>\n<div style=\"display: flex; gap: 10px; flex-wrap: wrap; margin: 18px 0 0;\">\n        <button id=\"ip-btn\" class=\"button\" style=\"background: var(--accent, #7ee787); color: #0b1114; border: none; padding: 12px 24px; border-radius: 6px; font-weight: 700; cursor: pointer;\">Mask<\/button><br \/>\n        <button id=\"ip-ga4\" class=\"button\" type=\"button\" style=\"background: transparent; color: var(--text-primary, #e8e8ee); border: 1px solid var(--border, #2a2a35); padding: 12px 20px; border-radius: 6px; font-weight: 700; cursor: pointer;\">Google Analytics preset<\/button><br \/>\n        <button id=\"ip-beispiel\" class=\"button\" type=\"button\" style=\"background: transparent; color: var(--text-primary, #e8e8ee); border: 1px solid var(--border, #2a2a35); padding: 12px 20px; border-radius: 6px; font-weight: 700; cursor: pointer;\">Load example<\/button>\n    <\/div>\n<div id=\"ip-ergebnis\" style=\"margin-top: 22px;\"><\/div>\n<\/div>\n<p><script>\n(function () {\n    'use strict';<\/p>\n<p>    const T = {\"einleitung\":\"Truncating the last octet is the usual recipe in server-side containers and in the conversions APIs of Meta, LinkedIn and TikTok. This tool shows the result, the size of the group that remains, and the cases where the masking never had a real address to work on.\",\"label_ip\":\"IP addresses, one per line\",\"ph_ip\":\"203.0.113.45\\n2001:db8:85a3::8a2e:370:7334\",\"label_v4\":\"IPv4 masking\",\"label_v6\":\"IPv6 masking\",\"v4_32\":\"keep all four octets (\\\/32)\",\"v4_24\":\"drop the last octet (\\\/24)\",\"v4_16\":\"keep two octets (\\\/16)\",\"v4_8\":\"keep one octet (\\\/8)\",\"v4_0\":\"drop the address entirely\",\"v6_128\":\"keep the full address (\\\/128)\",\"v6_64\":\"keep the network part (\\\/64)\",\"v6_56\":\"keep \\\/56\",\"v6_48\":\"keep \\\/48\",\"v6_32\":\"keep \\\/32\",\"v6_0\":\"drop the address entirely\",\"knopf\":\"Mask\",\"knopf_ga4\":\"Google Analytics preset\",\"beispiel\":\"Load example\",\"entfernt\":\"(removed)\",\"alle\":\"the whole internet\",\"fehler_leer\":\"No address was entered.\",\"fehler_praefix\":\"The chosen mask length is out of range.\",\"h_ergebnis\":\"Result\",\"h_nutzlast\":\"As it would leave in a payload\",\"h_einordnung\":\"What that means\",\"z_menge\":\"%s addresses share this value - %b bits were dropped.\",\"b_privat\":\"Private address range: whatever produced this payload sent an internal address, not the visitor\\u0027s.\",\"b_lokal\":\"Loopback address: this is the machine itself, never a visitor.\",\"b_linklokal\":\"Link-local address, which never travels beyond the local segment.\",\"b_carrier\":\"Carrier-grade NAT range: many subscribers of one provider share this address.\",\"b_reserviert\":\"Reserved range that is not routed on the internet.\",\"b_v4inv6\":\"IPv4 address wrapped in IPv6 notation. Masking rules for IPv6 leave the embedded address untouched far longer than expected.\",\"b_ungekuerzt\":\"Nothing was masked here: the address is stored in full.\",\"b_64\":\"A \\\/64 is exactly what a single household gets. Cutting to \\\/64 or less is not anonymisation.\",\"b_port\":\"A port was appended and has been dropped before the evaluation.\",\"b_ungueltig\":\"not a valid IP address\",\"e_hash\":\"Hashing an IPv4 address is not anonymisation: the whole space is 4.3 billion values and can be tried through in minutes, so a hash maps back to exactly one address.\",\"e_geo\":\"A \\\/24 still resolves to a city, often to a district. Geographic reporting therefore survives the truncation almost intact, which is the point of it.\",\"e_ga4\":\"GA4 has no switch for this. Addresses are used for the geographic lookup and then dropped, which is why the property never shows an IP anywhere.\",\"e_recht\":\"Truncation lowers the risk, it does not remove the personal reference: a \\\/24 with a timestamp and a user agent is still narrow enough to be treated as personal data.\"};<\/p>\n<p>    \/\/ --- reine Rechenlogik ---<\/p>\n<p>    \/\/ Adressbereiche, die nie ein Besucher aus dem Netz sein koennen. Steht\n    \/\/ so etwas in einer CAPI-Nutzlast, hat der eigene Server seine eigene\n    \/\/ Adresse mitgeschickt statt der des Besuchers.\n    const V4_BEREICHE = [\n        { netz: [10, 0, 0, 0], praefix: 8, art: 'privat' },\n        { netz: [172, 16, 0, 0], praefix: 12, art: 'privat' },\n        { netz: [192, 168, 0, 0], praefix: 16, art: 'privat' },\n        { netz: [127, 0, 0, 0], praefix: 8, art: 'lokal' },\n        { netz: [169, 254, 0, 0], praefix: 16, art: 'linklokal' },\n        { netz: [100, 64, 0, 0], praefix: 10, art: 'carrier' },\n        { netz: [0, 0, 0, 0], praefix: 8, art: 'reserviert' }\n    ];<\/p>\n<p>    function ipv4Lesen(text) {\n        const teile = String(text).trim().split('.');\n        if (teile.length !== 4) { return null; }\n        const zahlen = [];\n        for (let i = 0; i < 4; i++) {\n            if (!\/^[0-9]{1,3}$\/.test(teile[i])) { return null; }\n            const wert = parseInt(teile[i], 10);\n            if (wert > 255) { return null; }\n            zahlen.push(wert);\n        }\n        return zahlen;\n    }<\/p>\n<p>    function ipv6Lesen(text) {\n        let s = String(text).trim().toLowerCase();\n        const zone = s.indexOf('%');\n        if (zone !== -1) { s = s.slice(0, zone); }\n        if (s.indexOf(':') === -1) { return null; }<\/p>\n<p>        \/\/ In IPv6 eingebettete IPv4-Adresse, etwa ::ffff:192.0.2.7\n        const letzter = s.lastIndexOf(':');\n        const schwanz = s.slice(letzter + 1);\n        if (schwanz.indexOf('.') !== -1) {\n            const v4 = ipv4Lesen(schwanz);\n            if (!v4) { return null; }\n            s = s.slice(0, letzter + 1)\n                + ((v4[0] * 256 + v4[1]).toString(16)) + ':'\n                + ((v4[2] * 256 + v4[3]).toString(16));\n        }<\/p>\n<p>        const teile = s.split('::');\n        if (teile.length > 2) { return null; }\n        const links = teile[0] === '' ? [] : teile[0].split(':');\n        const rechts = teile.length === 2 ? (teile[1] === '' ? [] : teile[1].split(':')) : [];\n        let gruppen;\n        if (teile.length === 1) {\n            if (links.length !== 8) { return null; }\n            gruppen = links;\n        } else {\n            const fehlend = 8 - links.length - rechts.length;\n            if (fehlend < 1) { return null; }\n            gruppen = links.slice();\n            for (let i = 0; i < fehlend; i++) { gruppen.push('0'); }\n            gruppen = gruppen.concat(rechts);\n        }\n        if (gruppen.length !== 8) { return null; }\n        const zahlen = [];\n        for (let i = 0; i < 8; i++) {\n            if (!\/^[0-9a-f]{1,4}$\/.test(gruppen[i])) { return null; }\n            zahlen.push(parseInt(gruppen[i], 16));\n        }\n        return zahlen;\n    }\n\n    function ipv6Text(gruppen) {\n        \/\/ Laengste Folge aus Nullen suchen und durch :: ersetzen.\n        let bestStart = -1;\n        let bestLaenge = 0;\n        let start = -1;\n        let laenge = 0;\n        for (let i = 0; i < 8; i++) {\n            if (gruppen[i] === 0) {\n                if (start === -1) { start = i; laenge = 0; }\n                laenge++;\n                if (laenge > bestLaenge) { bestLaenge = laenge; bestStart = start; }\n            } else {\n                start = -1;\n                laenge = 0;\n            }\n        }\n        const teile = gruppen.map(function (g) { return g.toString(16); });\n        if (bestLaenge < 2) { return teile.join(':'); }\n        const vorn = teile.slice(0, bestStart).join(':');\n        const hinten = teile.slice(bestStart + bestLaenge).join(':');\n        return vorn + '::' + hinten;\n    }\n\n    function maskeV4(zahlen, praefix) {\n        const raus = [];\n        for (let i = 0; i < 4; i++) {\n            const anfang = i * 8;\n            if (anfang >= praefix) { raus.push(0); continue; }\n            const behalten = Math.min(8, praefix - anfang);\n            if (behalten >= 8) { raus.push(zahlen[i]); continue; }\n            raus.push(zahlen[i] & ((255 << (8 - behalten)) &#038; 255));\n        }\n        return raus;\n    }\n\n    function maskeV6(gruppen, praefix) {\n        const raus = [];\n        for (let i = 0; i < 8; i++) {\n            const anfang = i * 16;\n            if (anfang >= praefix) { raus.push(0); continue; }\n            const behalten = Math.min(16, praefix - anfang);\n            if (behalten >= 16) { raus.push(gruppen[i]); continue; }\n            raus.push(gruppen[i] & ((0xFFFF << (16 - behalten)) &#038; 0xFFFF));\n        }\n        return raus;\n    }\n\n    function inBereich(zahlen, netz, praefix) {\n        const a = maskeV4(zahlen, praefix);\n        const b = maskeV4(netz, praefix);\n        return a[0] === b[0] &#038;&#038; a[1] === b[1] &#038;&#038; a[2] === b[2] &#038;&#038; a[3] === b[3];\n    }\n\n    function menge(bits) {\n        \/\/ Wie viele Adressen deckt der verbliebene Rest ab?\n        if (bits <= 0) { return '1'; }\n        if (bits <= 53) {\n            const wert = Math.pow(2, bits);\n            return wert.toLocaleString('en-US').replace(\/,\/g, ' ');\n        }\n        return '2^' + bits;\n    }\n\n    function eineAdresse(roh, praefixV4, praefixV6) {\n        const eintrag = {\n            eingabe: String(roh).trim(),\n            art: '',\n            gueltig: false,\n            maskiert: '',\n            praefix: 0,\n            bitsWeg: 0,\n            menge: '',\n            befunde: []\n        };\n        if (eintrag.eingabe === '') { return null; }\n\n        \/\/ Ein angehaengter Port oder eine Klammerung stoert die Auswertung.\n        let text = eintrag.eingabe;\n        if (text.charAt(0) === '[') {\n            const zu = text.indexOf(']');\n            if (zu !== -1) { text = text.slice(1, zu); }\n        } else if (text.indexOf(':') !== -1 &#038;&#038; text.indexOf('.') !== -1 &#038;&#038; text.split(':').length === 2) {\n            text = text.split(':')[0];\n            eintrag.befunde.push(T.b_port);\n        }\n\n        const v4 = ipv4Lesen(text);\n        if (v4) {\n            eintrag.art = 'IPv4';\n            eintrag.gueltig = true;\n            eintrag.praefix = praefixV4;\n            eintrag.bitsWeg = 32 - praefixV4;\n            eintrag.maskiert = praefixV4 === 0 ? T.entfernt : maskeV4(v4, praefixV4).join('.');\n            eintrag.menge = praefixV4 === 0 ? T.alle : menge(32 - praefixV4);\n            V4_BEREICHE.forEach(function (b) {\n                if (inBereich(v4, b.netz, b.praefix)) {\n                    eintrag.befunde.push(T['b_' + b.art] || b.art);\n                }\n            });\n            if (praefixV4 === 32) { eintrag.befunde.push(T.b_ungekuerzt); }\n            return eintrag;\n        }\n\n        const v6 = ipv6Lesen(text);\n        if (v6) {\n            eintrag.art = 'IPv6';\n            eintrag.gueltig = true;\n            eintrag.praefix = praefixV6;\n            eintrag.bitsWeg = 128 - praefixV6;\n            eintrag.maskiert = praefixV6 === 0 ? T.entfernt : ipv6Text(maskeV6(v6, praefixV6));\n            eintrag.menge = praefixV6 === 0 ? T.alle : menge(128 - praefixV6);\n            const erstes = v6[0];\n            if (v6[0] === 0 &#038;&#038; v6[1] === 0 &#038;&#038; v6[2] === 0 &#038;&#038; v6[3] === 0 &#038;&#038; v6[4] === 0 &#038;&#038; v6[5] === 0xffff) {\n                eintrag.befunde.push(T.b_v4inv6);\n            }\n            if ((erstes &#038; 0xfe00) === 0xfc00) { eintrag.befunde.push(T.b_privat); }\n            if ((erstes &#038; 0xffc0) === 0xfe80) { eintrag.befunde.push(T.b_linklokal); }\n            if (ipv6Text(v6) === '::1') { eintrag.befunde.push(T.b_lokal); }\n            if (praefixV6 === 128) { eintrag.befunde.push(T.b_ungekuerzt); }\n            if (praefixV6 >= 64) { eintrag.befunde.push(T.b_64); }\n            return eintrag;\n        }<\/p>\n<p>        eintrag.befunde.push(T.b_ungueltig);\n        return eintrag;\n    }<\/p>\n<p>    function auswerten(text, praefixV4, praefixV6) {\n        const ergebnis = { ok: false, fehler: '', eintraege: [], anzahl: 0, ungueltig: 0 };\n        const zeilen = String(text === undefined || text === null ? '' : text).split(\/[\\r\\n,;]+\/);\n        const p4 = parseInt(praefixV4, 10);\n        const p6 = parseInt(praefixV6, 10);\n        if (!isFinite(p4) || p4 < 0 || p4 > 32 || !isFinite(p6) || p6 < 0 || p6 > 128) {\n            ergebnis.fehler = T.fehler_praefix;\n            return ergebnis;\n        }<\/p>\n<p>        zeilen.forEach(function (zeile) {\n            const eintrag = eineAdresse(zeile, p4, p6);\n            if (eintrag) { ergebnis.eintraege.push(eintrag); }\n        });<\/p>\n<p>        if (!ergebnis.eintraege.length) {\n            ergebnis.fehler = T.fehler_leer;\n            return ergebnis;\n        }\n        ergebnis.anzahl = ergebnis.eintraege.length;\n        ergebnis.ungueltig = ergebnis.eintraege.filter(function (e) { return !e.gueltig; }).length;\n        ergebnis.ok = true;\n        return ergebnis;\n    }<\/p>\n<p>    if (typeof window !== 'undefined') {\n        window.LW_TEST = window.LW_TEST || {};\n        window.LW_TEST.IP = {\n            auswerten: auswerten,\n            ipv4Lesen: ipv4Lesen,\n            ipv6Lesen: ipv6Lesen,\n            ipv6Text: ipv6Text,\n            maskeV4: maskeV4,\n            maskeV6: maskeV6\n        };\n    }<\/p>\n<p>    \/\/ --- Anbindung an das Dokument ---<\/p>\n<p>    const btn = document.getElementById('ip-btn');\n    const out = document.getElementById('ip-ergebnis');\n    const feld = document.getElementById('ip-eingabe');\n    const v4Feld = document.getElementById('ip-v4');\n    const v6Feld = document.getElementById('ip-v6');\n    const ga4Btn = document.getElementById('ip-ga4');\n    const beispielBtn = document.getElementById('ip-beispiel');\n    if (!btn || !out || !feld || !v4Feld || !v6Feld || !ga4Btn || !beispielBtn) { return; }<\/p>\n<p>    const KASTEN = 'background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-radius: 6px; padding: 14px; margin-bottom: 18px;';\n    const UEBERSCHRIFT = 'color: var(--text-primary, #e8e8ee); font-weight: 700; margin-bottom: 8px;';<\/p>\n<p>    function el(tag, css, text) {\n        const knoten = document.createElement(tag);\n        if (css) { knoten.setAttribute('style', css); }\n        if (text !== undefined && text !== null) { knoten.textContent = text; }\n        return knoten;\n    }<\/p>\n<p>    function meldung(text) {\n        out.textContent = '';\n        out.appendChild(el('div', 'background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-left: 3px solid var(--accent, #7ee787); color: var(--text-secondary, #a0a0b0); padding: 14px; border-radius: 6px;', text));\n    }<\/p>\n<p>    function zeigen(erg) {\n        out.textContent = '';<\/p>\n<p>        out.appendChild(el('div', UEBERSCHRIFT, T.h_ergebnis));\n        const kasten = el('div', KASTEN);\n        erg.eintraege.forEach(function (e) {\n            const z = el('div', 'padding: 9px 0; border-bottom: 1px solid var(--border, #2a2a35);');\n            const kopf = el('div', 'display: flex; gap: 14px; flex-wrap: wrap; align-items: baseline;');\n            kopf.appendChild(el('span', 'color: var(--text-secondary, #a0a0b0); font-family: monospace; min-width: 160px;', e.eingabe));\n            kopf.appendChild(el('span', 'color: var(--text-secondary, #a0a0b0);', '\u2192'));\n            kopf.appendChild(el('span', 'color: ' + (e.gueltig ? 'var(--accent, #7ee787)' : '#ffb86c') + '; font-family: monospace; font-weight: 700;', e.gueltig ? e.maskiert : T.b_ungueltig));\n            if (e.gueltig) {\n                kopf.appendChild(el('span', 'color: var(--text-secondary, #a0a0b0); font-size: 0.8rem;', e.art + ' \/' + e.praefix));\n            }\n            z.appendChild(kopf);\n            if (e.gueltig) {\n                z.appendChild(el('div', 'color: var(--text-secondary, #a0a0b0); font-size: 0.82rem; padding-top: 3px;', T.z_menge.replace('%s', e.menge).replace('%b', String(e.bitsWeg))));\n            }\n            e.befunde.forEach(function (b) {\n                z.appendChild(el('div', 'color: #ffb86c; font-size: 0.82rem; padding-top: 3px;', b));\n            });\n            kasten.appendChild(z);\n        });\n        out.appendChild(kasten);<\/p>\n<p>        \/\/ Nutzlast, wie sie an eine Conversions API ginge.\n        const ersteGueltige = erg.eintraege.filter(function (e) { return e.gueltig; })[0];\n        if (ersteGueltige) {\n            out.appendChild(el('div', UEBERSCHRIFT, T.h_nutzlast));\n            const code = el('pre', 'background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); padding: 16px; border-radius: 6px; overflow-x: auto; font-family: monospace; font-size: 0.85rem; line-height: 1.5; white-space: pre; margin-bottom: 18px;');\n            const wert = ersteGueltige.praefix === 0 ? 'null' : '\"' + ersteGueltige.maskiert + '\"';\n            code.textContent = '{\\n  \"event_name\": \"Purchase\",\\n  \"user_data\": {\\n    \"client_ip_address\": ' + wert + ',\\n    \"client_user_agent\": \"...\"\\n  }\\n}';\n            out.appendChild(code);\n        }<\/p>\n<p>        out.appendChild(el('div', UEBERSCHRIFT, T.h_einordnung));\n        const hinweise = el('div', KASTEN);\n        [T.e_hash, T.e_geo, T.e_ga4, T.e_recht].forEach(function (text) {\n            hinweise.appendChild(el('div', 'color: var(--text-secondary, #a0a0b0); font-size: 0.88rem; line-height: 1.6; padding: 5px 0;', text));\n        });\n        out.appendChild(hinweise);\n    }<\/p>\n<p>    btn.addEventListener('click', function () {\n        const erg = auswerten(feld.value, v4Feld.value, v6Feld.value);\n        if (!erg.ok) { meldung(erg.fehler); return; }\n        zeigen(erg);\n    });<\/p>\n<p>    ga4Btn.addEventListener('click', function () {\n        v4Feld.value = '24';\n        v6Feld.value = '48';\n        btn.click();\n    });<\/p>\n<p>    beispielBtn.addEventListener('click', function () {\n        feld.value = '203.0.113.45\\n198.51.100.7\\n192.168.1.45\\n2001:db8:85a3:1319:8a2e:370:7334:1\\n::ffff:192.0.2.128';\n        btn.click();\n    });\n})();\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Shows what an IPv4 or IPv6 address looks like after truncation, how large the remaining group of addresses is, and whether a payload carries a private address instead of the visitor&#8217;s.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":38,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-tool-base.php","meta":{"footnotes":""},"tags":[91261,91279,91061],"class_list":["post-10235","page","type-page","status-publish","hentry","tag-conversion-tracking","tag-prywatnosc-danych-pl","tag-server-side-gtm"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>IP Anonymization &amp; Masking Tester - Lukas Wojcik - Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/ip-anonymization-masking-tester\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"IP Anonymization &amp; Masking Tester - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Shows what an IPv4 or IPv6 address looks like after truncation, how large the remaining group of addresses is, and whether a payload carries a private address instead of the visitor&#039;s.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/ip-anonymization-masking-tester\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/ip-anonymization-masking-tester\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/ip-anonymization-masking-tester\\\/\",\"name\":\"IP Anonymization & Masking Tester - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-08-14T22:18:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/ip-anonymization-masking-tester\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/ip-anonymization-masking-tester\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/ip-anonymization-masking-tester\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Toolbox\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"IP Anonymization &#038; Masking Tester\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"luky\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"luky\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"IP Anonymization & Masking Tester - Lukas Wojcik - Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/ip-anonymization-masking-tester\/","og_locale":"en_US","og_type":"article","og_title":"IP Anonymization & Masking Tester - Lukas Wojcik - Blog","og_description":"Shows what an IPv4 or IPv6 address looks like after truncation, how large the remaining group of addresses is, and whether a payload carries a private address instead of the visitor's.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/ip-anonymization-masking-tester\/","og_site_name":"Lukas Wojcik - Blog","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/ip-anonymization-masking-tester\/","url":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/ip-anonymization-masking-tester\/","name":"IP Anonymization & Masking Tester - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-08-14T22:18:00+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/ip-anonymization-masking-tester\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/ip-anonymization-masking-tester\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/ip-anonymization-masking-tester\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Toolbox","item":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/"},{"@type":"ListItem","position":3,"name":"IP Anonymization &#038; Masking Tester"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"luky","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"luky"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/10235","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=10235"}],"version-history":[{"count":0,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/10235\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/38"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=10235"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=10235"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}