templates_blog_modulesdir = $(templates_blogdir)/modules
templates_dbl_DATA = \
+ src/templates/dbl/how-to-use.html \
src/templates/dbl/index.html \
src/templates/dbl/search.html \
src/templates/dbl/search-not-found.html
$(static_fonts_DATA)
static_img_DATA = \
+ src/static/img/adguard.svg \
src/static/img/apple-touch-icon-192x192-precomposed.png \
src/static/img/apple-touch-icon-180x180-precomposed.png \
src/static/img/apple-touch-icon-152x152-precomposed.png \
src/static/img/apple-touch-icon-72x72-precomposed.png \
src/static/img/apple-touch-icon-60x60-precomposed.png \
src/static/img/bash-logo.svg \
+ src/static/img/bind.png \
src/static/img/debian-logo.svg \
src/static/img/default-avatar.jpg \
src/static/img/fdroid-logo.svg \
src/static/img/ipfire-tux.png \
src/static/img/iuse-not-found.png \
+ src/static/img/knot.png \
src/static/img/kyberio-logo.svg \
src/static/img/lightningwirelabs-logo.svg \
+ src/static/img/opnsense.svg \
+ src/static/img/pfsense.png \
+ src/static/img/pi-hole.png \
+ src/static/img/powerdns.svg \
src/static/img/python-logo.svg \
- src/static/img/tor.svg
+ src/static/img/suricata.png \
+ src/static/img/tor.svg \
+ src/static/img/ublock-origin.svg \
+ src/static/img/unbound.svg
static_imgdir = $(staticdir)/img
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="80px" height="80px" viewBox="0 0 80 80" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!-- Generator: Sketch 52.2 (67145) - http://www.bohemiancoding.com/sketch -->
+ <title>logo@2x</title>
+ <desc>Created with Sketch.</desc>
+ <g id="logo" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <rect id="Rectangle" fill="#FFFFFF" x="0" y="0" width="80" height="80" rx="20"></rect>
+ <g id="Group-10" transform="translate(12.000000, 12.000000)">
+ <g id="Group-9">
+ <g id="Group-8">
+ <g id="Group-7">
+ <path d="M28.2221276,0 C19.4007575,0 8.75997994,2.07442553 8.65485005e-06,6.64038298 C8.65485005e-06,16.501617 -0.120909272,41.0689362 28.2221276,57.855 C56.5657909,41.0689362 56.4454995,16.501617 56.4454995,6.64038298 C47.6849017,2.07442553 37.0441241,0 28.2221276,0 L28.2221276,0 Z" id="Path" fill="#68BC71"></path>
+ <path d="M28.1932991,57.8379179 C-0.120827266,41.0522735 8.65485006e-06,16.4982725 8.65485006e-06,6.64038298 C8.75043947,2.07939831 19.3775821,0.00452145957 28.1932991,7.38217799e-06 L28.1932991,57.8379237 Z" id="Combined-Shape" fill="#67B279"></path>
+ </g>
+ <path d="M27.1926958,38.6027397 L44.2590846,15.6010416 C43.0084943,14.5986526 41.911548,15.3061181 41.3076915,15.8538333 L41.2856573,15.8555888 L27.0557264,30.6585285 L21.6942672,24.2064902 C19.1365123,21.2514028 15.6592758,23.5054616 14.8469876,24.1011604 L27.1926958,38.6027397" id="Fill-11" fill="#FFFFFF"></path>
+ </g>
+ </g>
+ </g>
+ </g>
+</svg>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="cvfy" x="652px" y="152px" width="600" height="119.8" version="1.1" viewBox="0 250 600 119.8" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:xlink="http://www.w3.org/1999/xlink"><title>OPNsense logo</title><metadata><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/><dc:title>OPNsense logo</dc:title></cc:Work></rdf:RDF></metadata>
+<title>OPNsense logo</title>
+<style type="text/css">
+ .st0{clip-path:url(#cvfb);fill:#898B8D;}
+ .st1{clip-path:url(#cvfb);fill:url(#cvfj);}
+ .st2{clip-path:url(#cvfb);fill:url(#cvfi);}
+ .st3{fill:#403F41;}
+ .st4{clip-path:url(#cvfa);fill:#898B8D;}
+ .st5{clip-path:url(#cvfa);fill:url(#cvfh);}
+ .st6{clip-path:url(#cvfa);fill:url(#cvfg);}
+ .st7{clip-path:url(#cvff);fill:#58595B;}
+ .st8{clip-path:url(#cvff);fill:url(#cvfr);}
+ .st9{clip-path:url(#cvfe);fill:#58595B;}
+ .st10{clip-path:url(#cvfe);fill:url(#cvfq);}
+ .st11{clip-path:url(#cvfd);fill:#58595B;}
+ .st12{clip-path:url(#cvfd);fill:url(#cvfp);}
+ .st13{clip-path:url(#cvfc);fill:#58595B;}
+ .st14{clip-path:url(#cvfc);fill:url(#cvfo);}
+ .st15{fill:url(#cvfn);}
+ .st16{fill:url(#cvfm);}
+ .st17{fill:url(#cvfl);}
+ .st18{fill:url(#cvfk);}
+ .st19{fill:#E24525;}
+ .st20{fill:#808183;}
+</style>
+<g transform="matrix(.9957 0 0 1 -29.69 -15.7)">
+
+ <defs>
+ <path id="cvfu" d="m38.8 284.1v-4.8c0-0.4 0.1-1.1 0.1-1.1l0.2-0.5v-0.2l0.2-0.4 0.1-0.1 0.1-0.2 0.1-0.1v-0.1l0.2-0.2v-0.1l0.7-0.7 0.2-0.1h0.1l0.3-0.2h0.3l0.6-0.3c0.4-0.1 0.7-0.1 1.1-0.1h94.6v9.2h9v-18.4h-103.6c-7.3 0-13.3 6.1-13.3 13.6v4.8z"/>
+ </defs>
+ <clipPath id="cvfb">
+ <use width="100%" height="100%" xlink:href="#cvfu"/>
+ </clipPath>
+ <rect class="st0" x="30.2" y="264.7" width="117.1" height="12" clip-path="url(#cvfb)"/>
+
+ <linearGradient id="cvfj" x1="-2420" x2="-2400" y1="800.1" y2="800.1" gradientTransform="matrix(.1869 .3575 -.6751 .353 1133 856.1)" gradientUnits="userSpaceOnUse">
+ <stop style="stop-color:#737373" offset="0"/>
+ <stop style="stop-color:#333" offset="1"/>
+ </linearGradient>
+ <polygon class="st1" points="133.8 277 147 269.9 150.7 277.1 137.5 284.2" clip-path="url(#cvfb)" style="fill:url(#cvfj)"/>
+
+ <linearGradient id="cvfi" x1="-2368" x2="-2347" y1="2163" y2="2163" gradientTransform="matrix(-.1861 .3579 -.5495 -.2858 785 1739)" gradientUnits="userSpaceOnUse">
+ <stop style="stop-color:#737373" offset="0"/>
+ <stop style="stop-color:#333" offset="1"/>
+ </linearGradient>
+ <polygon class="st2" points="31.9 271.1 42.6 276.9 38.9 284.1 28.2 278.4" clip-path="url(#cvfb)" style="fill:url(#cvfi)"/>
+
+ <rect class="st3" x="47.8" y="284.1" width="80.9" height="9.2"/>
+ <rect class="st3" x="47.8" y="358" width="80.9" height="9.2"/>
+
+ <defs>
+ <path id="cvft" d="m137.7 367.2v4.8c0 0.4-0.1 1.1-0.1 1.1l-0.2 0.5v0.2l-0.2 0.4-0.1 0.1-0.1 0.2-0.1 0.1v0.1l-0.2 0.2v0.1l-0.5 0.5h-0.1l-0.1 0.1-0.2 0.1-0.1 0.1-0.3 0.2h-0.3l-0.5 0.2c-0.4 0.1-0.7 0.1-1.1 0.1h-94.7v-9.2h-9v18.4h103.6c7.3 0 13.3-6.1 13.3-13.6v-4.8h-9z"/>
+ </defs>
+ <clipPath id="cvfa">
+ <use width="100%" height="100%" xlink:href="#cvft"/>
+ </clipPath>
+ <rect class="st4" x="29.2" y="374.6" width="117.1" height="12" clip-path="url(#cvfa)"/>
+
+ <linearGradient id="cvfh" x1="1480" x2="1501" y1="2101" y2="2101" gradientTransform="matrix(-.1869 -.3575 .6751 -.353 -1106 1649)" gradientUnits="userSpaceOnUse">
+ <stop style="stop-color:#737373" offset="0"/>
+ <stop style="stop-color:#333" offset="1"/>
+ </linearGradient>
+ <polygon class="st5" points="42.7 374.4 29.5 381.5 25.8 374.2 39 367.1" clip-path="url(#cvfa)" style="fill:url(#cvfh)"/>
+
+ <linearGradient id="cvfg" x1="1880" x2="1900" y1="995.7" y2="995.7" gradientTransform="matrix(.1861 -.3579 .5495 .2858 -757.7 765.5)" gradientUnits="userSpaceOnUse">
+ <stop style="stop-color:#737373" offset="0"/>
+ <stop style="stop-color:#333" offset="1"/>
+ </linearGradient>
+ <polygon class="st6" points="144.7 380.2 133.9 374.4 137.6 367.2 148.4 372.9" clip-path="url(#cvfa)" style="fill:url(#cvfg)"/>
+
+
+ <defs>
+ <rect id="cvfs" x="38.8" y="302.6" width="34.6" height="9.2"/>
+ </defs>
+ <clipPath id="cvff">
+ <use width="100%" height="100%" xlink:href="#cvfs"/>
+ </clipPath>
+ <rect class="st7" x="38.8" y="302.6" width="34.6" height="9.2" clip-path="url(#cvff)"/>
+
+ <linearGradient id="cvfr" x1="2724" x2="2762" y1="2480" y2="2480" gradientTransform="matrix(-1.521 -1.021 3.14 1.519 -3559 -659.4)" gradientUnits="userSpaceOnUse">
+ <stop style="stop-color:#58595B" offset=".107"/>
+ <stop offset="1"/>
+ </linearGradient>
+ <polygon class="st8" points="69.7 319.2 38.4 302.4 42.1 295 73.5 311.8" clip-path="url(#cvff)" style="fill:url(#cvfr)"/>
+
+
+ <defs>
+ <rect id="cvfx" x="103.1" y="302.6" width="34.6" height="9.2"/>
+ </defs>
+ <clipPath id="cvfe">
+ <use width="100%" height="100%" xlink:href="#cvfx"/>
+ </clipPath>
+ <rect class="st9" x="103.1" y="302.6" width="34.6" height="9.2" clip-path="url(#cvfe)"/>
+
+ <linearGradient id="cvfq" x1="2370" x2="2408" y1="2242" y2="2242" gradientTransform="matrix(1.521 -1.021 -3.14 1.519 3527 -659.4)" gradientUnits="userSpaceOnUse">
+ <stop style="stop-color:#58595B" offset=".107"/>
+ <stop offset="1"/>
+ </linearGradient>
+ <polygon class="st10" points="106.8 319.2 138.2 302.4 134.4 295 103.1 311.8" clip-path="url(#cvfe)" style="fill:url(#cvfq)"/>
+
+
+ <defs>
+ <rect id="cvfw" x="103.1" y="339.5" width="34.6" height="9.2"/>
+ </defs>
+ <clipPath id="cvfd">
+ <use width="100%" height="100%" xlink:href="#cvfw"/>
+ </clipPath>
+ <rect class="st11" x="103.1" y="339.5" width="34.6" height="9.2" clip-path="url(#cvfd)"/>
+
+ <linearGradient id="cvfp" x1="-2721" x2="-2683" y1="-204.9" y2="-204.9" gradientTransform="matrix(1.521 1.021 -3.14 -1.519 3587 2791)" gradientUnits="userSpaceOnUse">
+ <stop style="stop-color:#58595B" offset=".107"/>
+ <stop offset="1"/>
+ </linearGradient>
+ <polygon class="st12" points="106.8 332.1 138.2 348.9 134.4 356.3 103.1 339.5" clip-path="url(#cvfd)" style="fill:url(#cvfp)"/>
+
+
+ <defs>
+ <rect id="cvfv" x="38.8" y="339.5" width="34.6" height="9.2"/>
+ </defs>
+ <clipPath id="cvfc">
+ <use width="100%" height="100%" xlink:href="#cvfv"/>
+ </clipPath>
+ <rect class="st13" x="38.8" y="339.5" width="34.6" height="9.2" clip-path="url(#cvfc)"/>
+
+ <linearGradient id="cvfo" x1="-2569" x2="-2530" y1="-102.7" y2="-102.7" gradientTransform="matrix(-1.521 1.021 3.14 -1.519 -3500 2791)" gradientUnits="userSpaceOnUse">
+ <stop style="stop-color:#58595B" offset=".107"/>
+ <stop offset="1"/>
+ </linearGradient>
+ <polygon class="st14" points="69.7 332.1 38.4 348.9 42.1 356.3 73.5 339.5" clip-path="url(#cvfc)" style="fill:url(#cvfo)"/>
+
+ <linearGradient id="cvfn" x1="29.84" x2="73.4" y1="295.5" y2="295.5" gradientUnits="userSpaceOnUse">
+ <stop style="stop-color:#A6A8AB" offset=".2373"/>
+ <stop style="stop-color:#404040" offset="1"/>
+ </linearGradient>
+ <polygon class="st15" points="73.4 302.6 73.4 311.8 29.8 288.5 29.8 279.3" style="fill:url(#cvfn)"/>
+
+ <linearGradient id="cvfm" x1="-287.9" x2="-244.3" y1="295.5" y2="295.5" gradientTransform="matrix(-1 0 0 1 -141.2 0)" gradientUnits="userSpaceOnUse">
+ <stop style="stop-color:#A6A8AB" offset=".2373"/>
+ <stop style="stop-color:#404040" offset="1"/>
+ </linearGradient>
+ <polygon class="st16" points="103.1 302.6 103.1 311.8 146.7 288.5 146.7 279.3" style="fill:url(#cvfm)"/>
+
+ <linearGradient id="cvfl" x1="-119.4" x2="-75.84" y1="1846" y2="1846" gradientTransform="rotate(180 13.64 1101)" gradientUnits="userSpaceOnUse">
+ <stop style="stop-color:#A6A8AB" offset=".2373"/>
+ <stop style="stop-color:#404040" offset="1"/>
+ </linearGradient>
+ <polygon class="st17" points="103.1 348.8 103.1 339.5 146.7 362.8 146.7 372.1" style="fill:url(#cvfl)"/>
+
+ <linearGradient id="cvfk" x1="-138.6" x2="-95.07" y1="1846" y2="1846" gradientTransform="matrix(1 0 0 -1 168.5 2202)" gradientUnits="userSpaceOnUse">
+ <stop style="stop-color:#A6A8AB" offset=".2373"/>
+ <stop style="stop-color:#404040" offset="1"/>
+ </linearGradient>
+ <polygon class="st18" points="73.4 348.8 73.4 339.5 29.8 362.8 29.8 372.1" style="fill:url(#cvfk)"/>
+ <polygon class="st19" points="103.1 330.3 103.1 330.3 103.1 330.3 103.1 330.3 128.7 344 128.7 334.7 120.4 330.3 146.7 330.3 146.7 321 120.4 321 128.7 316.6 128.7 307.4 103.1 321"/>
+ <polygon class="st19" points="47.8 344 73.4 330.3 73.4 330.3 73.4 330.3 73.4 330.3 73.4 321 73.4 321 73.4 321 47.8 307.4 47.8 316.6 56.2 321 29.8 321 29.8 330.3 56.1 330.3 47.8 334.7"/>
+</g>
+<path class="st20" d="m208.9 257.4h-50.18c-7.368 0-13.34 6-13.34 13.4v90.6h54.76c7.368 0 13.34-6 13.34-13.5v-90.6h-4.58zm107 104.4h-9.061v-90.5c0-3.7 1.494-7.1 3.883-9.5s5.775-3.9 9.459-3.9h54.67v90.5c0 11.8-9.459 13.7-18.62 13.7-1.494 0-3.385-0.1-5.178-0.2-1.095-0.1-2.191-0.1-3.485-0.1v-9c0.8962 0 2.29 0.1 3.784 0.1 1.394 0.1 2.888 0.1 4.779 0.1 4.68 0 9.559-0.6 9.559-4.6v-81.5h-46.2c-0.7966 0.8-1.294 1.9-1.294 3.1m-30.47-12.5h-47.6c-6.87 0-12.55 5.6-12.55 12.6v91.2h9.061v-41.2h43.02c6.87 0 12.55-5.7 12.55-12.6v-50zm-47.6 9.1h43.02v40.8 0.5 1l-0.0996 0.1v0.1l-0.0996 0.1v0.2l-0.1992 0.2-0.0996 0.2-0.1992 0.2-0.1991 0.1-0.1992 0.2h-0.0996l-0.1992 0.1-0.0996 0.1h-0.0996c-0.0996 0-0.1992 0.1-0.2987 0.1h-0.498-0.4979-43.02v-40.8-0.5-0.5l0.0996-0.2v-0.2l0.0996-0.1 0.0996-0.2v-0.1l0.8964-0.9h0.1992l0.0996-0.1h0.0996l0.0996-0.1h1.096c-0.1991-0.2 0-0.3 0.0996-0.3zm43.02 41.4m-0.0996 0.1m0 0.1m0 0.1m0 0.1m0 0.1m-0.0996 0m0 0.1m0 0.1m-0.0996 0.1m0 0.1m-0.0996 0.1m0 0.1m-0.0996 0.2m-0.0996 0.1m-0.0996 0.2m-0.0996 0.1m-0.5974 0.5m-0.0996 0.1m-0.1991 0.1m-0.0996 0.1m-0.2987 0.1m-0.4979 0.2m-0.1992 0m-0.0996 0.1m-43.51-41.3m0-0.1m0.0996-0.2m0-0.1m0.1992-0.5m0.0996-0.3m0.0996-0.1m0-0.1m0.0996-0.1m0.1992-0.3m0.0996 0m0.2987-0.3m0.0996-0.1m0.0996-0.1m0.1992-0.1m0.0996-0.1m0.0996 0m0-0.1m0.1992 0m0.0996-0.1m0.4979-0.2m0.0996 0m0.0996 0m0.0996 0m-80.95-0.2h45.6v81.5c0 0.4-0.0996 1.1-0.0996 1.1l-0.1991 0.5v0.2l-0.1992 0.3-0.0996 0.1-0.0996 0.2-0.3984 0.4v0.1l-0.498 0.5h-0.0996l-0.0996 0.1-0.1992 0.1-0.0996 0.1-0.2987 0.2h-0.2988l-0.4979 0.2c-0.3983 0.1-0.697 0.1-1.095 0.1h-45.7v-81.5c0-0.4 0.0996-1.1 0.0996-1.1l0.1991-0.5v-0.2l0.1992-0.3 0.0996-0.1 0.0996-0.2 0.3984-0.4v-0.1l0.498-0.5h0.0996l0.0996-0.1 0.1991-0.1 0.0996-0.1 0.2987-0.2h0.2988l0.4979-0.2c0.3983-0.1 0.7966-0.1 1.195-0.1zm45.31 83.1m0 0.1m-0.0996 0m-0.1991 0.4m0 0.1m-0.0996 0.2m-0.0996 0.1m-0.0996 0.1m0 0.1m-0.0996 0m-0.0996 0.2m-0.0996 0m-0.0996 0.2m-0.0996 0m-0.1992 0.2m-0.0996 0.1m-0.0996 0.1m-0.0996 0.1m-0.1992 0.1m-0.0996 0m-0.3983 0.2m-0.5974 0.3m-46.5-83m0.0996-0.1m0-0.1m0.1992-0.3m0-0.1m0.0996-0.2m0.0996-0.1m0.0996-0.1m0.0996-0.1m0.1991-0.2m0-0.1m0.1992-0.1m0-0.1m0.1991-0.1m0-0.1m0.0996 0m0.0996-0.1m0.0996-0.1m0.1992-0.1m0.0996 0m0.3983-0.3m0.697-0.2m431.5 22c1.394 0 2.788 0.4 4.082 1.1 1.294 0.7 2.39 1.7 3.087 3.1 0.697 1.3 1.095 2.7 1.095 4.2 0 1.4-0.3983 2.8-1.095 4.1-0.697 1.3-1.792 2.4-3.087 3.1-1.294 0.7-2.688 1.1-4.182 1.1-1.394 0-2.788-0.4-4.182-1.1-1.294-0.7-2.39-1.8-3.087-3.1-0.697-1.3-1.095-2.7-1.095-4.1s0.3983-2.8 1.095-4.2c0.697-1.3 1.792-2.4 3.087-3.1 1.494-0.7 2.888-1.1 4.282-1.1zm0 1.4c-1.195 0-2.29 0.3-3.385 0.9s-1.991 1.5-2.589 2.6c-0.5974 1.1-0.8962 2.3-0.8962 3.5s0.2987 2.4 0.8962 3.5c0.5974 1.1 1.494 2 2.589 2.6s2.29 0.9 3.485 0.9 2.39-0.3 3.485-0.9c1.095-0.6 1.991-1.5 2.589-2.6 0.5974-1.1 0.8962-2.3 0.8962-3.5s-0.2987-2.4-0.8962-3.5c-0.5974-1.1-1.494-2-2.589-2.6-1.294-0.6-2.39-0.9-3.585-0.9zm3.385 9.8c-0.3983-0.8-0.9957-1.4-1.294-1.7-0.1992-0.2-0.3983-0.4-0.7966-0.5 0.7966-0.1 1.394-0.3 1.892-0.8 0.4979-0.5 0.697-1.1 0.697-1.7 0-0.5-0.0996-0.9-0.3983-1.3-0.2987-0.4-0.697-0.7-1.095-0.9-0.4979-0.2-1.195-0.2-2.29-0.2h-3.087v9h1.394v-3.8h0.8962c0.4979 0 0.8962 0.2 1.095 0.4 0.3983 0.3 1.095 1.1 1.394 1.8 0.2987 0.5 0.4979 1.5 0.4979 1.5h1.792c-0.0996-0.1-0.2987-1.1-0.697-1.8zm-3.286-3.3h-1.792v-2.7h1.593c0.697 0 1.195 0.1 1.494 0.2s0.4979 0.3 0.5974 0.5c0.0996 0.2 0.1992 0.4 0.1992 0.7 0 0.4-0.1992 0.7-0.4979 1-0.1992 0.1-0.697 0.3-1.593 0.3z" style="stroke-width:.9979"/>
+<path class="st19" d="m418.7 324.3h-14.54v-3c0-2.5-0.0996-4.1-0.3983-4.8-0.2987-0.7-0.9957-1-2.091-1-0.8962 0-1.593 0.3-2.091 0.9-0.4979 0.6-0.697 1.5-0.697 2.8 0 1.7 0.0996 2.9 0.2987 3.7 0.1991 0.8 0.8962 1.6 2.091 2.6 1.095 0.9 3.485 2.3 7.07 4.1 4.779 2.3 7.866 4.6 9.36 6.6 1.494 2.1 2.191 5.1 2.191 9 0 4.4-0.5974 7.8-1.693 10-1.095 2.2-3.087 4-5.676 5.2-2.688 1.2-5.875 1.8-9.659 1.8-4.182 0-7.767-0.7-10.75-2s-4.979-3.1-6.173-5.3c-1.095-2.2-1.693-5.6-1.693-10.1v-2.6h14.64v3.4c0 2.9 0.1991 4.8 0.4979 5.7 0.3983 0.9 1.095 1.3 2.191 1.3 1.195 0 1.991-0.3 2.39-0.9 0.4979-0.6 0.697-1.8 0.697-3.7 0-2.6-0.2987-4.2-0.8962-4.9-0.5974-0.7-3.784-2.6-9.559-5.8-4.779-2.7-7.767-5.2-8.862-7.4s-1.593-4.9-1.593-7.9c0-4.3 0.5974-7.5 1.693-9.6 1.095-2.1 3.087-3.7 5.775-4.8 2.688-1.1 5.875-1.7 9.459-1.7s6.671 0.5 9.161 1.4 4.481 2.1 5.775 3.6 2.191 2.9 2.39 4.2c0.2987 1.3 0.3983 3.3 0.3983 6v3.2zm43.02 10.7h-21.41v11.8c0 2.5 0.1992 4 0.4979 4.8 0.3983 0.7 0.9957 1.1 2.091 1.1 1.294 0 2.091-0.5 2.489-1.4 0.3983-1 0.5974-2.8 0.5974-5.5v-6.8h15.63v3.7c0 3.4-0.1991 5.9-0.5974 7.7s-1.394 3.7-2.987 5.8c-1.494 2.1-3.485 3.6-5.875 4.6s-5.377 1.5-8.962 1.5c-3.485 0-6.572-0.5-9.26-1.5-2.688-1-4.68-2.4-6.174-4.1-1.494-1.8-2.489-3.7-3.087-5.8-0.5974-2.1-0.8962-5.2-0.8962-9.2v-15.8c0-4.7 0.5974-8.5 1.892-11.2s3.385-4.8 6.273-6.3 6.273-2.2 10.06-2.2c4.58 0 8.464 0.9 11.45 2.6 2.987 1.8 5.078 4.1 6.373 7 1.195 2.9 1.792 7 1.792 12.2v7zm-16.43-8.8v-4c0-2.8-0.1992-4.6-0.4979-5.4-0.2987-0.8-0.8962-1.2-1.892-1.2-1.195 0-1.892 0.4-2.191 1-0.2987 0.7-0.3983 2.6-0.3983 5.6v4zm38.43-19.3-0.2987 4.1c1.693-2 2.489-2.7 4.182-3.7s3.883-1.4 6.173-1.4c2.788 0 5.078 0.7 6.97 2 1.792 1.3 2.987 3 3.485 5.1 0.4979 2 0.7966 5.4 0.7966 10.2v38.1h-16.43v-37.6c0-3.7-0.0996-6-0.3983-6.8-0.1991-0.8-0.8962-1.2-2.091-1.2s-1.892 0.5-2.191 1.4c-0.2987 1-0.3983 3.5-0.3983 7.6v36.7h-16.43v-54.3h16.63zm60.54 17.4h-14.54v-3c0-2.5-0.0996-4.1-0.3983-4.8-0.2987-0.7-0.9957-1-2.091-1-0.8962 0-1.593 0.3-2.091 0.9s-0.697 1.5-0.697 2.8c0 1.7 0.0996 2.9 0.2987 3.7 0.1991 0.8 0.8962 1.6 2.091 2.6 1.095 0.9 3.485 2.3 7.07 4.1 4.779 2.3 7.866 4.6 9.36 6.6 1.494 2.1 2.191 5.1 2.191 9 0 4.4-0.5974 7.8-1.693 10s-3.087 4-5.676 5.2c-2.688 1.2-5.875 1.8-9.659 1.8-4.182 0-7.767-0.7-10.75-2-2.987-1.3-4.979-3.1-6.173-5.3-1.095-2.2-1.693-5.6-1.693-10.1v-2.6h14.64v3.4c0 2.9 0.1992 4.8 0.4979 5.7 0.3983 0.9 1.095 1.3 2.191 1.3 1.195 0 1.991-0.3 2.39-0.9 0.4979-0.6 0.697-1.8 0.697-3.7 0-2.6-0.2987-4.2-0.8962-4.9-0.5974-0.7-3.784-2.6-9.559-5.8-4.779-2.7-7.767-5.2-8.862-7.4-1.095-2.2-1.593-4.9-1.593-7.9 0-4.3 0.5974-7.5 1.693-9.6 1.095-2.1 3.087-3.7 5.775-4.8s5.875-1.7 9.459-1.7c3.585 0 6.671 0.5 9.161 1.4s4.481 2.1 5.775 3.6c1.294 1.5 2.191 2.9 2.39 4.2 0.2987 1.3 0.3983 3.3 0.3983 6v3.2zm42.92 10.7h-21.31v11.8c0 2.5 0.1991 4 0.4979 4.8 0.3983 0.7 0.9957 1.1 2.091 1.1 1.294 0 2.091-0.5 2.489-1.4 0.3983-1 0.5974-2.8 0.5974-5.5v-6.8h15.63v3.7c0 3.4-0.1992 5.9-0.5974 7.7s-1.394 3.7-2.987 5.8c-1.494 2.1-3.485 3.6-5.875 4.6s-5.377 1.5-8.962 1.5c-3.485 0-6.572-0.5-9.26-1.5s-4.68-2.4-6.173-4.1c-1.494-1.8-2.489-3.7-3.087-5.8s-0.8962-5.2-0.8962-9.2v-15.8c0-4.7 0.5974-8.5 1.892-11.2 1.294-2.7 3.385-4.8 6.273-6.3s6.273-2.2 10.06-2.2c4.58 0 8.464 0.9 11.45 2.6 2.987 1.8 5.078 4.1 6.373 7 1.195 2.9 1.792 7 1.792 12.2zm-16.43-8.8v-4c0-2.8-0.1992-4.6-0.4979-5.4-0.2987-0.8-0.8962-1.2-1.892-1.2-1.195 0-1.892 0.4-2.191 1-0.2987 0.7-0.3983 2.6-0.3983 5.6v4z" style="stroke-width:.9979"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="159.92409mm"
+ height="21.657249mm"
+ viewBox="0 0 159.92409 21.657249"
+ version="1.1"
+ id="svg1"
+ inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
+ sodipodi:docname="Logo of PowerDNS.svg"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <sodipodi:namedview
+ id="namedview1"
+ pagecolor="#ffffff"
+ bordercolor="#000000"
+ borderopacity="0.25"
+ inkscape:showpageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:pagecheckerboard="0"
+ inkscape:deskcolor="#d1d1d1"
+ inkscape:document-units="mm"
+ inkscape:zoom="0.7349537"
+ inkscape:cx="338.11654"
+ inkscape:cy="331.31339"
+ inkscape:window-width="1870"
+ inkscape:window-height="1011"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="layer1" />
+ <defs
+ id="defs1">
+ <clipPath
+ id="clip-0">
+ <path
+ clip-rule="nonzero"
+ d="m 429,71.113281 h 30 V 100 h -30 z m 0,0"
+ id="path72" />
+ </clipPath>
+ <clipPath
+ id="clip-1">
+ <path
+ clip-rule="nonzero"
+ d="m 429,104 h 30 v 28.50391 h -30 z m 0,0"
+ id="path73" />
+ </clipPath>
+ <clipPath
+ id="clip-2">
+ <path
+ clip-rule="nonzero"
+ d="m 462,71.113281 h 30 V 100 h -30 z m 0,0"
+ id="path74" />
+ </clipPath>
+ <clipPath
+ id="clip-3">
+ <path
+ clip-rule="nonzero"
+ d="m 462,104 h 30 v 28.50391 h -30 z m 0,0"
+ id="path75" />
+ </clipPath>
+ <clipPath
+ id="clip-4">
+ <path
+ clip-rule="nonzero"
+ d="m 495,71.113281 h 29.19531 V 100 H 495 Z m 0,0"
+ id="path76" />
+ </clipPath>
+ <clipPath
+ id="clip-5">
+ <path
+ clip-rule="nonzero"
+ d="m 495,104 h 29.19531 v 28.50391 H 495 Z m 0,0"
+ id="path77" />
+ </clipPath>
+ <clipPath
+ id="clip-6">
+ <path
+ clip-rule="nonzero"
+ d="M 70.867188,72 H 109 v 60 H 70.867188 Z m 0,0"
+ id="path78" />
+ </clipPath>
+ <clipPath
+ id="clip-7">
+ <path
+ clip-rule="nonzero"
+ d="m 112,71.113281 h 44 v 61.390629 h -44 z m 0,0"
+ id="path79" />
+ </clipPath>
+ <clipPath
+ id="clip-8">
+ <path
+ clip-rule="nonzero"
+ d="m 394,71.113281 h 32 v 61.390629 h -32 z m 0,0"
+ id="path80" />
+ </clipPath>
+ </defs>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-15.345417,-60.812495)">
+ <g
+ clip-path="url(#clip-0)"
+ id="g81"
+ transform="matrix(0.35277777,0,0,0.35277777,-9.654952,35.72531)">
+ <path
+ fill-rule="nonzero"
+ fill="#e96619"
+ fill-opacity="1"
+ d="m 458.08594,85.28125 c 0,7.824219 -6.34375,14.167969 -14.16797,14.167969 -7.82422,0 -14.16797,-6.34375 -14.16797,-14.167969 0,-7.824219 6.34375,-14.167969 14.16797,-14.167969 7.82422,0 14.16797,6.34375 14.16797,14.167969"
+ id="path81" />
+ </g>
+ <g
+ clip-path="url(#clip-1)"
+ id="g82"
+ transform="matrix(0.35277777,0,0,0.35277777,-9.654952,35.72531)">
+ <path
+ fill-rule="nonzero"
+ fill="#e96619"
+ fill-opacity="1"
+ d="m 458.08594,118.33594 c 0,7.82422 -6.34375,14.16797 -14.16797,14.16797 -7.82422,0 -14.16797,-6.34375 -14.16797,-14.16797 0,-7.82422 6.34375,-14.16406 14.16797,-14.16406 7.82422,0 14.16797,6.33984 14.16797,14.16406"
+ id="path82" />
+ </g>
+ <g
+ clip-path="url(#clip-2)"
+ id="g83"
+ transform="matrix(0.35277777,0,0,0.35277777,-9.654952,35.72531)">
+ <path
+ fill-rule="nonzero"
+ fill="#e96619"
+ fill-opacity="1"
+ d="m 491.13672,85.28125 c 0,7.824219 -6.33985,14.167969 -14.16406,14.167969 -7.82422,0 -14.16407,-6.34375 -14.16407,-14.167969 0,-7.824219 6.33985,-14.167969 14.16407,-14.167969 7.82421,0 14.16406,6.34375 14.16406,14.167969"
+ id="path83" />
+ </g>
+ <g
+ clip-path="url(#clip-3)"
+ id="g84"
+ transform="matrix(0.35277777,0,0,0.35277777,-9.654952,35.72531)">
+ <path
+ fill-rule="nonzero"
+ fill="#e96619"
+ fill-opacity="1"
+ d="m 491.13672,118.33594 c 0,7.82422 -6.33985,14.16797 -14.16406,14.16797 -7.82422,0 -14.16407,-6.34375 -14.16407,-14.16797 0,-7.82422 6.33985,-14.16406 14.16407,-14.16406 7.82421,0 14.16406,6.33984 14.16406,14.16406"
+ id="path84" />
+ </g>
+ <g
+ clip-path="url(#clip-4)"
+ id="g85"
+ transform="matrix(0.35277777,0,0,0.35277777,-9.654952,35.72531)">
+ <path
+ fill-rule="nonzero"
+ fill="#e96619"
+ fill-opacity="1"
+ d="m 524.19531,85.28125 c 0,7.824219 -6.34375,14.167969 -14.16406,14.167969 -7.82813,0 -14.17188,-6.34375 -14.17188,-14.167969 0,-7.824219 6.34375,-14.167969 14.17188,-14.167969 7.82031,0 14.16406,6.34375 14.16406,14.167969"
+ id="path85" />
+ </g>
+ <g
+ clip-path="url(#clip-5)"
+ id="g86"
+ transform="matrix(0.35277777,0,0,0.35277777,-9.654952,35.72531)">
+ <path
+ fill-rule="nonzero"
+ fill="#e96619"
+ fill-opacity="1"
+ d="m 524.19531,118.33594 c 0,7.82422 -6.34375,14.16797 -14.16406,14.16797 -7.82813,0 -14.17188,-6.34375 -14.17188,-14.16797 0,-7.82422 6.34375,-14.16406 14.17188,-14.16406 7.82031,0 14.16406,6.33984 14.16406,14.16406"
+ id="path86" />
+ </g>
+ <g
+ clip-path="url(#clip-6)"
+ id="g87"
+ transform="matrix(0.35277777,0,0,0.35277777,-9.654952,35.72531)">
+ <path
+ fill-rule="nonzero"
+ fill="#5a5758"
+ fill-opacity="1"
+ d="M 86.328125,131.42187 H 70.867188 V 72.199219 h 14.957031 c 7.457031,0 13.003906,1.574219 16.632811,4.730469 4.2461,3.699218 6.3711,8.847656 6.3711,15.441406 0,4.3125 -0.89454,8.058596 -2.6836,11.238286 -2.375,4.2539 -6.08984,6.88281 -11.14453,7.89843 -1.703125,0.34375 -3.785156,0.51953 -6.242188,0.51953 -0.476562,0 -1.285156,-0.0156 -2.429687,-0.043 v 19.43749 m 0,-32.714839 c 0.332031,0.03125 0.570313,0.04297 0.710937,0.04297 1.480469,0 2.78125,-0.417969 3.898438,-1.257812 1.507812,-1.097657 2.261719,-2.890626 2.261719,-5.378907 0,-2.140625 -0.589844,-3.875 -1.761719,-5.207031 -1.03125,-1.1875 -2.375,-1.777344 -4.019531,-1.777344 -0.28125,0 -0.644531,0.01172 -1.089844,0.04297 v 13.535156"
+ id="path87" />
+ </g>
+ <g
+ clip-path="url(#clip-7)"
+ id="g88"
+ transform="matrix(0.35277777,0,0,0.35277777,-9.654952,35.72531)">
+ <path
+ fill-rule="nonzero"
+ fill="#5a5758"
+ fill-opacity="1"
+ d="m 134.08594,71.113281 c 4.60937,0 8.67187,1.503907 12.1914,4.511719 6.25782,5.351562 9.38672,14.144531 9.38672,26.37891 0,9.57422 -2.17969,17.19531 -6.53906,22.86328 -1.84375,2.40234 -4.0625,4.28125 -6.66016,5.64062 -2.59765,1.33203 -5.33593,1.9961 -8.21093,1.9961 -4.21875,0 -8.15625,-1.3711 -11.81641,-4.1211 -6.84375,-5.17578 -10.26562,-14.1875 -10.26562,-27.02734 0,-9.750001 2.25,-17.312501 6.74609,-22.691408 4.1875,-5.035156 9.24609,-7.550781 15.16797,-7.550781 m 0,14.925781 c -1.59375,0 -2.89453,1.070313 -3.89844,3.210938 -1.33984,2.777344 -2.01172,6.957031 -2.01172,12.53906 0,6.12891 0.71094,10.51172 2.13672,13.14453 0.92187,1.73438 2.09766,2.60157 3.51953,2.60157 1.39844,0 2.61328,-0.91016 3.64844,-2.73047 1.42187,-2.48828 2.13672,-6.71094 2.13672,-12.67188 0,-10.730466 -1.84375,-16.093748 -5.53125,-16.093748"
+ id="path88" />
+ </g>
+ <path
+ fill-rule="nonzero"
+ fill="#5a5758"
+ fill-opacity="1"
+ d="M 63.972249,82.08802 H 58.7109 L 56.670024,69.44453 55.0591,82.08802 H 49.752274 L 45.259868,61.19559 h 5.379861 l 1.788693,12.64212 1.892049,-12.64212 h 4.68533 l 2.054652,12.79508 1.685343,-12.79508 h 5.321984 l -4.095531,20.89243"
+ id="path89"
+ style="stroke-width:0.352778" />
+ <path
+ fill-rule="nonzero"
+ fill="#5a5758"
+ fill-opacity="1"
+ d="M 69.491291,82.08802 V 61.19559 h 10.124447 v 4.91271 h -4.67155 v 3.04546 h 4.198884 v 4.72943 h -4.198884 v 3.18326 h 4.67155 v 5.02157 H 69.491291"
+ id="path90"
+ style="stroke-width:0.352778" />
+ <path
+ fill-rule="nonzero"
+ fill="#5a5758"
+ fill-opacity="1"
+ d="m 96.678607,82.08802 h -5.898003 l -2.99999,-8.58655 v 8.58655 H 82.326338 V 61.19559 h 5.586567 c 2.463934,0 4.302234,0.50023 5.513532,1.4993 0.740005,0.61185 1.310513,1.39734 1.715657,2.35783 0.403765,0.95911 0.604958,1.99402 0.604958,3.1061 0,2.53145 -1.03904,4.27605 -3.118499,5.23516 z M 87.780614,70.85288 c 0.14745,0.011 0.271473,0.0152 0.369316,0.0152 0.650434,0 1.168576,-0.24391 1.551668,-0.73449 0.424437,-0.53055 0.635279,-1.16307 0.635279,-1.89756 0,-1.16307 -0.457511,-1.89756 -1.373908,-2.20349 -0.275607,-0.0923 -0.669723,-0.13918 -1.182355,-0.13918 v 4.95956"
+ id="path91"
+ style="stroke-width:0.352778" />
+ <path
+ fill-rule="nonzero"
+ fill="#5a5758"
+ fill-opacity="1"
+ d="M 98.107632,82.08802 V 61.19559 h 4.714268 c 2.9366,0 5.18831,0.91777 6.75514,2.7547 1.65641,1.9389 2.48323,4.5048 2.48323,7.6991 0,3.46852 -0.83234,6.14742 -2.49701,8.03534 -0.90675,1.01975 -2.03123,1.71428 -3.37068,2.08083 -0.79788,0.21498 -1.79282,0.32246 -2.98621,0.32246 z m 5.454278,-5.05188 c 1.9513,-0.0909 2.92695,-1.83141 2.92695,-5.21863 0,-2.27514 -0.46302,-3.89709 -1.39044,-4.86723 -0.33486,-0.34727 -0.84749,-0.52504 -1.53651,-0.53606 v 10.62192"
+ id="path92"
+ style="stroke-width:0.352778" />
+ <path
+ fill-rule="nonzero"
+ fill="#5a5758"
+ fill-opacity="1"
+ d="M 113.82278,82.08802 V 61.19559 h 5.20347 l 3.79787,10.91268 V 61.19559 h 5.20348 v 20.89243 h -5.20348 l -3.79787,-10.98985 v 10.98985 h -5.20347"
+ id="path93"
+ style="stroke-width:0.352778" />
+ <g
+ clip-path="url(#clip-8)"
+ id="g94"
+ transform="matrix(0.35277777,0,0,0.35277777,-9.654952,35.72531)">
+ <path
+ fill-rule="nonzero"
+ fill="#5a5758"
+ fill-opacity="1"
+ d="M 395.15625,129.94531 V 111.375 c 3.04297,4.3125 6.32422,6.46484 9.84375,6.46484 1.34375,0 2.46094,-0.39062 3.35156,-1.17187 0.78516,-0.69141 1.17578,-1.58984 1.17578,-2.6875 0,-1.35938 -0.6289,-2.64844 -1.88672,-3.86328 -0.27734,-0.26172 -1.39843,-1.1836 -3.35156,-2.77735 -2.40234,-1.9375 -4.25781,-3.75781 -5.57422,-5.46484 -2.51172,-3.296875 -3.76953,-7.074219 -3.76953,-11.324219 0,-3.730469 0.94922,-7.289062 2.84766,-10.671875 3.29687,-5.84375 8.14453,-8.765625 14.53906,-8.765625 3.66016,0 7.36328,1.011719 11.10547,3.039063 v 18.132812 c -0.94922,-1.558594 -2.02734,-2.863281 -3.22656,-3.902344 -2.01172,-1.765624 -3.95313,-2.648437 -5.82422,-2.648437 -1.45313,0 -2.58203,0.535156 -3.39453,1.605469 -0.47266,0.609375 -0.71094,1.257812 -0.71094,1.953125 0,1.214843 0.71094,2.5 2.13672,3.863281 0.30859,0.316406 1.46484,1.226562 3.47656,2.730469 2.03906,1.503906 3.80078,3.152343 5.28125,4.949221 2.57031,3.03515 3.85547,6.88281 3.85547,11.53906 0,5.89844 -1.73438,10.73047 -5.19922,14.48828 -3.46094,3.76172 -7.79297,5.64063 -12.98828,5.64063 -3.82813,0 -7.72266,-0.85157 -11.6875,-2.5586"
+ id="path94" />
+ </g>
+ </g>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>\r
+<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="0 0 128 128" height="128" width="128">\r
+ <g style="display:inline;opacity:1">\r
+ <g style="fill:#800000;fill-opacity:1;stroke:#ffffff;stroke-width:1.62100744;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" transform="matrix(0.6778654,0,0,0.56141828,-241.07537,-247.27712)"/>\r
+ <g transform="matrix(-0.6945203,0,0,0.56109687,375.02964,-247.42947)" style="fill:#800000;fill-opacity:1;stroke:#ffffff;stroke-width:1.60191178000000001;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline;stroke-linejoin:round">\r
+ <path d="m 447.83376,669.09921 c -80.63119,-57.03115 -80.63119,-57.03115 -80.63119,-199.60903 34.55623,0 46.07497,0 80.63119,-28.51558 m 0,228.12461 c 80.6312,-57.03115 80.6312,-57.03115 80.6312,-199.60903 -34.55623,0 -46.07497,0 -80.6312,-28.51558" style="fill:#800000;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.60191178;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/>\r
+ </g>\r
+ </g>\r
+ <g transform="translate(-17.872548,-17.32535)" style="display:inline">\r
+ <ellipse transform="matrix(1.3333335,0,0,1.3333334,-42.290862,-31.108461)" ry="12" rx="11.999999" cy="81.325356" cx="102.12254" style="fill:none;stroke:#ffffff;stroke-width:5.99999952;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline;"/>\r
+ <g style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1.99999996999999996;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" transform="scale(1.0018026,0.99820067)">\r
+ <path d="m 81.72523,81.471945 c 0,11.019828 -4.991003,16.028841 -15.97121,16.028841 -10.980207,0 -15.97121,-5.009013 -15.97121,-16.028841 l 0,-24.043262 7.985605,0 0,24.043262 c 0,7.012618 0.9982,8.014421 7.985605,8.014421 6.987404,0 7.985605,-1.001803 7.985605,-8.014421 l 0,-24.043262 7.985605,0 z" style="fill:#ffffff;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;"/>\r
+ </g>\r
+ </g>\r
+</svg>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="669px" height="153px" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;"><g><g><path d="M87.5,6.548l0,86.4l-29.5,17c-0.597,0.299 -1.303,0.299 -1.9,0l-29.5,-17l0,-86.4l-20.9,12.1c-3.528,2.042 -5.706,5.824 -5.7,9.9l0,86.4c0.021,4.07 2.191,7.839 5.7,9.9l45.7,26.4c3.533,1.998 7.867,1.998 11.4,0l45.7,-26.4c3.528,-2.042 5.706,-5.824 5.7,-9.9l0,-86.4c-0.021,-4.07 -2.191,-7.839 -5.7,-9.9l-21,-12.1Z" style="fill:#2d2e83;fill-rule:nonzero;"/><path d="M87.5,6.548l0,86.4l-29.5,17c-0.597,0.299 -1.303,0.299 -1.9,0l-29.5,-17l0,-86.4l-20.9,12.1c-3.528,2.042 -5.706,5.824 -5.7,9.9l0,86.4c0.021,4.07 2.191,7.839 5.7,9.9l45.7,26.4c3.533,1.998 7.867,1.998 11.4,0l45.7,-26.4c3.528,-2.042 5.706,-5.824 5.7,-9.9l0,-86.4c-0.021,-4.07 -2.191,-7.839 -5.7,-9.9l-21,-12.1Z" style="fill:url(#_Linear1);fill-rule:nonzero;"/><path d="M114.2,28.548c-0.021,-4.07 -2.191,-7.839 -5.7,-9.9l-30.4,-17.6c-2.337,-1.398 -5.263,-1.398 -7.6,0c-2.354,1.359 -3.807,3.882 -3.8,6.6l0,66.6c0.021,4.07 2.191,7.839 5.7,9.9l36.1,20.9c3.528,2.042 5.706,5.824 5.7,9.9l0,-86.4Z" style="fill:#1fc2d7;fill-rule:nonzero;"/><path d="M0,28.548c0.021,-4.07 2.191,-7.839 5.7,-9.9l30.5,-17.6c2.337,-1.398 5.263,-1.398 7.6,0c2.354,1.359 3.807,3.882 3.8,6.6l0,66.6c-0.021,4.07 -2.191,7.839 -5.7,9.9l-36.1,20.9c-3.528,2.042 -5.706,5.824 -5.7,9.9l-0.1,-86.4Z" style="fill:#1fc2d7;fill-rule:nonzero;"/></g><g><path d="M221.9,44.348l0,64l-11.5,0l-0.6,-5c-7.6,3.9 -15.6,6.5 -22.6,6.5c-10.8,0 -18.7,-6.1 -18.6,-21.3l0,-44.2l12.8,0l0,42.4c0,9.1 3.4,11.8 9.3,11.8c4.8,0 11.5,-2 18.4,-5.5l0,-48.7l12.8,0Z" style="fill:#0d0d27;fill-rule:nonzero;"/><path d="M296.9,64.148l0,44.2l-12.8,0l0,-42.4c0,-9.1 -3.5,-11.8 -9.8,-11.8c-5.5,0 -12.9,2 -20.9,5.7l0,48.6l-12.8,0l0,-64l11.5,0l0.6,5.1c8.7,-4.1 17.5,-6.6 24.8,-6.6c11.4,0 19.4,6 19.4,21.2Z" style="fill:#0d0d27;fill-rule:nonzero;"/><path d="M349.7,42.948c19.3,0 24.5,12.8 24.6,33.6c0.1,20.8 -5.2,33.4 -24.5,33.4c-7.1,0 -12.8,-1.7 -21.9,-6.8l-0.6,5.4l-11.5,0l0,-90.6l12.8,0l0,31.6c8.5,-4.9 14.1,-6.6 21.1,-6.6Zm-3.5,55.7c11.8,0 14.9,-6.3 15,-22.2c0.1,-15.9 -3.1,-22.2 -14.9,-22.2c-5,0 -9.1,1.1 -17.7,5.9l0,32.7c8.6,4.7 12.7,5.8 17.6,5.8Z" style="fill:#0d0d27;fill-rule:nonzero;"/><path d="M448.6,76.348c0,21.3 -7.2,33.5 -29.8,33.5c-22.6,0 -29.8,-12.2 -29.8,-33.5c0,-21.3 7.2,-33.5 29.8,-33.5c22.6,0 29.8,12.3 29.8,33.5Zm-46.4,0c0,16 3.8,22.2 16.6,22.2c12.8,0 16.6,-6.2 16.6,-22.2c0,-16 -3.8,-22.2 -16.6,-22.2c-12.8,0 -16.6,6.2 -16.6,22.2Z" style="fill:#0d0d27;fill-rule:nonzero;"/><path d="M518.2,44.348l0,64l-11.5,0l-0.6,-5c-7.6,3.9 -15.6,6.5 -22.6,6.5c-10.8,0 -18.7,-6.1 -18.6,-21.3l0,-44.2l12.8,0l0,42.4c0,9.1 3.4,11.8 9.3,11.8c4.8,0 11.5,-2 18.4,-5.5l0,-48.7l12.8,0Z" style="fill:#0d0d27;fill-rule:nonzero;"/><path d="M593.2,64.148l0,44.2l-12.8,0l0,-42.4c0,-9.1 -3.5,-11.8 -9.8,-11.8c-5.5,0 -12.9,2 -20.9,5.7l0,48.6l-12.8,0l0,-64l11.5,0l0.6,5.1c8.7,-4.1 17.5,-6.6 24.8,-6.6c11.4,0 19.4,6 19.4,21.2Z" style="fill:#0d0d27;fill-rule:nonzero;"/><path d="M656.9,108.448l-0.6,-5.4c-9,5 -14.6,6.8 -21.9,6.8c-19.3,0 -24.5,-12.7 -24.5,-33.4c0,-20.7 5.2,-33.6 24.5,-33.6c7.1,0 12.6,1.7 21.2,6.5l0,-31.6l12.8,0l0,90.6l-11.5,0.1Zm-33.9,-32.1c0,15.9 3.2,22.2 15,22.2c5,0 9,-1.1 17.6,-5.9l0,-32.7c-8.8,-4.8 -12.8,-5.9 -17.6,-5.9c-11.8,0.1 -15,6.4 -15,22.3Z" style="fill:#0d0d27;fill-rule:nonzero;"/></g></g><defs><linearGradient id="_Linear1" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(114.2,0,0,114.2,1.23648e-05,79.6485)"><stop offset="0" style="stop-color:#0d0d27;stop-opacity:1"/><stop offset="0.02" style="stop-color:#10102f;stop-opacity:1"/><stop offset="0.1" style="stop-color:#1a1b4d;stop-opacity:1"/><stop offset="0.19" style="stop-color:#232365;stop-opacity:1"/><stop offset="0.28" style="stop-color:#282976;stop-opacity:1"/><stop offset="0.38" style="stop-color:#2c2d80;stop-opacity:1"/><stop offset="0.5" style="stop-color:#2d2e83;stop-opacity:1"/><stop offset="0.62" style="stop-color:#2c2d80;stop-opacity:1"/><stop offset="0.72" style="stop-color:#282976;stop-opacity:1"/><stop offset="0.81" style="stop-color:#232365;stop-opacity:1"/><stop offset="0.9" style="stop-color:#1a1b4d;stop-opacity:1"/><stop offset="0.98" style="stop-color:#10102f;stop-opacity:1"/><stop offset="1" style="stop-color:#0d0d27;stop-opacity:1"/></linearGradient></defs></svg>
\ No newline at end of file
{# DBL #}
{% if request.path.startswith("/dbl") %}
+ <a class="navbar-item is-tab
+ {% if request.path.startswith("/dbl/how-to-use") %}is-active{% end %}"
+ href="/dbl/how-to-use">
+ {{ _("How To Use?") }}
+ </a>
+
<a class="navbar-item is-tab
{% if request.path.startswith("/dbl/lists") %}is-active{% end %}"
href="/dbl/lists">
--- /dev/null
+{% extends "../base.html" %}
+
+{% block head %}
+ {% module OpenGraph(
+ title=_("IPFire DBL - How To Use?"),
+ ) %}
+{% end block %}
+
+{% block title %}{{ _("IPFire DBL - How To Use?") }}{% end block %}
+
+{% block container %}
+ {% import urllib.parse %}
+
+ <section class="hero is-large">
+ <div class="hero-body">
+ <div class="container">
+ <h1 class="title is-1">
+ How To Use IPFire DBL
+ </h1>
+
+ <p class="subtitle">
+ IPFire DBL works with virtually any network security tool or DNS resolver.
+ Choose the integration method that fits your infrastructure and start
+ blocking malicious domains in minutes.
+ </p>
+ </div>
+ </div>
+ </section>
+
+ {# RPZ #}
+ <section class="section" id="rpz">
+ <div class="container">
+ <h3 class="title is-3">
+ {{ _("DNS Request Policy Zone (RPZ)") }}
+ </h3>
+
+ <div class="level">
+ <div class="level-left">
+ <div class="level-item">
+ <strong>
+ {{ _("Compatible with:") }}
+ </strong>
+ </div>
+
+ <div class="level-item">
+ <a href="https://www.isc.org/bind/" rel="noopener">
+ {{ _("BIND") }}
+ </a>
+ </div>
+
+ <div class="level-item">
+ <a href="https://www.knot-resolver.cz" rel="noopener">
+ {{ _("Knot Resolver") }}
+ </a>
+ </div>
+
+ <div class="level-item">
+ <a href="https://pi-hole.net" rel="noopener">
+ {{ _("Pi-Hole") }}
+ </a>
+ </div>
+
+ <div class="level-item">
+ <a href="https://www.powerdns.com" rel="noopener">
+ {{ _("PowerDNS Recursor") }}
+ </a>
+ </div>
+
+ <div class="level-item">
+ <a href="https://nlnetlabs.nl/projects/unbound/about/" rel="noopener">
+ {{ _("Unbound") }}
+ </a>
+ </div>
+ </div>
+ </div>
+
+ <div class="content">
+ <p>
+ The IPFire DBL is published as a Response Policy Zone (RPZ) and
+ can be consumed by many popular recursive DNS resolvers.
+ </p>
+
+ <p>
+ Resolvers fetch the list via AXFR/IXFR, store it locally, and only
+ transfer updates when the zone changes — keeping bandwidth usage
+ low and resolution fast.
+ The primary to fetch the zones from is hosted at
+ <code>primary.dbl.ipfire.org</code> and TLS is available.
+ </p>
+
+ <p>
+ If your DNS software does not allow to fetch the lists using
+ AXFR/IXFR, a HTTPS download is also available as a fallback.
+ </p>
+ </div>
+
+ <details>
+ <summary class="button is-small">
+ {{ _("Configuration Examples") }}
+ </summary>
+
+ <div class="content my-5">
+ <h6>PowerDNS Recursor</h6>
+
+ <pre>
+recursor:
+ rpzs:
+ - name: <strong>NAME</strong>.rpz.ipfire.org
+ addresses:
+ - 'primary.dbl.ipfire.org'</pre>
+
+ <h6>Unbound</h6>
+
+ <pre>
+server:
+ module-config: "respip validator iterator"
+
+rpz:
+ name: <strong>NAME</strong>.rpz.ipfire.org
+ primary: primary.dbl.ipfire.org
+ zonefile: /var/cache/unbound/NAME.rpz.ipfire.org.zone</pre>
+
+ <p>
+ Ensure to replace <strong>NAME</strong> with the list you want to block:
+ </p>
+
+ <table>
+ <thead>
+ <tr>
+ <th>
+ {{ _("List") }}
+ </th>
+
+ <th>
+ {{ _("Zone") }}
+ </th>
+
+ <th>
+ {{ _("Download") }}
+ </th>
+ </tr>
+ </thead>
+
+ <tbody>
+ {% for list in lists %}
+ <tr>
+ <th scope="row">
+ {{ list.name }}
+ </th>
+
+ <td>
+ {{ "%s.rpz.ipfire.org" % list.slug }}
+ </td>
+
+ <td>
+ <a href="https://dbl.ipfire.org/lists/{{ list.slug }}/rpz.zone">
+ {{ _("Download") }}
+ </a>
+ </td>
+ </tr>
+ {% end %}
+ </tbody>
+ </table>
+ </div>
+ </details>
+ </div>
+ </section>
+
+ {# DBL #}
+ <section class="section" id="dbl">
+ <div class="container">
+ <h3 class="title is-3">
+ {{ _("Query the list using DNS") }}
+ </h3>
+
+ <div class="content">
+ <p>
+ IPFire DBL lists are also available as a regular blocklist in DNS.
+ That way, you can quickly check if a domain is listed in a specific
+ category without fetching the entire list.
+ </p>
+
+ <pre>
+# dig +short A example.tld.<strong>NAME</strong>.dbl.ipfire.org
+127.0.0.2</pre>
+
+ <p>
+ The response will be <code>127.0.0.2</code> for any listed domains,
+ and <code>NXDOMAIN</code> otherwise.
+ Use DNSSEC to ensure the authenticity of the data.
+ </p>
+ </div>
+
+ <details>
+ <summary class="button is-small">
+ {{ _("Zones") }}
+ </summary>
+
+ <div class="content my-5">
+ <table>
+ <thead>
+ <tr>
+ <th>
+ {{ _("List") }}
+ </th>
+
+ <th>
+ {{ _("Zone") }}
+ </th>
+ </tr>
+ </thead>
+
+ <tbody>
+ {% for list in lists %}
+ <tr>
+ <th scope="row">
+ {{ list.name }}
+ </th>
+
+ <td>
+ {{ "%s.dbl.ipfire.org" % list.slug }}
+ </td>
+ </tr>
+ {% end %}
+ </tbody>
+ </table>
+ </div>
+ </details>
+ </div>
+ </section>
+
+ {# Plaintext #}
+ <section class="section" id="plaintext">
+ <div class="container">
+ <h3 class="title is-3">
+ {{ _("Plaintext Formats") }}
+ </h3>
+
+ <div class="content">
+ <p>
+ All IPFire DBL lists are also available as downloadable domain and hosts files.
+ </p>
+
+ <p>
+ These formats are intended for setups where the lists are consumed directly,
+ for example by firewalls, filtering proxies, custom scripts, or systems using
+ hosts-file based blocking. The files can be fetched periodically and applied locally.
+ </p>
+ </div>
+
+ <div class="level">
+ <div class="level-left">
+ <div class="level-item">
+ <div class="dropdown">
+ <div class="dropdown-trigger">
+ <button class="button is-primary is-small" aria-haspopup="true" aria-controls="dropdown-menu">
+ <span>
+ {{ _("Domains") }}
+ </span>
+
+ <span class="icon is-small">
+ <i class="fas fa-angle-down" aria-hidden="true"></i>
+ </span>
+ </button>
+ </div>
+
+ <div class="dropdown-menu" id="dropdown-menu" role="menu">
+ <div class="dropdown-content">
+ {% for list in lists %}
+ <a href="https://dbl.ipfire.org/lists/{{ list.slug }}/domains.txt" class="dropdown-item">
+ {{ list.name }}
+ </a>
+ {% end %}
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <div class="level-item">
+ <div class="dropdown">
+ <div class="dropdown-trigger">
+ <button class="button is-primary is-small" aria-haspopup="true" aria-controls="dropdown-menu">
+ <span>
+ {{ _("Hosts") }}
+ </span>
+
+ <span class="icon is-small">
+ <i class="fas fa-angle-down" aria-hidden="true"></i>
+ </span>
+ </button>
+ </div>
+
+ <div class="dropdown-menu" id="dropdown-menu" role="menu">
+ <div class="dropdown-content">
+ {% for list in lists %}
+ <a href="https://dbl.ipfire.org/lists/{{ list.slug }}/hosts.txt" class="dropdown-item">
+ {{ list.name }}
+ </a>
+ {% end %}
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </section>
+
+ {# Suricata #}
+ <section class="section" id="suricata">
+ <div class="container">
+ <h3 class="title is-3">
+ {{ _("Suricata") }}
+ </h3>
+
+ <div class="content">
+ <p>
+ IPFire DBL lists are available as a ruleset for Suricata
+ which can filter:
+ </p>
+
+ <ul>
+ <li>
+ DNS Queries
+ </li>
+
+ <li>
+ TLS and QUIC connections using SNI
+ </li>
+
+ <li>
+ HTTP Requests
+ </li>
+ </ul>
+
+ <a class="button is-primary is-small" href="https://dbl.ipfire.org/lists/suricata.tar.gz">
+ <span class="icon">
+ <i class="fas fa-download"></i>
+ </span>
+
+ <span>
+ {{ _("Download Suricata Ruleset") }}
+ </span>
+ </a>
+ </div>
+ </div>
+ </section>
+
+ {# Browser Extensions #}
+ <section class="section" id="browser-extensions">
+ <div class="container">
+ <h3 class="title is-3">
+ {{ _("Browser Extensions") }}
+ </h3>
+
+ <div class="level">
+ <div class="level-left">
+ <div class="level-item">
+ <strong>
+ {{ _("Compatible with:") }}
+ </strong>
+ </div>
+
+ <div class="level-item">
+ <a href="https://adblockplus.org" rel="noopener">
+ {{ _("Adblock Plus") }}
+ </a>
+ </div>
+
+ <div class="level-item">
+ <a href="https://adguard.com/en/welcome.html" rel="noopener">
+ {{ _("AdGuard") }}
+ </a>
+ </div>
+
+ <div class="level-item">
+ <a href="https://ublockorigin.com" rel="noopener">
+ {{ _("uBlock Origin") }}
+ </a>
+ </div>
+ </div>
+ </div>
+
+ <div class="content">
+ <p>
+ Click below to automatically subscribe to our blocklist in compatible clients:
+ </p>
+
+ <div class="dropdown">
+ <div class="dropdown-trigger">
+ <button class="button is-primary is-small" aria-haspopup="true" aria-controls="dropdown-menu">
+ <span>
+ {{ _("Subscribe to...") }}
+ </span>
+
+ <span class="icon is-small">
+ <i class="fas fa-angle-down" aria-hidden="true"></i>
+ </span>
+ </button>
+ </div>
+
+ <div class="dropdown-menu" id="dropdown-menu" role="menu">
+ <div class="dropdown-content">
+ {% for list in lists %}
+ {# Compose the subscription URL #}
+ {% set url = "https://subscribe.adblockplus.org/?%s" % \
+ urllib.parse.urlencode({
+ "location" : list.url("abp.txt"),
+ "title" : "IPFire DBL - %s" % list,
+ })
+ %}
+
+ <a href="{{ url }}" class="dropdown-item">
+ {{ list.name }}
+ </a>
+ {% end %}
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </section>
+
+ {# IPFire #}
+ <section class="section" id="ipfire">
+ <div class="container">
+ <h3 class="title is-3">
+ {% module IPFireLogo() %}
+ </h3>
+
+ <div class="content">
+ <p>
+ IPFire DBL is natively integrated into IPFire in the following features:
+ </p>
+
+ <ul>
+ <li>
+ <a href="/docs/configuration/network/proxy/url-filter">
+ {{ _("URL Filter")}}
+ </a>
+ </li>
+
+ <li>
+ <a href="/docs/configuration/firewall/ips">
+ {{ _("Intrusion Prevention System") }}
+ </a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </section>
+{% end block %}
{% block title %}{{ _("Welcome to IPFire DBL") }}{% end block %}
{% block container %}
- <section class="hero is-medium is-primary">
+ {% set total_domains = sum(list.total_domains for list in lists) %}
+
+ <section class="hero is-fullheight-with-navbar is-primary">
<div class="hero-body">
<div class="container">
<h1 class="title">{{ _("IPFire Domain Blocklist") }}</h1>
- <h6 class="subtitle mb-6">
- {{ _("Early threat mitigation, enforced over DNS") }}
+ <h6 class="subtitle">
+ {{ _("Network Security Through Intelligent Domain Control") }}
</h6>
- <div class="columns is-multiline my-6">
+ <div class="content">
+ <p class="is-size-5">
+ IPFire DBL is a comprehensive, community-maintained domain
+ blocklist that protects your network from malware, phishing,
+ unwanted content, and emerging threats.
+ With millions of categorized domains across multiple
+ threat categories, IPFire DBL integrates seamlessly into DNS
+ servers, firewalls, IPS systems, and browser extensions.
+ </p>
+
+ <p class="is-size-5">
+ Built on open standards, actively maintained, and free for
+ everyone — IPFire DBL stops threats before they reach your
+ network, whether you are securing a home network, enterprise
+ infrastructure, or managed services for clients.
+ </p>
+
+ <div class="buttons">
+ <a class="button" href="#lists">
+ {{ _("View Available Lists") }}
+ </a>
+
+ <a class="button" href="/dbl/how-to-use">
+ {{ _("How To Use?") }}
+ </a>
+ </div>
+
+ <p class="tag is-success">
+ <span class="icon-text">
+ <span class="icon">
+ <i class="fas fa-fire"></i>
+ </span>
+
+ <span>
+ <a href="https://www.ipfire.org/blog/ipfire-2-29-core-update-200-is-available-for-testing">
+ Beta Available in IPFire 2.29 - Core Update 200
+ </a>
+ </span>
+ </span>
+ </p>
+ </div>
+ </div>
+ </div>
+
+ <div class="hero-foot p-5">
+ <div class="container">
+ <div class="level">
+ <div class="level-item has-text-centered">
+ <div>
+ <p class="title">
+ {{ format_number(len(lists)) }}
+ </p>
+
+ <p class="heading">
+ {{ _("Lists") }}
+ </p>
+ </div>
+ </div>
+
+ <div class="level-item has-text-centered">
+ <div>
+ <p class="title">
+ {{ format_number(total_domains) }}
+ </p>
+
+ <p class="heading">
+ {{ _("Domains") }}
+ </p>
+ </div>
+ </div>
+
+ <div class="level-item has-text-centered">
+ <div>
+ <p class="title">
+ {{ format_percent(1) }}
+ </p>
+
+ <p class="heading">
+ {{ _("Free") }}
+ </p>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </section>
+
+ <section class="hero is-fullheight" id="lists">
+ <div class="hero-body">
+ <div class="container">
+ <h3 class="title is-3">
+ <span class="icon">
+ <i class="fa-solid fa-shield-halved"></i>
+ </span>
+
+ {{ _("What Gets Blocked?") }}
+ </h3>
+
+ <h5 class="subtitle is-5">
+ IPFire DBL categorizes and blocks domains across different threat categories.
+ Choose which categories to block based on your security and content policies.
+ </h5>
+
+ <div class="columns is-multiline my-5">
+ {% for list in lists %}
+ <div class="column is-one-third">
+ <div class="columns my-1">
+ <div class="column">
+ <h4 class="title is-4">
+ <a href="/dbl/lists/{{ list.slug }}">
+ {{ list.name }}
+ </a>
+ </h4>
+ </div>
+
+ <div class="column is-narrow">
+ <span class="tag">
+ {{ _("One Domain", "%(num)s Domains", list.total_domains) \
+ % { "num" : format_number(list.total_domains) } }}
+ </span>
+ </div>
+ </div>
+ </div>
+ {% end %}
+ </div>
+ </div>
+ </div>
+ </section>
+
+ <section class="hero is-dark is-fullheight">
+ <div class="hero-body">
+ <div class="container">
+ <h3 class="title is-3">
+ The IPFire DBL Vision
+ </h3>
+
+ <div class="content">
+ <p>
+ The IPFire team has spent years protecting networks at the edge —
+ we understand threats, filtering, and what it takes to keep systems
+ secure.
+ Combined with our community's expertise, we are building a blocklist
+ that is not just comprehensive, but extremely accurate through
+ continuous refinement and real-world feedback.
+ </p>
+
+ <p>
+ What sets DBL apart is how we deliver it.
+ Beyond traditional filtering methods, we have implemented DNS
+ Response Policy Zones (RPZ) with IXFR for lightning-fast incremental
+ updates — your resolver only downloads what has changed.
+ We provide Suricata rulesets for deep packet inspection across
+ DNS, TLS, HTTP, and QUIC — catching threats that bypass simple
+ domain matching.
+ And we support standard formats like domain lists and hosts files
+ for maximum compatibility.
+ </p>
+
+ <p>
+ This is our contribution to the open-source security community:
+ a blocklist built by firewall experts, maintained by practitioners,
+ and engineered for the real world.
+ Transparent, collaborative, and designed to evolve with every
+ threat we face together.
+ </p>
+ </div>
+
+ <div class="columns is-multiline py-6">
<div class="column is-half">
<div class="columns is-mobile is-vcentered">
<div class="column is-3 has-text-centered">
- <i class="fa-solid fa-magnifying-glass fa-5x"></i>
+ <i class="fa-solid fa-layer-group fa-5x"></i>
</div>
<div class="column">
- <p class="title is-5">{{ _("Accuracy First, Always") }}</p>
+ <p class="title is-5">
+ {{ _("Category-Based Filtering") }}
+ </p>
<div class="content">
<p>
- We prioritise high-confidence, well-verified data over raw volume.
- Every listed domain must meet clear criteria, be reviewed continuously,
- and be removed quickly when it no longer poses a threat.
- The goal is trustworthy blocking with minimal false positives, suitable
- for production networks.
+ Block entire categories of domains including malware,
+ phishing, adult content, social media, gambling, and more.
+ Exercise granular control over what content reaches
+ your network.
</p>
</div>
</div>
<div class="column is-half">
<div class="columns is-mobile is-vcentered">
<div class="column is-3 has-text-centered">
- <i class="fa-solid fa-shield-heart fa-5x"></i>
+ <i class="fa-solid fa-magnifying-glass fa-5x"></i>
</div>
<div class="column">
- <p class="title is-5">{{ _("Privacy-Respecting Operation") }}</p>
+ <p class="title is-5">
+ {{ _("Deep Packet Inspection") }}
+ </p>
<div class="content">
<p>
- The service is operated without tracking users or collecting
- resolver telemetry. DNS security should improve safety without
- introducing new privacy risks.
+ Integrates with Suricata IDS/IPS to analyze DNS,
+ TLS, HTTP, and QUIC traffic.
+ Blocks malicious domains at multiple network layers
+ for comprehensive protection.
</p>
</div>
</div>
<div class="column is-half">
<div class="columns is-mobile is-vcentered">
<div class="column is-3 has-text-centered">
- <i class="fa-solid fa-earth-europe fa-5x"></i>
+ <i class="fab fa-osi fa-5x"></i>
</div>
<div class="column">
- <p class="title is-5">{{ _("Built on DNS Standards and Best Practices") }}</p>
+ <p class="title is-5">
+ {{ _("Open & Community-Driven") }}
+ </p>
<div class="content">
<p>
- These blocklists are developed with a deep understanding of DNS
- infrastructure. They integrate naturally with technologies like
- Response Policy Zones (RPZ), follow established standards, and
- are operated with stability and long-term reliability in mind
- — even at scale.
+ Built and maintained by the IPFire community with
+ full transparency and a commitment to long-term
+ sustainability.
+ Continuously updated with emerging threats, completely
+ open-source, and welcoming community contributions
+ — you are in control of your security.
</p>
</div>
</div>
<div class="column is-half">
<div class="columns is-mobile is-vcentered">
<div class="column is-3 has-text-centered">
- <span class="fab fa-osi fa-5x"></span>
+ <i class="fa-solid fa-earth-europe fa-5x"></i>
</div>
<div class="column">
- <p class="title is-5">{{ _("Open, Inclusive, and Free Software") }}</p>
+ <p class="title is-5">
+ {{ _("Works Everywhere") }}
+ </p>
<div class="content">
<p>
- The IPFire DNS blocklists are built as a public good:
- open, transparent, and free to use.
- They are available to anyone, regardless of platform or vendor,
- and developed in the open so the wider community can inspect,
- contribute, and benefit.
+ Built directly into IPFire's Web Proxy and
+ Intrusion Prevention System.
+ Also designed to work with other firewall and
+ filtering solutions.
+ Open standards mean you can use IPFire DBL
+ wherever you need domain-based protection.
</p>
</div>
</div>
</div>
</section>
+ <section class="hero is-fullheight">
+ <div class="hero-body">
+ <div class="container">
+ <h3 class="title is-3">
+ {{ _("Works With Your Existing Infrastructure") }}
+ </h3>
+
+ <h5 class="subtitle is-5">
+ IPFire DBL integrates seamlessly with popular DNS servers, firewalls,
+ IPS systems, and browser extensions
+ </h5>
+
+ <div class="columns is-multiline is-centered is-vcentered">
+ <div class="column is-one-quarter is-flex is-justify-content-center"">
+ <a href="/dbl/how-to-use#rpz">
+ <figure class="image is-128x128 is-flex is-align-items-center">
+ <img src="{{ static_url("img/powerdns.svg") }}" alt="{{ _("PowerDNS") }}">
+ </figure>
+ </a>
+ </div>
+
+ <div class="column is-one-quarter is-flex is-justify-content-center"">
+ <a href="/dbl/how-to-use#rpz">
+ <figure class="image is-128x128 is-flex is-align-items-center">
+ <img src="{{ static_url("img/unbound.svg") }}" alt="{{ _("Unbound") }}">
+ </figure>
+ </a>
+ </div>
+
+ <div class="column is-one-quarter is-flex is-justify-content-center"">
+ <a href="/dbl/how-to-use#rpz">
+ <figure class="image is-128x128 is-flex is-align-items-center">
+ <img src="{{ static_url("img/bind.png") }}" alt="{{ _("BIND") }}">
+ </figure>
+ </a>
+ </div>
+
+ <div class="column is-one-quarter is-flex is-justify-content-center"">
+ <a href="/dbl/how-to-use#rpz">
+ <figure class="image is-128x128 is-flex is-align-items-center">
+ <img src="{{ static_url("img/knot.png") }}" alt="{{ _("Knot DNS") }}">
+ </figure>
+ </a>
+ </div>
+
+ <div class="column is-one-quarter is-flex is-justify-content-center"">
+ <a href="/dbl/how-to-use#suricata">
+ <figure class="image is-128x128 is-flex is-align-items-center">
+ <img src="{{ static_url("img/suricata.png") }}" alt="{{ _("Suricata") }}">
+ </figure>
+ </a>
+ </div>
+
+ <div class="column is-one-quarter is-flex is-justify-content-center"">
+ <a href="/dbl/how-to-use#rpz">
+ <figure class="image is-128x128 is-flex is-align-items-center">
+ <img src="{{ static_url("img/opnsense.svg") }}" alt="{{ _("OPNsense") }}">
+ </figure>
+ </a>
+ </div>
+
+ <div class="column is-one-quarter is-flex is-justify-content-center"">
+ <a href="/dbl/how-to-use#rpz">
+ <figure class="image is-128x128 is-flex is-align-items-center">
+ <img src="{{ static_url("img/pfsense.png") }}" alt="{{ _("pfSense") }}">
+ </figure>
+ </a>
+ </div>
+
+ <div class="column is-one-quarter is-flex is-justify-content-center"">
+ <a href="/dbl/how-to-use#rpz">
+ <figure class="image is-64x64 is-flex is-align-items-center">
+ <img src="{{ static_url("img/pi-hole.png") }}" alt="{{ _("Pi-Hole") }}">
+ </figure>
+ </a>
+ </div>
+
+ <div class="column is-one-quarter is-flex is-justify-content-center"">
+ <a href="/dbl/how-to-use#browser-extensions">
+ <figure class="image is-64x64 is-flex is-align-items-center">
+ <img src="{{ static_url("img/ublock-origin.svg") }}" alt="{{ _("uBlock Origin") }}">
+ </figure>
+ </a>
+ </div>
+
+ <div class="column is-one-quarter is-flex is-justify-content-center"">
+ <a href="/dbl/how-to-use#browser-extensions">
+ <figure class="image is-64x64 is-flex is-align-items-center">
+ <img src="{{ static_url("img/adguard.svg") }}" alt="{{ _("AdGuard") }}">
+ </figure>
+ </a>
+ </div>
+
+ <div class="column is-full is-flex is-justify-content-center">
+ <h1 class="title is-1 py-5">
+ {% module IPFireLogo() %}
+ </h1>
+ </div>
+
+ <div class="column is-full has-text-centered">
+ <div class="content">
+ <p>
+ ...and any system that supports RPZ, domain lists,
+ hosts files, or Suricata rulesets
+ </p>
+ </div>
+
+ <a class="button is-primary is-medium" href="/dbl/how-to-use">
+ {{ _("See All Integration Methods") }}
+ </a>
+ </div>
+ </div>
+ </div>
+ </div>
+ </section>
+
+ <section class="hero is-dark is-fullheight">
+ <div class="hero-body">
+ <div class="container">
+ <h3 class="title is-3">
+ {{ _("Perfect For...") }}
+ </h3>
+
+ <div class="columns is-multiline">
+ <div class="column is-half p-5">
+ <h4 class="title is-4">
+ <span class="icon">
+ <i class="fa-solid fa-building"></i>
+ </span>
+
+ Corporate Networks
+ </h4>
+
+ <div class="content">
+ <p>
+ Enforce acceptable use policies by blocking social media,
+ gambling, or adult content.
+ Protect employees from phishing and malware sites at the
+ network edge.
+ </p>
+ </div>
+ </div>
+
+ <div class="column is-half p-5">
+ <h4 class="title is-4">
+ <span class="icon">
+ <i class="fa-solid fa-graduation-cap"></i>
+ </span>
+
+ Educational Institutions
+ </h4>
+
+ <div class="content">
+ <p>
+ Create safe browsing environments for students.
+ Filter inappropriate content and ensure compliance with
+ child safety regulations across the entire campus network.
+ </p>
+ </div>
+ </div>
+
+ <div class="column is-half p-5">
+ <h4 class="title is-4">
+ <span class="icon">
+ <i class="fa-solid fa-house"></i>
+ </span>
+
+ Home Networks
+ </h4>
+
+ <div class="content">
+ <p>
+ Protect family members from malicious sites, phishing attempts,
+ and inappropriate content.
+ Set up parental controls with category-based filtering.
+ </p>
+ </div>
+ </div>
+
+ <div class="column is-half p-5">
+ <h4 class="title is-4">
+ <span class="icon">
+ <i class="fa-solid fa-circle-nodes"></i>
+ </span>
+
+ Managed Service Providers
+ </h4>
+
+ <div class="content">
+ <p>
+ Deploy consistent, reliable domain filtering across multiple
+ client firewalls.
+ Reduce attack surface with actively maintained threat intelligence.
+ </p>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </section>
+
<section class="hero">
<div class="hero-body">
<div class="container">
- <a class="button is-primary is-large is-fullwidth" href="/donate">
- <span class="icon">
- <i class="fa-solid fa-heart"></i>
- </span>
- <span>
- Help keep the Internet safe and free — support IPFire DBL today
- </span>
- </a>
+ <div class="columns is-centered">
+ <div class="column is-half">
+ <div class="box">
+ <h3 class="title is-3">
+ {{ _("Want More Network Intelligence? Try IPFire Location") }}
+ </h3>
+
+ <div class="content">
+ <p>
+ Need to know where network traffic is coming from?
+ IPFire Location provides lightning-fast IP geolocation data
+ with country codes, ASN information, and network flags —
+ perfect for geo-blocking, compliance, and traffic analysis.
+ </p>
+
+ <p>
+ Built with the same commitment to quality as DBL:
+ open-source, actively maintained, and trusted by
+ enterprises worldwide.
+ </p>
+
+ <a class="button is-primary" href="/location">
+ Learn More About IPFire Location
+ </a>
+ </div>
+ </div>
+ </div>
+ </div>
</div>
</div>
</section>
</div>
</div>
</section>
-
- {# How To Use? #}
- <section class="section">
- <div class="container">
- <h5 class="title is-5">
- {{ _("How To Use?") }}
- </h5>
-
- <div class="tabs">
- <ul>
- <li class="is-active" data-tab="ipfire">
- <a>{% module IPFireLogo() %}</a>
- </li>
-
- <li data-tab="abp">
- <a>{{ _("Adblock Plus, uBlock Origin, etc.") }}</a>
- </li>
-
- <li data-tab="rpz">
- <a>{{ _("Request Policy Zone (RPZ)") }}</a>
- </li>
-
- <li data-tab="suricata">
- <a>{{ _("Suricata") }}</a>
- </li>
-
- <li data-tab="alternative">
- <a>{{ _("Alternative Formats") }}</a>
- </li>
- </ul>
- </div>
-
- <div id="ipfire" class="tab-content">
- <div class="content">
- <p>
- In IPFire, all blocklists are already included and integrated into the following features:
- </p>
-
- <ul>
- <li>
- {{ _("URL Filter")}}
- </li>
-
- <li>
- {{ _("Intrusion Prevention System") }}
- </li>
- </ul>
- </div>
- </div>
-
- <div id="abp" class="tab-content is-hidden">
- <div class="content">
- {# Compose the subscription URL #}
- {% set url = "https://subscribe.adblockplus.org/?%s" % \
- urllib.parse.urlencode({
- "location" : list.url("abp.txt"),
- "title" : "IPFire DBL - %s" % list,
- })
- %}
-
- <p>
- Click below to automatically subscribe to our blocklist in uBlock Origin, AdGuard, and compatible clients.
- </p>
-
- <a class="button is-primary is-small" href="{{ url }}">
- {{ _("Subscribe") }}
- </a>
- </div>
- </div>
-
- <div id="rpz" class="tab-content is-hidden">
- <div class="content">
- <p>
- The IPFire DBL is published as a Response Policy Zone (RPZ) and
- can be consumed by many popular recursive DNS resolvers.
- </p>
-
- <p>
- Resolvers fetch the list via AXFR/IXFR, store it locally, and only
- transfer updates when the zone changes — keeping bandwidth usage
- low and resolution fast.
- </p>
-
- <h6>PowerDNS Recursor</h6>
-
- <pre>
-recursor:
- rpzs:
- - name: {{ list.slug }}.rpz.ipfire.org
- addresses:
- - 'primary.dbl.ipfire.org'</pre>
-
- <h6>Unbound</h6>
-
- <pre>
-server:
- module-config: "respip validator iterator"
-
-rpz:
- name: {{ list.slug }}.rpz.ipfire.org
- primary: primary.dbl.ipfire.org
- zonefile: /var/cache/unbound/{{ list.slug }}.rpz.ipfire.org.zone</pre>
- </div>
- </div>
-
- <div id="suricata" class="tab-content is-hidden">
- <div class="content">
- <p>
- IPFire DBL lists are available as a ruleset for Suricata
- which can filter:
- </p>
-
- <ul>
- <li>
- DNS Queries
- </li>
-
- <li>
- TLS and QUIC connections using SNI
- </li>
-
- <li>
- HTTP Requests
- </li>
- </ul>
-
- <a class="button is-primary is-small" href="https://dbl.ipfire.org/lists/suricata.tar.gz">
- <span class="icon">
- <i class="fas fa-download"></i>
- </span>
-
- <span>
- {{ _("Suricata Ruleset (containing all lists)") }}
- </span>
- </a>
- </div>
- </div>
-
- <div id="alternative" class="tab-content is-hidden">
- <div class="content">
- <p>
- All IPFire DBL lists are also available as downloadable domain and hosts files.
- </p>
-
- <p>
- These formats are intended for setups where the lists are consumed directly,
- for example by firewalls, filtering proxies, custom tooling, or systems using
- hosts-file based blocking. The files can be fetched periodically and applied locally.
- </p>
- </div>
-
- <div class="buttons are-small">
- <a class="button is-primary" href="https://dbl.ipfire.org/lists/{{ list.slug }}/domains.txt">
- <span class="icon">
- <i class="fas fa-download"></i>
- </span>
-
- <span>
- {{ _("Domains") }}
- </span>
- </a>
-
- <a class="button is-primary" href="https://dbl.ipfire.org/lists/{{ list.slug }}/hosts.txt">
- <span class="icon">
- <i class="fas fa-download"></i>
- </span>
-
- <span>
- {{ _("Hosts") }}
- </span>
- </a>
- </div>
- </div>
- </div>
- </section>
{% end block %}
(r"/location/lookup/(.+)", location.LookupHandler),
# DBL
- (r"/dbl/?", StaticHandler, { "template" : "dbl/index.html" }),
+ (r"/dbl/?", dbl.IndexHandler),
+ (r"/dbl/how\-to\-use", dbl.HowToUseHandler),
(r"/dbl/lists", dbl.ListsHandler),
(r"/dbl/lists/([\w\-]+)", dbl.ListHandler),
(r"/dbl/lists/([\w\-]+)/domains/(.*)", dbl.ListDomainHandler),
return await self.backend.dbl.get_list(slug)
+class IndexHandler(base.AnalyticsMixin, BaseHandler):
+ async def get(self):
+ # Fetch all lists
+ lists = await self.backend.dbl.get_lists()
+
+ # Render the page
+ self.render("dbl/index.html", lists=lists)
+
+
+class HowToUseHandler(base.AnalyticsMixin, BaseHandler):
+ async def get(self):
+ # Fetch all lists
+ lists = await self.backend.dbl.get_lists()
+
+ # Render the page
+ self.render("dbl/how-to-use.html", lists=lists)
+
+
class ListsHandler(base.AnalyticsMixin, BaseHandler):
async def get(self):
# Fetch all lists