[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"public-config":3,"i-flag:ph-4x3":14,"i-flag:us-4x3":19,"i-flag:de-4x3":21,"i-flag:hk-4x3":23,"i-tabler:lifebuoy":25,"i-tabler:timeline":28,"i-tabler:apps":30,"i-tabler:package":32,"i-tabler:circle-half-2":34,"i-tabler:sun":36,"i-tabler:moon":38,"i-tabler:menu-2":40,"i-tabler:user":42,"i-tabler:notebook":44,"i-simple-icons:forgejo":46,"i-tabler:shield-lock":48,"i-tabler:tools":50,"i-tabler:calendar":52,"i-tabler:x":54,"$f1iioimfgjgb19":56,"i-tabler:arrow-left":110,"i-tabler:tag":112},{"matomo":4,"booking":7,"site":9,"blog":11,"newsletter":12},{"enabled":5,"siteId":6},true,"7",{"enabled":5,"url":8},"https:\u002F\u002Fcal.com\u002Fjdbungart",{"url":10},"https:\u002F\u002Fjdneer.com",{"enabled":5},{"enabled":13},false,{"left":15,"top":15,"width":16,"height":17,"rotate":15,"vFlip":13,"hFlip":13,"body":18},0,640,480,"\u003Cpath fill=\"#0038a8\" d=\"M0 0h640v240H0z\"\u002F>\u003Cpath fill=\"#ce1126\" d=\"M0 240h640v240H0z\"\u002F>\u003Cpath fill=\"#fff\" d=\"M415.7 240L0 480V0\"\u002F>\u003Cpath fill=\"#fcd116\" d=\"M26.7 42.4L41 55l16.6-9.2l-7.4 17.5l14 13l-19-1.6l-8.1 17.2l-4.3-18.5L14 71l16.3-10zm323.8 172.3l.4 19l18 6.3l-18 6.2l-.4 19l-11.5-15.1l-18.2 5.5l10.8-15.6l-10.8-15.6l18.2 5.5zM37.2 388.1l8 17.2l19-1.6l-13.9 13l7.4 17.5l-16.6-9.1l-14.4 12.4l3.6-18.7L14 409l18.9-2.4zm114.2-249l-6.2 6.2l3.1 47l-3 .3l-5.7-42.9l-5.1 5l7.6 38.4a48 48 0 0 0-17.2 7.1l-21.7-32.4H96l26.4 34.3l-2.4 2l-31.1-35.5h-8.8v8.8l35.4 31l-2 2.5l-34.3-26.3v7.1l32.5 21.7q-5.2 7.8-7.1 17.2L66.3 223l-5.1 5l42.9 5.7q-.3 1.6-.3 3.1l-47-3l-6.2 6.2l6.2 6.2l47-3.1l.3 3.1l-42.9 5.7l5 5l38.4-7.6a48 48 0 0 0 7.1 17.2l-32.5 21.7v7.2l34.3-26.3l2 2.4l-35.4 31v8.8H89l31-35.4l2.5 2L96 312.2h7.2l21.7-32.5q7.8 5.2 17.2 7.1l-7.6 38.4l5 5l5.7-42.9q1.5.3 3.1.3l-3 47l6.1 6.2l6.3-6.2l-3.1-47l3-.3l5.7 43l5.1-5.1l-7.6-38.4a48 48 0 0 0 17.2-7.1l21.7 32.5h7.2l-26.4-34.3l2.4-2l31.1 35.4h8.8v-8.8l-35.4-31l2-2.4l34.3 26.3v-7.2l-32.5-21.7q5.2-7.8 7.1-17.2l38.3 7.6l5.1-5l-42.9-5.7q.3-1.5.3-3.1l47 3l6.2-6.1l-6.2-6.2l-47 3l-.3-3l42.9-5.7l-5-5l-38.4 7.5a48 48 0 0 0-7.1-17.2l32.5-21.7v-7.1l-34.3 26.3l-2-2.4l35.4-31v-8.9H214l-31 35.5l-2.5-2l26.4-34.3h-7.2L178 200.2q-7.8-5.2-17.2-7.1l7.6-38.3l-5-5l-5.7 42.8l-3.1-.3l3-47z\"\u002F>",{"left":15,"top":15,"width":16,"height":17,"rotate":15,"vFlip":13,"hFlip":13,"body":20},"\u003Cpath fill=\"#bd3d44\" d=\"M0 0h640v480H0\"\u002F>\u003Cpath stroke=\"#fff\" stroke-width=\"37\" d=\"M0 55.3h640M0 129h640M0 203h640M0 277h640M0 351h640M0 425h640\"\u002F>\u003Cpath fill=\"#192f5d\" d=\"M0 0h364.8v258.5H0\"\u002F>\u003Cmarker id=\"SVGEq3dreKJ\" markerHeight=\"30\" markerWidth=\"30\">\u003Cpath fill=\"#fff\" d=\"m14 0l9 27L0 10h28L5 27z\"\u002F>\u003C\u002Fmarker>\u003Cpath fill=\"none\" marker-mid=\"url(#SVGEq3dreKJ)\" d=\"m0 0l16 11h61h61h61h61h60L47 37h61h61h60h61L16 63h61h61h61h61h60L47 89h61h61h60h61L16 115h61h61h61h61h60L47 141h61h61h60h61L16 166h61h61h61h61h60L47 192h61h61h60h61L16 218h61h61h61h61h60z\"\u002F>",{"left":15,"top":15,"width":16,"height":17,"rotate":15,"vFlip":13,"hFlip":13,"body":22},"\u003Cpath fill=\"#fc0\" d=\"M0 320h640v160H0z\"\u002F>\u003Cpath fill=\"#000001\" d=\"M0 0h640v160H0z\"\u002F>\u003Cpath fill=\"red\" d=\"M0 160h640v160H0z\"\u002F>",{"left":15,"top":15,"width":16,"height":17,"rotate":15,"vFlip":13,"hFlip":13,"body":24},"\u003Cpath fill=\"#ec1b2e\" d=\"M0 0h640v480H0\"\u002F>\u003Cpath id=\"SVG5tfvBPpj\" fill=\"#fff\" d=\"M346.3 103.1C267 98 230.6 201.9 305.6 240.3c-26-22.4-20.6-55.3-10.1-72.4l1.9 1.1c-13.8 23.5-11.2 52.7 11.1 71c-12.7-12.3-9.5-39 12.1-48.9s23.6-39.3 16.4-49.1q-14.7-25.6 9.3-38.9M307.9 164l-4.7 7.4l-1.8-8.6l-8.6-2.3l7.8-4.3l-.6-8.9l6.5 6.1l8.3-3.3l-3.7 8.1l5.6 6.8z\"\u002F>\u003Cuse href=\"#SVG5tfvBPpj\" transform=\"rotate(72 312.5 243.5)\"\u002F>\u003Cuse href=\"#SVG5tfvBPpj\" transform=\"rotate(144 312.5 243.5)\"\u002F>\u003Cuse href=\"#SVG5tfvBPpj\" transform=\"rotate(216 312.5 243.5)\"\u002F>\u003Cuse href=\"#SVG5tfvBPpj\" transform=\"rotate(288 312.5 243.5)\"\u002F>",{"left":15,"top":15,"width":26,"height":26,"rotate":15,"vFlip":13,"hFlip":13,"body":27},24,"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M8 12a4 4 0 1 0 8 0a4 4 0 1 0-8 0\"\u002F>\u003Cpath d=\"M3 12a9 9 0 1 0 18 0a9 9 0 1 0-18 0m12 3l3.35 3.35M9 15l-3.35 3.35m0-12.7L9 9m9.35-3.35L15 9\"\u002F>\u003C\u002Fg>",{"left":15,"top":15,"width":26,"height":26,"rotate":15,"vFlip":13,"hFlip":13,"body":29},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"m4 16l6-7l5 5l5-6\"\u002F>\u003Cpath d=\"M14 14a1 1 0 1 0 2 0a1 1 0 1 0-2 0M9 9a1 1 0 1 0 2 0a1 1 0 1 0-2 0m-6 7a1 1 0 1 0 2 0a1 1 0 1 0-2 0m16-8a1 1 0 1 0 2 0a1 1 0 1 0-2 0\"\u002F>\u003C\u002Fg>",{"left":15,"top":15,"width":26,"height":26,"rotate":15,"vFlip":13,"hFlip":13,"body":31},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 5a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v4a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1zm0 10a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v4a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1zm10 0a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v4a1 1 0 0 1-1 1h-4a1 1 0 0 1-1-1zm0-8h6m-3-3v6\"\u002F>",{"left":15,"top":15,"width":26,"height":26,"rotate":15,"vFlip":13,"hFlip":13,"body":33},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"m12 3l8 4.5v9L12 21l-8-4.5v-9zm0 9l8-4.5M12 12v9m0-9L4 7.5m12-2.25l-8 4.5\"\u002F>",{"left":15,"top":15,"width":26,"height":26,"rotate":15,"vFlip":13,"hFlip":13,"body":35},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M3 12a9 9 0 1 0 18 0a9 9 0 1 0-18 0m9-9v18m0-7l7-7m-7 12l8.5-8.5M12 9l4.5-4.5\"\u002F>",{"left":15,"top":15,"width":26,"height":26,"rotate":15,"vFlip":13,"hFlip":13,"body":37},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 12a4 4 0 1 0 8 0a4 4 0 1 0-8 0m-5 0h1m8-9v1m8 8h1m-9 8v1M5.6 5.6l.7.7m12.1-.7l-.7.7m0 11.4l.7.7m-12.1-.7l-.7.7\"\u002F>",{"left":15,"top":15,"width":26,"height":26,"rotate":15,"vFlip":13,"hFlip":13,"body":39},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 3h.393a7.5 7.5 0 0 0 7.92 12.446A9 9 0 1 1 12 2.992z\"\u002F>",{"left":15,"top":15,"width":26,"height":26,"rotate":15,"vFlip":13,"hFlip":13,"body":41},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 6h16M4 12h16M4 18h16\"\u002F>",{"left":15,"top":15,"width":26,"height":26,"rotate":15,"vFlip":13,"hFlip":13,"body":43},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 7a4 4 0 1 0 8 0a4 4 0 0 0-8 0M6 21v-2a4 4 0 0 1 4-4h4a4 4 0 0 1 4 4v2\"\u002F>",{"left":15,"top":15,"width":26,"height":26,"rotate":15,"vFlip":13,"hFlip":13,"body":45},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 4h11a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H6a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1m3 0v18m4-14h2m-2 4h2\"\u002F>",{"left":15,"top":15,"width":26,"height":26,"rotate":15,"vFlip":13,"hFlip":13,"body":47},"\u003Cpath fill=\"currentColor\" d=\"M16.777 0a2.9 2.9 0 1 1-2.529 4.322H12.91a4.266 4.266 0 0 0-4.265 4.195v2.118a7.08 7.08 0 0 1 4.147-1.42l.118-.002h1.338a2.9 2.9 0 0 1 5.43 1.422a2.9 2.9 0 0 1-5.43 1.422H12.91a4.266 4.266 0 0 0-4.265 4.195v2.319A2.9 2.9 0 0 1 7.222 24A2.9 2.9 0 0 1 5.8 18.57V8.589a7.11 7.11 0 0 1 6.991-7.108l.118-.001h1.338A2.9 2.9 0 0 1 16.778 0M7.223 19.905a1.194 1.194 0 1 0 0 2.389a1.194 1.194 0 0 0 0-2.389m9.554-10.464a1.194 1.194 0 1 0 0 2.389a1.194 1.194 0 0 0 0-2.39m0-7.735a1.194 1.194 0 1 0 0 2.389a1.194 1.194 0 0 0 0-2.389\"\u002F>",{"left":15,"top":15,"width":26,"height":26,"rotate":15,"vFlip":13,"hFlip":13,"body":49},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M12 3a12 12 0 0 0 8.5 3A12 12 0 0 1 12 21A12 12 0 0 1 3.5 6A12 12 0 0 0 12 3\"\u002F>\u003Cpath d=\"M11 11a1 1 0 1 0 2 0a1 1 0 1 0-2 0m1 1v2.5\"\u002F>\u003C\u002Fg>",{"left":15,"top":15,"width":26,"height":26,"rotate":15,"vFlip":13,"hFlip":13,"body":51},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M3 21h4L20 8a1.5 1.5 0 0 0-4-4L3 17zM14.5 5.5l4 4\"\u002F>\u003Cpath d=\"M12 8L7 3L3 7l5 5M7 8L5.5 9.5M16 12l5 5l-4 4l-5-5m4 1l-1.5 1.5\"\u002F>\u003C\u002Fg>",{"left":15,"top":15,"width":26,"height":26,"rotate":15,"vFlip":13,"hFlip":13,"body":53},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 7a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2zm12-4v4M8 3v4m-4 4h16m-9 4h1m0 0v3\"\u002F>",{"left":15,"top":15,"width":26,"height":26,"rotate":15,"vFlip":13,"hFlip":13,"body":55},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M18 6L6 18M6 6l12 12\"\u002F>",{"slug":57,"title":58,"excerpt":59,"image":60,"publishedAt":61,"topics":62,"readMinutes":66,"html":67,"metaTitle":58,"metaDescription":68,"shareImage":69,"updatedAt":70,"author":71,"related":73},"guide-to-setting-up-an-ookla-speedtest-server-on-rockylinux-8","Guide to Setting Up an OOKLA Speedtest Server on RockyLinux 8\u002F9","I'm gonna walk you through a simple guide to get your OOKLA Speedtest server(s) up and running on RockyLinux 8. We'll even make it start automatically when your server boots. Oh, and we'll sprinkle in some basic security tips to keep things safe.","https:\u002F\u002Fimages.unsplash.com\u002Fphoto-1610034534785-4706b86dd6a5?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3wxMTc3M3wwfDF8c2VhcmNofDN8fHNwZWVkdGVzdHxlbnwwfHx8fDE2OTM3NTMxNjR8MA&ixlib=rb-4.0.3&q=80&w=2000","2025-01-10T14:10:00.000+08:00",[63],{"key":64,"label":65},"guides","Guides",9,"\u003Cp>\u003Cstrong>\u003Cem>UPDATED JAN 11, 2024\u003C\u002Fem>\u003C\u002Fstrong>\u003C\u002Fp>\u003Cp>Hey everyone!\u003C\u002Fp>\u003Cp>There are quite a few guides out there on how to set up OOKLA's Speedtest server on Linux, but honestly, even OOKLA's own guide is kinda vague. That's not fun, especially if you're somewhat new to Linux.\u003C\u002Fp>\u003Cp>This guide is for the beginners out there. \u003Cu>What you should know?\u003C\u002Fu> How to install RockyLinux 8\u002F9 (we're not covering that here), a bit about moving around the Linux command-line, and editing files using a text editor like nano or vi\u002Fvim.\u003C\u002Fp>\u003Cdiv class=\"kg-card kg-callout-card kg-callout-card-green\">\u003Cdiv class=\"kg-callout-emoji\">💡\u003C\u002Fdiv>\u003Cdiv class=\"kg-callout-text\">Not feeling comfortable with the command line? Want an expert at your side? Book a consultation with me 🙂 Click \u003Ca href=\"https:\u002F\u002Fcal.com\u002Fjdbungart?ref=ghost.jdneer.com\" rel=\"noreferrer\">this link\u003C\u002Fa> to get started.\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Ch2 id=\"requirements\">\u003Cstrong>Requirements\u003C\u002Fstrong>\u003C\u002Fh2>\u003Cp>For this walkthrough, all you need are an OOKLA account, properly configured DNS pointing at a server with RockyLinux 8\u002F9 freshly installed. Use a minimal installation, without graphical user interface. Make sure the server has a network interface facing the public internet with at least one public IPv4 and IPv6 address assigned to it.\u003C\u002Fp>\u003Cdiv class=\"kg-card kg-callout-card kg-callout-card-yellow\">\u003Cdiv class=\"kg-callout-emoji\">🛡️\u003C\u002Fdiv>\u003Cdiv class=\"kg-callout-text\">I'm not going into the details of setting up an OOKLA account, handling DNS configurations, or adding your server to the speedtest network. We're zeroing in on getting that server operational. Need assistance with the rest? Just give me a shout!\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv class=\"kg-card kg-callout-card kg-callout-card-red\">\u003Cdiv class=\"kg-callout-emoji\">🚀\u003C\u002Fdiv>\u003Cdiv class=\"kg-callout-text\">\u003Cb>\u003Cstrong>Using Cloudflare DNS? \u003C\u002Fstrong>\u003C\u002Fb>Make sure to disable Proxy Mode for your speedtest domain's A\u002FAAAA records. Otherwise you won't be able to obtain a Let's Encrypt TLS certificate.\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Ch2 id=\"deployment-steps\">Deployment steps\u003C\u002Fh2>\u003Cul>\u003Cli>Secure superuser access (root).\u003C\u002Fli>\u003Cli>Set up a new system user specifically for the OOKLA Speedtest server.\u003C\u002Fli>\u003Cli>Configure the firewall correctly with firewalld, using iptables as the backend.\u003C\u002Fli>\u003Cli>Install the necessary systemd unit files for autostart on boot.\u003C\u002Fli>\u003Cli>Adjust the SELinux policy to let systemd start the speedtest server as an unprivileged user.\u003C\u002Fli>\u003C\u002Ful>\u003Cdiv class=\"kg-card kg-callout-card kg-callout-card-blue\">\u003Cdiv class=\"kg-callout-emoji\">🔑\u003C\u002Fdiv>\u003Cdiv class=\"kg-callout-text\">\u003Cb>\u003Cstrong>Why you shouldn't run services with root privileges: \u003C\u002Fstrong>\u003C\u002Fb>Instead of having the speedtest server run as the 'root' user, which grants its processes complete system access, we'll run it under a \u003Cu>non-privileged system user\u003C\u002Fu> named 'ooklaserver'. This approach is standard and, typically, it stops a process from gaining unchecked system access – a crucial step if an application ever gets compromised.\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv class=\"kg-card kg-callout-card kg-callout-card-blue\">\u003Cdiv class=\"kg-callout-emoji\">⏪\u003C\u002Fdiv>\u003Cdiv class=\"kg-callout-text\">\u003Cb>\u003Cstrong>Can a process run by a non-privileged user listen on privileged network ports (1-1023)?\u003C\u002Fstrong>\u003C\u002Fb> The short answer is; no. The long answer; if you'd try to launch the speedtest server as a regular system user, it won't be able to listen on port 443 (HTTPS), \u003Ca href=\"https:\u002F\u002Fsupport.ookla.com\u002Fhc\u002Fen-us\u002Farticles\u002F360027274852-Which-Ports-Am-I-Required-to-Use-?ref=ghost.jdneer.com\">which is required for secure client connections to work\u003C\u002Fa>. To get around this problem, we'll tap into the socket feature of systemd. More on that later 😉\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cp>Alright, let's get started! First and foremost, if not done yet, make sure you have a secure, non-generic password set for the root user. After you've successfully installed your RockyLinux 8\u002F9.\u003C\u002Fp>\u003Cp>You can head over to the \u003Ca href=\"https:\u002F\u002Fbitwarden.com\u002Fpassword-generator\u002F?ref=ghost.jdneer.com\">Strong Password Generator\u003C\u002Fa> provided by Bitwarden, to generate a strong enough password.\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-card-hascaption\">\u003Cimg src=\"\u002Fcontent\u002Fimages\u002F2023\u002F09\u002Fimage.png\" class=\"kg-image\" alt=\"\" loading=\"lazy\" width=\"972\" height=\"738\" srcset=\"\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2023\u002F09\u002Fimage.png 600w, \u002Fcontent\u002Fimages\u002F2023\u002F09\u002Fimage.png 972w\" sizes=\"(min-width: 720px) 720px\" \u002F>\u003Cfigcaption>\u003Cspan>Example, three words, capitalized letters, one number, separated by a dash. Do not use the password shown above ;-)\u003C\u002Fspan>\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Then, log in to your server using the root user:\u003C\u002Fp>\u003Cpre>\u003Ccode>ssh root@&lt;ip address&gt;\u003C\u002Fcode>\u003C\u002Fpre>\u003Cdiv class=\"kg-card kg-callout-card kg-callout-card-green\">\u003Cdiv class=\"kg-callout-emoji\">💡\u003C\u002Fdiv>\u003Cdiv class=\"kg-callout-text\">Alternatively, you can log in as a non-privileged user and then switch to the root user using \u003Ccode spellcheck=\"false\">sudo su -\u003C\u002Fcode> or \u003Ccode spellcheck=\"false\">su -\u003C\u002Fcode>. From here on out, make sure to follow the guide as the root user.\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cp>Change the root password:\u003C\u002Fp>\u003Cpre>\u003Ccode>[root@AS12345-OOKLA1 ~]# passwd\nChanging password for user root.\nNew password: \nRetype new password: \npasswd: all authentication tokens updated successfully.\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Next, let's make sure all the latest software packages are installed:\u003C\u002Fp>\u003Cpre>\u003Ccode>[root@AS12345-OOKLA1 ~]# dnf update -y\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Reboot the server:\u003C\u002Fp>\u003Cpre>\u003Ccode>[root@AS12345-OOKLA1 ~]# reboot\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Then, log back into your server:\u003C\u002Fp>\u003Cpre>\u003Ccode>ssh root@&lt;ip address&gt;\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Ensure the necessary software packages are installed, they're hard dependencies for this to work!\u003C\u002Fp>\u003Cpre>\u003Ccode>[root@AS12345-OOKLA1 ooklaserver]# dnf install -y wget tar\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Now, before we proceed with installing the OOKLA speedtest server, let's get the firewall configuratiojn sorted out.\u003C\u002Fp>\u003Ch2 id=\"firewall-configuration\">Firewall Configuration\u003C\u002Fh2>\u003Cp>Ensure firewalld is installed:\u003C\u002Fp>\u003Cpre>\u003Ccode>[root@AS12345-OOKLA1 ~]# dnf install -y firewalld\nLast metadata expiration check: 0:55:27 ago on Sun 03 Sep 2023 12:02:18 PM UTC.\nPackage firewalld-0.9.3-13.el8.noarch is already installed.\nDependencies resolved.\nNothing to do.\nComplete!\u003C\u002Fcode>\u003C\u002Fpre>\u003Cdiv class=\"kg-card kg-callout-card kg-callout-card-green\">\u003Cdiv class=\"kg-callout-emoji\">💡\u003C\u002Fdiv>\u003Cdiv class=\"kg-callout-text\">\u003Cb>\u003Cstrong>Note:\u003C\u002Fstrong>\u003C\u002Fb> Starting with CentOS v8, and its binary-compatible siblings like ArmaLinux and RockyLinux, firewalld transitioned to using nftables as its default firewall backend, moving away from iptables. Although nftables boasts several benefits, it's a tad more intricate. For straightforward scenarios like what we're tackling, we're reverting to iptables to keep things simpler and more digestible.\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cp>Let's switch the backend of firewalld to iptables:\u003C\u002Fp>\u003Cpre>\u003Ccode>[root@AS12345-OOKLA1 ~]# sed -r -i -e \"\u002F(.*)FirewallBackend(.+)\u002Fc FirewallBackend\\=iptables\" \u002Fetc\u002Ffirewalld\u002Ffirewalld.conf\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Restart the firewalld service, and then verify if iptables chains have been created:\u003C\u002Fp>\u003Cpre>\u003Ccode>[root@AS12345-OOKLA1 ~]# systemctl restart firewalld\n\n[root@AS12345-OOKLA1 ~]# iptables -nvL IN_public_allow\nChain IN_public_allow (1 references)\n pkts bytes target     prot opt in     out     source               destination         \n    0     0 ACCEPT     tcp  --  *      *       0.0.0.0\u002F0            0.0.0.0\u002F0            tcp dpt:22 ctstate NEW,UNTRACKED\n    0     0 ACCEPT     tcp  --  *      *       0.0.0.0\u002F0            0.0.0.0\u002F0            tcp dpt:9090 ctstate NEW,UNTRACKED\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Great! In the output above, you'll notice that port 9090\u002Ftcp is permitted for inbound traffic. That's designated for the cockpit service, which provides a simple web interface for managing your server. If you opted for a minimal OS installation, cockpit wouldn't be included by default. Regardless, let's go ahead and close that port, and ensure that cockpit isn't installed.\u003C\u002Fp>\u003Cpre>\u003Ccode>[root@AS12345-OOKLA1 ~]# dnf remove -y cockpit\n[root@AS12345-OOKLA1 ~]# firewall-cmd --remove-service=cockpit\n[root@AS12345-OOKLA1 ~]# firewall-cmd --runtime-to-permanent\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Verify that port 9090\u002Ftcp has been closed:\u003C\u002Fp>\u003Cpre>\u003Ccode>[root@AS12345-OOKLA1 ~]# iptables -nvL IN_public_allow\nChain IN_public_allow (1 references)\n pkts bytes target     prot opt in     out     source               destination         \n    0     0 ACCEPT     tcp  --  *      *       0.0.0.0\u002F0            0.0.0.0\u002F0            tcp dpt:22 ctstate NEW,UNTRACKED\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Neat! Now, only SSH is permitted. Next, let's permit inbound connections from all sources to the ports that the speedtest server uses. Specifically, ports 80, 443, 5060, and 8080 for both UDP and TCP transport protocols.\u003C\u002Fp>\u003Cpre>\u003Ccode>[root@AS12345-OOKLA1 ~]# firewall-cmd --add-port=80\u002Ftcp\n[root@AS12345-OOKLA1 ~]# firewall-cmd --add-port=443\u002Ftcp\n[root@AS12345-OOKLA1 ~]# firewall-cmd --add-port=5060\u002Ftcp --add-port=5060\u002Fudp\n[root@AS12345-OOKLA1 ~]# firewall-cmd --add-port=8080\u002Ftcp --add-port=8080\u002Fudp\n[root@AS12345-OOKLA1 ~]# firewall-cmd --runtime-to-permanent\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Make sure to verify:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card kg-width-wide\">\u003Cimg src=\"\u002Fcontent\u002Fimages\u002F2023\u002F09\u002Fimage-1.png\" class=\"kg-image\" alt=\"\" loading=\"lazy\" width=\"991\" height=\"217\" srcset=\"\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2023\u002F09\u002Fimage-1.png 600w, \u002Fcontent\u002Fimages\u002F2023\u002F09\u002Fimage-1.png 991w\" \u002F>\u003C\u002Ffigure>\u003Cp>Awesome, that seems to have worked! Based on the packet counter, we are also able to see that we've received one inbound connection on port 80.\u003C\u002Fp>\u003Cdiv class=\"kg-card kg-callout-card kg-callout-card-green\">\u003Cdiv class=\"kg-callout-emoji\">🛡️\u003C\u002Fdiv>\u003Cdiv class=\"kg-callout-text\">\u003Cb>\u003Cstrong>Best Practice:\u003C\u002Fstrong>\u003C\u002Fb> It's wise to limit management access to specific subnets or IP addresses. You might also consider changing the SSH port. While changing the SSH port won't improve security, it'll definitely help declutter your system logs from those pesky automated scans.\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cp>If you want to limit SSH access on the default port 22\u002Ftcp, use the following commands. Remember to replace x.x.x.x with an IP address or a subnet in CIDR notation (e.g., 1.2.3.0\u002F24).\u003C\u002Fp>\u003Cpre>\u003Ccode>[root@AS12345-OOKLA1 ~]# firewall-cmd --remove-service=ssh\n[root@AS12345-OOKLA1 ~]# firewall-cmd --add-rich-rule='rule family=\"ipv4\" source address=\"x.x.x.x\" service name=\"ssh\" accept'\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Save the current runtime configuration as permanent:\u003C\u002Fp>\u003Cpre>\u003Ccode>[root@AS12345-OOKLA1 ~]# firewall-cmd --runtime-to-permanent\u003C\u002Fcode>\u003C\u002Fpre>\u003Cdiv class=\"kg-card kg-callout-card kg-callout-card-grey\">\u003Cdiv class=\"kg-callout-emoji\">❗\u003C\u002Fdiv>\u003Cdiv class=\"kg-callout-text\">Always test before finalizing these configuration changes. If an issue arises while you're connected via SSH, just give the server a quick reboot.\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Ch2 id=\"deploying-the-ookla-speedtest-server\">Deploying the OOKLA Speedtest Server\u003C\u002Fh2>\u003Cp>Now, create the system user dedicated to running the OOKLA speedtest server process:\u003C\u002Fp>\u003Cpre>\u003Ccode>[root@AS12345-OOKLA1 ~]# useradd ooklaserver\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Switch to the \u003Cem>ooklaserver\u003C\u002Fem> user:\u003C\u002Fp>\u003Cpre>\u003Ccode>[root@AS12345-OOKLA1 ~]# su - ooklaserver\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Download the OOKLA speedtest installer:\u003C\u002Fp>\u003Cpre>\u003Ccode>[ooklaserver@AS12345-OOKLA1 ~]$ wget https:\u002F\u002Finstall.speedtest.net\u002Fooklaserver\u002Fooklaserver.sh\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Make the installer script executable:\u003C\u002Fp>\u003Cpre>\u003Ccode>[ooklaserver@AS12345-OOKLA1 ~]$ chmod u+x ooklaserver.sh\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Install the server binary:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode>[ooklaserver@AS12345-OOKLA1 ~]$ .\u002Fooklaserver.sh install\nServer Platform is linux64\nThis will install the Ookla server for linux64 to the current folder. Please confirm (y\u002Fn) &gt; y \n\n[...]\nStarting OoklaServer\nDaemon Started (1234)\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>\u003Cp>\u003Cspan>Confirm with 'y', followed by enter.\u003C\u002Fspan>\u003C\u002Fp>\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>The installer script tends to automatically start the OoklaServer daemon. We have to stop it before proceeding with the systemd configuration:\u003C\u002Fp>\u003Cpre>\u003Ccode>[ooklaserver@AS12345-OOKLA1 ~]$ .\u002Fooklaserver.sh stop\nStopping OoklaServer Daemon (1234) . . . . . . . . . . . . . . . . . . . .\nAdditional OoklaServer processes running; stopping\n[...]\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Great, now let's switch back to the root user:\u003C\u002Fp>\u003Cpre>\u003Ccode>[ooklaserver@AS12345-OOKLA1 ~]$ exit\n[root@AS12345-OOKLA1 ~]# \u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Let's set up the unit files for systemd. Just copy and paste the chunks below, starting from \u003Cem>cat\u003C\u002Fem> and concluding at \u003Cem>EOF\u003C\u002Fem>:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode>[root@AS12345-OOKLA1 ~]# cat &lt;&lt; EOF &gt; \u002Fetc\u002Fsystemd\u002Fsystem\u002Fooklaserver.socket \n[Unit]\nDescription=Ookla Server socket\nBindsTo=ooklaserver.service\n\n[Socket]\nListenStream=80\nListenStream=443\nNoDelay=true\nStopWhenUnneeded=yes\n\n[Install]\nWantedBy=sockets.target\nEOF\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>\u003Cp>\u003Cspan>Set up the socket unit file. This enables the OoklaServer process to proxy privileged network ports 80 and 443, for the speedtest server process running as a non-privileged user.\u003C\u002Fspan>\u003C\u002Fp>\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cfigure class=\"kg-card kg-code-card\">\u003Cpre>\u003Ccode>[root@AS12345-OOKLA1 ~]# cat &lt;&lt; EOF &gt; \u002Fetc\u002Fsystemd\u002Fsystem\u002Fooklaserver.service \n[Unit]\nAfter=network.target\nRequires=ooklaserver.socket\n\n[Service]\nUser=ooklaserver\nGroup=ooklaserver\nWorkingDirectory=\u002Fhome\u002Fooklaserver\n\nType=forking\nKillMode=control-group\n\nExecStart=\u002Fhome\u002Fooklaserver\u002Fooklaserver.sh start\nExecStop=\u002Fhome\u002Fooklaserver\u002Fooklaserver.sh stop\n\nTimeoutStartSec=30\nTimeoutStopSec=30\n\nRestart=on-failure\n\n[Install]\nWantedBy=multi-user.target\nEOF\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigcaption>\u003Cp>\u003Cspan>This service unit file which allows you to start, stop, and restart the OoklaServer process.\u003C\u002Fspan>\u003C\u002Fp>\u003C\u002Ffigcaption>\u003C\u002Ffigure>\u003Cp>Reload the systemd daemon for changes to take effect:\u003C\u002Fp>\u003Cpre>\u003Ccode>[root@AS12345-OOKLA1 ~]# systemctl daemon-reload\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Enable the service and socket target:\u003C\u002Fp>\u003Cpre>\u003Ccode>[root@AS12345-OOKLA1 ~]# systemctl enable --now ooklaserver.socket\n[root@AS12345-OOKLA1 ~]# systemctl enable ooklaserver.service\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Let's check whether the \u003Cem>ooklaserver\u003C\u002Fem> service is now present:\u003C\u002Fp>\u003Cpre>\u003Ccode>[root@AS12345-OOKLA1 ~]# systemctl status ooklaserver\n● ooklaserver.service\n   Loaded: loaded (\u002Fetc\u002Fsystemd\u002Fsystem\u002Fooklaserver.service; disabled; vendor preset: disabled)\n   Active: inactive (dead)\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch2 id=\"selinux-configuration\">SELinux Configuration\u003C\u002Fh2>\u003Cp>Looking good! Let's try to fire it up :)\u003C\u002Fp>\u003Cpre>\u003Ccode>[root@AS12345-OOKLA1 ~]# systemctl start ooklaserver\nFailed to start ooklaserver.service: Unit ooklaserver.service has a bad unit file setting.\nSee system logs and 'systemctl status ooklaserver.service' for details.\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Whooops! Something ain't right. Let's check the system's audit.log and see whether we're having trouble with the SELinux policy:\u003C\u002Fp>\u003Cpre>\u003Ccode>[root@AS12345-OOKLA1 ~]# grep 'denied' \u002Fvar\u002Flog\u002Faudit\u002Faudit.log | grep 'ooklaserver.sh' | tail -1\ntype=AVC msg=audit(1693744541.087:1431): avc:  denied  { execute } for  pid=7644 comm=\"(erver.sh)\" name=\"ooklaserver.sh\" dev=\"sda\" ino=265528 scontext=system_u:system_r:init_t:s0 tcontext=unconfined_u:object_r:user_home_t:s0 tclass=file permissive=0\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Fair enough! SELinux prevents systemd from executing files of type \u003Ccode>user_home_t\u003C\u002Fcode>! Luckily, there is an easy fix for that. First, let's install the policy core utilities and extend the local SELinux file context to change the label of the \u003Cem>ooklaserver.sh\u003C\u002Fem> script.\u003C\u002Fp>\u003Cpre>\u003Ccode>[root@AS12345-OOKLA1 ~]# dnf install -y policycoreutils policycoreutils-python-utils\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Now, let's change the file type from \u003Ccode>user_home_t\u003C\u002Fcode> to \u003Ccode>initrc_exec_t\u003C\u002Fcode> so systemd can execute the script:\u003C\u002Fp>\u003Cpre>\u003Ccode>[root@AS12345-OOKLA1 ~]# semanage fcontext --add --type initrc_exec_t \u002Fhome\u002Fooklaserver\u002Fooklaserver.sh\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Now we'll just have to restore the security labels:\u003C\u002Fp>\u003Cpre>\u003Ccode>[root@AS12345-OOKLA1 ~]# restorecon -RFv \u002Fhome\u002Fooklaserver\nRelabeled \u002Fhome\u002Fooklaserver\u002Fooklaserver.sh from unconfined_u:object_r:user_home_t:s0 to system_u:object_r:initrc_exec_t:s0\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cdiv class=\"kg-card kg-callout-card kg-callout-card-red\">\u003Cdiv class=\"kg-callout-emoji\">🔥\u003C\u002Fdiv>\u003Cdiv class=\"kg-callout-text\">\u003Cb>\u003Cstrong>DANGER, WILL ROBINSON! \u003C\u002Fstrong>\u003C\u002Fb>\u003Cu>Don't just blindly turn off SELinux looking for a quick fix.\u003C\u002Fu> Take the time to understand it and learn how to harness its power. When active, SELinux is on your side, making it significantly harder for attackers to move around the system and gain elevated system access.\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cp>Let's try to fire it up, again!\u003C\u002Fp>\u003Cpre>\u003Ccode>[root@AS12345-OOKLA1 ~]# systemctl start ooklaserver\n\n[root@AS12345-OOKLA1 ~]# systemctl status ooklaserver\n● ooklaserver.service\n   Loaded: loaded (\u002Fetc\u002Fsystemd\u002Fsystem\u002Fooklaserver.service; enabled; vendor preset: disabled)\n   Active: active (running) since Sun 2023-09-03 12:43:51 UTC; 2h 12min ago\n  Process: 7706 ExecStart=\u002Fhome\u002Fooklaserver\u002Fooklaserver.sh start (code=exited, status=0\u002FSUCCESS)\n[...]\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>BOOM!\u003C\u002Fp>\u003Cp>Closing Remarks\u003C\u002Fp>\u003Cp>Let's check that the speedtest server processes are listening on all required ports:\u003C\u002Fp>\u003Cpre>\u003Ccode>[root@AS12345-OOKLA1 ~]# lsof -nPiTCP:80,443,8080,5060\nCOMMAND    PID        USER   FD   TYPE DEVICE SIZE\u002FOFF NODE NAME\nsystemd      1        root   50u  IPv6  51435      0t0  TCP *:80 (LISTEN)\nsystemd      1        root   51u  IPv6  51436      0t0  TCP *:443 (LISTEN)\nOoklaServ 7715 ooklaserver    3u  IPv6  51435      0t0  TCP *:80 (LISTEN)\nOoklaServ 7715 ooklaserver    4u  IPv6  51436      0t0  TCP *:443 (LISTEN)\nOoklaServ 7748 ooklaserver    4u  IPv4  51101      0t0  TCP *:5060 (LISTEN)\nOoklaServ 7748 ooklaserver    6u  IPv4  51126      0t0  TCP *:8080 (LISTEN)\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch2 id=\"ookla-speed-server-test\">OOKLA Speed Server Test\u003C\u002Fh2>\u003Cp>The last step is to test your server using the \u003Ca href=\"https:\u002F\u002Fwww.speedtest.net\u002Fhost-tester?ref=ghost.jdneer.com\">OOKLA server tester\u003C\u002Fa> before requesting it to be listed publicly.\u003C\u002Fp>\u003Cdiv class=\"kg-card kg-callout-card kg-callout-card-red\">\u003Cdiv class=\"kg-callout-emoji\">❗\u003C\u002Fdiv>\u003Cdiv class=\"kg-callout-text\">OOKLA typically mandates that all speedtest servers support IPv6 connectivity. This necessitates setting up an IPv6 DNS record (AAAA) for your server's FQDN. Without a genuine IPv6 connection, your server might not be included in the public server pool.\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cp>Here's a test for a server with properly configured DNS, IPv4 and IPv6 connectivity:\u003C\u002Fp>\u003Cfigure class=\"kg-card kg-image-card\">\u003Cimg src=\"\u002Fcontent\u002Fimages\u002F2025\u002F01\u002Fimage-2.png\" class=\"kg-image\" alt=\"\" loading=\"lazy\" width=\"1159\" height=\"1250\" srcset=\"\u002Fcontent\u002Fimages\u002Fsize\u002Fw600\u002F2025\u002F01\u002Fimage-2.png 600w, \u002Fcontent\u002Fimages\u002Fsize\u002Fw1000\u002F2025\u002F01\u002Fimage-2.png 1000w, \u002Fcontent\u002Fimages\u002F2025\u002F01\u002Fimage-2.png 1159w\" sizes=\"(min-width: 720px) 720px\" \u002F>\u003C\u002Ffigure>\u003Cp>If you want to manually stop the ooklaserver service, do this:\u003C\u002Fp>\u003Cpre>\u003Ccode>[root@AS12345-OOKLA1 ~]# systemctl stop ooklaserver\u003C\u002Fcode>\u003C\u002Fpre>\u003Cdiv class=\"kg-card kg-callout-card kg-callout-card-green\">\u003Cdiv class=\"kg-callout-emoji\">💡\u003C\u002Fdiv>\u003Cdiv class=\"kg-callout-text\">Need some help with this topic? You can book a consultation with me to get expert advice! Click \u003Ca href=\"https:\u002F\u002Fcal.com\u002Fjdbungart?ref=ghost.jdneer.com\" rel=\"noreferrer\">this link\u003C\u002Fa> to get started.\u003C\u002Fdiv>\u003C\u002Fdiv>","I'm gonna walk you through a simple guide to get your OOKLA Speedtest server(s) up and running on RockyLinux 8. We'll even make it start automatically...",{"src":60},"2025-02-13T11:47:05.000+08:00",{"name":72,"url":10,"owner":5},"JD Bungart",[74,86,94,102],{"slug":75,"title":76,"excerpt":77,"image":78,"publishedAt":79,"topics":80,"readMinutes":85},"package-cooldowns-github-package-firewall-npm-pnpm-bun-pip-uv-poetry","Package Cooldowns Compared: GitHub Package Firewall vs. What npm, pnpm, Yarn, Bun, pip, uv and Poetry Already Do","GitHub now offers an install-time firewall for npm, free in preview and metered later. Most package managers already ship a free cooldown. Here is what each tool does, the copy-paste config, and where cooldowns stop helping.","\u002Fcontent\u002Fimages\u002F2026\u002F10\u002Fpkg-cooldowns-conveyor-alberto-rodriguez-unsplash.jpg","2026-10-26T14:00:00.000+08:00",[81,82],{"key":64,"label":65},{"key":83,"label":84},"security","Security",1,{"slug":87,"title":88,"excerpt":89,"image":90,"publishedAt":91,"topics":92,"readMinutes":85},"hetzner-cloud-private-network-behind-your-own-firewall","Building a Private Network on Hetzner Cloud Behind Your Own Firewall","Keep servers off the public internet: a Hetzner Cloud private network with one route, your own firewall as the gateway, and working configs for Ubuntu and Rocky Linux 8.","\u002Fcontent\u002Fimages\u002F2026\u002F10\u002Fhetzner-private-network-feature-a1.png","2026-10-22T20:00:00.000+08:00",[93],{"key":64,"label":65},{"slug":95,"title":96,"excerpt":97,"image":98,"publishedAt":99,"topics":100,"readMinutes":85},"stretch-ixgbe-driver-allow-unsupported-sfp-modules-on-intel-x520-cards","Debian: IXGBE Driver - Allow unsupported SFP+ Modules on Intel X520 Cards","The Server hardware we use for Proxmox deployments often has Intel X520 (ixgbe driver) or X710 (i40e driver) cards installed. These provide for several SFP+ ports required for 10 Gigabit connectivity. Enterprise vendors such as DELL and Intel provide compatibility lists for SFP transceivers that are supported by their network adapters. Often times adapter firmware requires specifically encoded modules, preventing any unsupported modules from being initialized. One way to work around this probl","\u002Fcontent\u002Fimages\u002F2019\u002F09\u002FIMG_20190926_171628.resized-2.jpg","2019-09-27T17:50:00.000+08:00",[101],{"key":64,"label":65},{"slug":103,"title":104,"excerpt":105,"image":106,"publishedAt":107,"topics":108,"readMinutes":85},"cost-efficient-virtual-machine-clustering-with-proxmox-ve-for-smes-and-enterprises","Cost-efficient Virtual Machine Clustering with Proxmox VE for SMEs and Enterprises","Proxmox VE is a web based, open source hardware virtualization platform based on Debian GNU\u002FLinux. It allows for virtualizing unmodified guests using the kernel based virtual machine (KVM) which is the native implementation of hardware assisted virtualization that's embedded into the linux kernel. In addition, Proxmox VE also supports Linux containers (LXC) being an OS level type of virtualization. Hardware assisted virtualization requires special support of a machine's processor commonly known","\u002Fcontent\u002Fimages\u002F2018\u002F09\u002FIMG_20180927_002650_1500-1.jpg","2018-09-29T22:37:00.000+08:00",[109],{"key":64,"label":65},{"left":15,"top":15,"width":26,"height":26,"rotate":15,"vFlip":13,"hFlip":13,"body":111},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 12h14M5 12l6 6m-6-6l6-6\"\u002F>",{"left":15,"top":15,"width":26,"height":26,"rotate":15,"vFlip":13,"hFlip":13,"body":113},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M6.5 7.5a1 1 0 1 0 2 0a1 1 0 1 0-2 0\"\u002F>\u003Cpath d=\"M3 6v5.172a2 2 0 0 0 .586 1.414l7.71 7.71a2.41 2.41 0 0 0 3.408 0l5.592-5.592a2.41 2.41 0 0 0 0-3.408l-7.71-7.71A2 2 0 0 0 11.172 3H6a3 3 0 0 0-3 3\"\u002F>\u003C\u002Fg>"]