<?xml version="1.0" encoding="UTF-8" standalone="no"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:gd="http://schemas.google.com/g/2005" xmlns:georss="http://www.georss.org/georss" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-5554915078212081470</atom:id><lastBuildDate>Fri, 26 Dec 2025 14:40:00 +0000</lastBuildDate><category>InfoSec</category><category>unix</category><category>openbsd</category><category>hack</category><category>meetings</category><category>rant</category><category>humor</category><category>linux</category><category>sysadmin</category><category>kansascity</category><category>physicalsecurity</category><category>wireless</category><category>php</category><category>unixtips</category><category>Electronics</category><category>lockpicking</category><category>Operatingsystems</category><category>OSX</category><category>Windows</category><category>encryption</category><category>apache</category><category>blogs</category><category>locks</category><category>mysql</category><category>networking</category><category>readingroom</category><category>bsd</category><category>hardware</category><category>oamp</category><category>ubuntu</category><category>DefCon16</category><category>HiR Info</category><category>virtualization</category><category>FreeBSD</category><category>opensource</category><category>script</category><category>wrong</category><category>Apple</category><category>fail</category><category>mobile</category><category>programming</category><category>shell</category><category>ssh</category><category>twitter</category><category>Websecurity</category><category>fon</category><category>games</category><category>hackers</category><category>privacy</category><category>radio</category><category>software</category><category>links</category><category>music</category><category>news</category><category>raspberrypi</category><category>repair</category><category>tools</category><category>web filter</category><category>DefCon17</category><category>Old School</category><category>attack</category><category>computing</category><category>conventions</category><category>exploit</category><category>hackerspace</category><category>proxy</category><category>socialengineering</category><category>Geek100</category><category>MAC</category><category>ccckc</category><category>computer hacker</category><category>dc16badge</category><category>google</category><category>malware</category><category>password</category><category>2600</category><category>AIX</category><category>BlackHat2008</category><category>DumpsterDiving</category><category>OpenSolaris</category><category>backup</category><category>baz</category><category>dnstunnel</category><category>evasion</category><category>evilwifi</category><category>fire</category><category>ham</category><category>history</category><category>install</category><category>microsoft</category><category>newlisp</category><category>photography</category><category>tunneling</category><category>Books</category><category>IP</category><category>Magazines</category><category>amp</category><category>archlinux</category><category>awareness</category><category>awk</category><category>defense</category><category>epoch</category><category>explosives</category><category>hacks</category><category>httpd</category><category>jasager</category><category>jornada</category><category>laptop</category><category>metasploit</category><category>netbsd</category><category>openvas</category><category>presentation</category><category>recovery</category><category>scanning</category><category>socialnetworking</category><category>solaris</category><category>storage</category><category>vulnerability</category><category>web browser</category><category>workbench</category><category>CLI</category><category>DIYLockpickSeries</category><category>Gadgets</category><category>IBM</category><category>LOAD OF CRAP</category><category>Surveillance</category><category>application security</category><category>audit</category><category>boot</category><category>breach</category><category>chroot</category><category>cloud</category><category>contests</category><category>cyberraid</category><category>debian</category><category>ethernet</category><category>frogman</category><category>guestposts</category><category>handhelds</category><category>risk</category><category>support</category><category>threat</category><category>transportation</category><category>vx8550</category><category>x11</category><category>xkcd</category><category>CCTV</category><category>FreeStuff</category><category>LG</category><category>Polls</category><category>QPST</category><category>RBAC</category><category>RSS</category><category>Steganography</category><category>antivirus</category><category>backtrack</category><category>base64</category><category>blackarch</category><category>bsideskc</category><category>build cheap</category><category>compliance</category><category>craft</category><category>cron</category><category>education</category><category>honeynet</category><category>honeypot</category><category>intro</category><category>isync</category><category>javascript</category><category>jobs</category><category>knowledge</category><category>mainframe</category><category>make</category><category>motorola</category><category>nginx</category><category>onmp</category><category>package management</category><category>patch</category><category>perl</category><category>pizero</category><category>pranks</category><category>reconfigure</category><category>retro</category><category>reviews</category><category>scam</category><category>scifi</category><category>skills</category><category>syslog</category><category>terror</category><category>tether</category><category>worm</category><category>1U rackmount</category><category>3D</category><category>BONJOUR</category><category>BitPIM</category><category>Bitblocker</category><category>CAD</category><category>CPAP</category><category>DefCon18</category><category>EFS</category><category>Eugene Rabinowitch</category><category>HiD</category><category>NSM</category><category>RENDEVOUS</category><category>RIM</category><category>ReactOS</category><category>Search</category><category>Stallman</category><category>Vista</category><category>ZCN</category><category>ZendFramework</category><category>accounting</category><category>aesthetic</category><category>appsec</category><category>assessment</category><category>bbs</category><category>bc</category><category>biometric</category><category>blackberry</category><category>bluetooth</category><category>brainstorm</category><category>brightkite</category><category>buffer overflow</category><category>cable</category><category>caffeine</category><category>career</category><category>certifications</category><category>charity</category><category>chat</category><category>chdk</category><category>cheaters</category><category>claude</category><category>clickjacking</category><category>clustering</category><category>coffee</category><category>conspiracy</category><category>dc17badge</category><category>desktop</category><category>devops</category><category>diagnostics</category><category>drama</category><category>droid2global</category><category>e815</category><category>emacs</category><category>email</category><category>end-user</category><category>facebook</category><category>ferret</category><category>fiction</category><category>fiction sf literature</category><category>find</category><category>firewall</category><category>flickr</category><category>foo</category><category>forensics</category><category>ftpd</category><category>fud</category><category>github</category><category>gmrs</category><category>googlehacks</category><category>gps</category><category>hackerfuel</category><category>hackersforcharity</category><category>hamster</category><category>heat</category><category>heatsink</category><category>holywar</category><category>hpfeeds</category><category>identity</category><category>ids</category><category>insider</category><category>iodine</category><category>ipod</category><category>kali</category><category>key</category><category>kids</category><category>kubernetes</category><category>kubuntu</category><category>ldom</category><category>leadership</category><category>linksys</category><category>literature</category><category>llm</category><category>log</category><category>lvm</category><category>mail</category><category>map</category><category>mechanical</category><category>mediawiki</category><category>memory</category><category>mind</category><category>motion</category><category>movies</category><category>mud</category><category>nessus</category><category>netbook</category><category>netbook design evolution</category><category>netbook design evolution technology</category><category>nostalgia</category><category>office</category><category>outdoors</category><category>overview</category><category>owasp</category><category>ozymandns</category><category>pfsense</category><category>phishing</category><category>physics</category><category>pkgsrc</category><category>poe</category><category>postfix</category><category>potty-humor</category><category>proximity card</category><category>python</category><category>radiosonde</category><category>redundancy</category><category>rickroll</category><category>robotics</category><category>rsync</category><category>rumors</category><category>safety</category><category>sandbox</category><category>science</category><category>screensaver</category><category>sdr</category><category>seckc</category><category>secret</category><category>seo</category><category>sidejacking</category><category>sleep</category><category>snort</category><category>space</category><category>spreadsheets</category><category>spyware</category><category>sqli</category><category>sqlinjection</category><category>ssl</category><category>steampunk book review fiction rant</category><category>stories</category><category>subversion</category><category>sudo</category><category>sun</category><category>svn</category><category>tcpdump</category><category>tech economy cheap</category><category>television</category><category>the end</category><category>thinclient</category><category>timex sinclair</category><category>toys</category><category>tracing</category><category>tw2002</category><category>usb thumb drive hardware hack mod artistic</category><category>virtualbox</category><category>weather</category><category>white list</category><category>wordpress</category><category>wtf</category><category>x10</category><category>xampp</category><category>xorg</category><category>z80</category><title>HiR Information Report</title><description>Covering security, programming, systems administration and other interesting topics.</description><link>http://www.h-i-r.net/</link><managingEditor>noreply@blogger.com (Ax0n)</managingEditor><generator>Blogger</generator><openSearch:totalResults>604</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5554915078212081470.post-887255717964658019</guid><pubDate>Mon, 06 Oct 2025 01:55:00 +0000</pubDate><atom:updated>2025-10-05T20:55:07.106-05:00</atom:updated><title>Self-Hosting a BitWarden-Compatible Password Manager Service</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguDpJ5DM5ypP0rVfa439rzJzn0uQIBwXC_18yVO9wRLhzYV51dbtVCZ7sYCCy-ikLS-9FC3M0R89G9aKLDYXQBhVAdheLnt9xQqZy3F-1LrCDuaRHuKpfKQjWVpA9h-3uEpGrTlpSo6MUdy90hPN0LuCZYZUKz0rn0O_NW9ye05h87_Qz9AVVyXI4-FTw/s1310/vwadmin.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="765" data-original-width="1310" height="374" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguDpJ5DM5ypP0rVfa439rzJzn0uQIBwXC_18yVO9wRLhzYV51dbtVCZ7sYCCy-ikLS-9FC3M0R89G9aKLDYXQBhVAdheLnt9xQqZy3F-1LrCDuaRHuKpfKQjWVpA9h-3uEpGrTlpSo6MUdy90hPN0LuCZYZUKz0rn0O_NW9ye05h87_Qz9AVVyXI4-FTw/w640-h374/vwadmin.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;When you trust third parties with your password vault, there’s always some risk. Most password manager services use zero-knowledge encryption to keep your passwords safe, but they still have enough information about you to identify you, and there may be useful metadata or billing information stored. Furthermore, if the service is offline for maintenance or under a denial-of-service attack, you may have trouble accessing your passwords. All password manager services cost money if you want all the features. The free plans provide only basic functionality for a single user.&lt;br /&gt;&lt;br /&gt;Hosting your own password vault comes with plenty of risks, too. You are solely responsible for patches, maintenance, backups, and providing support to family, co-workers or friends using your solution. &lt;b&gt;I cannot overstate the seriousness and responsibility that comes with managing a service like this for other people, or the consequences of doing it poorly.&lt;/b&gt;&lt;/p&gt;&lt;p&gt;BitWarden is open-source, and there are several alternative implementations that work well. For ease of use, I’ll focus on deploying&amp;nbsp;&lt;a href="https://www.vaultwarden.net/" target="_blank"&gt;VaultWarden&lt;/a&gt;&amp;nbsp;in Docker with an nginx front-end. My production environment is running the rust server directly on OpenBSD with relayd.&lt;br /&gt;&lt;br /&gt;You’ll need a DNS domain, access to create DNS entries, and a public-facing server that’s accessible via HTTPS. You might be able to run this at home, but a dedicated server, VPS or cloud server might be more reliable. I’ll be using the latest Debian bookworm for this, but Ubuntu Server, Amazon Linux, etc should work fine with minor adjustments.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;You should have a DNS entry for your VaultWarden server. The examples use vault.yourdomain.com and you should adjust that accordingly.&lt;br /&gt;&lt;br /&gt;Make sure all the packages are up to date&lt;/p&gt;&lt;p&gt;&lt;span style="color: #6aa84f;"&gt;sudo apt update &amp;amp;&amp;amp; sudo apt upgrade -y&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Install packages:&lt;br /&gt;&lt;span style="color: #6aa84f;"&gt;sudo apt install -y docker.io nginx docker-compose certbot&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Add yourself to the docker group&lt;/p&gt;&lt;p&gt;&lt;span style="color: #6aa84f;"&gt;sudo usermod -aG docker ${USER}&lt;br /&gt;newgrp docker&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Create a directory for VaultWarden&lt;/p&gt;&lt;p&gt;&lt;span style="color: #6aa84f;"&gt;mkdir vaultwarden&lt;br /&gt;cd vaultwarden&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This will download the latest VaultWarden docker image and then run a command inside a temporary container to generate the strong encrypted hash for the administrator login page.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #6aa84f;"&gt;docker run --rm -it vaultwarden/server /vaultwarden hash&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Create a strong password.&lt;br /&gt;&lt;br /&gt;Create .env file based on the output of the hash generator. There are many special characters in the hash, and it's easiest to just reference this value as a variable rather than trying to get it into the docker-compose.yml file directly. Note the prefix “VAULTWARDEN_” on this line.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #3d85c6;"&gt;VAULTWARDEN_ADMIN_TOKEN='$argon2id$v=19$m=65540,t=3,p=4…'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Create docker-compose.yml:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #3d85c6;"&gt;services:&lt;br /&gt;&amp;nbsp; vaultwarden:&lt;br /&gt;&amp;nbsp; &amp;nbsp; image: vaultwarden/server:latest&lt;br /&gt;&amp;nbsp; &amp;nbsp; container_name: vaultwarden&lt;br /&gt;&amp;nbsp; &amp;nbsp; restart: unless-stopped&lt;br /&gt;&amp;nbsp; &amp;nbsp; volumes:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - ./vw-data:/data&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - /var/log/vaultwarden:/var/log/vaultwarden&lt;br /&gt;&amp;nbsp; &amp;nbsp; environment:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - DOMAIN=https://vault.yourdomain.com&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - SIGNUPS_ALLOWED=true&amp;nbsp; # Set to false after creating accounts&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - SHOW_PASSWORD_HINT=false&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - ROCKET_PORT=80&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - LOG_FILE=/var/log/vaultwarden/vaultwarden.log&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - LOG_LEVEL=info&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - EXTENDED_LOGGING=true&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - IP_HEADER=X-Forwarded-For&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - ADMIN_TOKEN=${VAULTWARDEN_ADMIN_TOKEN}&lt;br /&gt;&amp;nbsp; &amp;nbsp; ports:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - "127.0.0.1:8080:80"&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;We have a chicken-and-egg problem now. nginx will be running after installation, but we can't configure it for TLS without the certificates from LetsEncrypt, and we can't run certbot while nginx is running. Let's stop nginx and run certbot manually. Don't forget to use your correct DNS name and email address for the certbot command.&lt;/p&gt;&lt;p&gt;&lt;span style="color: #6aa84f;"&gt;sudo systemctl stop nginx&lt;br /&gt;&lt;br /&gt;sudo certbot certonly --standalone -d vault.yourdomain.com --non-interactive --agree-tos --email you@email.com&amp;nbsp; --redirect&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Create the nginx config file /etc/nginx/sites-available/vault&amp;nbsp;&lt;br /&gt;&lt;span style="color: #3d85c6;"&gt;# Redirect HTTP to HTTPS&lt;br /&gt;server {&lt;br /&gt;&amp;nbsp; &amp;nbsp; listen 80;&lt;br /&gt;&amp;nbsp; &amp;nbsp; listen [::]:80;&lt;br /&gt;&amp;nbsp; &amp;nbsp; server_name vault.yourdomain.com;&lt;br /&gt;&amp;nbsp; &amp;nbsp; return 301 https://$server_name$request_uri;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;# HTTPS Server&lt;br /&gt;server {&lt;br /&gt;&amp;nbsp; &amp;nbsp; listen 443 ssl;&lt;br /&gt;&amp;nbsp; &amp;nbsp; listen [::]:443 ssl;&lt;br /&gt;&amp;nbsp; &amp;nbsp; http2 on;&lt;br /&gt;&amp;nbsp; &amp;nbsp; server_name vault.yourdomain.com;&lt;br /&gt;&amp;nbsp; &amp;nbsp; ssl_certificate /etc/letsencrypt/live/vault.yourdomain.com/fullchain.pem;&lt;br /&gt;&amp;nbsp; &amp;nbsp; ssl_certificate_key /etc/letsencrypt/live/vault.yourdomain.com/privkey.pem;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; # Security headers&lt;br /&gt;&amp;nbsp; &amp;nbsp; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;&lt;br /&gt;&amp;nbsp; &amp;nbsp; add_header X-Frame-Options "SAMEORIGIN" always;&lt;br /&gt;&amp;nbsp; &amp;nbsp; add_header X-Content-Type-Options "nosniff" always;&lt;br /&gt;&amp;nbsp; &amp;nbsp; add_header X-XSS-Protection "1; mode=block" always;&lt;br /&gt;&amp;nbsp; &amp;nbsp; add_header Referrer-Policy "same-origin" always;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; # Proxy to Vaultwarden&lt;br /&gt;&amp;nbsp; &amp;nbsp; location / {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; proxy_pass http://127.0.0.1:8080;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; proxy_set_header Host $host;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; proxy_set_header X-Forwarded-Proto $scheme;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # WebSocket support for live sync&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; proxy_http_version 1.1;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; proxy_set_header Upgrade $http_upgrade;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; proxy_set_header Connection $connection_upgrade;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; # Increase file size for vault exports/imports &amp;amp; sends&lt;br /&gt;&amp;nbsp; &amp;nbsp; client_max_body_size 128M;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;# WebSocket connection upgrade map&lt;br /&gt;map $http_upgrade $connection_upgrade {&lt;br /&gt;&amp;nbsp; &amp;nbsp; default upgrade;&lt;br /&gt;&amp;nbsp; &amp;nbsp; ''&amp;nbsp; &amp;nbsp; &amp;nbsp; "";&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Enable this site by creating a symlink to it from sites-enabled:&lt;/p&gt;&lt;p&gt;&lt;span style="color: #6aa84f;"&gt;sudo ln -s /etc/nginx/sites-available/vault /etc/nginx/sites-enabled/vault&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Use this fun trick to replace all the host names in your docker-compose and nginx files, if you didn't edit them manually already. Obviously, replace "vault.h-i-r.net" with your own host name.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #6aa84f;"&gt;sudo sed -i 's/vault.yourdomain.com/vault.h-i-r.net/g' /etc/nginx/sites-available/vault ~/vaultwarden/docker-compose.yml&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Start Vaultwarden and check the logs:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #6aa84f;"&gt;cd ~/vaultwarden&lt;br /&gt;docker-compose up -d&lt;br /&gt;docker-compose logs&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Test the nginx configuration first:&lt;br /&gt;&lt;span style="color: #6aa84f;"&gt;sudo nginx -t&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;If no errors are found, start nginx:&lt;br /&gt;&lt;span style="color: #6aa84f;"&gt;sudo systemctl start nginx&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Browse to your vault URL and create an account. Choose a strong master password. I recommend a passphrase. Resist the urge to use your web browser’s built-in password manager to generate a password, and do not allow the web browser to store this password.&lt;br /&gt;&lt;br /&gt;You can import passwords, generate new ones, set up multi-factor authentication, set up shared passwords and more.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Visit the VaultWarden admin panel at your URL /admin&lt;br /&gt;&lt;br /&gt;Log in using the password you used to generate the admin token. Here, you can tune configuration options, manage user accounts, disable new user signups, set a new admin token, etc. Generally, the default values are safe and most of the premium paid features are enabled by default.&lt;br /&gt;&lt;br /&gt;Install the official BitWarden browser plugins, desktop and mobile apps for your platforms. When you first attempt to login, select the “self-hosted” server and enter the URL for your new VaultWarden server. Sign in with the username and master password you created. Once installed, you can also set up biometric and passkey unlock.&lt;br /&gt;&lt;br /&gt;To back up your own personal vault, use web or desktop, and export an encrypted, password-protected json backup. This file is resistant to cracking, and is good enough to keep saved on unencrypted backups, an external drive you keep in a safe place, or even cloud storage, so long as the password is very strong.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;P&gt;We are proud members of the &lt;A HREF="http://securitybloggers.net/"&gt;Security Bloggers Network&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;This content originally posted on &lt;A HREF="http://www.h-i-r.net/"&gt;HiR Information Report&lt;/A&gt;. Copyright © 1997-2010, HiR&lt;/P&gt;&lt;/div&gt;</description><link>http://www.h-i-r.net/2025/10/self-hosting-bitwarden-compatible.html</link><author>noreply@blogger.com (Ax0n)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguDpJ5DM5ypP0rVfa439rzJzn0uQIBwXC_18yVO9wRLhzYV51dbtVCZ7sYCCy-ikLS-9FC3M0R89G9aKLDYXQBhVAdheLnt9xQqZy3F-1LrCDuaRHuKpfKQjWVpA9h-3uEpGrTlpSo6MUdy90hPN0LuCZYZUKz0rn0O_NW9ye05h87_Qz9AVVyXI4-FTw/s72-w640-h374-c/vwadmin.png" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5554915078212081470.post-5103492465150805014</guid><pubDate>Thu, 18 Sep 2025 04:35:00 +0000</pubDate><atom:updated>2025-09-17T23:35:25.941-05:00</atom:updated><title>Raspberry Pi Home-Lab IDS with Suricata and Wazuh</title><description>&lt;p&gt;I recently set up Suricata IDS in my home lab again as part of a re-build.&amp;nbsp;&amp;nbsp;&lt;br /&gt;You'll need a RaspberryPi 3, 4 or 5 and an inexpensive smart switch that can mirror traffic from your home lab environment.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://amzn.to/420PpLc" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1290" data-original-width="1008" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJqD8VQTRFdmJsXbbDIjzKXGyPDIfltHH1x-SU3Kpx-GimoYcOMlFJmMF8lDWaZNit5RGLe3EzJZGXtiUr3BCbIvddl7WO1qI9DG8N8UFgvcdUZYbfiKIpBnAkF5PjbenjNpDXnXUeBDuKcX6JeaIejbFtvCgt57ARJYo8hDT_MWaAfocnuMeMKy2qrBw/w156-h200/Screenshot_20250917-132222.png" width="156" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;I opted for the &lt;a href="https://amzn.to/420PpLc"&gt;TP-Link TL-SG105e&lt;/a&gt; and TL-SG-108e switches for my home lab, with 5 and 8 1GBPS ports, respectively. I've been using these switches for years and they seem to be popular in the homelab community.&amp;nbsp;&lt;p&gt;&lt;/p&gt;&lt;p&gt;I think the 4GB Raspberry Pi 4 is probably a good balance of affordability and resources. This setup was just a little sluggish on the Pi 3, but it worked fine once it was up and running. On 32-bit platforms like the Raspberry Pi 2, only older versions of Suricata seem to be available.&lt;/p&gt;&lt;p&gt;I would avoid buying Raspberry Pi boards from Amazon, as they're usually overpriced, fulfilled by sketchy resellers, or only sold as part of cost-ineffective bundles by companies that deal primarily in hobby electronics accessories. In North America, &lt;a href="https://www.adafruit.com/search?q=raspberry+pi&amp;amp;a%5B%5D=i"&gt;Adafruit&lt;/a&gt; is probably the most reliable place to buy one online, if you don't have a retail storefront that sells them locally.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Flash the latest &lt;a href="https://www.raspberrypi.com/software/operating-systems/" target="_blank"&gt;RasPiOS bookworm lite&lt;/a&gt; image to SD Card. Once it's flashed, set it up for remote SSH access. You can do this 100% headless by preparing the SD card. If you're on Linux or MacOS, you can go open the boot partition of the SD Card and run these commands to auto-provision your account and enable SSH on first boot. Obviously, choose a different username and password than this:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #38761d;"&gt;echo myusername:$(echo 'mypassword' | openssl passwd -6 -stdin) &amp;gt; userconf.txt&lt;br /&gt;&lt;br /&gt;touch ssh&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglmti7IImVr651W9fUWFfXxfJOr0ljs3UCEL7WIh_kjUOSsFxMoiaA6raylPEZr97seBZi92rNNGfUxPcoYKrJu27T5HkMCJzFl42AUe6an5zXryJQ6LnhfV9XRZjS8ELEWDobLsiP9PbVBNzztE2kHwq8BcuVeaO8ZY0Es0FwS0YBM8qHKm4LLDRrVHY/s878/tpmirrror.png" style="clear: left; float: left; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" data-original-height="781" data-original-width="878" height="285" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglmti7IImVr651W9fUWFfXxfJOr0ljs3UCEL7WIh_kjUOSsFxMoiaA6raylPEZr97seBZi92rNNGfUxPcoYKrJu27T5HkMCJzFl42AUe6an5zXryJQ6LnhfV9XRZjS8ELEWDobLsiP9PbVBNzztE2kHwq8BcuVeaO8ZY0Es0FwS0YBM8qHKm4LLDRrVHY/s320/tpmirrror.png" width="320" /&gt;&lt;/a&gt;Next, log in to your smart switch and set up port mirroring. I mirrored only the port for my target lab machine on port 1 to mySuricata Raspberry Pi on port 2. Generally, you should only mirror one single port to the pi, and be careful about mirroring the uplink if there's a lot going on in your lab. Under most conditions, you should be able to use the single Ethernet interface on your Raspberry Pi for both management and IDS sniffing.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;Make sure the OS is up to date, then install suricata, tcpdump and jq.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #38761d;"&gt;sudo apt update &amp;amp;&amp;amp; sudo apt -y upgrade&lt;br /&gt;&lt;br /&gt;sudo apt -y install suricata tcpdump jq&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;We need to edit the configuration slightly. You may want to adjust $HOME_NET to focus only on the "target" part of your home lab, and we definitely need to fix the rule path to align with the rule set we're installing, because the default rules won't catch anything useful.&lt;br /&gt;&lt;br /&gt;edit /etc/suricata/suricata.yaml and change&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #3d85c6;"&gt;default-rule-path: /etc/suricata/rules&lt;/span&gt;&lt;br /&gt;&amp;nbsp;to&amp;nbsp;&lt;br /&gt;&lt;span style="color: #3d85c6;"&gt;default-rule-path: /var/lib/suricata/rules&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you plan on using Suricata to detect attacks that happen entirely within your LAN, you should update home-net to a list of your target systems, for example my home lab target is 192.168.1.135, so &lt;span style="color: #3d85c6;"&gt;HOME_NET = "[192.168.1.135/32]"&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;br /&gt;However, if you're watching all of your NAT targets for attacks involving the public internet, the default list is fine, and covers all RFC1918 addresses.&lt;/p&gt;&lt;p&gt;If you have a substantially large SD card and feel like you will want the option to deeply examine the raw packet data for identified attacks, enable pcap-log in /etc/suricata/suricata.yaml. The default settings will likely eat up many gigabytes of space. Mine looks more like this.&lt;/p&gt;&lt;p&gt;&lt;span style="color: #3d85c6;"&gt;&amp;nbsp; - pcap-log:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; enabled: yes&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; filename: log.pcap&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; limit: 1000mb&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; max-files: 10&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; compression: none&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; mode: normal&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Add the Emerging-All rule source and run suricata-update to install them.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #38761d;"&gt;sudo suricata-update add-source et-all https://rules.emergingthreats.net/open/suricata-6.0/emerging-all.rules.tar.gz&lt;br /&gt;&lt;br /&gt;sudo suricata-update -v&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;I had to stop and start suricata to get the new rules to load. A simple "restart" didn't work for some reason.&lt;br /&gt;&lt;span style="color: #38761d;"&gt;&lt;br /&gt;sudo systemctl stop suricata&lt;br /&gt;sudo systemctl start suricata&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You can use jq to parse the event log looking for alerts&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #38761d;"&gt;jq '. | select(.event_type=="alert")' /var/log/suricata/eve.json&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;and it's not too hard to set up the Wazuh agent to send these to your home lab SIEM. Once you have installed wazuh-agent on your Raspberry Pi, you can add various log files to monitor by editing /var/ossec/etc/ossec.conf and adding this block near the end of the file.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #3d85c6;"&gt;&amp;nbsp; &amp;lt;localfile&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;log_format&amp;gt;json&amp;lt;/log_format&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;location&amp;gt;/var/log/suricata/eve.json&amp;lt;/location&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/localfile&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiH3bNgEcuYdZa13spf9e7xvSh7pV0y6nNIwbvPwrwT8u62225kOIs0J5oxVki-uc5TMtHjQkes7nwO-6gNB5f2W-CA8HNvFK_FuJqQc-w6YGNEarYKTHPDbfHvpWW8qQhbpudIpj6auEZWpNpwTEa4FdWzZF0hyphenhyphenOKBv4LvCxl2kbExRQcuoYwmPWW5GLA/s887/Screenshot_2025-09-15_20-46-12.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="887" data-original-width="709" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiH3bNgEcuYdZa13spf9e7xvSh7pV0y6nNIwbvPwrwT8u62225kOIs0J5oxVki-uc5TMtHjQkes7nwO-6gNB5f2W-CA8HNvFK_FuJqQc-w6YGNEarYKTHPDbfHvpWW8qQhbpudIpj6auEZWpNpwTEa4FdWzZF0hyphenhyphenOKBv4LvCxl2kbExRQcuoYwmPWW5GLA/w320-h400/Screenshot_2025-09-15_20-46-12.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&amp;nbsp;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Restart wazuh to pick up the changes.&lt;/p&gt;&lt;p&gt;&lt;span style="color: #38761d;"&gt;sudo systemctl restart wazuh-agent&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;As long as you're getting alert events in eve.json (which you should be able to check with the jq command above), then the events should also start funneling into your Wazuh instance. You will probably want to refresh the wazuh-alerts-* index from the Dashboard Management menu in Wazuh after Suricata alerts start coming in, so that the new fields are searchable.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSEAv0moTGVysyefrYnDZjkh4-8mvxMUy9TAVLkVKiuWe6_49tsZIxZQ7MJbz0BlwAdUFprhA1Tm5t18C9yM5apkM5-2XYCXIK9qZrvDqJRaJ6alqCFzm1pp1-0eprgJO3rXd3dVuNshpU8K0dLo5EF9s6urwJLTBgDQO6ZhLxMb_pbMfhoMVvLgMAeHA/s1179/Screenshot_2025-09-15_23-47-08.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1023" data-original-width="1179" height="556" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSEAv0moTGVysyefrYnDZjkh4-8mvxMUy9TAVLkVKiuWe6_49tsZIxZQ7MJbz0BlwAdUFprhA1Tm5t18C9yM5apkM5-2XYCXIK9qZrvDqJRaJ6alqCFzm1pp1-0eprgJO3rXd3dVuNshpU8K0dLo5EF9s6urwJLTBgDQO6ZhLxMb_pbMfhoMVvLgMAeHA/w640-h556/Screenshot_2025-09-15_23-47-08.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&amp;nbsp;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;P&gt;We are proud members of the &lt;A HREF="http://securitybloggers.net/"&gt;Security Bloggers Network&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;This content originally posted on &lt;A HREF="http://www.h-i-r.net/"&gt;HiR Information Report&lt;/A&gt;. Copyright © 1997-2010, HiR&lt;/P&gt;&lt;/div&gt;</description><link>http://www.h-i-r.net/2025/09/raspberry-pi-home-lab-ids-with-suricata.html</link><author>noreply@blogger.com (Ax0n)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJqD8VQTRFdmJsXbbDIjzKXGyPDIfltHH1x-SU3Kpx-GimoYcOMlFJmMF8lDWaZNit5RGLe3EzJZGXtiUr3BCbIvddl7WO1qI9DG8N8UFgvcdUZYbfiKIpBnAkF5PjbenjNpDXnXUeBDuKcX6JeaIejbFtvCgt57ARJYo8hDT_MWaAfocnuMeMKy2qrBw/s72-w156-h200-c/Screenshot_20250917-132222.png" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5554915078212081470.post-3497461430534299760</guid><pubDate>Wed, 17 Sep 2025 03:11:00 +0000</pubDate><atom:updated>2025-09-17T13:18:03.038-05:00</atom:updated><title>Build your home-lab SIEM with Wazuh</title><description>&lt;div style="text-align: left;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPe9zvuuErg5c94yqMTTyNqzuXy7N5zgMQTlPHp0_wLpnbMpIPy_jN8BzNlOBKUc4DiSvXJlmmAEMqLw2x4jI3vJmN06iwps892Hrs-lxtSX_lJjKStcJkpu77eP_Gl14wcQAlCZfMlhKs4izS9K1YLg6d5JkJBsA8x3-y5HIRg3VTfqy8dW9ENakPFig/s2200/wazuh.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1097" data-original-width="2200" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPe9zvuuErg5c94yqMTTyNqzuXy7N5zgMQTlPHp0_wLpnbMpIPy_jN8BzNlOBKUc4DiSvXJlmmAEMqLw2x4jI3vJmN06iwps892Hrs-lxtSX_lJjKStcJkpu77eP_Gl14wcQAlCZfMlhKs4izS9K1YLg6d5JkJBsA8x3-y5HIRg3VTfqy8dW9ENakPFig/w640-h320/wazuh.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;To land that SOC role, you need SIEM experience. How do you get it without the infosec job? &lt;a href="https://wazuh.com" target="_blank"&gt;Wazuh&lt;/a&gt; is an open-source SIEM you can set up in minutes. It has some surprisingly huge production deployments, so it's not just a toy for the home lab. I've been using Wazuh and it's predecessor, OSSec, at home for close to twenty years, but I recently rebuilt my home lab security monitoring stack.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: left;"&gt;I started with a Debian 13 VM on ProxMox and &lt;a href="https://documentation.wazuh.com/current/deployment-options/docker/wazuh-container.html" target="_blank"&gt;followed the instructions&lt;/a&gt; for a single-node install. Mind the system requirements. 4 cores, 8GB RAM and 50GB of storage are recommended at minimum. You could run it on a laptop or a small home server as well. The version numbers and instructions are subject to change, so I'd recommend following the official procedure, rather than my trying to copy and paste steps here.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;div style="text-align: left;"&gt;I ran into one snag during installation 
that caused a bunch of errors on the main dashboard and kept some stats 
from loading. Buried in the GitHub issues for Wazuh, I found a command that I had to run from inside the 
single-node Docker Compose directory to initialize wazuh-modules:&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;div style="text-align: left;"&gt;&lt;span style="color: #6aa84f;"&gt;sudo docker exec single-node-wazuh.manager-1 /var/ossec/bin/wazuh-modulesd&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;I rebooted my wazuh server but you could probably just restart the containers with docker-compose down; docker-compose up -d&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: left;"&gt;After you start the docker container, wait a few minutes then visit https://&amp;lt;your IP&amp;gt;/ and accept the self-signed certificate. The default credentials are admin:SecretPassword and you should change those ASAP.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;The "Endpoints" page has a "Deploy new agent" link that will help you generate a small script to run on your Windows, Mac and Linux machines to install, enable and start the agent. You'll have to run it manually on the endpoint, either on the console or through a remote session (like RDP, VNC, or SSH).&lt;br /&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;div style="text-align: left;"&gt;&lt;div style="text-align: left;"&gt;Then you 
can get attack alerts, watch the logs, check security benchmarks, and 
start building in-demand cybersecurity skills at home, or just use it for monitoring your fleet of computers.&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: left;"&gt;The main dashboard will show you a summary of all the agents and alerts (or a bunch of errors if you ran into the snag I ran into and haven't run the work-around yet). And the "Discover" app inside Wazuh gives you a robust event log search.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;I've found, especially as new logs start coming in from various operating systems, you should refresh the field lists for the wazuh-alerts index. From the main menu on the upper left, select "Dashboards Management" near the bottom of the menu, click "Index Patterns", then "wazuh-alerts-*" and near the upper right, click the refresh icon next to the trash can icon. This will allow you to search on new fields in the Discover app.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;In my next post, I'll cover setting up a Suricata IDS on a Raspberry Pi, and integrating Suricata network IDS alerts into Wazuh, too.&amp;nbsp;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;P&gt;We are proud members of the &lt;A HREF="http://securitybloggers.net/"&gt;Security Bloggers Network&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;This content originally posted on &lt;A HREF="http://www.h-i-r.net/"&gt;HiR Information Report&lt;/A&gt;. Copyright © 1997-2010, HiR&lt;/P&gt;&lt;/div&gt;</description><link>http://www.h-i-r.net/2025/09/build-your-home-lab-siem-with-wazuh.html</link><author>noreply@blogger.com (Ax0n)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPe9zvuuErg5c94yqMTTyNqzuXy7N5zgMQTlPHp0_wLpnbMpIPy_jN8BzNlOBKUc4DiSvXJlmmAEMqLw2x4jI3vJmN06iwps892Hrs-lxtSX_lJjKStcJkpu77eP_Gl14wcQAlCZfMlhKs4izS9K1YLg6d5JkJBsA8x3-y5HIRg3VTfqy8dW9ENakPFig/s72-w640-h320-c/wazuh.png" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5554915078212081470.post-2240702221756274827</guid><pubDate>Tue, 19 Aug 2025 23:08:00 +0000</pubDate><atom:updated>2025-08-19T18:08:44.850-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">claude</category><category domain="http://www.blogger.com/atom/ns#">honeynet</category><category domain="http://www.blogger.com/atom/ns#">honeypot</category><category domain="http://www.blogger.com/atom/ns#">javascript</category><category domain="http://www.blogger.com/atom/ns#">llm</category><category domain="http://www.blogger.com/atom/ns#">python</category><title>Modernizing The HoneyNet: Bringing Community Honey Network Into 2025</title><description>&lt;div&gt;Eight years ago, I wrote about &lt;a href="https://www.h-i-r.net/2017/09/building-honeypot-army-pi-ec2-mhn.html" target="_blank"&gt;building a honeypot army with Raspberry Pi, EC2, and Modern Honey Network&lt;/a&gt;. Back then, the Modern Honey Network (MHN) project was the gold standard for deploying a large fleet of honeypots, but it was already showing its age as Python 2 deprecation loomed. in 2020, some folks forked the work and got it running on Python 3, but haven't maintained it since. &lt;a href="https://x.com/hevnsnt/status/1935429263584543197?t=CKEsitIKEX0rFYkKCzjz9w" target="_blank"&gt;To the surprise&lt;/a&gt; of everyone who remembers me introducing the SecKC MHN effort and the stunning WebGL dashboard Wintel and I worked on together, my old MHN server was still running in 2025, dutifully grinding away on Ubuntu 16.04 LTS and Python 2.7.12. For the past 2 years, folks have asked me how to build their own, and I've had to say "First, time-travel back to 2017..."&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'd actually set out to do this work over my vacation a few months ago, but I was not in a good headspace and really just needed to disconnect. I did get familiar with CHN back in May. It ran fine in Docker but it was still dated, and it was going to need some work to integrate with the WebGL Dashboard. In many ways, I felt like some kind of archaeologist, looking at the mostly-abandoned CHN work, the few-and-infrequent MHN updates prior to 2018, and the fossils of purpose-built honeypots, many untouched since before 2015.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What's left of a once-vibrant honeypot ecosystem is a bit of a shame. The original MHN stack had become a museum of dependencies that couldn't be installed on modern systems. Even CHN featured Ubuntu 18.04 base images, archaic PyMongo trying to talk to MongoDB 8.x (spoiler: it can't), and many other outdated Python packages. I also realized that if anything happened to my precious EC2 instance, the entire stack was going to be offline indefinitely. I have backups of everything, but trying to untangle everything to restore a fragile artifact like this wasn't my idea of fun, and I'd probably just let it fade into obscurity. At the same time, I also envisioned getting the whole thing running in Python virtual environments on one of my OpenBSD systems, instead of relying on Docker on a cloud node somewhere. Docker is great, but it should be a deployment consideration, not a hard requirement.&lt;/div&gt;&lt;h2 style="text-align: left;"&gt;Claude Code -- or -- vibe-technical-debt-repayment&lt;/h2&gt;&lt;div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2EiiAm885Scl2L2iLlKj3V3q6c11DstN3Te04dZEaZNXyRBcPGxRmPcD8-GZ2OABCtWd4tO1i0EGvfP0KmSHLuAhRqcs2MGVnftWrY4WGj6Yux-E5oMS6M4lV6YAkLbtl0Wmy1GSz2wVq2p2VxUeMD4NpXEykdgIRYXyG287lDm21PHheAKpHC1hEeq4/s1627/CHN%20Arch.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="821" data-original-width="1627" height="161" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2EiiAm885Scl2L2iLlKj3V3q6c11DstN3Te04dZEaZNXyRBcPGxRmPcD8-GZ2OABCtWd4tO1i0EGvfP0KmSHLuAhRqcs2MGVnftWrY4WGj6Yux-E5oMS6M4lV6YAkLbtl0Wmy1GSz2wVq2p2VxUeMD4NpXEykdgIRYXyG287lDm21PHheAKpHC1hEeq4/s320/CHN%20Arch.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;This was the first seriously large project I've used Claude Code to help with. I used it mostly for documentation and test automation. I started by having it unpack how all of the pieces work together and creating a &lt;a href="https://github.com/n0xa/seckc-encom-boardroom/blob/master/CHN_Architecture.md" target="_blank"&gt;Mermaid syntax diagram (left) and description&lt;/a&gt; in Markdown to help better understand the data flow between the honeypots, hpfeeds, mnemosyne, MongoDB, SQLite and the core CHN-Server itself. I also had Claude help me keep track of the project plan, broken up into phases, and when I was getting tired and had to take a break, it could summarize the commit logs, diffs, and create a quick checklist of next-steps that I could come back to the next day to get my head back into the game quicker. When I found a class of problems in the code, Claude highlighted other places the same patterns were found. That wasn't anything I couldn't do in a modern IDE, but it was a nice touch, since I was working in vim the entire time. If you actually try to have Claude write code, it's kind of a mixed bag. Many of its decisions are based on popular and harmful anti-patterns propagated through StackOverflow, Quora and Reddit. You'll have to babysit it and tell it no quite often.&lt;/div&gt;&lt;h2 style="text-align: left;"&gt;The Modernization Journey&lt;/h2&gt;&lt;div&gt;&lt;div&gt;The initial scope seemed straightforward enough: upgrade some dependencies, fix some syntax errors and APIs, clean up a few bugs, get it all running in an OpenBSD VMM instance, then focus on rolling some new Docker containers. What started as a simple refresh turned into a journey through eight years of accumulated technical debt. I started with just the CHN-Server repository, but it had dependencies on the hpfeeds3 repository, and updating that meant messing with the mnemosyne repository. Several projects install my updated hpfeed3 package directly from GitHub in requirements.txt or the Dockerfile. There were layers of compatibility issues forcing me to take a phased, incremental approach to modernization, and a few gotchas that bit me several times, particularly syntax changes around PyMongo. Some bugs weren't obvious until I tried end-to-end testing with real honeypots in the lab. Honestly, I'm sure I missed a few obvious ones, but none that impact basic functionality so far. I threw hundreds of events per hour at the system using an infinite loop of telnet attempts. The system didn't even notice. It's much less resource-intensive.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The front-end needed some work, too. I parameterized the base API URL inside the JavaScript. Rob Scanlon's original work was built with Grunt, and Wintel's middleware used an ancient python2 WebSocket library that is incompatible with anything in modern JavaScript. After a few hours of trying to remove all of the Deprecated bits from the front-end, I decided to revert back to the basics, and gut the WebSocket code from the middleware entirely, and add a REST API to poll the honeypot attacks. I tweaked the Javascript as minimally as possible. I'm really not that comfortable with front-end code.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;End to end also revealed a few things that'll need attention soon. The deployment scripts all reference docker containers with architecture tags (-amd64, -arm, etc) that don't exist, for example. Hpfeeds-logger and hpfeeds-cif start up and appear functional, but they need more comprehensive testing than just "the container starts and doesn't immediately crash." I do my own log collection with a custom HPFeeds scraper I wrote in Go last year, replacing the PHP junk I had written back in 2017. I haven't used CIF since 2017 either, and don't really have much need for it. That's future work or maybe even someone else's problem. I'm working on a plan to submit my improvements upstream in a practical way that doesn't require the current maintainers to review massive, monolithic pull requests (if they're even paying attention to PRs). I may end up having to just maintain this fork myself for a while. I'll come up with a more sustainable strategy to keep it up to date if it looks like that's how it will be.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Getting CHN deployed in 2025 is easier than it was in 2017, assuming you can navigate the initial setup. Once I had verified all of the pieces kind of worked on their own, I &lt;a href="https://github.com/n0xa/chn-quickstart" target="_blank"&gt;forked the chn-quickstart project.&lt;/a&gt; The guided Docker Compose generator handles most of the complexity, and the whole CHN stack comes up with a simple &lt;b&gt;&lt;span style="color: #04ff00; font-family: courier;"&gt;docker-compose up -d&lt;/span&gt;&lt;/b&gt;. It's missing the attack-map and custom middleware for the time being, but they're not too hard to deploy next to CHN once it's up and running. I did manage to dockerize the middleware. As of last night, I cut over the DNS records from my old EC2 instance to my new VPS. This thing's actually running in production! nginx handles routing the web requests to the right places, and hosting the static assets of the animated front-end.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The OpenBSD deployment in my lab environment has been rock-solid, with Cowrie honeypots running on Raspberry Pi devices feeding data back to the central server. Watching the attack data flow in real-time through the web interface brings back that same sense of satisfaction I felt eight years ago - except now it's running on modern infrastructure. I need to clean up the OpenBSD init scripts and write some documentation around that part. I don't think it'll be as easy to deploy on bare metal (in Python Virtual Environments with uWSGI) as I'd like.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;During the 2020 CHN effort, Duke University's STINGAR team built a bunch of dockerized honeypots that are still functional today, but similarly dated. Modernizing those honeypot projects would be nice. If we concede that the honeypot deployment strategy is just docker images on single board computers, home lab VMs and cloud nodes, it's not really that urgent. Cowrie is actively maintained, and a bare-metal deployment script is on my list of things to build soon.&lt;/div&gt;&lt;/div&gt;&lt;h2 style="text-align: left;"&gt;Links&lt;/h2&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;a href="https://mhn.h-i-r.net/dash/" target="_blank"&gt;Go watch the neat spinning map&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://github.com/n0xa/SecKC-MHN-Globe" target="_blank"&gt;Look at it on a terminal window instead&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://github.com/n0xa/golang-stuff" target="_blank"&gt;Check out my Go HPFeeds Client if you want to watch the firehose of raw attack data&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://github.com/n0xa/chn-quickstart" target="_blank"&gt;CHN-QuickStart if you want to build your own CHN Instance&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://gist.github.com/n0xa/b179848093a4e346f7bd6b8ab61e2909" target="_blank"&gt;Some documentation if you want to run some Honeypots on my CHN Instance and feed the map&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://github.com/n0xa/"&gt;My GitHub (Where all of this stuff currently lives)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;P&gt;We are proud members of the &lt;A HREF="http://securitybloggers.net/"&gt;Security Bloggers Network&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;This content originally posted on &lt;A HREF="http://www.h-i-r.net/"&gt;HiR Information Report&lt;/A&gt;. Copyright © 1997-2010, HiR&lt;/P&gt;&lt;/div&gt;</description><link>http://www.h-i-r.net/2025/08/modernizing-honeynet-bringing-community.html</link><author>noreply@blogger.com (Ax0n)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2EiiAm885Scl2L2iLlKj3V3q6c11DstN3Te04dZEaZNXyRBcPGxRmPcD8-GZ2OABCtWd4tO1i0EGvfP0KmSHLuAhRqcs2MGVnftWrY4WGj6Yux-E5oMS6M4lV6YAkLbtl0Wmy1GSz2wVq2p2VxUeMD4NpXEykdgIRYXyG287lDm21PHheAKpHC1hEeq4/s72-c/CHN%20Arch.png" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5554915078212081470.post-3160647930131881171</guid><pubDate>Sat, 29 Jun 2024 06:04:00 +0000</pubDate><atom:updated>2024-06-29T06:51:15.209-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">openbsd</category><category domain="http://www.blogger.com/atom/ns#">unix</category><title>OpenBSD Power Management</title><description>&lt;p&gt;&amp;nbsp;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDTyE4vqlozpe4FszlOo7IDeAIPK_8Bumh_cJb8H-WDmmri8eAnX_m02f7XD-sRCch8RnbYrq1Qzz8_ioXfsrcbKszUVnMbdHhilRHdMS7zlyYIXpw4w2HLSWhY2LYI5VF_ZcpqMPd0hvU1D6jsoI9Wffkr3rxVQ9UXo8uytin16NZrybwxPz98x9vdJQ/s1043/NeoFetch.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="622" data-original-width="1043" height="191" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDTyE4vqlozpe4FszlOo7IDeAIPK_8Bumh_cJb8H-WDmmri8eAnX_m02f7XD-sRCch8RnbYrq1Qzz8_ioXfsrcbKszUVnMbdHhilRHdMS7zlyYIXpw4w2HLSWhY2LYI5VF_ZcpqMPd0hvU1D6jsoI9Wffkr3rxVQ9UXo8uytin16NZrybwxPz98x9vdJQ/w320-h191/NeoFetch.png" width="320" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;OpenBSD's power management features are powerful and plenty. My current setup floats the battery at 80% charged, to reduce battery wear during the work week, and it doesn't suspend when I close the lid as long as it's plugged in. On battery power, it adjusts the CPU speed under load to optimize battery life without sacrificing performance when I need it, and it will automatically suspend at 5% battery to save me from the system powering off unexpectedly. When I plan to head out, I can use a quick alias to allow the battery to charge all the way, which takes about 20 minutes from 80%. We'll go through how I have it set up.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Long-time readers of HiR will not be surprised I'm running OpenBSD as my primary general-purpose operating system on my ThinkPad X1 Carbon. Over on Instagram, people do a double-take. One of the surprises was the fact that in a NeoFetch screenshot, it was noted that my CPU was 400 MHz because I was on battery power without anything heavy running. Power management on OpenBSD also blew some minds. &lt;br /&gt;&lt;br /&gt;Out of the box, power management is disabled on OpenBSD. It's one of the few things that do not "just work" by default. The vast majority of OpenBSD systems do not need power management features, but it's a must for laptops.&lt;br /&gt;&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;Understanding apmd&lt;/h3&gt;&lt;p&gt;apmd is the Advanced Power Management daemon. If you just set apmd to start with no options, on a well-supported laptop like the 8th Generation Lenovo ThinkPad X1 Carbon I'm using, your laptop will probably suspend when you close the lid or use "zzz" on the command line. And it will wake up when you open the lid or mess with the keyboard. apmd will also enable automatic performance adjustment mode -- clocking down the CPU when there's not much load.&amp;nbsp; That's a pretty good start. There will likely be no warning when your battery is close to dying, and there won't be anything there to stop it from just turning off abruptly when it hits 0%. That's not optimal. Also, when you close the laptop lid and it's plugged in, you might want the system to remain active. You can do that by &lt;a href="https://man.openbsd.org/acpibtn.4" target="_blank"&gt;tweaking machdep.lidaction with sysctl&lt;/a&gt;, but there's a much better way.&lt;br /&gt;&lt;br /&gt;Looking at the &lt;a href="https://man.openbsd.org/apmd" target="_blank"&gt;manual page for apmd&lt;/a&gt;, we have a lot of useful options.&lt;br /&gt;&lt;br /&gt;We can start apmd in high-performance mode (-H) to get the most processing power out of the system, low-performance mode (-L) to extend battery life at the expense of CPU speed, or force automatic performance adjustment mode (-A) which happens to be the default. &lt;br /&gt;&lt;br /&gt;The -a option (lowercase) will block incoming BIOS suspend requests, such as those coming from closing the lid, if the system is plugged in. You can still manually suspend through your window manager or the command line zzz utility.&lt;br /&gt;&lt;br /&gt;The -z [percent] option will automatically suspend the system if it is not plugged in and the battery is at or below the threshold percentage.&lt;br /&gt;&lt;br /&gt;Enable and configure apmd. I assume that you've configured doas. I've covered this on several pages, like my &lt;a href="https://www.h-i-r.net/p/setting-up-openbsd-relayd-based-httpd.html" target="_blank"&gt;OpenBSD webserver article&lt;/a&gt;. I explicitly set automatic performance mode (-A), blocking suspend when plugged in (-a), and set it to automatically suspend at 5% battery (-z 5). Feel free to change this however you please.&lt;br /&gt;&lt;span style="color: #93c47d;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #6aa84f;"&gt;&lt;b&gt;doas rcctl enable apmd &lt;br /&gt;doas rcctl set apmd flags -A -a -z 5&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;The apm command line utility&lt;/h3&gt;&lt;p style="text-align: left;"&gt;Simply running the apm utility will provide battery and charge status&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style="color: #6aa84f;"&gt;apm&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style="color: #38761d;"&gt;Battery state: high, 79% remaining, 153 minutes life estimate&lt;br /&gt;AC adapter state: not connected&lt;br /&gt;Performance adjustment mode: auto (400 MHz)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There are a number of display flags that you can pass to APM to get specific details, for instance, apm -m will display the number of minutes of estimated battery life (or time to achieve a full charge). See &lt;a href="https://man.openbsd.org/apm"&gt;the man page for apm&lt;/a&gt; for all the details. This is useful if you are making scripts to determine power management status such as for tmux/powerline or custom status bar scripts.&lt;br /&gt;&lt;br /&gt;You can also adjust the performance mode on-the-fly, using apm -H, apm -L or apm -A to enable high performance, low-performance or automatic performance modes respectively, without restarting apmd.&lt;br /&gt;&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;sysctl, power management and sensors &lt;/h3&gt;&lt;p&gt;This will dump out everything from the hw.sensors tree in sysctl:&lt;br /&gt;&lt;b&gt;&lt;span style="color: #93c47d;"&gt;sysctl hw.sensors&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;From here, we can see fan speeds, temperatures, the number of battery charge cycles and even things like the battery's factory design capacity and last fully-charged capacity in Watt-hours.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrRtRBk_K8108v7WPzZKiq2eQ4zB6u1OBhojb47MbiNq-Nvq0o_huUzK-tFAky3BL7gXNby9cDAkRdNUrRKes11TTBBSxM3DRJfq_GVraSW7KxP4aDEcmjwMParl73QRtFkM8qLl-2kfvzShM_RLaiP1USxvv9efeppSt_NqLpBnNLPxI0ChnSjUY3scU/s861/hw.sensors.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="727" data-original-width="861" height="270" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrRtRBk_K8108v7WPzZKiq2eQ4zB6u1OBhojb47MbiNq-Nvq0o_huUzK-tFAky3BL7gXNby9cDAkRdNUrRKes11TTBBSxM3DRJfq_GVraSW7KxP4aDEcmjwMParl73QRtFkM8qLl-2kfvzShM_RLaiP1USxvv9efeppSt_NqLpBnNLPxI0ChnSjUY3scU/s320/hw.sensors.png" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;By dividing last full capacity by the design capacity, you can see how far below the rated capacity your battery has deteriorated, in a way a measure of battery health. For example, my battery's design capacity is 51 Wh, but my last full charge was 39.76 Wh. 39.76 / 51 is about 0.78, so my "full" capacity is about 78% of what it was when new. That's not bad for a 4-year-old laptop on the original battery with about 500 discharge cycles. &lt;br /&gt;&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;Extending battery health with charging optimization&lt;/h3&gt;&lt;p&gt;Many devices are now limiting the battery charge to about 80% when the system spends a lot of time plugged in. The MacBook my employer issued to me does this using some kind of magic algorithm that determines if it hasn't been running on battery power much lately. Leaving your battery slightly discharged like this actually extends the life of the battery substantially if you use it while plugged in most of the time.&lt;br /&gt;&lt;br /&gt;OpenBSD can do the same thing, to an extent. The maximum charge level can be set with sysctl, so you can place the following line in /etc/sysctl.conf so that it's set immediately when booting up:&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style="color: #6fa8dc;"&gt;hw.battery.chargestop=80&lt;/span&gt;&lt;/b&gt; &lt;br /&gt;&lt;/p&gt;&lt;p&gt;Then, manually set it with sysctl, or reboot:&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style="color: #6aa84f;"&gt;doas sysctl hw.battery.chargestop=80&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;If your battery is fully charged, it won't do anything, but the next time you run the battery down below 80% and plug it back in, it will stop charging the battery once it hits 80%. As far as I know, the battery will still charge to 100% if you turn the system off, though.&lt;br /&gt;&lt;br /&gt;You can set or adjust the maximum charge level from the command line as well. For instance, if you know you're going to be on the go later today and want to actually charge the battery to 100%, running this command will take care of things:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: #6aa84f;"&gt;doas sysctl hw.battery.chargestop=100&lt;/span&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;There are also additional hw.battery.chargemode options and an hw.battery.chargestart variable, for advanced use cases that I haven't needed. You can reference the &lt;a href="https://man.openbsd.org/sysctl.2#HW_BATTERY~2" target="_blank"&gt;hw.battery section of the detailed manual page for the sysctl API&lt;/a&gt; to read more about these settings.&lt;br /&gt;&lt;br /&gt;Finally, I've been using XFCE lately, and the package "xfce4-battery" does a decent job, allowing me to place a battery widget in any of the XFCE panels. There may be additional widgets or plugins for your GUI of choice.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;P&gt;We are proud members of the &lt;A HREF="http://securitybloggers.net/"&gt;Security Bloggers Network&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;This content originally posted on &lt;A HREF="http://www.h-i-r.net/"&gt;HiR Information Report&lt;/A&gt;. Copyright © 1997-2010, HiR&lt;/P&gt;&lt;/div&gt;</description><link>http://www.h-i-r.net/2024/06/openbsd-power-management.html</link><author>noreply@blogger.com (Ax0n)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDTyE4vqlozpe4FszlOo7IDeAIPK_8Bumh_cJb8H-WDmmri8eAnX_m02f7XD-sRCch8RnbYrq1Qzz8_ioXfsrcbKszUVnMbdHhilRHdMS7zlyYIXpw4w2HLSWhY2LYI5VF_ZcpqMPd0hvU1D6jsoI9Wffkr3rxVQ9UXo8uytin16NZrybwxPz98x9vdJQ/s72-w320-h191-c/NeoFetch.png" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5554915078212081470.post-6386609146201825604</guid><pubDate>Sun, 05 May 2024 04:44:00 +0000</pubDate><atom:updated>2024-05-04T23:46:17.895-05:00</atom:updated><title>Running your own Wireguard VPN server and Travel Router</title><description>&lt;p&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjICFjzUosq7VizmG7qu6YmMcJB2UBUyDlMowOQvKSwIsl42obeXNlxdm7YJc28nSQotvuEKyNdCHa0ls66EPX4ZRaHi3HjMXw19-oM0A0S12OtPNVeEJmpI9Lez5yG0U0CGKa_DXC3ZMOtN5fowcQ-Knxsz5vhi40HawCoNICZzDmsuVijlMM39uN2494/s4000/20240504_180507.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1383" data-original-width="4000" height="139" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjICFjzUosq7VizmG7qu6YmMcJB2UBUyDlMowOQvKSwIsl42obeXNlxdm7YJc28nSQotvuEKyNdCHa0ls66EPX4ZRaHi3HjMXw19-oM0A0S12OtPNVeEJmpI9Lez5yG0U0CGKa_DXC3ZMOtN5fowcQ-Knxsz5vhi40HawCoNICZzDmsuVijlMM39uN2494/w400-h139/20240504_180507.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;If you travel, or work from the road a lot, you probably have a good reason to set up a travel router and VPN. Travel routers let you create a private network for all of your personal devices. Paired with a VPN, you can obscure the nature of your activity from the local network, and evade IP address or geographical restrictions.&amp;nbsp;&lt;p&gt;&lt;/p&gt;&lt;p&gt;The good use cases for “privacy” focused VPN services are vanishing. Improved encryption and protocols prevent many of the ways a casual attacker can spy on you with wifi. On top of that, many such providers have been caught selling user data to third parties and turning over information to authorities under subpoena, making them possibly worse than any attacker you’re sharing the hotel wifi with.&lt;/p&gt;&lt;p&gt;Running your own cloud VPN is easy and affordable. Once you know how to set it up, you can run it on most hosting providers anywhere in the world, or set it up at home so that you can virtually hop on your home network while you’re out and about.

Actually installing Wireguard is the main part that’s different between operating systems.&amp;nbsp;&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;OpenBSD Server &lt;br /&gt;&lt;/h3&gt;&lt;p&gt;It's probably no surprise that I run Wireguard on my OpenBSD Servers. OpenBSD has had full kernel support for Wireguard for years, so it's just a matter of installing the userland tools, and setting up the interface.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style="color: #6aa84f;"&gt;doas pkg_add wireguard-tools&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;/etc/hostname.wg0:&lt;/p&gt;&lt;p&gt;&lt;span style="color: #6fa8dc;"&gt;inet 10.0.0.1 255.255.255.0 NONE&lt;br /&gt;up&lt;br /&gt;!/usr/local/bin/wg setconf wg0 /etc/wireguard/wg0.conf&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;Amazon Linux&lt;/h3&gt;&lt;p&gt;Amazon Linux is just one easy example I found of a Red Hat-based system. These steps should work similarly on others like Rocky or Alma.&amp;nbsp;&lt;/p&gt;&lt;p dir="ltr" id="docs-internal-guid-ec420629-7fff-cc5f-b8be-250c17769985" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;b style="color: #6aa84f;"&gt;&lt;span face="Arial, sans-serif" style="background-color: transparent; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;sudo wget -O /etc/yum.repos.d/wireguard.repo https://copr.fedorainfracloud.org/coprs/jdoss/wireguard/repo/epel-7/jdoss-wireguard-epel-7.repo&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;b style="color: #6aa84f;"&gt;&lt;span face="Arial, sans-serif" style="background-color: transparent; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;sudo yum upgrade&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;b style="color: #6aa84f;"&gt;&lt;span face="Arial, sans-serif" style="background-color: transparent; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;sudo yum clean all&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;b style="color: #6aa84f;"&gt;&lt;span face="Arial, sans-serif" style="background-color: transparent; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;sudo yum install wireguard-tools wireguard-dkms iptables-services&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;br /&gt;&lt;h3 style="text-align: left;"&gt;Debian Linux&lt;/h3&gt;&lt;br /&gt;As the root of many other distributions like Ubuntu and RaspiOS, it made sense to also cover Debian since these instructions will also likely work on many distributions.&lt;br /&gt;&lt;br /&gt;&lt;b style="color: #6aa84f;"&gt;&lt;span face="Arial, sans-serif" style="background-color: transparent; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;sudo apt update&lt;/span&gt;&lt;/b&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;b style="color: #6aa84f;"&gt;&lt;span face="Arial, sans-serif" style="background-color: transparent; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;sudo apt install wireguard&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p dir="ltr" id="docs-internal-guid-3fe16fe0-7fff-8c7f-3191-e237aa8fe8af" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Arial,sans-serif" style="background-color: transparent; color: black; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;Generating Public and Private Keys&lt;br /&gt;&lt;/h3&gt;&lt;p&gt;Most of the travel routers I've seen don't have a way to generate Wireguard keys on the device if you're manually configuring it. These can be generated on your VPN server and imported. We're changing the umask here to ensure the files are not world or group readable. We're going to be editing files as root, so just use sudo -i (linux) or doas -s&amp;nbsp; (OpenBSD)&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #6aa84f;"&gt;&lt;b&gt;sudo -i &lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b style="color: #6aa84f;"&gt;umask 077&amp;nbsp;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Create the client keys: &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style="color: #6aa84f;"&gt;wg genkey | tee client-private.key | wg pubkey &amp;gt; client-public.key&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;And then server keys:&lt;br /&gt;&lt;b&gt;&lt;span style="color: #6aa84f;"&gt;cd /etc/wireguard&lt;br /&gt;wg genkey | tee private.key | wg pubkey &amp;gt; public.key&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Figure out your main network interface:&lt;/p&gt;&lt;p&gt;ip a&lt;/p&gt;&lt;p&gt;In Amazon AWS EC2, the interface was enX0 but it may very well be eth0 or something ridiculous like enp37s8lmaowtf depending on your configuration. You'll need this interface name for your iptables rules.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Using this example skeleton configuration file as a template, paste it into /etc/wireguard/wg0.conf and edit the interface name and fill in the appropriate public and private keys.&amp;nbsp; You can pick any port number you wish. There is no standardized port for Wireguard.&lt;/p&gt;&lt;p&gt;/etc/wireguard/wg0.conf&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #3d85c6;"&gt;[Interface]&lt;br /&gt;PrivateKey = [the contents of /etc/wireguard/private.key]&lt;br /&gt;ListenPort = 57609&lt;br /&gt;Address = 10.0.0.1/24&lt;br /&gt;PostUp = iptables -t nat -I POSTROUTING -o [Interface] -j MASQUERADE&lt;br /&gt;PostUp = ip6tables -t nat -I POSTROUTING -o [Interface] -j MASQUERADE&lt;br /&gt;PreDown = iptables -t nat -D POSTROUTING -o [Interface] -j MASQUERADE&lt;br /&gt;PreDown = ip6tables -t nat -D POSTROUTING -o [Interface] -j MASQUERADE&lt;br /&gt;&lt;br /&gt;[Peer]&lt;br /&gt;PublicKey = [the contents of client-public.key]&lt;br /&gt;AllowedIPs = 10.0.0.2/32&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;Final Setup and starting the server&lt;/h3&gt;&lt;h4 style="text-align: left;"&gt;OpenBSD &lt;br /&gt;&lt;/h4&gt;&lt;p&gt;For OpenBSD, you won't need the Address or IPTables entries in wg0.conf above. You'll need to tell PF to NAT traffic for wg0, though. Again, you'll need the primary interface name, which you can find with ifconfig. Place the following lines into /etc/pf.conf AFTER the "pass" and before the block commands at the end of the file and restart pf.&lt;/p&gt;&lt;p&gt;&lt;span style="color: #3d85c6;"&gt;pass in on wg0&lt;br /&gt;pass in inet proto udp from any to any port 51820&lt;br /&gt;pass out on egress inet from (wg0:network) nat-to ([Interface]:0)&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #6aa84f;"&gt;&lt;b&gt;doas pfctl -f /etc/pf.conf&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Enable IP Forwarding by adding these lines to /etc/sysctl.conf: &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #3d85c6;"&gt;net.inet.ip.forwarding=1&lt;br /&gt;net.inet6.ip6.forwarding=1&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;To start Wireguard, run the following commands, or reboot:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style="color: #6aa84f;"&gt;doas sysctl net.inet.ip.forwarding=1&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style="color: #6aa84f;"&gt;doas net.inet6.ip6.forwarding=1&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #6aa84f;"&gt;&lt;b&gt;doas sh /etc/netstart wg0 &lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;h4 style="text-align: left;"&gt;Linux &lt;br /&gt;&lt;/h4&gt;&lt;p&gt;For Amazon Linux or Debian, it's also similar. Add these to /etc/sysctl.conf:&lt;/p&gt;&lt;p dir="ltr" id="docs-internal-guid-bddc3be8-7fff-9268-ba36-0ecceb847829" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Arial, sans-serif" style="background-color: transparent; color: #3d85c6; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;net.ipv4.ip_forward=1&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Arial, sans-serif" style="background-color: transparent; color: #3d85c6; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;net.ipv6.conf.all.forwarding=1&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Reload sysctl:&lt;/p&gt;&lt;p&gt;&lt;span style="color: #6aa84f;"&gt;&lt;b&gt;sudo sysctl -p&lt;/b&gt;&lt;/span&gt; &lt;br /&gt;&lt;/p&gt;&lt;p&gt;Enable and start the Wireguard service with systemctl&lt;/p&gt;&lt;p dir="ltr" id="docs-internal-guid-2351bf51-7fff-54b4-0924-7e1e644f1534" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;b&gt;&lt;span face="Arial, sans-serif" style="background-color: transparent; color: #6aa84f; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;sudo systemctl enable &lt;/span&gt;&lt;span face="Arial, sans-serif" style="background-color: transparent; color: #6aa84f; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;"&gt;wg-quick@wg0.service&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p dir="ltr" id="docs-internal-guid-2351bf51-7fff-54b4-0924-7e1e644f1534" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;b&gt;&lt;span face="Arial, sans-serif" style="background-color: transparent; color: #6aa84f; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;sudo systemctl start &lt;/span&gt;&lt;span face="Arial, sans-serif" style="background-color: transparent; color: #6aa84f; font-size: 11pt; font-style: normal; font-variant: normal; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;"&gt;wg-quick@wg0.service&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p dir="ltr" id="docs-internal-guid-2351bf51-7fff-54b4-0924-7e1e644f1534" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;Travel Router Configuration&lt;/h3&gt;&lt;p&gt;I've been using GL.iNet routers with Wireguard for about 3 years. The example screenshots are from my GL-SFT1200 "Opal" travel router. Manually configure the Wireguard client and set these values:&lt;/p&gt;&lt;h4 style="text-align: left;"&gt;Interface&lt;/h4&gt;&lt;p&gt;IP Address: 10.0.0.2 (or your "peer" address from the Wireguard server config)&lt;/p&gt;&lt;p&gt;Private key: Contents of client-private.key file we generated earlier&lt;/p&gt;&lt;h4 style="text-align: left;"&gt;Peer&lt;/h4&gt;&lt;p&gt;Public Key: Contents of /etc/wireguard/public.key from the wireguard server&lt;/p&gt;&lt;p&gt;Endpont host: IP address and port of your wireguard server (e.g. 3.45.67.89:57609)&lt;/p&gt;&lt;p&gt;Allowed IPs: 0.0.0.0/0 (or, all IP addresses are allowed through the Wireguard server)&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpq_bLOHDdw9dTRSTyuDt79KryLb6NuYBXWX3Nxw2Vyu024wbB3bhIv59VYtz-d6Sn5bbxBytYIdXJaq-NuCG6trRnMPXmaHWg6qYIJ_C_lP0LrlH6hmTF-cyJbTCuXZBpY-hivPNcHWIPf2u61eJU16PaJch_K735sWVMF4lUAUpEPSdZkgbYJ5IkSgk/s974/Screenshot%202024-05-04%20232323.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="866" data-original-width="974" height="356" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpq_bLOHDdw9dTRSTyuDt79KryLb6NuYBXWX3Nxw2Vyu024wbB3bhIv59VYtz-d6Sn5bbxBytYIdXJaq-NuCG6trRnMPXmaHWg6qYIJ_C_lP0LrlH6hmTF-cyJbTCuXZBpY-hivPNcHWIPf2u61eJU16PaJch_K735sWVMF4lUAUpEPSdZkgbYJ5IkSgk/w400-h356/Screenshot%202024-05-04%20232323.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Once you have configured the Wireguard client, you can connect to the VPN. Browse to an IP address checking site like whatismyip.com to verify you're coming from the VPN server's IP address.&lt;p&gt;&lt;/p&gt;&lt;p&gt;Many travel routers have a mode switch on the side that allows you to easily change how the router works. I set up my Opal router so that the mode switch enables or disables Wireguard on the fly so I have more flexibility without worrying about having to log into the admin control panel and change settings.&amp;nbsp;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilvUtpRYFmZq4zMvyQx9VK9sXk0n9o4JAsz2k5bhrMckATtgFnAFpLV3u-wJvjOgSe9ddDKA7YUHnXttsNpVIA4HAxmr387mQA2BwT85ytRx-LFfRTx0ZvfU1UDjYWbOhb4wl0yj28v143mfER-Y3gPHTJnBjRFHyaS9EPZsiV5lqPSu6qz-NSEsLTcWA/s973/Screenshot%202024-05-04%20233908.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="661" data-original-width="973" height="271" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilvUtpRYFmZq4zMvyQx9VK9sXk0n9o4JAsz2k5bhrMckATtgFnAFpLV3u-wJvjOgSe9ddDKA7YUHnXttsNpVIA4HAxmr387mQA2BwT85ytRx-LFfRTx0ZvfU1UDjYWbOhb4wl0yj28v143mfER-Y3gPHTJnBjRFHyaS9EPZsiV5lqPSu6qz-NSEsLTcWA/w400-h271/Screenshot%202024-05-04%20233908.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;P&gt;We are proud members of the &lt;A HREF="http://securitybloggers.net/"&gt;Security Bloggers Network&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;This content originally posted on &lt;A HREF="http://www.h-i-r.net/"&gt;HiR Information Report&lt;/A&gt;. Copyright © 1997-2010, HiR&lt;/P&gt;&lt;/div&gt;</description><link>http://www.h-i-r.net/2024/05/running-your-own-wireguard-vpn-server.html</link><author>noreply@blogger.com (Ax0n)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjICFjzUosq7VizmG7qu6YmMcJB2UBUyDlMowOQvKSwIsl42obeXNlxdm7YJc28nSQotvuEKyNdCHa0ls66EPX4ZRaHi3HjMXw19-oM0A0S12OtPNVeEJmpI9Lez5yG0U0CGKa_DXC3ZMOtN5fowcQ-Knxsz5vhi40HawCoNICZzDmsuVijlMM39uN2494/s72-w400-h139-c/20240504_180507.jpg" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5554915078212081470.post-4589525417320164680</guid><pubDate>Wed, 15 Nov 2023 03:09:00 +0000</pubDate><atom:updated>2023-11-14T21:12:13.465-06:00</atom:updated><title>November 2023 SecKC Presentation: Mobile SDR</title><description>Thanks to all who showed up and asked questions!
&lt;iframe src="https://docs.google.com/presentation/d/e/2PACX-1vQMhKMmKa50kbIasyafSkDbiBoCY_k4zodSfV18C2PSkQMwWCpzRW19bL4tl-OLCJqyEzfvrtYrj3WF/embed?start=false&amp;loop=false&amp;delayms=3000" frameborder="0" width="480" height="299" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;P&gt;We are proud members of the &lt;A HREF="http://securitybloggers.net/"&gt;Security Bloggers Network&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;This content originally posted on &lt;A HREF="http://www.h-i-r.net/"&gt;HiR Information Report&lt;/A&gt;. Copyright © 1997-2010, HiR&lt;/P&gt;&lt;/div&gt;</description><link>http://www.h-i-r.net/2023/11/november-2023-seckc-presentation-mobile.html</link><author>noreply@blogger.com (Ax0n)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5554915078212081470.post-3679614279319988341</guid><pubDate>Sun, 01 Oct 2023 07:40:00 +0000</pubDate><atom:updated>2023-10-01T02:50:14.127-05:00</atom:updated><title>Introducing NEMO for the M5Stick C Plus</title><description>&lt;p&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_sDw7IUZsnDVKCV1ysrAAcdJfrg8EDH48nAKwWiAAtWF8vC3wc6zFfzIHDyhE8_mJ6OktYaWAinkT6A_IsdkCKw7KcOAFFWhSGXrbucnH1DoncG5Stj_gdw_eHF7eJLrypQoBbfH6OrkItMb0Dl26LvF3PSOS45pQBD5H0Q6GYWnBLP7VRgUf7F2hQLc/s2992/20230926_181104.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="2992" data-original-width="2992" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_sDw7IUZsnDVKCV1ysrAAcdJfrg8EDH48nAKwWiAAtWF8vC3wc6zFfzIHDyhE8_mJ6OktYaWAinkT6A_IsdkCKw7KcOAFFWhSGXrbucnH1DoncG5Stj_gdw_eHF7eJLrypQoBbfH6OrkItMb0Dl26LvF3PSOS45pQBD5H0Q6GYWnBLP7VRgUf7F2hQLc/s320/20230926_181104.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;I've been working on this project for a couple of weeks, and it's pretty close to finished. I've been trying to build some more skills in the embedded systems, microcontroller and Internet of Things realm, and when I decided it was time to expand my experience to ESP32, I wanted a dev kit with a little bit of everything built in. I already have breadboards, displays, servos, sensors, LEDs and accessories galore. I just wanted something cute that'd keep my interest for a while. Enter the M5Stack M5Stick C Plus. Powered by an ESP32, featuring an AXP192 power management unit, accelerometer, IR and red LEDs, a 100mAh battery, microphone, speaker, display, a few buttons and plenty of exposed GPIO pins, it seemed like a good place to start.&lt;/p&gt;&lt;p&gt;My usual method of learning involves sketching out a rough plan for demonstrating mastery of core concepts, so my first few projects were about getting the ESP-IDF and arduino environments working with simple programs. I also ported CircuitPython to it for some of my early projects. I focused on the WiFi stack and designing user interfaces at first, then using UART, SPI and I2C via the GPIO pins.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;With most of the tech community excited about the Flipper Zero, I started thinking about what sorts of high-tech pranks one could get away with on a platform like this. The end result is NEMO, named after the titular character in Finding Nemo, in contrast to some other high-tech toy named after a fictional dolphin. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;The Stick C Plus has no IR sensor, but it does have a transmitter. Infrared replay attacks might work if you plugged an IR receiver into the GPIO, but I'm not worried about that. I settled for an implementation of TV-B-Gone, relying on previous work by &lt;a href="http://www.righto.com/2010/11/improved-arduino-tv-b-gone.html" target="_blank"&gt;Ken Shirriff&lt;/a&gt; and a local hacker, &lt;a href="https://github.com/MrARM/hakrwatch" target="_blank"&gt;MrARM&lt;/a&gt;. I had previously messed with similar projects in both CircuitPython, and at the source-code level, way back in 2008 with the DefCon 16 badge, which also featured an infrared TV killer mode.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHyLSsePSq59kQ74di5b4KPu3i_Es0WwOcb567TC91FNKT3MOnRRniEndsrjDETwQVEZvpIch7-5ZQ0Q393DNCprnfSryKaJKJjlcujJD7CZX0KKgTkCpN-9kDH6Iaq1Os4Ou1fOQ_-lB12Wu6ZsMSxjeQcEUZc2P2MKAMh0T34j9lJJIe6PS7tbMOIVg/s2992/20230926_181305.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="2992" data-original-width="2992" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHyLSsePSq59kQ74di5b4KPu3i_Es0WwOcb567TC91FNKT3MOnRRniEndsrjDETwQVEZvpIch7-5ZQ0Q393DNCprnfSryKaJKJjlcujJD7CZX0KKgTkCpN-9kDH6Iaq1Os4Ou1fOQ_-lB12Wu6ZsMSxjeQcEUZc2P2MKAMh0T34j9lJJIe6PS7tbMOIVg/s320/20230926_181305.jpg" width="320" /&gt;&amp;nbsp;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;div style="text-align: left;"&gt;Right about the time I was starting to work on this, DefCon 31 was wrapping up, and a ton of folks were commenting on the bizarre behavior of their iOS devices at the conference, seemingly always displaying pop-ups trying to connect AirPods or other accessories. This became known as the "AppleJuice" attack, and relies on bluetooth low energy beacon advertisements, and iOS's user experience that tries to make device pairing easier. I found a very bare-bones implementation for ESP32, that was somewhat broken.&amp;nbsp; I fixed it and gave it a decent two-button user interface as well.&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiI80KYzZ9HOSYJAI93VjLBSJ30SyDkljc3zsTsp3Ho09eHk-oRxvb1qTiiSslQzLVEJFXvmz02gkQw6ZmOuV7NpOn3GmLgM7UyTrTuZoQRffbne497Gh2iGll2X3MSGURb3v8nnfh8CEqHg4XErg2r6-l7XzItaNbTG-yF3KLgPNH2iiohs2VCLixztes/s2992/20230926_181408.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="2992" data-original-width="2992" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiI80KYzZ9HOSYJAI93VjLBSJ30SyDkljc3zsTsp3Ho09eHk-oRxvb1qTiiSslQzLVEJFXvmz02gkQw6ZmOuV7NpOn3GmLgM7UyTrTuZoQRffbne497Gh2iGll2X3MSGURb3v8nnfh8CEqHg4XErg2r6-l7XzItaNbTG-yF3KLgPNH2iiohs2VCLixztes/s320/20230926_181408.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;I rounded out the pranks with WiFi Spamming, using a list of funny WiFi SSIDs, the now-popular "RickRoll" SSIDs and a mode that spams hundreds of randomly-named SSIDs per minute. &lt;br /&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXMPXqbWGUsD7eACZE9HXoevuS7KUuMrqSsjE3xfPa52Z2ekY0UXeJUobTOyrIQHkiEgK1kKzhLj2iKsfRpZ5cXv4cA31BgNEteWTNqDXjulpokQrkGFiw6BmPpT95DunYTEuHL1ZD0Tb8P9omwnZcFQBHMeruyHr62Skt3zVOmAtYK7BAxlojNsTFAYo/s2992/20230926_181156.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="2992" data-original-width="2992" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXMPXqbWGUsD7eACZE9HXoevuS7KUuMrqSsjE3xfPa52Z2ekY0UXeJUobTOyrIQHkiEgK1kKzhLj2iKsfRpZ5cXv4cA31BgNEteWTNqDXjulpokQrkGFiw6BmPpT95DunYTEuHL1ZD0Tb8P9omwnZcFQBHMeruyHr62Skt3zVOmAtYK7BAxlojNsTFAYo/s320/20230926_181156.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;It defaults to a "watch" mode with a 24-hour clock backed by the on-board real-time-clock. There's a few kilobytes of non-volatile EEPROM storage on board, of which I'm using a few bytes to keep settings like left/right hand rotation, brightness, auto-dimming timer and TV-B-Gone region settings persistent through deep sleep or power off mode. All in all, it's a few existing projects just kind of glued together in a novel way that's easy to use. Those who've known me for a while would say that's on-brand.&amp;nbsp;&lt;/p&gt;&lt;p&gt;A few people have asked me if it's for sale. I have no plans to sell anything, such as M5Stick units pre-flashed with NEMO. This is open-source software I put together for fun, and anyone can use it and extend it. You can buy the device and learn how to load my code on it, but I'd be more excites to hear about people being inspired to build their own cool projects on it.&amp;nbsp; &lt;br /&gt;&lt;/p&gt;&lt;p&gt;At $20-$30 depending on the site and accessories you get with the M5Stick C Plus, it has a lot of capabilities. Here's an &lt;a href="https://amzn.to/3PY9mfV"&gt;Amazon Affiliate Link&lt;/a&gt; to buy a version with a watch strap, lego mounting and wall-mounting options. The project source code and pre-compiled binaries are up on the &lt;a href="https://github.com/n0xa/m5stick-nemo" target="_blank"&gt;m5stick-NEMO GitHub repository&lt;/a&gt;, and I am keeping the project up to date in the M5Burner app. You can see a &lt;a href="https://www.instagram.com/p/Cx2KgdtOOdE/"&gt;quick walk-through reel&lt;/a&gt; on &lt;a href="https://www.instagram.com/4x0nn" target="_blank"&gt;my Instagram&lt;/a&gt; as well. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;P&gt;We are proud members of the &lt;A HREF="http://securitybloggers.net/"&gt;Security Bloggers Network&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;This content originally posted on &lt;A HREF="http://www.h-i-r.net/"&gt;HiR Information Report&lt;/A&gt;. Copyright © 1997-2010, HiR&lt;/P&gt;&lt;/div&gt;</description><link>http://www.h-i-r.net/2023/10/introducing-nemo-for-m5stick-c-plus.html</link><author>noreply@blogger.com (Ax0n)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_sDw7IUZsnDVKCV1ysrAAcdJfrg8EDH48nAKwWiAAtWF8vC3wc6zFfzIHDyhE8_mJ6OktYaWAinkT6A_IsdkCKw7KcOAFFWhSGXrbucnH1DoncG5Stj_gdw_eHF7eJLrypQoBbfH6OrkItMb0Dl26LvF3PSOS45pQBD5H0Q6GYWnBLP7VRgUf7F2hQLc/s72-c/20230926_181104.jpg" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5554915078212081470.post-2753852087264899734</guid><pubDate>Sat, 25 Feb 2023 23:18:00 +0000</pubDate><atom:updated>2023-02-25T23:34:14.899-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">devops</category><category domain="http://www.blogger.com/atom/ns#">kubernetes</category><category domain="http://www.blogger.com/atom/ns#">linux</category><category domain="http://www.blogger.com/atom/ns#">openbsd</category><category domain="http://www.blogger.com/atom/ns#">sysadmin</category><category domain="http://www.blogger.com/atom/ns#">virtualization</category><title>Running a Kubernetes Cluster with OpenBSD VMM</title><description>&lt;p dir="ltr" id="docs-internal-guid-567d4521-7fff-8efd-eba2-03df79e87f42" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Kubernetes relies on Linux containers and cgroups, so you can't run Kubernetes or even docker containers directly on OpenBSD, but Alpine Linux runs great under OpenBSD's VMM hypervisor. Alpine shares a lot of the same ideologies as OpenBSD, and it has become a favorite in the Linux container ecosystem.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" id="docs-internal-guid-567d4521-7fff-8efd-eba2-03df79e87f42" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLkEqXrmx7n8eXsHtwqI9szzvlq1brMgNdGLv8EQBZAX4lQxOAH04NCYre9yMJDuO23b--Rh04rJ3jm9sGxuJOgyInTPwqmebESwXoi15Dqdwe9vJFYFBeRaGXpvlr13YIKbJJKYuFcjVuYcfgoa1aig__D2leMzX66W4K3A0wQMfVsPxIU6mHDAcH/s2048/k9s.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="2048" data-original-width="2048" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLkEqXrmx7n8eXsHtwqI9szzvlq1brMgNdGLv8EQBZAX4lQxOAH04NCYre9yMJDuO23b--Rh04rJ3jm9sGxuJOgyInTPwqmebESwXoi15Dqdwe9vJFYFBeRaGXpvlr13YIKbJJKYuFcjVuYcfgoa1aig__D2leMzX66W4K3A0wQMfVsPxIU6mHDAcH/w400-h400/k9s.jpg" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;h1 dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 20pt;"&gt;&lt;span style="font-family: Arial; font-size: 20pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;What's the point?&amp;nbsp;&lt;/span&gt;&lt;/h1&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Kubernetes is a system for deploying containerized applications at scale, in a clustered environment. This lets developers create microservices that run in a mesh configuration, or large, monolithic apps that run in Docker. These docker containers can then be deployed to a kubernetes cluster for testing and production use. In the modern enterprise world, it's becoming far less common to build and provision web servers and run apps on them. More often than not, the infrastructure is virtual, software-defined, and deployed in containers.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;It would be far faster and efficient to follow my OpenBSD HTTPD guide and then install Wordpress directly, so this is less about getting wordpress running on OpenBSD than it is about getting one's feet wet in clustered workloads and applying modern DevOps principles in an OpenBSD-centric home lab. Once this is up and running, you can use kubectl, kustomize, or helm to deploy all kinds of things to the cluster with relative ease. I'm gonna try OWASP Juice Shop next.&lt;/p&gt;&lt;h1 dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 20pt;"&gt;&lt;span style="font-family: Arial; font-size: 20pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Caveat Emptor&lt;/span&gt;&lt;/h1&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;This is not a good project for someone who’s never used OpenBSD before. I make some assumptions that you’re generally familiar with OpenBSD and performing routine system administration and housekeeping tasks.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;This is not a supported configuration. I’ve been running kubernetes on OpenBSD’s VMM hypervisor in my home lab for about 7 months as of the time of writing. I wanted to play with Kubernetes at home, and at the time, my Dell PowerEdge R410 running OpenBSD was the only thing I had available, so I decided to try this out. Occasionally, the network or nodes lag a little, but it’s been pretty stable for the most part.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;There are a few limitations to this setup. VMM currently has no way to allocate more than one CPU core to a VM. This causes two problems for Kubernetes:&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;First is that Kubernetes’ master node minimum requirement is for 2 cores. We can override it, and it seems to run with just one core, but it’s not optimal.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Second is that some workloads may request more than 1 CPU worth of computing resources for a pod. The master node will be unable to find a node that can support that pod, because these worker nodes will only have one core, or 1000 milli-cores, of CPU capacity each. If you see errors like “Unschedulable” and “Insufficient cpu,” this is one potential reason.&lt;/span&gt;&lt;/p&gt;&lt;h1 dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 20pt;"&gt;&lt;span style="font-family: Arial; font-size: 20pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;VMM Vs. The World&lt;/span&gt;&lt;/h1&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;I’ve been running production websites on OpenBSD VMM guests for years without any problems, but I won’t pretend that VMM’s relative immaturity isn’t a deal-breaker for clustered workloads like this. This project was my way of better understanding how kubernetes works under the hood, and an excuse to play UNIX nerd.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Since late last year, I have also been running a similar K8S cluster based on Alpine Linux VMs, but hosting it on slightly better hardware running the ProxMox VE hypervisor. I’m still using the NFS server on my R410, though. ProxMox allows me to allocate 4 cores to each node, so I can run heavier applications. This setup is production-ready and I could justify operating a business on a ProxMox-based cluster like this if I were on a tight budget.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;There are commercial solutions that take a lot of the work out of on-premise kubernetes, and affordable options for managed cluster workloads (in the clouds or whatever). Do what makes sense.&lt;/span&gt;&lt;/p&gt;&lt;h1 dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 20pt;"&gt;&lt;span style="font-family: Arial; font-size: 20pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Conventions&amp;nbsp;&lt;/span&gt;&lt;/h1&gt;&lt;p&gt;&lt;span style="color: #93c47d;"&gt;Commands you should run are in green&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #6fa8dc;"&gt;File contents are in blue&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-family: Arial; font-size: 20pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;OpenBSD Host Considerations&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 18pt;"&gt;&lt;span style="font-family: Arial; font-size: 16pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Minimum System Requirements&lt;/span&gt;&lt;/h2&gt;&lt;ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"&gt;&lt;li aria-level="1" dir="ltr" style="background-color: transparent; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;8GB RAM&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="background-color: transparent; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;4-core CPU that has VMM/EPT support (most i5 or i7 CPU should work)&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="background-color: transparent; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;50GB of storage&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;For this example, we’ll run 3 Alpine Linux VMs – one master node and two worker nodes. Each node will get 2GB of RAM and be set up for 10GB of storage, but qcow2 images only allocate storage when it’s used.&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"&gt;&lt;span style="font-family: Arial; font-size: 16pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Installing OpenBSD&lt;/span&gt;&lt;/h2&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;I make some assumptions about your OpenBSD environment:&lt;/span&gt;&lt;/p&gt;&lt;ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"&gt;&lt;li aria-level="1" dir="ltr" style="background-color: transparent; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;A default OpenBSD install with all installsets&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="background-color: transparent; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;/etc/doas.conf&lt;/span&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt; is configured so you can use it from a user account you created during the installation. The below is a minimalist doas.conf:&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"&gt;&lt;li aria-level="2" dir="ltr" style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: circle; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #6fa8dc; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;permit persist :wheel&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li aria-level="1" dir="ltr" style="background-color: transparent; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Enough storage for 3 Alpine Linux virtual machines.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"&gt;&lt;li aria-level="2" dir="ltr" style="background-color: transparent; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: circle; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;I use a 100GB filesystem mounted at /vmm for this&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="2" dir="ltr" style="background-color: transparent; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: circle; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;The QCOW2 files in my example lab as of the time of writing are only using about 7GB of storage&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li aria-level="1" dir="ltr" style="background-color: transparent; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Enough storage for the NFS server to support persistent storage for some applications.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"&gt;&lt;li aria-level="2" dir="ltr" style="background-color: transparent; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: circle; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;I use a 100GB filesystem mounted at /k8s&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="2" dir="ltr" style="background-color: transparent; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: circle; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;A full WordPress/MySQL install in k8s is using less than 1GB&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li aria-level="1" dir="ltr" style="background-color: transparent; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;You can change these example directories around as you need to, but you’ll see these paths in the documentation.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 18pt;"&gt;&lt;span style="font-family: Arial; font-size: 16pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Networking the OpenBSD host and the VMM Guests&lt;/span&gt;&lt;/h2&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;We are going to bridge our guest VMs to the LAN. This is easier if you have multiple ethernet interfaces on your OpenBSD host, but we can work around it if you only have one.&lt;/span&gt;&lt;/p&gt;&lt;h3 dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 16pt;"&gt;&lt;span style="font-family: Arial; font-size: 14pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Two ethernet interfaces&lt;/span&gt;&lt;/h3&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;On a system with more than one ethernet interface, use a secondary interface to bridge the VMs to the network. In this example, I allowed the installer to configure the ethernet interface bnx0 with dhcp but I also connected the second ethernet interface bnx1 to the network. Set the second interface to come up with no IP address needed.&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: medium none; table-layout: fixed; width: 468pt;"&gt;&lt;colgroup&gt;&lt;col&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;/etc/hostname.bnx1&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #6fa8dc; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;up&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;h3 dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 16pt;"&gt;&lt;span style="color: #93c47d; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;doas sh /etc/netstart bnx1&lt;/span&gt;&lt;/h3&gt;&lt;h3 dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 16pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Arial; font-size: 14pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;–or – Single ethernet interface&lt;/span&gt;&lt;/h3&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;If we use a DHCP client on the OpenBSD host, it will intercept all DHCP traffic on the interface and keep the guest VMs from obtaining DHCP leases.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Set up a DHCP reservation for the MAC address of your OpenBSD host. This is only so your router doesn’t issue your IP address to some other system. Configure the OpenBSD host to use the reserved IP address in a static configuration.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;An example where my ethernet interface is em0. Static address of this interface is 192.168.1.2. I have marked this IP address as reserved on my home router.&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: medium none; table-layout: fixed; width: 468pt;"&gt;&lt;colgroup&gt;&lt;col&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;/etc/hostname.em0&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #6fa8dc; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;inet 192.168.1.2 255.255.255.0&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #6fa8dc; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;! route add default 192.168.1.254&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Your static IP details will likely differ from the above. Set appropriately. You may also need to manually configure /etc/resolv.conf&lt;/span&gt;&lt;/p&gt;&lt;h3 dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 16pt;"&gt;&lt;span style="font-family: Arial; font-size: 14pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;VM Bridge&lt;/span&gt;&lt;/h3&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Add the interface that you’ll be using to bridge0 as in the example below. For my lab machine, I have two interfaces and I’m using bnx1 to bridge my VMs.&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: medium none; table-layout: fixed; width: 468pt;"&gt;&lt;colgroup&gt;&lt;col&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;/etc/hostname.bridge0&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #6fa8dc; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;add bnx1&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Make sure you bring up the bridge interface&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;doas sh /etc/netstart bridge0&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 18pt;"&gt;&lt;span style="font-family: Arial; font-size: 16pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Set up NFS&lt;/span&gt;&lt;/h2&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Kubernetes requires some kind of network-attached storage that all of the containers can access regardless of which worker node they get allocated to. NFS is a popular option, and we’ll eventually install an automated NFS Client storage provisioner on the cluster. We might as well run this on the VMM server itself, since OpenBSD comes with an NFS server in the base install.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Export the /k8s filesystem (with enough storage, as mentioned above) via /etc/exports. You must ensure the network and netmask are appropriate for your LAN.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: medium none; table-layout: fixed; width: 468pt;"&gt;&lt;colgroup&gt;&lt;col&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;/etc/exports&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;/k8s -alldirs -network=192.168.1 -mask=255.255.255.0 -mapall=root&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 12pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Each Persistent Volume will invoke a new NFS thread, so we’ll max it out with 20 server threads for NFS and enable both TCP and UDP modes. mountd, portmap, statd and lockd are all part of the RPC and NFS system. Let’s enable them and start the services.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #93c47d; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;doas rcctl enable mountd&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #93c47d; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;doas rcctl enable statd&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #93c47d; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;doas rcctl enable lockd&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #93c47d; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;doas rcctl enable portmap&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #93c47d; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;doas rcctl enable nfsd&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #93c47d; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;doas rcctl set nfsd flags -t -u -n 20&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #93c47d; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;doas rcctl start mountd statd lockd portmap nfsd&lt;/span&gt;&lt;/p&gt;&lt;h1 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt;"&gt;&lt;span style="font-family: Arial; font-size: 20pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Create Template VM&lt;/span&gt;&lt;/h1&gt;&lt;h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"&gt;&lt;span style="font-family: Arial; font-size: 16pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Directory setup&lt;/span&gt;&lt;/h2&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;As mentioned above, this should have plenty of space, at least 30GB. We make it group writable so our user level account (which should be in the wheel group) can use it easily.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;doas mkdir /vmm&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;doas chmod 770 /vmm&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;cd /vmm&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"&gt;&lt;span style="font-family: Arial; font-size: 16pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Configure VMD’s virtual switch&lt;/span&gt;&lt;/h2&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Create A very bare-bones vm.conf to set up our bridge network. We’ll add to this later.&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: medium none; table-layout: fixed; width: 468pt;"&gt;&lt;colgroup&gt;&lt;col&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;/etc/vm.conf&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;switch "bridged" {&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;interface bridge0&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"&gt;&lt;span style="font-family: Arial; font-size: 16pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Enable and start vmd&lt;/span&gt;&lt;/h2&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;doas rcctl enable vmd&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;doas rcctl start vmd&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"&gt;&lt;span style="font-family: Arial; font-size: 16pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Download alpine-virt ISO image&lt;/span&gt;&lt;/h2&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;ftp https://dl-cdn.alpinelinux.org/alpine/v3.17/releases/x86_64/alpine-virt-3.17.2-x86_64.iso&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"&gt;&lt;span style="font-family: Arial; font-size: 16pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Create template VM disk image&lt;/span&gt;&lt;/h2&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #93c47d; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;vmctl create -s 10G alpine-template.qcow2&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"&gt;&lt;span style="font-family: Arial; font-size: 16pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Boot the template vm&lt;/span&gt;&lt;/h2&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;This will start the VM, boot from the iso, and attach your template VM disk image.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;doas vmctl start -c -d alpine-virt-3.17.2-x86_64.iso \&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-d alpine-template.qcow2 -m 2G -n bridged alpine-template&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"&gt;&lt;span style="font-family: Arial; font-size: 16pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Install Alpine Linux&lt;/span&gt;&lt;/h2&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Kubernetes works best when there’s no swap, so we’ll disable it with a variable we pass to setup-alpine. Mostly, just follow the prompts.&lt;/span&gt;&lt;/p&gt;&lt;ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"&gt;&lt;li aria-level="1" dir="ltr" style="background-color: transparent; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Log in as root and run the below command&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;SWAP_SIZE=0 setup-alpine&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="background-color: transparent; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Specify a hostname (I usually use ‘kube’ but we’ll change it later)&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="background-color: transparent; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Configure network (DHCP is fine)&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="background-color: transparent; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Busybox for cron&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="background-color: transparent; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Create a user-level account&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="background-color: transparent; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Use Openssh server&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="background-color: transparent; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Use the vdb disk as “sys” volume&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="background-color: transparent; font-family: Consolas, sans-serif; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;halt&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;After a while, hit enter. vmctl will exit back to the OpenBSD shell with an [EOT].&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"&gt;&lt;span style="font-family: Arial; font-size: 16pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Reboot into the template VM&lt;/span&gt;&lt;/h2&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Same command as above but without the installer ISO attached&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;doas vmctl start -c \&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-d alpine-template.qcow2 -m 2G -n bridged alpine-template&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"&gt;&lt;span style="font-family: Arial; font-size: 16pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Set up the basic software&lt;/span&gt;&lt;/h2&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Log in and immediately elevate to root&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;su -&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Edit /etc/apk/repositories. The default Alpine Linux install only includes vi. If you must, you can use “apk add nano” first.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;We only want these 3 repos enabled. You can leave the # in front of the others in the file.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: medium none; table-layout: fixed; width: 468pt;"&gt;&lt;colgroup&gt;&lt;col&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;/etc/apk/repositories&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;http://dl-cdn.alpinelinux.org/alpine/v3.17/main&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;http://dl-cdn.alpinelinux.org/alpine/v3.17/community&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;http://dl-cdn.alpinelinux.org/alpine/edge/testing&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Update the package index and install some software we need:&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;apk update&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;apk add doas kubernetes kubeadm docker cni-plugins kubelet kubectl nfs-utils cni-plugin-flannel flannel flannel-contrib-cni docker uuidgen git&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;We’ll use doas from this point forward. The default configuration of doas should be fine for our purposes (allows wheel-group users to do anything, caches the password for the session). Exit your root shell.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;exit&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Test doas – this will also cache the password so the rest of the commands run all at once if you just paste them in.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;doas id&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Paste the below into your terminal if you want. Or type it. I’m not the boss of you.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;doas rm /etc/ssh/*key*&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;printf "#!/bin/sh\nmount --make-rshared /\n" |\&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;  doas tee /etc/local.d/sharemetrics&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;doas chmod +x /etc/local.d/sharemetrics&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;doas rc-update add local&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;doas rc-update add docker default&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;doas rc-update add containerd default&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;doas rc-update add kubelet default&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;doas rc-update add rpc.statd default&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;doas rc-update add ntpd default&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;echo "net.bridge.bridge-nf-call-iptables=1" | doas tee -a /etc/sysctl.conf&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;doas apk add 'kubelet=~1.26'&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;doas apk add 'kubeadm=~1.26'&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;doas apk add 'kubectl=~1.26'&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;The last 3 commands ensure we don’t let Kubernetes components get upgraded past the minor version we specify. Replace 1.26 with the current minor version (1.22.3-r1 would be 1.22). As of writing, 1.26 is the latest. This keeps the cluster nodes from inadvertently updating to a higher version with incompatibilities.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Shut down the system. This has most of what we need for all the kubernetes nodes.&lt;/span&gt;&lt;/p&gt;&lt;span style="color: #93c47d;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;doas halt&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Once vmctl exits and you are back at the OpenBSD shell, make this template disk image read-only. This will be our base image for the 3 Alpine Linux VMs, and if something changes in this file, it’ll break the derivative images.&lt;/span&gt;&lt;/p&gt;&lt;span style="color: #93c47d;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;doas chmod 400 alpine-template.qcow2&lt;/span&gt;&lt;/p&gt;&lt;h1 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt;"&gt;&lt;span style="font-family: Arial; font-size: 20pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Clone Template VM&lt;/span&gt;&lt;/h1&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Create the derivative images for the master node and two workers.&lt;/span&gt;&lt;/p&gt;&lt;span style="color: #93c47d;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;doas vmctl create -b alpine-template.qcow2 kube-master.qcow2&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;doas vmctl create -b alpine-template.qcow2 kube-w1.qcow2&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;doas vmctl create -b alpine-template.qcow2 kube-w2.qcow2&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Add them to /etc/vm.conf. We specify MAC addresses inside the interface clause because if we don’t, they will get a different random MAC address (and probably IP address) at runtime.&amp;nbsp; My /etc/vm.conf now looks like this:&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: medium none; table-layout: fixed; width: 468pt;"&gt;&lt;colgroup&gt;&lt;col&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;/etc/vm.conf&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;switch "bridged" {&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;interface bridge0&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;vm "kube-master" {&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;disable&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;memory 2048M&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;disk "/vmm/kube-master.qcow2"&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;interface {&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;switch "bridged"&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;lladdr fe:e1:ba:d9:fb:c0&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;span style="color: #6fa8dc;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;vm "kube-w1" {&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;disable&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;memory 2048M&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;disk "/vmm/kube-w1.qcow2"&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;interface {&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;switch "bridged"&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;lladdr fe:e1:ba:d9:fb:c1&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;span style="color: #6fa8dc;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;vm "kube-w2" {&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;disable&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;memory 2048M&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;disk "/vmm/kube-w2.qcow2"&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;interface {&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;switch "bridged"&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;lladdr fe:e1:ba:d9:fb:c2&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span style="color: #6fa8dc;"&gt;}&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Before we continue, it’s a good idea to set up a DHCP reservation for the MAC address you use for the master node. If the master node IP changes, the workers can’t find it, and fixing the cluster is not a very straightforward task. This isn’t too important if you’re just playing around with kubernetes for fun, though.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;If you have more than 8GB of RAM, I’d allocate about 25% of your RAM to each VM. 16GB of RAM? 4096M per node. 32GB of RAM? Give each node 8192M.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;If you have a system with more than 4 cores, and more than 32GB of RAM, consider adding more worker nodes and tuning the RAM on them. 2GB per node is an absolute minimum and will lag a lot.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Reload the configuration and start up the master node with a console&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #93c47d; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;doas vmctl reload&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #93c47d; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;doas vmctl start -c kube-master&lt;/span&gt;&lt;/p&gt;&lt;h1 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt;"&gt;&lt;span style="font-family: Arial; font-size: 20pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Bootstrap the master node&lt;/span&gt;&lt;/h1&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Login to the console or SSH into the master node.&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"&gt;&lt;span style="font-family: Arial; font-size: 16pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Set the host name and machine-id&lt;/span&gt;&lt;/h2&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;These are important for the k8s networking components.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;echo "master" | doas tee /etc/hostname&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;doas hostname -F /etc/hostname&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;uuidgen | doas tee /etc/machine-id&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"&gt;&lt;span style="font-family: Arial; font-size: 16pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Install k8s management tools&lt;/span&gt;&lt;/h2&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;doas apk add k9s helm curl&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"&gt;&lt;span style="font-family: Arial; font-size: 16pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Initialize Kubernetes&lt;/span&gt;&lt;/h2&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Here, we have to work-around the requirement for two CPU cores.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;doas kubeadm init --&lt;/span&gt;&lt;span style="color: #93c47d; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;ignore-preflight-errors=NumCPU \&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--pod-network-cidr=10.244.0.0/16 --node-name=master&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;This could take some time to pull images and generate crypto keys. It will eventually spit out a bunch of stuff including the below (slightly modded).&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Execute these with your user-level account on master.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #93c47d; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #93c47d; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #93c47d; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt; &lt;/span&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;mkdir -p $HOME/.kube&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;&lt;/span&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt; doas cp -i /etc/kubernetes/admin.conf $HOME/.kube/config&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;&lt;/span&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt; doas chown $(id -u):$(id -g) $HOME/.kube/config&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;The initialization will also show the command to join nodes to the cluster...&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #93c47d; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #93c47d; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;&lt;/span&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt; kubeadm join 192.168.1.xxx:6443 --token foobar.foobarfoobarfoob \&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;&lt;/span&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt; --discovery-token-ca-cert-hash sha256: \&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;&lt;/span&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt; d34db3efd34db3efd34db3efd34db3efd34db3efd34db3efd34db3efd34db3ef&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Save this kubeadm join command. You'll need it for all your workers. I create a file on master and save it just so it’s easy to find.&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"&gt;&lt;span style="font-family: Arial; font-size: 16pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Install Flannel CNI plugin.&lt;/span&gt;&lt;/h2&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;This is technically the first package you manually deploy to your cluster. It creates a daemonset of containers (pods) that will self-replicate across all nodes as they join the cluster.&lt;/span&gt;&lt;/p&gt;&lt;span style="color: #93c47d;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml&lt;/span&gt;&lt;/p&gt;&lt;h1 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt;"&gt;&lt;span style="font-family: Arial; font-size: 20pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Worker Nodes&lt;/span&gt;&lt;/h1&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Boot up the first worker node. On your OpenBSD VMM host, run:&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;doas vmctl start -c kube-w1&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Login to the console or SSH into this worker node.&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"&gt;&lt;span style="font-family: Arial; font-size: 16pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Set the host name and machine-id&lt;/span&gt;&lt;/h2&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Similar to how we set up the master node, we need each worker to have a unique name and machine-id&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;echo "kube-w1" | doas tee /etc/hostname&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;doas hostname -F /etc/hostname&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;uuidgen | doas tee /etc/machine-id&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Run the command to join the cluster as provided when initializing the master node. Don’t forget to use doas.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #93c47d; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;doas kubeadm join 192.168.1.xxx:6443 --token foobar.foobarfoobarfoob \&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #93c47d; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #93c47d; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #93c47d; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp; --discovery-token-ca-cert-hash sha256: \&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #93c47d; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #93c47d; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #93c47d; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp; d34db3efd34db3efd34db3efd34db3efd34db3efd34db3efd34db3efd34db3ef&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Kubernetes tokens are only valid for 24 hours. If you want to join a new worker to the cluster, you can generate and print a new join token at any time. You must execute this on the MASTER node, then run the output of this command on your new worker node.&lt;/span&gt;&lt;/p&gt;&lt;span style="color: #93c47d;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #93c47d; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;kubeadm token create --print-join-command&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;That’s it. Log off. You're done with this worker node.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;You can hit enter and then use the “tilde period” escape sequence ~. to break out of the vmctl console while the VM remains running. If connected to your VM server over SSH, note that ~. is also the sequence to terminate your SSH session, so use ~~. instead.&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"&gt;&lt;span style="font-family: Arial; font-size: 16pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Rinse, Repeat&lt;/span&gt;&lt;/h2&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Repeat the above process for kube-w2 (make sure you change the hostname in the commands above) before you continue. You can repeat this process to make as many worker nodes as you have the resources for. You’ll need to make new drive images and VMs in /etc/vm.conf to support them.&lt;/span&gt;&lt;/p&gt;&lt;h1 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt;"&gt;&lt;span style="font-family: Arial; font-size: 20pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Behold, your Kubernetes cluster&lt;/span&gt;&lt;/h1&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Login to the master node again.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"&gt;&lt;span style="font-family: Arial; font-size: 16pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Basic kubectl commands&lt;/span&gt;&lt;/h2&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;kubectl get nodes&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;kubectl get pods --all-namespaces&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;You should see stuff running.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"&gt;&lt;span style="font-family: Arial; font-size: 16pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;K9S Navigation&lt;/span&gt;&lt;/h2&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;K9S is a curses-based Kubernetes UI. Just run “&lt;/span&gt;&lt;span face="Consolas, sans-serif" style="font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span style="color: #93c47d;"&gt;k9s&lt;/span&gt;”&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;If k9s exits with an error message, it may be due to your termcap being unsupported. Try the below command, then run k9s again. If that works, consider adding this to the .profile file so it runs every time you log in.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;export TERM=xterm-256color&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;":" will let you jump to the various pages. Some pages worth knowing:&lt;/span&gt;&lt;/p&gt;&lt;ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"&gt;&lt;li aria-level="1" dir="ltr" style="background-color: transparent; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;node &amp;nbsp; &lt;/span&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt; - all connected nodes&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="background-color: transparent; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;deploy &amp;nbsp; &lt;/span&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt; - deployments, which configure pods and replicaSets&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="background-color: transparent; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;daemonset&amp;nbsp; &amp;nbsp; - daemonsets - groups of pods that should run on many nodes&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="background-color: transparent; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;statefulset &amp;nbsp; &amp;nbsp; - Stateful applications&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="background-color: transparent; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;pods &amp;nbsp; &lt;/span&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt; - Individual containers&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li aria-level="1" dir="ltr" style="background-color: transparent; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline; white-space: pre;"&gt;&lt;p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;namespace &amp;nbsp; - namespaces in the cluster&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;On each page, note the hotkey menu at the top. You can also use "/" to search the current content of the given page. You can on-the-fly edit a manifest of a deployment, for example, or delete a pod to evict it (usually results in a restart which may or may not be on the same node) - Also pay attention to the number hotkeys which let you filter by namespace. Often, you'll want 0 for ALL namespaces&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"&gt;&lt;span style="font-family: Arial; font-size: 16pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Troubleshooting with K9S&lt;/span&gt;&lt;/h2&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Cursor over an asset (like a pod, daemonset, deployment) and use “d” to describe the asset. You can usually see information about what’s going on. This is useful for figuring out why a pod is in a CrashLoopBackoff state.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Use “l” (lowercase L) to fetch logs. You may need to use the hotkeys to view head or tail the logs, adjust line wrapping, etc.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Use “e” to edit a manifest on-the-fly. You can often “hack” quick fixes in if something is typoed or you want to scale up a deployment manually.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Use “s” on a pod to try to get a shell on the container. Some containers do not support shells. Containers that are crashing will not remain up long enough to do anything meaningful in a shell.&lt;/span&gt;&lt;/p&gt;&lt;h1 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt;"&gt;&lt;span style="font-family: Arial; font-size: 20pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Provision NFS Storage&lt;/span&gt;&lt;/h1&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;SSH back into your MASTER node.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;When an application requires storage, it makes a “Persistent Volume Claim.” These will lurk around forever and stop the application from deploying until a persistent volume is created that meets the criteria for the claim. In a managed cluster, this happens automatically, so we’re going to deploy our own magic process to create these volumes on the fly, using storage we provide via NFS.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;For this, we will use &lt;/span&gt;&lt;a href="http://github.com/kubernetes-sigs/nfs-subdir-external-provisioner"&gt;&lt;span style="background-color: transparent; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;"&gt;nfs-subdir-external-provisioner&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;, and set up Kustomize to tweak it for our environment. Kustomize can modify and patch stock manifests so you don’t have to edit them directly – and as you’ll see here, sometimes you don’t even need to download them, you can just reference the repository.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"&gt;&lt;span style="font-family: Arial; font-size: 16pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Make a directory&lt;/span&gt;&lt;/h2&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Generally speaking, we work in a directory for a given task. We’ll make a new directory for our storage provisioning.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;mkdir storage; cd storage&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"&gt;&lt;span style="font-family: Arial; font-size: 16pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Create configuration files&lt;/span&gt;&lt;/h2&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Create the below files inside the storage directory with the contents as shown. YAML is extremely picky and your browser might not copy/paste these correctly. You can snag all of the YAML files I use in this example from my github: &lt;/span&gt;&lt;a href="https://github.com/n0xa/k8s-playground"&gt;&lt;span style="background-color: transparent; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;"&gt;n0xa/k8s-playground&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: medium none; table-layout: fixed; width: 468pt;"&gt;&lt;colgroup&gt;&lt;col&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;namespace.yaml&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #6fa8dc; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;apiVersion: v1&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #6fa8dc; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;kind: Namespace&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #6fa8dc; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;metadata:&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #6fa8dc; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;name: nfs-provisioner&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Be sure to modify the highlighted values in the patch file to match your NFS server’s details.&lt;/span&gt;&lt;/p&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: medium none; table-layout: fixed; width: 468pt;"&gt;&lt;colgroup&gt;&lt;col&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;patch_nfs_details.yaml&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"&gt;&lt;span style="color: #6fa8dc;"&gt;apiVersion: apps/v1&lt;br /&gt;kind: Deployment&lt;br /&gt;metadata:&lt;br /&gt;&amp;nbsp; labels:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; app: nfs-client-provisioner&lt;br /&gt;&amp;nbsp; name: nfs-client-provisioner&lt;br /&gt;spec:&lt;br /&gt;&amp;nbsp; template:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; spec:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; containers:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - name: nfs-client-provisioner&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; env:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - name: NFS_SERVER&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; value: &lt;/span&gt;192.168.1.122&lt;span style="color: #6fa8dc;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - name: NFS_PATH&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; value: &lt;/span&gt;/k8s&lt;span style="color: #6fa8dc;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; volumes:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - name: nfs-client-root&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nfs:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; server: &lt;/span&gt;192.168.1.122&lt;span style="color: #6fa8dc;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; path: &lt;/span&gt;/k8s&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: medium none; table-layout: fixed; width: 468pt;"&gt;&lt;colgroup&gt;&lt;col&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;kustomization.yaml&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #6fa8dc; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;namespace: nfs-provisioner&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #6fa8dc; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;bases:&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #6fa8dc; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;- github.com/kubernetes-sigs/nfs-subdir-external-provisioner//deploy&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #6fa8dc; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;resources:&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #6fa8dc; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;- namespace.yaml&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #6fa8dc; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;patchesStrategicMerge:&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #6fa8dc; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;- patch_nfs_details.yaml&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"&gt;&lt;span style="font-family: Arial; font-size: 16pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Deploy with Kubectl&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;This will use the kustomization.yaml to patch the manifest files, and apply the resulting assets to your cluster.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #93c47d; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;kubectl apply -k ./ &lt;/span&gt;&lt;/p&gt;&lt;h1 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt;"&gt;&lt;span style="font-family: Arial; font-size: 20pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Deploy MetalLB Load Balancer&lt;/span&gt;&lt;/h1&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Now we need to build a load balancer to expose the service to an external set of IP addresses. We will use &lt;/span&gt;&lt;a href="https://metallb.universe.tf/installation/"&gt;&lt;span style="background-color: transparent; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;"&gt;MetalLB&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt; for this. We are going to arbitrarily use some LAN IP addresses here. In my home lab, the range 192.168.1.1 through 192.168.1.63 is out of the normal DHCP scope. You may wish to set aside a range of addresses that aren’t managed by DHCP at all.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"&gt;&lt;span style="font-family: Arial; font-size: 16pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Make a directory&lt;/span&gt;&lt;/h2&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #93c47d; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;mkdir ~/metallb; cd ~/metallb&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"&gt;&lt;span style="font-family: Arial; font-size: 16pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Install MetalLB with kubectl&lt;/span&gt;&lt;/h2&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;kubectl apply -f&amp;nbsp; https://raw.githubusercontent.com/metallb/metallb/v0.13.7/config/manifests/metallb-native.yaml&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"&gt;&lt;span style="font-family: Arial; font-size: 16pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Configure Load Balancer IP Addresses&lt;/span&gt;&lt;/h2&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Create a configuration yaml for the IP addresses you’re reserving for the load balancer. You can specify IP address ranges, CIDR blocks or single IPs if you want. You can add as many lines as you wish. You can see I defined two IP address ranges, one named “production” and the other (which is technically one IP address) named “wordpress”&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: medium none; table-layout: fixed; width: 468pt;"&gt;&lt;colgroup&gt;&lt;col&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;address.yaml&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;apiVersion: metallb.io/v1beta1&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;kind: IPAddressPool&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;metadata:&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;name: production&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;namespace: metallb-system&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;spec:&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;addresses:&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;- &lt;/span&gt;192.168.1.16-192.168.1.24&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;---&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;apiVersion: metallb.io/v1beta1&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;kind: IPAddressPool&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;metadata:&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;name: wordpress&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;namespace: metallb-system&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;spec:&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;addresses:&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;- &lt;/span&gt;192.168.1.14/32&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;---&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;apiVersion: metallb.io/v1beta1&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;kind: L2Advertisement&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;metadata:&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;name: l2-advert&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;namespace: metallb-system&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;br /&gt;&lt;h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"&gt;&lt;span style="font-family: Arial; font-size: 16pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Apply the configuration&lt;/span&gt;&lt;/h2&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Note that the API extensions this manifest references won’t be available until after the MetalLB resources are all up and running.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;kubectl apply -f address.yaml&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;By default, any new service that gets deployed will get an IP address from the “production” pool. If we add the proper annotations to any new service that gets deployed, we can force it to use the wordpress IP address we specified.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;h1 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt;"&gt;&lt;span style="font-family: Arial; font-size: 20pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Deploy WordPress&lt;/span&gt;&lt;/h1&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Let’s deploy a simple Wordpress blog using helm.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"&gt;&lt;span style="font-family: Arial; font-size: 16pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Add the Bitnami Helm Repository&lt;/span&gt;&lt;/h2&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;span style="color: #93c47d;"&gt;helm repo add bitnami https://charts.bitnami.com/bitnam&lt;/span&gt;i&lt;/span&gt;&lt;/p&gt;&lt;h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"&gt;&lt;span style="font-family: Arial; font-size: 16pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Configure Wordpress&lt;/span&gt;&lt;/h2&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Here, I’ve put together a YAML file with just enough details to get it up and running. We’ll give it a title, a username, and details about our storage and load balancer service annotations. You should change any of these details as you need.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;div align="left" dir="ltr" style="margin-left: 0pt;"&gt;&lt;table style="border-collapse: collapse; border: medium none; table-layout: fixed; width: 468pt;"&gt;&lt;colgroup&gt;&lt;col&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;wp-values.yaml&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 0pt;"&gt;&lt;td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;wordpressUsername: myuser&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;wordpressEmail: ax0n@example.com&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;wordpressFirstName: Noah&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;wordpressLastName: Axon&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;wordpressBlogName: "Ax0n's Blog"&lt;/span&gt;&lt;/p&gt;&lt;span style="color: #6fa8dc;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;global:&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;storageClass: "nfs-client"&lt;/span&gt;&lt;/p&gt;&lt;span style="color: #6fa8dc;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;service:&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;annotations:&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="color: #6fa8dc; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;metallb.universe.tf/address-pool: wordpress&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;br /&gt;&lt;h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"&gt;&lt;span style="font-family: Arial; font-size: 16pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Install Wordpress with Helm&lt;/span&gt;&lt;/h2&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;We’ll make a new “wordpress” namespace in k8s for this installation.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;helm install wordpress -f wp-values.yaml --create-namespace wordpress \&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span face="Consolas, sans-serif" style="color: #93c47d; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--namespace wordpress bitnami/wordpress&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;This will spit out a whole bunch of text explaining how to find the randomly-generated password, the service IP address and more. Of course, we know it should pick up the IP address we defined for Wordpress in the MetalLB configuration.&amp;nbsp;Grab the password via the commands provided.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Helm will create a whole bunch of resources, including a statefulset for MariaDB, a deployment for the Wordpress webserver, volumes for the database and wordpress web application itself, a secret to hold the generated password, and a number of other resources. This can take several minutes to complete. Feel free to open k9s again and watch the logs as MariaDB initializes, Wordpress waits to connect, and the entire provisioning process unfolds.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Once it’s complete, browse to the IP address you set up for Wordpress.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;Use the admin URL and log in.&lt;/span&gt;&lt;/p&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8_3s8yYf899gStst4Hjwhgkru3qfWfrvjaORXNNULpU6advPm3V3qcXGxEmkHLXCHyNelG-rHNM7k7dtxo1b8tIGn1Mb_bRD63U8Gmjd6Fz2NyjKRfI0XVBm92Qwnzz8VqGfiL7KTVZviLgQL3rpHRW4P5X8xHKkopriTA2Zl7pbVkTAP3594zeym/s1187/Screenshot_2023-02-25_17-07-24.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="867" data-original-width="1187" height="293" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8_3s8yYf899gStst4Hjwhgkru3qfWfrvjaORXNNULpU6advPm3V3qcXGxEmkHLXCHyNelG-rHNM7k7dtxo1b8tIGn1Mb_bRD63U8Gmjd6Fz2NyjKRfI0XVBm92Qwnzz8VqGfiL7KTVZviLgQL3rpHRW4P5X8xHKkopriTA2Zl7pbVkTAP3594zeym/w400-h293/Screenshot_2023-02-25_17-07-24.png" width="400" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"&gt;&lt;span style="font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"&gt;I did run into a well-documented issue with the installation, in that the health checks (readiness and liveness probes) caused the Wordpress container to restart before it was finished setting everything up. I had to manually create a “themes” directory inside my NFS server under the directory provisioned for wordpress and then manually download and set a theme inside the admin page.&amp;nbsp; This seems to happen on lower-performance clusters. sometimes.&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;P&gt;We are proud members of the &lt;A HREF="http://securitybloggers.net/"&gt;Security Bloggers Network&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;This content originally posted on &lt;A HREF="http://www.h-i-r.net/"&gt;HiR Information Report&lt;/A&gt;. Copyright © 1997-2010, HiR&lt;/P&gt;&lt;/div&gt;</description><link>http://www.h-i-r.net/2023/02/running-kubernetes-cluster-with-openbsd.html</link><author>noreply@blogger.com (Ax0n)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLkEqXrmx7n8eXsHtwqI9szzvlq1brMgNdGLv8EQBZAX4lQxOAH04NCYre9yMJDuO23b--Rh04rJ3jm9sGxuJOgyInTPwqmebESwXoi15Dqdwe9vJFYFBeRaGXpvlr13YIKbJJKYuFcjVuYcfgoa1aig__D2leMzX66W4K3A0wQMfVsPxIU6mHDAcH/s72-w400-h400-c/k9s.jpg" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5554915078212081470.post-3586972351943809340</guid><pubDate>Thu, 27 May 2021 22:48:00 +0000</pubDate><atom:updated>2021-05-27T17:49:12.024-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">boot</category><category domain="http://www.blogger.com/atom/ns#">bsd</category><category domain="http://www.blogger.com/atom/ns#">openbsd</category><category domain="http://www.blogger.com/atom/ns#">unix</category><category domain="http://www.blogger.com/atom/ns#">Windows</category><title>Dedicated page for Multi-Booting Windows 10 and OpenBSD</title><description>&lt;p&gt;I've created a dedicated page with my guide for &lt;a href="https://www.h-i-r.net/p/multi-booting-windows-10-and-openbsd.html"&gt;Multi-Booting Windows 10 and OpenBSD&lt;/a&gt;. This supersedes the earlier blog post on this topic. I've been running this setup for a few months now and I seem to have ironed out most of the gotchas, including how to, as elegantly as practicable, deal with Windows' BitLocker shenanigans as well as its tendency to override the rEFInd boot manager. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;P&gt;We are proud members of the &lt;A HREF="http://securitybloggers.net/"&gt;Security Bloggers Network&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;This content originally posted on &lt;A HREF="http://www.h-i-r.net/"&gt;HiR Information Report&lt;/A&gt;. Copyright © 1997-2010, HiR&lt;/P&gt;&lt;/div&gt;</description><link>http://www.h-i-r.net/2021/05/dedicated-page-for-multi-booting.html</link><author>noreply@blogger.com (Ax0n)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5554915078212081470.post-3796810206021300658</guid><pubDate>Sun, 02 May 2021 03:37:00 +0000</pubDate><atom:updated>2021-05-01T22:37:38.982-05:00</atom:updated><title>OpenBSD 6.9 Released, PHP/MySQL Page updated</title><description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3YwpmlVvpX7CyLXBVWW9EqOu3w2Nw6UO_325C4D3ztbPVnxJoS1VaTGNjGzINoJw8g8r46t9YVIbFriZIGFkJfbcq1PHw99jpNx9__OgXLnf3iirz3S7_5NXpszfYvSTCH66Ijxhx4Qk/s2048/obsd69logo.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="2048" data-original-width="1536" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3YwpmlVvpX7CyLXBVWW9EqOu3w2Nw6UO_325C4D3ztbPVnxJoS1VaTGNjGzINoJw8g8r46t9YVIbFriZIGFkJfbcq1PHw99jpNx9__OgXLnf3iirz3S7_5NXpszfYvSTCH66Ijxhx4Qk/s320/obsd69logo.png" /&gt;&lt;/a&gt;&lt;/div&gt;The &lt;a href="http://www.openbsd.org/69.html"&gt;50th release of OpenBSD&lt;/a&gt; hit the mirrors last night, but I had some problems installing packages -- they were out of sync a bit. Anyhow, today, all of the package repositories on all the mirrors seem to be working swimmingly (you see what I did there?) and getting OpenBSD's built-in HTTPD working with PHP 8.0.3 and MariaDB (a MySQL Fork) 10.5.9 is a breeze. I've updated the &lt;a href="http://www.h-i-r.net/p/setting-up-openbsd-relayd-based-httpd.html"&gt;OpenBSD HTTPD/PHP/MySQL&lt;/a&gt; page accordingly.&lt;p&gt;&lt;/p&gt;&lt;p&gt;I'm most excited about a number of fixes in the VMM hypervisor that mean it can once again run some of my Linux virtual machines that have newer kernels. That had been broken for quite a while. There are also some changes to video and audio subsystems that I feel like might have been driven by some of my input on the mailing lists. The world may never know.&amp;nbsp;&lt;/p&gt;&lt;p&gt;In news that's related only by virtue of OpenBSD tinkering, I also managed to get &lt;a href="https://obsproject.com/"&gt;OBS Studio&lt;/a&gt; working on OpenBSD-CURRENT, which just required me to figure out how to get the excellent &lt;a href="https://github.com/jasperla/openbsd-wip"&gt;openbsd-wip ports tree&lt;/a&gt; working alongside the &lt;a href="https://www.openbsd.org/faq/ports/ports.html"&gt;official OpenBSD Ports&lt;/a&gt;. I'm still figuring out how to tune OBS to get high-quality live streams working, and at present, directly attaching the webcam to OBS results in a Kernel Panic. So there are some bugs to iron out.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;P&gt;We are proud members of the &lt;A HREF="http://securitybloggers.net/"&gt;Security Bloggers Network&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;This content originally posted on &lt;A HREF="http://www.h-i-r.net/"&gt;HiR Information Report&lt;/A&gt;. Copyright © 1997-2010, HiR&lt;/P&gt;&lt;/div&gt;</description><link>http://www.h-i-r.net/2021/05/openbsd-69-released-phpmysql-page.html</link><author>noreply@blogger.com (Ax0n)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3YwpmlVvpX7CyLXBVWW9EqOu3w2Nw6UO_325C4D3ztbPVnxJoS1VaTGNjGzINoJw8g8r46t9YVIbFriZIGFkJfbcq1PHw99jpNx9__OgXLnf3iirz3S7_5NXpszfYvSTCH66Ijxhx4Qk/s72-c/obsd69logo.png" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5554915078212081470.post-2906060875667186772</guid><pubDate>Wed, 24 Mar 2021 03:06:00 +0000</pubDate><atom:updated>2021-03-23T22:09:02.693-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">laptop</category><category domain="http://www.blogger.com/atom/ns#">openbsd</category><category domain="http://www.blogger.com/atom/ns#">unix</category><title>Review: OpenBSD 6.8 on 8th Gen Lenovo ThinkPad X1 Carbon 13.3"</title><description>&lt;p&gt;10 days ago, I bought this X1 Carbon. I immediately installed OpenBSD on it. It took me a few days to settle in and make myself at home, but here are my impressions.&lt;/p&gt;&lt;p&gt;This was the smoothest experience I've had getting OpenBSD set up the way I like it. The Toshiba NB305 in 2011 was a close second, but the Acer I used between these two laptops required a lot more tweaking of both hardware and kernel to get it to feel like home.&lt;/p&gt;&lt;h1 style="text-align: left;"&gt;The bad news &lt;br /&gt;&lt;/h1&gt;&lt;p&gt;Let's start with what doesn't work flawlessly on the ThinkPad under OpenBSD-STABLE (6.8 with all patches to date applied), roughly in the order I noticed them. &lt;b&gt;At the moment, the issues with the TrackPad and browser webcam are the only outstanding annoyances.&lt;/b&gt; Everything else was easily addressed with basic configuration adjustments.&lt;br /&gt;&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;The resolution is just too high.&amp;nbsp;&lt;/h3&gt;&lt;p style="text-align: left;"&gt;First world problems. While I admire cramming a full-blown 4K UHD into this diminutive portable workstation, at 3840x2160 on a 13-inch-class display, everything was too small to read. Windows and MacOS both handle the ever-growing number of pixels on a display by having a "scale" item in the display properties. While display managers designed for BSD and Linux, such as XFCE or GNOME, do have the ability to scale items, these scale settings don't work globally across all applications in a predictable way.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The high-DPI display was most problematic during installation, wherein the kernel modesetting used the native screen resolution for the text-mode installer, with each line of text being barely a millimeter tall. I literally wore a headset magnifier to install OpenBSD on this thing. After install, the console was a reasonable size. I don't know why the installer used such a high resolution, but suppose it could be related to firmware for the on-board graphics adapter that's not present in the install media but is present after a full install and fw_update.&lt;/p&gt;&lt;p&gt;Upon logging in to X and opening a terminal window, I had to bump up the font size just to see what's going on. I opted to just decrease the resolution of my display to solve this problem. Using xrandr to experiment with different 16x9 resolutions, I settled on 2048x1152, though plain old 1080p is also quite pleasant. I added this lovely gem to my .xinitrc file before calling the desktop environment:&lt;/p&gt;&lt;p&gt;xrandr --output eDP-1 --mode 2048x1152&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;The touchpad occasionally goes non-responsive.&amp;nbsp;&lt;/h3&gt;&lt;p&gt;I think this may be hardware-level wrist-detection stuff at work, but backing completely off the computer and trying to use the touchpad doesn't fix it. I often have to use two or three fingers at a time and repeatedly tap the touchpad to get it to come back. Thinking about it now, I should probably see if it works after I just leave it alone for a few seconds. In the meantime, I disabled the trackpad in the BIOS and I'm trying my very best to embrace the TrackPoint "Eraser Head" pointer. If you know what's going on with the touchpad, let me know.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;The TrackPoint doesn't scroll by default under X.&lt;/h3&gt;&lt;p&gt;On Windows, you can scroll by holding the center TrackPoint button while moving the TrackPoint head. This didn't work by default -- center button is "paste" by default under X. I was able to make some more additions to the beginning of my .xinitrc file to get it right, where clicking the center button pastes the clipboard contents, and holding it allows you to scroll with the TrackPoint:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;xinput set-prop "/dev/wsmouse" "WS Pointer Wheel Emulation" 1&lt;br /&gt;xinput set-prop "/dev/wsmouse" "WS Pointer Wheel Emulation Button" 2&lt;br /&gt;xinput set-prop "/dev/wsmouse" "WS Pointer Wheel Emulation Axes" 6 7 4 5&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;Audio quality with the default settings&lt;/h3&gt;&lt;p&gt;The audio sounded a little tinny and not all that loud when I first played audio over them. Part of the backstory of my admiration of the ThinkPad X1 line is that I pay attention to OpenBSD developers and what they say about hardware. ThinkPads get a lot of praise from the developers I follow, and in one of &lt;a href="https://jcs.org/2019/08/14/x1c7" target="_blank"&gt;jcs@'s recent-ish blog posts&lt;/a&gt; about the previous generation of X1 Carbon, there was some concern about the audio output. I noticed that while sound was coming out of the "bass" speakers on the bottom of the wrist rest and the "treble" speakers on top near the screen hinges, the tone of the sound coming out of all of the speakers seemed amiss -- and muting the small speakers made it sound better. It turned out to be the same problem as jcs@ noted on the 7th gen X1 Carbon, and adding this line to /etc/mixerctl.conf fixed it, while providing crystal-clear sound through all 4 speakers:&lt;br /&gt;&lt;br /&gt;outputs.spkr2_source=dac-0:1&lt;br /&gt;&lt;/p&gt;&lt;p&gt;When this laptop's audio is firing on all cylinders, it sounds positively amazing given its size. I've had big old chunky gaming laptops with big old woofers inside them that didn't sound this good. What it has in audio quality, it lacks, just a little, in maximum volume, but it's more than loud enough to fill my workspace with sound, whether I'm in the back of my camper-van or hacking away in my home office.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;Webcam support in the browser&lt;/h3&gt;&lt;p&gt;YouTube, Discord and some other sites will TRY to use the webcam and microphone - and take note of the kern.audio.record (and upcoming kern.video.record) sysctl options. On Discord's web app, I briefly see my webcam video as the webcam activity LED illuminates, then the LED turns off and Discord returns an error. On YouTube, I never see my own video, but the webcam activity LED blinks briefly. Video capture tools such as ffmpeg and vlc work quite well with the webcam. Given that, I believe there's probably a simple fix to make it work flawlessly, I just haven't found it yet. I'm looking forward to a time, hopefully soon, when I can use an official &lt;a href="https://undeadly.org/cgi?action=article;sid=20210113072623" target="_blank"&gt;package or port of OBS Studio&lt;/a&gt;, maybe even with working virtual camera support.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;The fingerprint reader isn't supported&lt;/h3&gt;&lt;p&gt;jcs@ also noted the same of the 7th generation X1 as of 2019. It doesn't bother me in the least. Maybe it'd be neat to log in to OpenBSD with a fingerprint, but I've been using OpenBSD for 21 years without it, so I don't miss the functionality and it's only barely worth mentioning.&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;No Bluetooth &lt;br /&gt;&lt;/h3&gt;&lt;p&gt;Bluetooth has been unsupported by OpenBSD for many years. I don't miss it, but if you decide to try OpenBSD, you might notice that there is no Bluetooth stack. &lt;br /&gt;&lt;/p&gt;&lt;h1 style="text-align: left;"&gt;The good news&lt;/h1&gt;&lt;p&gt;What works? Basically everything else.&amp;nbsp;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;The function keys for volume, mute, brightness, and keyboard backlight worked without any hassle &lt;br /&gt;&lt;/li&gt;&lt;li&gt;The built-in ethernet port 
(which requires a dongle to use) has full support in the kernel via em(4) without 
requiring a firmware blob.&lt;/li&gt;&lt;li&gt;After loading firmware, the on-board Intel WiFi6 adapter is fast and functional via iwx(4).&amp;nbsp;&lt;/li&gt;&lt;li&gt;Sleep/suspend/wake works well via zzz(1) or simply closing the laptop lid. Similarly, using sysctl to disable sleep when the laptop is closed works and it will stay running while closed. &lt;br /&gt;&lt;/li&gt;&lt;li&gt;WebGL applications, such as some of my favorite online games, work fine now. About a year ago, none of them worked. It could just be that my old laptop didn't have enough resources for these web applications.&lt;/li&gt;&lt;li&gt;&amp;nbsp;YouTube, Social media applications, Google Drive, etc... all good.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Even the USB microscope that I use for small  electronics work and examining small mechanical parts such as those 
found in locks and analog watches works great with VLC once I'd created /dev/video2 and set up device permissions.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Battery life seems good. I have been using this laptop for about 3 and a half hours before and during the writing of this review, with moderate screen brightness, several "hungry" tabs open in Firefox and with pianobar (a CLI Pandora client) blasting my "Orbital" inspired playlist. I have two OpenBSD virtual machines running in vmm, though I'm not currently doing anything intense with them. I've been on battery the whole time and I've got 43% battery remaining, with an estimated run time of about 2.5 hours remaining. I can deal with 6 hours of untethered run-time under my usual working conditions. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;The system temperature has hovered in the 40-60*C range most of the time, though it got a little warmer when certain browser tasks get rolling. The cooling fan has remained off almost the entire time, but when it's running, it's still very quiet.&lt;br /&gt;&lt;/p&gt;I was a little worried that I'd have a "never meet your heroes" moment when I bought this laptop, and that it might not live up to the expectations that I had. So far, it's everything I need and then some. &lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;P&gt;We are proud members of the &lt;A HREF="http://securitybloggers.net/"&gt;Security Bloggers Network&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;This content originally posted on &lt;A HREF="http://www.h-i-r.net/"&gt;HiR Information Report&lt;/A&gt;. Copyright © 1997-2010, HiR&lt;/P&gt;&lt;/div&gt;</description><link>http://www.h-i-r.net/2021/03/review-openbsd-68-on-8th-gen-lenovo.html</link><author>noreply@blogger.com (Ax0n)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5554915078212081470.post-7098783610111934930</guid><pubDate>Thu, 18 Mar 2021 02:16:00 +0000</pubDate><atom:updated>2021-05-27T17:44:44.836-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">hardware</category><category domain="http://www.blogger.com/atom/ns#">laptop</category><category domain="http://www.blogger.com/atom/ns#">openbsd</category><category domain="http://www.blogger.com/atom/ns#">unix</category><category domain="http://www.blogger.com/atom/ns#">Windows</category><title>Multi-booting OpenBSD and Windows 10 on modern hardware with rEFInd</title><description>&lt;p&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzuYn9mRYNsxDdBy0dGgpdwDdxbywQcZ3ozYWMAQYoFx-bkcTABPSI-tPb94wLx4eQe9_2yJy1rBohFeetELWY21YSohCWXSzmHdpSjebKi4lbuUfeOmdJ3YkI_gYWPGDjTsIEXjl-wvI/s1080/2021-03-17.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1080" data-original-width="1080" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzuYn9mRYNsxDdBy0dGgpdwDdxbywQcZ3ozYWMAQYoFx-bkcTABPSI-tPb94wLx4eQe9_2yJy1rBohFeetELWY21YSohCWXSzmHdpSjebKi4lbuUfeOmdJ3YkI_gYWPGDjTsIEXjl-wvI/w400-h400/2021-03-17.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: medium;"&gt;&lt;b&gt;The information here has been refined and documented in a dedicated page for &lt;a href="https://www.h-i-r.net/p/multi-booting-windows-10-and-openbsd.html"&gt;Multi-Booting Windows 10 and OpenBSD&lt;/a&gt;. That page has all up-to-date details, and this post is no longer the best available source of information on this topic.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;I recently purchased a 13.3" 8th Gen Lenovo ThinkPad X1 Carbon. Frankly, the X1 series has been my dream machine for years. I like small laptops, and this one is light, powerful and is similar to what's used by many of the OpenBSD core developers, so I knew it would probably be well-supported. My previous laptop -- the &lt;a href="http://www.h-i-r.net/2016/10/laptop-cpu-upgrade-or-quest-for-openbsd.html"&gt;Acer I upgraded to an i5&lt;/a&gt; for VMM years ago -- was set up for dual-boot, but somewhere along the way, the Windows boot manager stopped booting OpenBSD so I'd been using a modified OpenBSD install image on an SD card to load the OpenBSD kernel from the internal SSD, I set the BIOS to prioritize the SD card for booting, and I just remove the SD Card from my Acer if I need to boot Windows. That laptop is growing long in the tooth, but it's served me well for the past 5 years.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;I decided to try properly dual-booting Windows and OpenBSD again with my new ThinkPad. And that's where things got ugly.&lt;br /&gt;&lt;br /&gt;The steps to get Windows and OpenBSD working together, as outlined in the &lt;a href="https://www.openbsd.org/faq/faq4.html#Multibooting" target="_blank"&gt;OpenBSD Multibooting FAQ&lt;/a&gt; seem to not work at all on recent Windows 10 versions, and especially on modern PCs with EFI and GPT disks. I tried several times without any luck, and I also rendered my system unbootable a number of times in my quest. Fortunately, I had made recovery media so I could blow away my X1 Carbon to factory defaults when things went sideways. That's a 45 minute process each time.&lt;br /&gt;&lt;br /&gt;Start with a Windows install, and have good backups, including, if possible, external recovery media from the manufacturer. Several times, the drive partition table was so screwed up that the recovery partition was missing as well, leaving me with the recovery USB stick as my only way forward. To resize the Windows partitions, you will have to completely disable BitLocker full-disk encryption if it's enabled. I am a fan of FDE, but we have to turn it off for this to work. You can re-enable it when you have your whole system back up and running, but there are come caveats at the end. &lt;br /&gt;&lt;br /&gt;Create a &lt;a href="https://gparted.org/liveusb.php" target="_blank"&gt;Live USB of GParted&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;On another USB stick, write the contents of the OpenBSD &lt;a href="http://installXX.img" target="_blank"&gt;installXX.img&lt;/a&gt;. This link references install68.img from OpenBSD 6.8, which may be out of date or a broken link when you read this.&lt;br /&gt;&lt;br /&gt;Boot into the gparted live distro. On modern EFI/UEF systems, you will probably need to adjust secure boot and/or legacy boot options in your system's BIOS to continue.&lt;br /&gt;&lt;br /&gt;Shrink the main Windows partition by some amount to make room for OpenBSD. I gave myself 120GB. That's how much room I have dedicated to OpenBSD on my Acer, and it seems to be a good size. I also usually create another FAT32 or Exfat partition that I can store files on to be accessed from both OpenBSD and Windows, but that's beyond the scope of this write-up. &lt;br /&gt;&lt;br /&gt;Create a new partition for OpenBSD in the empty space. GParted doesn't know about OpenBSD partition types, so you'll have to then close GParted and launch a terminal window from the live environment. You'll have to launch gdisk via sudo and address your drive's device. For example:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #6fa8dc;"&gt;sudo gdisk /dev/nvme0n1&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;Use the "p" option to print a list of partition entries. Find the one you created and use the "t" option to change the partition type to "A600" which is what OpenBSD expects to use for its disklabel entries. "w" will write the GPT and exit. You may also want to use the "b" option before you exit to make a backup of your partition tables just in case you mess something up. You'll have to store it to a USB drive, but you can probably store it on the same USB stick you booted GParted from.&lt;br /&gt;&lt;br /&gt;At this point, I decided to reboot and make sure Windows still works. Thankfully, it did. Reboot into the OpenBSD installer using the USB stick you created. I won't walk through the whole installer process, but pay very close attention to the disk partitioning options. When prompted for the disks to install OpenBSD to, you should see an "OpenBSD Area" option and that should be the default disk partition to install to. If that option doesn't exist and you choose "gpt" or "whole disk" you will destroy the GPT record on your drive and destroy the Windows installation. Your system will only boot into OpenBSD if you proceed. You can probably use gdisk and your backup of the GPT to recover the partition table if you didn't actually install OpenBSD, or you may have to reinstall Windows and start all over again, and that isn't fun. Trust me. I've done that four times this week. Don't let the system do an auto-layout. Choose "custom." Unless you know what you're doing, just make one big disklabel partition for OpenBSD's root drive.&lt;br /&gt;&lt;br /&gt;Once OpenBSD is installed, exit to the shell. You will need to copy the EFI boot executable to some other media so you can access it from Windows. I inserted a USB stick that was formatted for FAT32. It showed up as sd1 and the first non-BSD partition typically shows up as "i"&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #6fa8dc;"&gt;mkdir /usb&lt;br /&gt;mount /dev/sd1i /usb&lt;br /&gt;cp /mnt/usr/mdec/BOOTX64.EFI /usb/bootx64_openbsd.efi&lt;br /&gt;umount /usb&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Go ahead and reboot. It should boot into Windows. Fingers crossed!&lt;br /&gt;&lt;br /&gt;Now, go &lt;a href="https://www.rodsbooks.com/refind/getting.html" target="_blank"&gt;download rEFInd&lt;/a&gt; and unzip the archive. I followed the &lt;a href="https://www.rodsbooks.com/refind/installing.html#windows" target="_blank"&gt;Windows manual install instructions&lt;/a&gt; to get rEFInd working. I rebooted again, simply because I'd become so accustomed to bricking my shiny new laptop. To my surprise, rEFInd presented me with a boot menu. Windows showed up, and an additional menu item called "Fallback boot" also appeared. This menu option booted me into OpenBSD. That could be pretty much the end of it, but I wanted an actual OpenBSD menu option.&lt;br /&gt;&lt;br /&gt;To accomplish this, I borrowed some mojo from &lt;a href="https://functionallyparanoid.com/2017/06/30/boot-all-the-things/" target="_blank"&gt;this somewhat dated blog entry on FunctionallyParanoid&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;You have to access the EFI system partition from a privileged command shell (hearkening back to the instructions to manually install rEFInd from Windows), so I copied the refind.conf file off to my Documents folder, edited it with notepad, then saved it and copied it back over to the EFI system partition. &lt;br /&gt;I added this clause near the end of the refind.conf file:&lt;br /&gt;&lt;br /&gt;menuentry “OpenBSD”&lt;br /&gt;{&lt;br /&gt;icon \EFI\refind\icons\os_openbsd.png&lt;br /&gt;loader \EFI\boot\bootx64_openbsd.efi&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Make sure to download &lt;a href="https://cdn1.iconfinder.com/data/icons/KDE_Crystal_Diamond_2.5_Classical_Mod/128x128/apps/openbsd.png" target="_blank"&gt;the OpenBSD icon&lt;/a&gt; and place it in the \EFI\refind\icons folder, too. Once I did that and rebooted, rEFInd still had the "fallback" menu item, but OpenBSD showed up with its own logo alongside the Windows logo. Both operating systems boot, and my mission was finally accomplished.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;P&gt;We are proud members of the &lt;A HREF="http://securitybloggers.net/"&gt;Security Bloggers Network&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;This content originally posted on &lt;A HREF="http://www.h-i-r.net/"&gt;HiR Information Report&lt;/A&gt;. Copyright © 1997-2010, HiR&lt;/P&gt;&lt;/div&gt;</description><link>http://www.h-i-r.net/2021/03/multi-booting-openbsd-and-windows-10-on.html</link><author>noreply@blogger.com (Ax0n)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzuYn9mRYNsxDdBy0dGgpdwDdxbywQcZ3ozYWMAQYoFx-bkcTABPSI-tPb94wLx4eQe9_2yJy1rBohFeetELWY21YSohCWXSzmHdpSjebKi4lbuUfeOmdJ3YkI_gYWPGDjTsIEXjl-wvI/s72-w400-h400-c/2021-03-17.jpg" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5554915078212081470.post-1022905999561119138</guid><pubDate>Mon, 21 Sep 2020 14:40:00 +0000</pubDate><atom:updated>2020-09-22T10:32:16.415-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">gps</category><category domain="http://www.blogger.com/atom/ns#">map</category><category domain="http://www.blogger.com/atom/ns#">radio</category><category domain="http://www.blogger.com/atom/ns#">radiosonde</category><category domain="http://www.blogger.com/atom/ns#">raspberrypi</category><category domain="http://www.blogger.com/atom/ns#">sdr</category><category domain="http://www.blogger.com/atom/ns#">weather</category><title>Mobile Weather Balloon Chasing Rig</title><description>&lt;p&gt;A few locals (mostly part of the SecKC crew) have been chasing weather balloons for the past few months. It's an interesting way to get out of the house and go do something. We are also trying to reverse engineer the guts of these weather balloon payloads, but that's a story for another post.&lt;/p&gt;&lt;h2 style="text-align: left;"&gt;Weather Balloons and Radiosondes&lt;/h2&gt;&lt;p&gt;In the US, a number of National Weather Service offices (I'm guessing about a third to half of them) deploy weather balloons every day at about 0:00 and 12:00 UTC, give or take an hour either way. They often launch at about 45 minutes ahead of time, but they can be delayed by severe weather. That's over 700 weather balloons per year from each of the dozens of stations that launch them!&lt;/p&gt;&lt;p&gt;The weather balloons carry something called a radiosonde into the stratosphere. This package contains a battery, radio transmitter, GPS, and weather sensors. The radio transmissions include position information, humidity, temperature and other metrics, once per second. Position information is used to determine wind speed and elevation to correlate with the other metrics. This data is shared internationally and is used for local forecasts and models, and worldwide climate trends.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Close up of the bottom panel of a 400 MHz Lockheed-Martin Sippican LMS-6 Radiosonde.&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOAkEtl4YJL_eZ5crt5ksbRvJrKtMtWtdwtKDCLYChiMjGAAfZf9L1NcyH3JoyEQHZIrA7fxBmWuJlyWbno8fl0hi2bP9AP2gSkERRnDdVqJF2uu-Rynt06hyphenhyphenDXD7ujozcayusyLmsEig/s2048/20200921_092915.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1714" data-original-width="2048" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOAkEtl4YJL_eZ5crt5ksbRvJrKtMtWtdwtKDCLYChiMjGAAfZf9L1NcyH3JoyEQHZIrA7fxBmWuJlyWbno8fl0hi2bP9AP2gSkERRnDdVqJF2uu-Rynt06hyphenhyphenDXD7ujozcayusyLmsEig/s320/20200921_092915.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;The air gets thinner and the pressure lowers as the balloon climbs past 100,000 feet, and it eventually bursts. The package, weighing less than a pound, falls back to the ground under a small parachute so that it doesn't hurt anyone or anything when it lands.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Here's a video I shot through a telescope, of a weather balloon bursting at about 130,000 feet. You can faintly see the radiosonde swinging beneath the balloon. When it bursts, the parachute expands as the package falls.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/uLgdPvAxc-4" width="560"&gt;&lt;/iframe&gt;  
  &lt;br /&gt;&lt;/p&gt;&lt;p&gt;A recovered weather balloon, after untangling all of the rope.&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwwcO622jQfMlnlFn6Xu8oGy5Zzwz56BRhTCCuHGJiHPJkdedZ1duWVe3Rb1ZDpVWn12gQ1iBOzgbV3UL2UJlQbAmu4b2NC9pKnL1FcvRof9zoRZE0uX5sGWF1RvRoOad6o9ma-hpbNtw/s2048/img_20200902_101758-1.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="2048" data-original-width="1536" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwwcO622jQfMlnlFn6Xu8oGy5Zzwz56BRhTCCuHGJiHPJkdedZ1duWVe3Rb1ZDpVWn12gQ1iBOzgbV3UL2UJlQbAmu4b2NC9pKnL1FcvRof9zoRZE0uX5sGWF1RvRoOad6o9ma-hpbNtw/s320/img_20200902_101758-1.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;The National Weather Service does not recover these devices from the field. Some of them have a mailing bag and shipping label attached so that folks who find them can return them to be refurbished. The radiosondes that we've been finding have no instructions aside from "dispose safely". That is to say, once they have fulfilled their mission and landed, these radiosondes are very much "finders keepers" and are no longer government property. They can land more than a hundred miles away from the launch site, depending on jet streams and wind conditions closer to the surface.&lt;/p&gt;&lt;h2 style="text-align: left;"&gt;Tracking&lt;/h2&gt;&lt;p&gt;To facilitate the tracking of these devices, a number of software tools have been created to make use of software-defined radio receivers (such as the RTL-SDR or HackRF One) or simple audio-decoding from a computer sound card. My favorite tools are &lt;a href="https://github.com/projecthorus/radiosonde_auto_rx" target="_blank"&gt;radiosonde_auto_rx&lt;/a&gt; and &lt;a href="https://github.com/projecthorus/chasemapper" target="_blank"&gt;chasemapper&lt;/a&gt;, both part of &lt;a href="http://www.projecthorus.org" target="_blank"&gt;Project Horus&lt;/a&gt;, an amateur radio high-altitude-ballooning project in Australia. The tools to monitor amateur balloons happens to work just fine for tracking weather balloons, and folks have added code to help decode the payload data for weather balloons.&amp;nbsp;&lt;/p&gt;&lt;p&gt;radiosonde_auto_rx scans a small range of frequencies you define, looking for a signal that's likely to be a radiosonde. It then tunes to that frequency and tries to decode the location data. Once it's locked on, it continuously tracks the location of the balloon. It can also upload balloon location data to websites like &lt;a href="https://sondehub.org" target="_blank"&gt;sondehub&lt;/a&gt; (radiosonde tracking) and &lt;a href="https://habhub.org" target="_blank"&gt;habhub&lt;/a&gt; (high-altitude balloon tracking), so folks can share data about these balloons' trajectories with a world-wide audience.&lt;/p&gt;&lt;p&gt;Screen shot from &lt;a href="http://sondehub.org"&gt;sondehub.org&lt;/a&gt; showing multiple weather balloons in flight, and locations of auto_rx sites:&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9F90cG6db1rTcjpS3x88aAxbTIZ1JODXMB4uYHhB7ixlicVIttTJg0BWlR6EEmH56pUTg6JEb9t8VHwUnMatNEQK_ExaMxOxLpkMwiyu_ocsS41xLwnWOrCjjxljhBAfacDKTXSchyphenhyphento/s2656/Screen+Shot+2020-09-21+at+8.32.53+AM.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1184" data-original-width="2656" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9F90cG6db1rTcjpS3x88aAxbTIZ1JODXMB4uYHhB7ixlicVIttTJg0BWlR6EEmH56pUTg6JEb9t8VHwUnMatNEQK_ExaMxOxLpkMwiyu_ocsS41xLwnWOrCjjxljhBAfacDKTXSchyphenhyphento/s320/Screen+Shot+2020-09-21+at+8.32.53+AM.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Chasemapper acquires the balloon location data from radiosonde_auto_rx, and your location from local GPS data, then draws a map of your location and the payload's location, in a browser session. This is a nice visual aid when you're planning on recovering a radiosonde. Here's a screen shot showing my vehicle's track and a radiosonde payload location on a recent balloon chase. The payload location doesn't have a track following it because I rebooted my setup to move it to my car. The movement was from me hiking toward my car while unplugging the battery.&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWOu_D7mflkraRjmWxOHNYBWJLcU8_2LfT3zjktxhlg5304e-ABoDb_zQtXwLlZjyqoxY4zimanYy9VRttro9a0Wk8K_Sv7dbBJlmlFiO2cetlNZ5aGwcJ2utu5npf-GEhbfgRtVAFHdo/s1318/Screen+Shot+2020-09-19+at+9.12.45+PM.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="836" data-original-width="1318" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWOu_D7mflkraRjmWxOHNYBWJLcU8_2LfT3zjktxhlg5304e-ABoDb_zQtXwLlZjyqoxY4zimanYy9VRttro9a0Wk8K_Sv7dbBJlmlFiO2cetlNZ5aGwcJ2utu5npf-GEhbfgRtVAFHdo/s320/Screen+Shot+2020-09-19+at+9.12.45+PM.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;h2 style="text-align: left;"&gt;Building the mobile tracker&lt;/h2&gt;&lt;p&gt;I decided I'd like to build a semi-mobile balloon tracker that I could leave running at home most of the time, but also quickly toss into my car or even carry with me if a radiosonde was going to be landing nearby, to help me recover it from some corn field or woods or an 8-foot tall patch of thistles and prairie grass out in the middle of nowhere. These things never seem to land anywhere convenient, like in the ditch of a dirt road.&amp;nbsp;&lt;/p&gt;&lt;p&gt;I decided to make do with stuff I already had laying around. You may recognize some pieces from previous articles. The below links are Amazon affiliate links to the parts I used if you wish to reproduce my exact setup, and purchasing from these links supports this site).&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;a href="https://amzn.to/3ceShZM" target="_blank"&gt;Raspberry Pi 3&lt;/a&gt; with an &lt;a href="https://amzn.to/3hPJXk4" target="_blank"&gt;AdaFruit 3.5" TFT&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://amzn.to/2FZR3oU" target="_blank"&gt;RTL-SDR v3 receiver kit&lt;/a&gt; or &lt;a href="https://amzn.to/2FZPNCf" target="_blank"&gt;NooElec NESDR Nano Three kit&lt;/a&gt; (you only need one SDR, both of these models work in this setup)&lt;/li&gt;&lt;li&gt;&lt;a href="https://amzn.to/3hMdzPl"&gt;Inseego MiFi 8800L WiFi Hot-Spot&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://amzn.to/2RXxcK9"&gt;Rii wireless mini keyboard/trackpad&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://amzn.to/33MdSEX" target="_blank"&gt;26800mAh USB battery pack&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtIu5zTgO6G2pZkx8ZR3TV6wZzNLcQN3OcHarnJ6h6NzoQyCu8mIldCaGQjZvylL17h7H9yYaMl4CY5ecV7iDB7V151ApwQPVdwVQGFbgX622e0HndkeltaEe6A3XKRKu_l20q3a4zY2Y/s1460/chasemapper2.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1458" data-original-width="1460" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtIu5zTgO6G2pZkx8ZR3TV6wZzNLcQN3OcHarnJ6h6NzoQyCu8mIldCaGQjZvylL17h7H9yYaMl4CY5ecV7iDB7V151ApwQPVdwVQGFbgX622e0HndkeltaEe6A3XKRKu_l20q3a4zY2Y/s320/chasemapper2.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;The MiFi 8800L not only offers 4G wireless connectivity so radiosonde_auto_rx can upload location data and chasemapper can download map data, but it also has a GPSd server integrated so other devices (like the Raspberry Pi) can use the GPS location of the hotspot. You must log in to the MiFi admin page to activate the GPS Service. By default, it runs on port 11010, and it's recommended to leave that default set.&lt;/p&gt;&lt;p&gt;Actually getting chasemapper to use that GPS data turned out to be more trouble than I had bargained for. You may be better-off connecting a USB GPS to your Raspberry Pi. I'll cover how I managed to cobble everything together as I go through this post.&amp;nbsp;&lt;/p&gt;&lt;p&gt;The first order of business was installing the latest RasPiOS to a fresh 16GB SD Card. There is more than enough documentation on raspberrypi.org to get you started. The Rii keyboard works both with a nano-receiver or via Bluetooth. Pick your poison. I chose to use the nano-receiver because bluetooth seems to not like to auto-reconnect on reboot some of the time. Feel free to use whatever kind-of-portable human-interface device you like.&lt;/p&gt;&lt;p&gt;Next, I had to get the display working.&amp;nbsp;&lt;/p&gt;&lt;p&gt;I had really good luck with the&lt;a href="http://www.h-i-r.net/2018/10/small-tft-displays-for-kali-on.html" target="_blank"&gt; fbcp-ili3941 driver on this Raspberry Pi with Kali Linux&lt;/a&gt;, and the instructions I wrote about setting up fbcp worked fine on the latest RasPiOS. You can follow most of the instructions in that article to get the AdaFruit TFT working, just keep in mind the touch screen won't work with the fbcp driver. The digitizer on my display actually broke a few years ago, so I don't miss it.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;For my setup, I uncommented the following lines in config.h. Note that these lines need the # at the beginning of the line. I removed the // from these two lines to uncomment them:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style="color: #a2c4c9;"&gt;#define DISPLAY_ROTATE_180_DEGREES&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #a2c4c9;"&gt;#define DISPLAY_BREAK_ASPECT_RATIO_WHEN_SCALING&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;I used the following options to build fbcp:&lt;/p&gt;&lt;p&gt;&lt;b&gt;cmake -DADAFRUIT_HX8357D_PITFT=ON -DSPI_BUS_CLOCK_DIVISOR=30 ..&lt;/b&gt; &lt;br /&gt;&lt;/p&gt;&lt;p&gt;As per the Kali instructions, I put the call to /usr/local/bin/fbcp near the top of /etc/rc.local so that it runs on boot.&lt;/p&gt;&lt;p&gt;I set my display up to run in 480p mode since the display is so tiny. The entirety of my /boot/config.txt file is:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style="color: #76a5af;"&gt;hdmi_force_hotplug=1&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #76a5af;"&gt;dtparam=audio=on&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #76a5af;"&gt;hdmi_group=1&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #76a5af;"&gt;hdmi_mode=3&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #76a5af;"&gt;dtoverlay=pwm,pin=18,func=2&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Reboot and make sure the TFT display works.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Now for Radiosonde_auto_rx. &lt;a href="https://github.com/projecthorus/radiosonde_auto_rx/wiki"&gt;The setup instructions &lt;/a&gt;mostly work. You'll need to install a bunch of dependencies. They recommend installing rtl-sdr from source. I just added it via apt, and it supported the bias-tee option. Make sure you install the udev rules and module blacklist options per the instructions.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Keep following the instructions. Maybe, if you're lucky it'll just work. For me, though, I had to do some hacky garbage to get it to compile. If build.sh fails, you can try these tricks:&amp;nbsp;&lt;/p&gt;&lt;p&gt;I had to tell the compiler use the c11 standard for compiling fsk_demod by adding “-std=c11” to line 50 of auto_rx/build.sh, which now looks like this:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style="color: #76a5af;"&gt;gcc -std=c11 fsk_demod.c fsk.c modem_stats.c kiss_fftr.c kiss_fft.c -lm -o fsk_demod&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;I had to tell the compiler to use the built-in alloca() for some reason, and the real baffler was having to define the meaning of freaking Pi, twice.&lt;/p&gt;&lt;p&gt;In utils/fsk.c, I added these lines to the "includes" block near the top:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style="color: #a2c4c9;"&gt;#define alloca(x) &amp;nbsp;__builtin_alloca(x)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #a2c4c9;"&gt;#ifndef M_PI&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #a2c4c9;"&gt;&amp;nbsp; &amp;nbsp; #define M_PI 3.14159265358979323846&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #a2c4c9;"&gt;#endif&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;And I added the following to utils/modem_stats.c, also near the top.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style="color: #a2c4c9;"&gt;#ifndef M_PI&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #a2c4c9;"&gt;&amp;nbsp; &amp;nbsp; #define M_PI 3.14159265358979323846&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #a2c4c9;"&gt;#endif&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;With all that out of the way, the instructions for setting up Radiosonde_auto_rx work just fine. Make sure to edit station.cfg. You probably want to specify a name, callsign or handle for uploading to HabHub (and enable uploads), and you should specify your latitude and longitude. You could, in theory, also use gpsd for radiosonde_auto_rx as well. I didn't set up auto_rx to use gpsd, so even when I'm mobile, the reports appear to come from the hard-coded location in auto_rx. I'm fine with that.&lt;/p&gt;&lt;p&gt;It seems that the National Weather Service relies mostly on radiosondes made by Lockheed Martin Sippican. The LMS-6 Radiosonde comes in two "flavors", one operating between 400 and 406 MHz and the other one operating around 1680 MHz. The Vaisala RS41 is a newer radiosonde model used at some locations, and it also operates around 400 MHz. You should ensure the proper frequency range for your location is enabled. The 1680&amp;nbsp; MHz radiosondes also work best with a circular-polarized antenna, similar to those you might use for certain FPV drone video.&lt;br /&gt;&lt;/p&gt;&lt;h2 style="text-align: left;"&gt;Setting up Chasemapper&lt;/h2&gt;&lt;p&gt;The instructions for Chasemapper mostly work out of the box, with the exception of GPSd in my case. The version of GPSd on the MiFi 8800L doesn't support JSON output which Chasemapper requires, so I ended up running a modern version of &amp;nbsp;GPSd on RasPiOS, pointing it at the GPSd on the hot-spot. Details on that toward the end of the article. I also had some trouble running GPSd on the default port of 2947, so of course I ran it on port 1337.&amp;nbsp;&lt;/p&gt;&lt;p&gt;For horusmapper.cfg, I changed only the following lines:&lt;/p&gt;&lt;p&gt;car_source_type = gpsd&amp;nbsp;&lt;/p&gt;&lt;p&gt;gpsd_port = 1337&lt;/p&gt;&lt;p&gt;habitat_call = [my amateur radio callsign]&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h2 style="text-align: left;"&gt;Tying it all together&lt;/h2&gt;&lt;p&gt;I didn't set up systemd services for anything, but you may want to follow the instructions in the git repositories to enable systemd services if you plan on building a dedicated tracker. I run gpsd, auto_rx and chasemapper on-demand with a simple shell script that I call "loon.sh":&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style="color: #a2c4c9;"&gt;#!/bin/sh&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #a2c4c9;"&gt;gpsd -S 1337 gpsd://192.168.1.1:11010&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #a2c4c9;"&gt;cd ~/radiosonde_auto_rx/auto_rx&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #a2c4c9;"&gt;python auto_rx.py&amp;amp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #a2c4c9;"&gt;cd ~/chasemapper/&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #a2c4c9;"&gt;python horusmapper.py&amp;amp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Everything runs in the background, and the terminal will fill up with logs about both chasemapper and auto_rx status. You can fire up your Raspberry Pi's web browser and hit localhost:5001 for ChaseMapper, and localhost:5000 for the auto_rx status page.&amp;nbsp;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;P&gt;We are proud members of the &lt;A HREF="http://securitybloggers.net/"&gt;Security Bloggers Network&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;This content originally posted on &lt;A HREF="http://www.h-i-r.net/"&gt;HiR Information Report&lt;/A&gt;. Copyright © 1997-2010, HiR&lt;/P&gt;&lt;/div&gt;</description><link>http://www.h-i-r.net/2020/09/mobile-weather-balloon-chasing-rig.html</link><author>noreply@blogger.com (Ax0n)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOAkEtl4YJL_eZ5crt5ksbRvJrKtMtWtdwtKDCLYChiMjGAAfZf9L1NcyH3JoyEQHZIrA7fxBmWuJlyWbno8fl0hi2bP9AP2gSkERRnDdVqJF2uu-Rynt06hyphenhyphenDXD7ujozcayusyLmsEig/s72-c/20200921_092915.jpg" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5554915078212081470.post-5756193087492397313</guid><pubDate>Tue, 04 Aug 2020 21:26:00 +0000</pubDate><atom:updated>2020-08-04T16:26:55.584-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">gmrs</category><category domain="http://www.blogger.com/atom/ns#">radio</category><title>GMRS and You</title><description>&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK05u_KH_KiIIVgRZiHrt9yG3kFBF5nLFdekQul2CJf5vqxp-lWkvdOkCvG0UMswx0wUh-VhwLQVYHzMbnLL-bUhfdmuS8PtLcRN1fo07rkJs6bZ-nhHg8tq0ksNQV1h8KhUhyJoVqOHc/s2048/IMG_20200804_123513.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1536" data-original-width="2048" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK05u_KH_KiIIVgRZiHrt9yG3kFBF5nLFdekQul2CJf5vqxp-lWkvdOkCvG0UMswx0wUh-VhwLQVYHzMbnLL-bUhfdmuS8PtLcRN1fo07rkJs6bZ-nhHg8tq0ksNQV1h8KhUhyJoVqOHc/s640/IMG_20200804_123513.jpg" width="640" /&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;With the availability of handheld radios that are more powerful than cheap walkie-talkies, even more powerful radios for your home and vehicles, antenna masts and a small network of repeaters, GMRS allows your family some of the benefits of amateur radio, at a 
marginal cost, and without every member having to pass an exam. With a decent home and mobile GMRS radio set-up, your family could likely stay in touch even if you stray several miles from home for work or errands. &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;With the potential of a wide-spread infrastructure outage in an emergency, and increased tracking of location data via smart phones, payment card transactions and the like, adding GMRS to your family's communications strategy can make a lot of sense.&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;h2 style="text-align: left;"&gt;FRS vs GMRS&lt;/h2&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;General 
Mobile Radio Service (GMRS) is a UHF Land Mobile Personal Radio Service,
 not much unlike Citizens Band (CB) or Family Radio Service (FRS). In fact, 14 frequencies used by GMRS are shared with FRS. &lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Up until the rules changed in 2017, one had to obtain a GMRS license to use channels 15-22 on FRS/GMRS handheld radios that look a lot like the one on the left in the title photo above. That radio is actually a 5 watt Midland GXT-1000 GMRS radio, but with a few caveats, it can be used for FRS as well.&lt;/div&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Recent changes were made to allow up to 2 watts on channels 1-7 and 15-22 as part of FRS without obtaining a license. Channels 8-14 are still reserved solely for FRS use in the US, with a maximum of 500mW output. A number of FRS radios are available that run close to 2W on legal channels, but today I'll be focusing on GMRS specifically. The primary differences between FRS and GMRS are:&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;GMRS handheld radios are allowed to transmit up to 5W&lt;/li&gt;&lt;li&gt;GMRS mobile and base-station radios are allowed up to 50W&lt;/li&gt;&lt;li&gt;Removable antennae are allowed&lt;/li&gt;&lt;li&gt;Repeaters can be used on GMRS&lt;/li&gt;&lt;li&gt;An FCC license is required for GMRS, but there is no exam.&lt;/li&gt;&lt;li&gt;Businesses can legally use FRS for operations, but business use of GMRS is mostly disallowed.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;h2 style="text-align: left;"&gt;The Rules&lt;/h2&gt;&lt;div&gt;A short, multi-page primer on GMRS is &lt;a href="https://www.fcc.gov/general-mobile-radio-service-gmrs" target="_blank"&gt;provided by the FCC&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The full rules for operating on GMRS are in &lt;a href="https://www.ecfr.gov/cgi-bin/text-idx?mc=true&amp;amp;node=pt47.5.95&amp;amp;rgn=div5#sp47.5.95.e" target="_blank"&gt;FCC Part 95 subpart E&lt;/a&gt;. &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The short, short version of the rules that should cover most of the highlights:&lt;/div&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;No "public broadcast" messages, advertising or music&lt;/li&gt;&lt;li&gt;No profanity&lt;/li&gt;&lt;li&gt;Only communicate with other GMRS or FRS users. Communication with amateur radio stations is not allowed.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;No "Jamming" or continuous transmissions&lt;/li&gt;&lt;li&gt;Don't use GMRS to assist in any criminal activity&lt;/li&gt;&lt;li&gt;You must identify your call sign (e.g. WRBX000) in English or morse code&lt;/li&gt;&lt;ul&gt;&lt;li&gt;At the end of a single transmission that you do not expect a reply to&lt;/li&gt;&lt;li&gt;At the end of a conversation&lt;br /&gt;&lt;/li&gt;&lt;li&gt;At least once every 15 minutes while communicating&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;You can authorize any family members to use your license with your permission.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Your parents, 
children, grandparents, nieces, siblings and uncles can legally operate 
on GMRS under one single license, if you give them permission and ensure
 they know the rules.&lt;/li&gt;&lt;li&gt;If they break the GMRS rules under your license, 
your license is likely in jeopardy. You are ultimately responsible for 
the actions of those using your license.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;While
 GMRS is provided as a convenient way for family members to stay in touch, 
an authorized GMRS user is allowed to talk to others outside of their 
family. They do not need to be physically close enough to you to 
communicate with you as the license holder as long as they obey the rules.&lt;/div&gt;&lt;h2 style="text-align: left;"&gt;Licensing&lt;/h2&gt;&lt;div&gt;Most adult United States citizens are eligible to apply for a GMRS license. As of 2020, the license fee is $85, and it is valid for 10 years from the date of issue. &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One can apply for a GMRS license online through the &lt;a href="https://www.fcc.gov/wireless/systems-utilities/universal-licensing-system" target="_blank"&gt;Universal Licensing System&lt;/a&gt;, or by mail. Either way, you must fill out FCC Form 605. Filing online requires you to register for an FCC Registration Numer (FRN) if you do not already have one. Amateur radio operators may use their existing FRN, for example. &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Once logged in to ULS, click "Apply for a new license" and choose "ZA - General Mobile Radio Service" from the very bottom of the drop-down list. &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Upon completion of FCC Form 605 for GMRS, you will be required to make an online payment. Your license will usually show up within a few hours or on the next business day. You will also likely receive an email about your license grant. &lt;br /&gt;&lt;/div&gt;&lt;h2 style="text-align: left;"&gt;Hardware&lt;/h2&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;YOU MUST NOT USE AMATEUR RADIO EQUIPMENT* ON GMRS. &lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Transceivers specifically designed for amateur radio are not allowed on GMRS. Some hams use commercial radios that have been tuned to work on amateur radio frequencies, and there's a bit of a grey area there. &lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Until recently, hardware specifically designed to take full advantage of GMRS was pretty rare. Radios must be type-certified under FCC Part 95 to operate on GMRS and strict standards must be met with regard to channel deviation, frequency stability at a wide variety of temperatures, and spurious emissions. It just so happens that commercial land mobile UHF Radios type-certified under FCC Part 90 meet or exceed the specifications for GMRS, so long as they do not exceed 50 watts of output power. As such, many GMRS users will re-program commercial UHF radios to operate on GMRS frequencies. The FCC hasn't ever given a straight answer about if this is allowed, but most repeater operators are okay with it. The Motorola Radius in the above photo is one of these, but a variety of 15-45 watt mobile radios and 2-5 watt handhelds from the commercial lines of Motorola, Kenwood, Bendix/King and others can often be found inexpensively on the used market. Just make sure you, or the seller, can program them properly. &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;BTech (purveyors of the ubiquitous, cheap "Baofeng" ham radios) markets two GMRS-specific radios: the GMRS-v1 handheld and the GMRS-50X1 mobile radio. These two have been type-certified for GMRS, have the ability to use GMRS repeaters, and are legal. The GMRS-V1 is, in fact, the only GMRS-specific handheld radio I was able to find that has repeater capability.&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Midland, Cobra, and Uniden have also been making a variety of type-certified GMRS radios. Most of the handheld units, like the Midland GXT-1000 I have, do not have the capability to use GMRS repeaters, but the Midland Mobile and Micro-Mobile radios, designed to be installed inside vehicles, do have repeater capability.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Most GMRS radios are interoperable with FRS radios. The GMRS-specific radios mentioned above may have more than 22 channels, but channels 1-22 are almost guaranteed to work between any GMRS and FRS radio. If your family does a lot of outdoor activity, you may find that inexpensive FRS radios work fine for kids, and your GMRS radios will let you communicate with them.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Many old-school GMRS users refer to frequencies -- and especially repeaters, by the kilohertz part of the frequency only. I suspect this persists in part because GMRS users are begrudgingly sharing practically all of their frequencies with FRS users and dislike the concept of channel numbers. At any rate, "700" refers to either 462.700 MHz, or a repeater that uses 467.700 MHz on the input and 462.700 MHz on the output.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt; &lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;You can see actual frequencies in this chart on Wikipedia:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="https://en.wikipedia.org/wiki/General_Mobile_Radio_Service#Frequency_Table"&gt;https://en.wikipedia.org/wiki/General_Mobile_Radio_Service#Frequency_Table&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;h2 style="text-align: left;"&gt;Repeaters &lt;/h2&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Like amateur radio, GMRS operators can run repeater systems. These repeater systems listen 5MHz higher than the base frequency, and re-transmit the signal on the base frequency so that all radios listening can hear the message. Not all regions have GMRS repeaters, but here in the Kansas City area, there are several to choose from. Unlike amateur radio repeaters, most of them require permission from the repeater operator before you use them.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://MyGMRS.com"&gt;MyGMRS.com&lt;/a&gt; is probably the closest thing there is to a directory of all GMRS repeaters in the United States. You can browse the repeater listings without signing up for an account, but many repeater details (such as the CTCSS or DCS codes to use them) are hidden until you log in. Some of these details are completely unlisted, instead requiring you to ask the repeater owner for permission. You can only create a MyGMRS account once your GMRS license has been active for a day or two and the website has imported your license from the FCC.&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;You can also buy or build your own GMRS repeater, and it probably comes as no surprise that commercial repeater hardware is also quite common. Repeater building is a complex topic I won't cover here, but the cost is usually pretty significant.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;P&gt;We are proud members of the &lt;A HREF="http://securitybloggers.net/"&gt;Security Bloggers Network&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;This content originally posted on &lt;A HREF="http://www.h-i-r.net/"&gt;HiR Information Report&lt;/A&gt;. Copyright © 1997-2010, HiR&lt;/P&gt;&lt;/div&gt;</description><link>http://www.h-i-r.net/2020/08/gmrs-and-you.html</link><author>noreply@blogger.com (Ax0n)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK05u_KH_KiIIVgRZiHrt9yG3kFBF5nLFdekQul2CJf5vqxp-lWkvdOkCvG0UMswx0wUh-VhwLQVYHzMbnLL-bUhfdmuS8PtLcRN1fo07rkJs6bZ-nhHg8tq0ksNQV1h8KhUhyJoVqOHc/s72-c/IMG_20200804_123513.jpg" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5554915078212081470.post-912454819464448167</guid><pubDate>Wed, 13 May 2020 03:23:00 +0000</pubDate><atom:updated>2020-05-13T08:02:18.817-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ham</category><category domain="http://www.blogger.com/atom/ns#">radio</category><title>Yaesu FTM-400XDR - Undocumented Cross-Band Repeater Mode</title><description>I was in the market for a new dual-band amateur radio. I'm a bit of a Yaesu fan, and I was torn between trying to find a used workhorse like the&amp;nbsp; FT-8900R, or trying something a bit more modern, like the FTM-400XDR. The one thing I really wanted the '8900R for was its cross-band repeater. That was the only thing missing from the new '400XDR.&lt;br /&gt;
&lt;br /&gt;
Cross-band repeater mode will listen on two different bands (usually 70cm and 2m) and repeat what's being "heard" on one of the bands, transmitting it on the other. You can use this for a variety of purposes, but it's most commonly used to boost the range of a small handheld radio when you can't feasibly take a high-powered radio with you -- such as into an office building, down in your basement storm shelter, or keeping in touch with a group of spread-out friends while in an area without good repeater coverage. &lt;br /&gt;
&lt;br /&gt;
Lo and behold, the FTM-400XDR does have a cross-band repeater built-in. It's just not documented officially. It's actually pretty easy to set it up. &lt;br /&gt;
&lt;br /&gt;
Start by configuring your radio's tuners the way you want them to work together. Check that the frequencies, repeater offsets, squelch are all correct, and disable APRS if you had it enabled.&lt;br /&gt;
&lt;br /&gt;
In this case, I configured the top tuner to communicate with a local repeater, on medium power. It might be kind of hard to see, but there are indicators "-" and&amp;nbsp; "T-TRX" in the header of the top tuner that indicate a negative repeater offset, and "Tone Squelch on Transmit and Receive" which are common radio configurations for repeater use. You could instead set the upper tuner to a simplex frequency if you want to run it as a stand-alone temporary repeater.&lt;br /&gt;
&lt;br /&gt;
The bottom tuner has to be on the other band. Since the repeater I wanted to talk through is on the 2m band, I selected a simplex frequency from within the 70cm band.&amp;nbsp; Since I plan on staying pretty close to my radio for this test, I set the power level on the bottom tuner to low power, and made sure there was no auto-repeater-shift offset. You'll notice there are no indicators in the header of the lower tuner. You would not want to accidentally link two other repeaters together. Don't cross the streams.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK3Wtz90QNt0kfDq2_1qgDbM2zrJvl-kTwFFSDIxhhE3J_1iexjoW72wjzh8_0GENLNjumVtvipdxTBpIeTIldkfZpvEVew4guOKox_OyXaXmkkasr8ApgBJomAEu273zNxOWZXMLiIYs/s1600/IMG_20200512_210114.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1200" data-original-width="1600" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK3Wtz90QNt0kfDq2_1qgDbM2zrJvl-kTwFFSDIxhhE3J_1iexjoW72wjzh8_0GENLNjumVtvipdxTBpIeTIldkfZpvEVew4guOKox_OyXaXmkkasr8ApgBJomAEu273zNxOWZXMLiIYs/s400/IMG_20200512_210114.jpg" width="400" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;
Power the radio off. Next, hold the SETUP, F and GM buttons under the power button at the same time. Keep holding them while you power the radio on.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPGV70g1Mxi-FknFwmlZ9hVydgeQhmdMbWNUt6p5FctcQGCHv7raKf9TbTa9KYQcfhKze_7kNapdMqO8fU9hVd4BGklKCQm5sC49nS7RQFrf2QbusywPzPckeXgoNxjL6O-D9_kOqxLNo/s1600/IMG_20200512_210114-2.jpg" imageanchor="1"&gt;&lt;img border="0" data-original-height="1271" data-original-width="963" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPGV70g1Mxi-FknFwmlZ9hVydgeQhmdMbWNUt6p5FctcQGCHv7raKf9TbTa9KYQcfhKze_7kNapdMqO8fU9hVd4BGklKCQm5sC49nS7RQFrf2QbusywPzPckeXgoNxjL6O-D9_kOqxLNo/s320/IMG_20200512_210114-2.jpg" width="242" /&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;
When it powers up, you will see an "X-Repeater" indicator in the middle of the screen.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2mDWsWnb1zzjAkbwej6aqesDTIzqaDtIQrJyQt_9MJYy08krUnWPGqFu_KZQoryPHuoFbN0GNwWg6M_2JHPmBPaz3IwPlQTS_C2cgPqvKsC3roYu89dHziS-d-picrXqpodUKm7d9gD4/s1600/IMG_20200512_210349.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1200" data-original-width="1600" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2mDWsWnb1zzjAkbwej6aqesDTIzqaDtIQrJyQt_9MJYy08krUnWPGqFu_KZQoryPHuoFbN0GNwWg6M_2JHPmBPaz3IwPlQTS_C2cgPqvKsC3roYu89dHziS-d-picrXqpodUKm7d9gD4/s400/IMG_20200512_210349.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
If you're setting up a stand-alone repeater, all users will have to configure their dual-band handheld radios for "split" operation. This varies by make and model, but you'll want them to transmit on the same frequency as the bottom tuner, and receive on the same frequency as the top tuner of the '400XDR. Anything transmitted by members of your party on the lower tuner's frequency will be repeated out to everyone else listening on the upper tuner's frequency.&lt;br /&gt;
&lt;br /&gt;
To use the cross-band repeater with another repeater like I did, 
you'll want&amp;nbsp; to set your handheld radio to use the 
simplex frequency, without a repeater shift, that's displayed on the 
bottom tuner. The cross-band will relay bi-directionally, so whatever you transmit will be sent to the repeater configured on the upper tuner, and whatever the repeater transmits will be sent back to your handheld via the simplex frequency on the lower tuner.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLL67zK2RiBE8hN0SxOeOGXYVtCm_sMiDoAFLG5B5PsWBGZyIGDRinyE4gRCP-_0xEukqjbfveXWXbezPFVibgNKDkpeBYAA9v4zlZvUDGubgJh3B45ocdqX9FW9lcJPO8Uxg8goFR2qA/s1600/IMG_20200512_210442.jpg"&gt;&lt;img border="0" data-original-height="1600" data-original-width="1367" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLL67zK2RiBE8hN0SxOeOGXYVtCm_sMiDoAFLG5B5PsWBGZyIGDRinyE4gRCP-_0xEukqjbfveXWXbezPFVibgNKDkpeBYAA9v4zlZvUDGubgJh3B45ocdqX9FW9lcJPO8Uxg8goFR2qA/s320/IMG_20200512_210442.jpg" width="273" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To disable cross-band repeater mode, power the radio off, then use the same 3-finger-salute while powering it back on.&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;When the repeater isn't being actively used, you're still responsible for ensuring it is functioning properly. Your cross-band repeater has no way to identify itself. (e.g. CW ID) and lacks the sophistication of a real repeater. &lt;/li&gt;
&lt;li&gt;You or someone you trust should be close enough to your cross-band 
repeater to shut it off quickly should it malfunction or otherwise 
transmit undesired activity (such as static, intentional interference, 
radio pirates).&lt;/li&gt;
&lt;li&gt;Turn the radio off or disable cross-band repeater mode if you are not actively using it or are unable to monitor it.&lt;/li&gt;
&lt;li&gt;Use the minimum power level possible for the communications required. This is just best-practice, but also, if you end up cross-band repeating a long-running discussion, you may overheat your radio and/or drain your car battery. Mobile radios like this are designed for a relatively low duty cycle -- transmitting only for a few minutes at a time, then given a chance to cool down while others talk. Low power (5 Watts) is probably safe for extended, continuous bidirectional operation.&lt;/li&gt;
&lt;li&gt;The FTM-400XDR is capable of operating on Yaesu System Fusion (C4FM)
 digital modes, but under cross-band repeater mode, it will only operate
 in analog FM mode. You cannot cross-band repeat to a digital repeater 
from an analog handheld radio.&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;I do wonder if another Fusion
 radio could communicate through a cross-band repeater to a Fusion 
Repeater and vice/versa... I don't have a second Fusion radio to test 
this with.&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div class="blogger-post-footer"&gt;&lt;P&gt;We are proud members of the &lt;A HREF="http://securitybloggers.net/"&gt;Security Bloggers Network&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;This content originally posted on &lt;A HREF="http://www.h-i-r.net/"&gt;HiR Information Report&lt;/A&gt;. Copyright © 1997-2010, HiR&lt;/P&gt;&lt;/div&gt;</description><link>http://www.h-i-r.net/2020/05/yaesu-ftm-400xdr-undocumented-cross.html</link><author>noreply@blogger.com (Ax0n)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK3Wtz90QNt0kfDq2_1qgDbM2zrJvl-kTwFFSDIxhhE3J_1iexjoW72wjzh8_0GENLNjumVtvipdxTBpIeTIldkfZpvEVew4guOKox_OyXaXmkkasr8ApgBJomAEu273zNxOWZXMLiIYs/s72-c/IMG_20200512_210114.jpg" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5554915078212081470.post-6118239547053762800</guid><pubDate>Sun, 02 Feb 2020 19:05:00 +0000</pubDate><atom:updated>2020-02-02T13:09:15.010-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">script</category><category domain="http://www.blogger.com/atom/ns#">shell</category><title>02/02/2020! The first palindrome date since 11/11/1111</title><description>It's been &lt;a href="http://www.h-i-r.net/2010/10/it-only-happens-once-every-823-years.html" target="_blank"&gt;almost a decade&lt;/a&gt; since I've seen an "only happens every several hundred years" thing floating around that seemed too out-there to be real.&lt;br /&gt;
&lt;br /&gt;
So let's debunk the "first palindrome date since 11/11/1111" shall we? Surely these happen more frequently than that. And for shame not using &lt;a href="http://www.h-i-r.net/2013/02/iso-8601.html" target="_blank"&gt;ISO-8601&lt;/a&gt; format. Fortunately, today also works as an ISO-8601 palindrome: 2020-02-02.&lt;br /&gt;
&lt;br /&gt;
I whipped up a quick bash script to scan for dates n-days before and after today's date looking for palindromes in ISO-8601 format as well as the two other formats that are commonly (ab)used here in the United States, DD-MM-YY and DD-MM-YYYY. It's inefficient, relying on a lot of calls to date(1) and rev(1) but it is what it is.&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;br /&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
#!/bin/sh&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
export i=1&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
while true&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
do&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
# ISO-8601 or GTFO.&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
idtb=`date -v-${i}d +%Y%m%d`&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
idtf=`date -v+${i}d +%Y%m%d`&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
# MM-DD-YYYY format&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
ydtb=`date -v-${i}d +%m%d%Y`&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
ydtf=`date -v+${i}d +%m%d%Y`&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
# MM-DD-YY format&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
dtb=`date -v-${i}d +%m%d%y`&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
dtf=`date -v+${i}d +%m%d%y`&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
if [ "$idtb" -eq "`echo $idtb | rev`" ]&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
then&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
echo YYYYMMDD $idtb was a palindrome. &lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
fi&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
if [ "$idtf" -eq "`echo $idtf | rev`" ]&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
then&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
echo YYYYMMDD $idtf will be a palindrome.&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
fi&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
if [ "$ydtb" -eq "`echo $ydtb | rev`" ]&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
then&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
echo MMDDYYYY $ydtb was a palindrome.&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
fi&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
if [ "$ydtf" -eq "`echo $ydtf | rev`" ]&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
then&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
echo MMDDYYYY $ydtf will be a palindrome.&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
fi&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
if [ "$dtb" -eq "`echo $dtb | rev`" ]&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
then&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
echo MMDDYY $dtb was a palindrome.&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
fi&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
if [ "$dtf" -eq "`echo $dtf | rev`" ]&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
then&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
echo MMDDYY $dtf will be a palindrome.&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
fi&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
export i=`expr $i + 1`&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
done&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/blockquote&gt;
A quick run for a minute or so shows a lot of palindromes past and future. &lt;br /&gt;
&lt;pre&gt;MMDDYY 021120 will be a palindrome.
MMDDYY 022220 will be a palindrome.
YYYYMMDD 20211202 will be a palindrome.
MMDDYYYY 12022021 will be a palindrome.
MMDDYY 121121 will be a palindrome.
MMDDYY 122221 will be a palindrome.
MMDDYY 112211 was a palindrome.
MMDDYY 111111 was a palindrome.
YYYYMMDD 20111102 was a palindrome.
MMDDYYYY 11022011 was a palindrome.
MMDDYY 012210 was a palindrome.
MMDDYY 011110 was a palindrome.
YYYYMMDD 20300302 will be a palindrome.
MMDDYYYY 03022030 will be a palindrome.
YYYYMMDD 20100102 was a palindrome.
MMDDYYYY 01022010 was a palindrome.
MMDDYY 031130 will be a palindrome.
MMDDYY 032230 will be a palindrome.&amp;nbsp; &lt;/pre&gt;
&lt;div class="blogger-post-footer"&gt;&lt;P&gt;We are proud members of the &lt;A HREF="http://securitybloggers.net/"&gt;Security Bloggers Network&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;This content originally posted on &lt;A HREF="http://www.h-i-r.net/"&gt;HiR Information Report&lt;/A&gt;. Copyright © 1997-2010, HiR&lt;/P&gt;&lt;/div&gt;</description><link>http://www.h-i-r.net/2020/02/02022020-first-palindrome-date-since.html</link><author>noreply@blogger.com (Ax0n)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5554915078212081470.post-1247256602203390030</guid><pubDate>Sat, 04 Jan 2020 00:34:00 +0000</pubDate><atom:updated>2020-01-03T19:00:08.800-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">appsec</category><category domain="http://www.blogger.com/atom/ns#">owasp</category><category domain="http://www.blogger.com/atom/ns#">raspberrypi</category><category domain="http://www.blogger.com/atom/ns#">sqli</category><category domain="http://www.blogger.com/atom/ns#">sqlinjection</category><title>AppSec Lab: RasPwn with a MiFi-8800L JetPack Router</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://stuff.h-i-r.net/photos/RasPwn.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://stuff.h-i-r.net/photos/RasPwn.jpg" data-original-height="403" data-original-width="800" height="161" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
I'm hosting a few Application Security workshops later this year. I settled on &lt;a href="http://raspwn.org/" target="_blank"&gt;RasPwn&lt;/a&gt; for the lab because it comes pre-configured with a bunch of vulnerable applications out of the box.&lt;br /&gt;
&lt;br /&gt;
RasPwn acts as a stand-alone wireless access point using the Raspberry Pi's on-board Wi-Fi. If you plug in ethernet, it can route packets, but DNS forwarding seems broken. Some of the participants will have to be online and available during the workshops, so I wanted to make sure the lab has full Internet access. Additionally, it helps when folks can look up information about vulnerabilities while learning new concepts. I won't always be able to rely on on-site ethernet to provide Internet access to participants, so I decided to set up my MiFi 8800L hotspot as an Internet gateway on RasPwn, and I had to make sure DNS worked.&lt;br /&gt;
&lt;br /&gt;
Hotspot setup:&lt;br /&gt;
When you plug in most WiFi hotspots over USB, some will only charge the internal battery, while others will immediately show up as a network device. Some also show up as a "virtual USB drive" with drivers and software. The Inseego MiFi-8800L touch-screen model prompts you when you plug it in, and has an option to serve Internet via USB only or USB+WiFi.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://stuff.h-i-r.net/photos/8800usbwifi-shrink.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://stuff.h-i-r.net/photos/8800usbwifi-shrink.jpg" data-original-height="302" data-original-width="403" height="239" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
If you use the Web UI, you can set this option as the default. There's no way to set it up from the touch-screen interface. All other Inseego (and their previous brand, Novatel) hotspots I've used can be set up to provide USB Internet access by default, using the web admin portal. See owners' manual for details on accessing the admin portal. It'll probably vary widely by model. Example from my 8800L:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://stuff.h-i-r.net/photos/jetPack-shrink.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://stuff.h-i-r.net/photos/jetPack-shrink.png" data-original-height="304" data-original-width="512" height="190" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
RasPwn setup:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://raspwn.org/install" target="_blank"&gt;Download the RasPwn software&lt;/a&gt; and follow the install instructions on the download page. If you've messed with Raspberry Pi distributions before, this should be pretty self-explanatory.&lt;/li&gt;
&lt;li&gt;Place the card into a Raspberry Pi 3 and power it up. You won't need a screen or keyboard for anything. I did have to power-cycle the Raspberry Pi after the first boot for the WiFi network to show up. You may have to do the same.&amp;nbsp;&amp;nbsp; &lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;When RasPwn boots up, you'll see a new WiFi network called &lt;b&gt;RasPwnOS&lt;/b&gt; show up. Connect to it. The default WiFi password is &lt;b&gt;In53cur3!&amp;nbsp; &lt;br /&gt; &lt;/b&gt;&lt;/li&gt;
&lt;li&gt;SSH to 192.168.99.1. The username is &lt;b&gt;pi&lt;/b&gt; and the password is &lt;b&gt;pwnme!&lt;/b&gt;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;ssh pi@192.168.99.1 &lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Set up eth1 (for the hotspot's USB interface)&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;edit &lt;b&gt;/etc/network/interfaces&lt;/b&gt; with vi or nano&lt;/li&gt;
&lt;li&gt;insert the two lines below, preferably after "eth0" is specified: &lt;br /&gt;&lt;b&gt;allow-hotplug eth1&lt;br /&gt;iface eth1 inet dhcp&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Save the file&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Change the IP masquerading rules for iptables to use eth1 &lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;edit &lt;b&gt;/etc/iptables.up.rules&lt;/b&gt; with vi or nano&lt;/li&gt;
&lt;li&gt;change the MASQUERADE rule from&lt;br /&gt;&lt;b&gt;-A POSTROUTING -o eth0 -j MASQUERADE&lt;/b&gt;&lt;br /&gt;to &lt;br /&gt;&lt;b&gt;-A POSTROUTING -o eth1 -j MASQUERADE&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;save the file&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&amp;nbsp;Set up the DHCP server to issue an external backup resolver&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;edit &lt;b&gt;/etc/udhcpd.conf&lt;/b&gt; with vi or nano&lt;/li&gt;
&lt;li&gt;change the "opt dns" line from&lt;br /&gt;&lt;b&gt;opt&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dns&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 192.168.99.1 192.168.99.10&lt;/b&gt;&lt;br /&gt;to&lt;br /&gt;&lt;b&gt;opt&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dns&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 192.168.99.1 8.8.8.8&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
(Note: the DNS stuff is kind of hacky. You could configure the on-board bind9 DNS server to resolve recursively, but it's more complicated and this works just fine) &lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Reboot RasPwn and test Internet connectivity. &lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;sudo reboot&lt;/li&gt;
&lt;li&gt;Close your SSH window&lt;/li&gt;
&lt;li&gt;Wait a minute or so&lt;/li&gt;
&lt;li&gt;Reconnect to the &lt;b&gt;RasPwnOS&lt;/b&gt; wifi network&lt;/li&gt;
&lt;li&gt;Try browsing the internet. If it doesn't work, make sure the HotSpot is showing a USB connection. You may need to unplug it and plug it back in, or unplug the hotspot, reboot RasPwn again, and plug the hotspot in after RasPwn boots up all the way.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
Okay, so let's hack something!&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Go to playground.raspwn.org from your RasPwn WiFi connection&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Pick an app and start hacking!&lt;/li&gt;
&lt;/ul&gt;
The first thing in the playground is the OWASP Bricks practice application. It's intentionally vulnerable and designed to be increasingly complex with each challenge building on what you learned with the previous ones.&lt;br /&gt;
&lt;br /&gt;
Some of the exercises will require an intercepting proxy such as BurpSuite, Charles Proxy, or OWASP ZAP, but the first login page can be hacked with just a browser.
I actually didn't read any documentation for Bricks, and had never played with it before setting up RasPwn. My first login attempt was "admin" with a password of "admin" and it logged me in. &lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://stuff.h-i-r.net/photos/bricks1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://stuff.h-i-r.net/photos/bricks1.png" data-original-height="528" data-original-width="624" height="270" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
It wasn't until I saw the SQL in the footer that I knew this was supposed to be an SQL Injection challenge.Whoops. Okay, let's try this again with &lt;b&gt;foo&lt;/b&gt; and a password of &lt;b&gt;bar&lt;/b&gt;.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://stuff.h-i-r.net/photos/bricks2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://stuff.h-i-r.net/photos/bricks2.png" data-original-height="539" data-original-width="606" height="284" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
Okay, so that's what "access denied" looks like. Now let's throw some SQL injection into the username field. Here, I used a username of "&lt;b&gt;foo ' OR 1=1 -- &lt;/b&gt;" (note the space after the &lt;b&gt;--&lt;/b&gt; comment, that's needed for MySQL and maybe other databases to acknowledge a comment). &lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://stuff.h-i-r.net/photos/bricks3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://stuff.h-i-r.net/photos/bricks3.png" data-original-height="516" data-original-width="606" height="272" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
And we've successfully used SQL Injection to hack the first Bricks challenge.&lt;br /&gt;
&lt;br /&gt;
Happy hacking, friends!&lt;div class="blogger-post-footer"&gt;&lt;P&gt;We are proud members of the &lt;A HREF="http://securitybloggers.net/"&gt;Security Bloggers Network&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;This content originally posted on &lt;A HREF="http://www.h-i-r.net/"&gt;HiR Information Report&lt;/A&gt;. Copyright © 1997-2010, HiR&lt;/P&gt;&lt;/div&gt;</description><link>http://www.h-i-r.net/2020/01/appsec-lab-raspwn-with-mifi-8800l.html</link><author>noreply@blogger.com (Ax0n)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5554915078212081470.post-8041889944430571849</guid><pubDate>Mon, 21 Oct 2019 00:11:00 +0000</pubDate><atom:updated>2019-10-20T19:11:26.813-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">mysql</category><category domain="http://www.blogger.com/atom/ns#">openbsd</category><category domain="http://www.blogger.com/atom/ns#">php</category><category domain="http://www.blogger.com/atom/ns#">unix</category><title>OpenBSD 6.6 released early!</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPc22rp43ubP9I5jBdbcTil9n4SN829jwaCjXyHhqF_o3Nv3kWQ6my_iBU1hB6-aRQ65-ZlQWxo3KuHJHzY7u1Y7JDenHiq1oNs3U9z0NyQfwTN0VVNsOBAaPtcGM7nGEu6tRXT0NLVII/s1600/puffy66.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="199" data-original-width="599" height="106" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPc22rp43ubP9I5jBdbcTil9n4SN829jwaCjXyHhqF_o3Nv3kWQ6my_iBU1hB6-aRQ65-ZlQWxo3KuHJHzY7u1Y7JDenHiq1oNs3U9z0NyQfwTN0VVNsOBAaPtcGM7nGEu6tRXT0NLVII/s320/puffy66.gif" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href="https://www.openbsd.org/66.html" target="_blank"&gt;OpenBSD 6.6&lt;/a&gt; was released earlier this week. Along with it come a number of exciting enhancements to not just hardware support, but improvements to the installer, and security enhancements to the userland as &lt;a href="https://man.openbsd.org/unveil.2" target="_blank"&gt;unveil&lt;/a&gt; and &lt;a href="https://man.openbsd.org/pledge.2" target="_blank"&gt;pledge&lt;/a&gt; continue to get integrated more. You can read the entire change log at the link above.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
As I had mentioned when OpenBSD 6.5 came out, sysupgrade(8) was making snapshot upgrades a breeze for those of us running -CURRENT. A few weeks back, the team &lt;a href="https://www.openbsd.org/errata65.html#p012_sysupgrade" target="_blank"&gt;made a sysupgrade patch available&lt;/a&gt; to bring this functionality to OpenBSD 6.5, so that folks could take advantage of it to upgrade to OpenBSD 6.6 when it was released. I spent some time this week testing it on my VMM virtual machines running OpenBSD-Stable and indeed, it's just as easy as upgrading snapshots. Then I upgraded everything else, including my production servers.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
To upgrade from OpenBSD 6.5, as root or with doas, just run these commands:&lt;/div&gt;
&lt;div&gt;
syspatch&lt;/div&gt;
&lt;div&gt;
sysupgrade (it'll download what it needs, reboot, do the upgrade, and reboot again, fully unattended)&lt;/div&gt;
&lt;div&gt;
pkg_add -u (to upgrade all of your binary packages to the latest version)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
As per usual, I updated the &lt;a href="http://www.h-i-r.net/p/setting-up-openbsd-relayd-based-httpd.html" target="_blank"&gt;OpenBSD/httpd/MariaDB/PHP walk-through&lt;/a&gt;.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;P&gt;We are proud members of the &lt;A HREF="http://securitybloggers.net/"&gt;Security Bloggers Network&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;This content originally posted on &lt;A HREF="http://www.h-i-r.net/"&gt;HiR Information Report&lt;/A&gt;. Copyright © 1997-2010, HiR&lt;/P&gt;&lt;/div&gt;</description><link>http://www.h-i-r.net/2019/10/openbsd-66-released-early.html</link><author>noreply@blogger.com (Ax0n)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPc22rp43ubP9I5jBdbcTil9n4SN829jwaCjXyHhqF_o3Nv3kWQ6my_iBU1hB6-aRQ65-ZlQWxo3KuHJHzY7u1Y7JDenHiq1oNs3U9z0NyQfwTN0VVNsOBAaPtcGM7nGEu6tRXT0NLVII/s72-c/puffy66.gif" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5554915078212081470.post-4568536767482614756</guid><pubDate>Wed, 25 Sep 2019 13:57:00 +0000</pubDate><atom:updated>2019-09-25T09:02:23.833-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">scam</category><category domain="http://www.blogger.com/atom/ns#">socialengineering</category><title>Scams: Two Close Calls</title><description>Over on Twitter, &lt;a href="https://twitter.com/konklone" target="_blank"&gt;Eric Mill&lt;/a&gt; tweeted:
&lt;br /&gt;
&lt;blockquote class="twitter-tweet" data-lang="en"&gt;
&lt;div dir="ltr" lang="en"&gt;
A friend of mine who works in infosec recently fell for a scam and had to cancel their credit card. They're very embarrassed about it right now, but I'm pretty sure we can all be scammed, right? It's definitely happened to me.&lt;br /&gt;
&lt;br /&gt;
Have you been scammed before? How'd it happen?&lt;/div&gt;
— Eric Mill (@konklone) &lt;a href="https://twitter.com/konklone/status/1176668345162186752?ref_src=twsrc%5Etfw"&gt;September 25, 2019&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async="" charset="utf-8" src="https://platform.twitter.com/widgets.js"&gt;&lt;/script&gt;
My stories are a bit too long for Twitter, but let's unpack two scams that were pretty well done which I fell for -- at least partially -- recently. We'll also highlight some early telltale signs that something was wrong, which I embarrassingly either missed or shrugged off at first, so that perhaps you'll be able to spot these scams better.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Feel free to share your own "scammed" stories in the aforementioned &lt;a href="https://twitter.com/konklone/status/1176668345162186752" target="_blank"&gt;Twitter thread&lt;/a&gt;, or here in the comments.
&lt;br /&gt;
&lt;h4&gt;
My bank's doppelganger phone number&amp;nbsp;&lt;/h4&gt;
My debit card had been getting flaky in chip readers recently. In fact, the plastic around the embedded chip contacts was breaking. It was time for a new card. I turned the card over to find the customer service number, which was a bit difficult to read because it was inexplicably printed directly under the embossed credit card number. The conversation went like this:&lt;br /&gt;
&lt;br /&gt;
Agent: Thank you for calling [my bank's name] Card Services, this is [name]. Who am I speaking with today?&lt;br /&gt;
Me: ... my real name ...&lt;br /&gt;
Agent: Good morning, [name]! How can we help you today?&lt;br /&gt;
Me: My card's pretty worn out and isn't working consistently. I need a replacement, please.&lt;br /&gt;
Agent: We can get your new card sent out right away! What's your card number?&lt;br /&gt;
Me: ... reads the card number ...&lt;br /&gt;
Agent: And the expiration date?&lt;br /&gt;
Me: ... reads the expiration date after a short pause ...&lt;br /&gt;
Agent: And for security purposes, the 3-digit CVV code.&lt;br /&gt;
&lt;br /&gt;
I suspected something was fishy when the agent requested my expiration date, but a few things were going on in my head. *I* called them, not the other way around. Also, the agent was professional and friendly, and even answered the phone with my bank's name. But when I got asked for the CVV code, that's when I knew something was completely wrong. I took a very close look at the back of my card, and compared it to the phone number I was calling. One of the hardest-to-read digits of the phone number on the back of my card was an 8, instead of the 0 that I dialed.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
Having disclosed my first and last name, Primary Account Number and expiration date, I called my bank's real number and had my card disabled and ordered a replacement. My real bank didn't even need my whole card number to look my account up when I contacted them. That was the first red flag, and I had completely missed it.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
The mobile phone carrier "Fraud Department"&lt;/h4&gt;
I got a call unusually early on a Saturday morning from my mobile carrier's customer service number (It was in my contacts and it was the right number). The person on the line was from the fraud department, and explained that they'd seen unusual activity on my account. Someone had changed the address on my account and then mail-ordered a new iPhone X for a little over $1000. She explained that any time an address is changed right before a purchase, their system flags the transaction for review. &lt;br /&gt;
&lt;br /&gt;
This sounds quite rational to me. But who had access to my account? My wife's caregiver had recently quit and moved out, and she had a phone on our account. When she quit, we made her leave the phone behind. Perhaps she was up to no good? I was confused and furious; I felt violated. I explained that our old roommate may be behind it.&lt;br /&gt;
&lt;br /&gt;
"Do you recognize this address?" the agent asks, before rattling off some random address in The Bronx. There's no way our old roommate was in The Bronx. Her family is all in Texas and Oklahoma. I thought it was very strange that a fraud department representative would disclose this information to me. That was the first red flag. I chose to ignore it.&lt;br /&gt;
&lt;br /&gt;
"Sir, we'll take care of this," she explains. "We never processed the transaction, because it was flagged for review. Let's get your account secured! I just sent you a one-time code to verify you're in possession of the phone tied to your account. Can you read it to me?" There's red flag #2. I was still far too flummoxed to see it.&lt;br /&gt;
&lt;br /&gt;
I get an SMS message from my wireless carrier. In a rush, I don't even read the whole message. I rattle off the 8-digit number. But then something catches my eye as I bring the phone back up to my head. Right at the beginning of the text message, there's a big disclaimer along the lines of "&lt;b&gt;For the security of your account, we will never contact you for this code.&lt;/b&gt;" &lt;br /&gt;
&lt;br /&gt;
Now the plot thickens, but I'm a bit sharpened up. I begin to suspect this is an elaborate ruse, and it worked pretty well.&lt;br /&gt;
&lt;br /&gt;
"I am not comfortable with this call," I say, grabbing my laptop and trying to log in to my account. The password has already been changed, in under a minute. Even the temporary code I'd just been texted isn't working. "Is there a direct number I can call you back at?"&lt;br /&gt;
&lt;br /&gt;
"I'm securing your account, sir. I assure you, I'm from the fraud department. We do this all the time. I understand you're angry. We're almost finished with the password reset," she says, quite professionally. Meanwhile, I'm issuing my own password reset through my carrier's website. I get the exact same text message this agent had "sent" me, with a different one-time code, obiously.&lt;br /&gt;
&lt;br /&gt;
I tell her that something has come up and I'll have to call her back in a few minutes. I ask for her name again. "Jessica," she says.&lt;br /&gt;
&lt;br /&gt;
"May I please have your direct phone number so I can call you back in a bit, Jessica?"&lt;br /&gt;
&lt;br /&gt;
"Sure thing! Just call me back at the customer service number I'm calling from. I'm at extension 105."&lt;br /&gt;
&lt;br /&gt;
I hang up, and finish resetting my password.&lt;br /&gt;
&lt;br /&gt;
I call back while scrolling through my account to make sure nothing's been purchased or changed. I get my carrier's customer service, as expected. There is no way to dial an extension. I get a real human on the phone, and ask to be transferred to extension 105. There is no extension 105. There *IS* a fraud department, but they do not call subscribers directly. Customer service pulls up my account's history. They keep a record of every agent who's looked at my account. No one had opened my account since we added a line to the account for our recently-departed caregiver.&lt;br /&gt;
&lt;br /&gt;
Attackers can easily spoof a call to make it look like it came from any phone number. Armed with only my carrier's customer service phone number, and a list of phone numbers assigned to my carrier, they can trawl through the list and perpetrate this scam over and over. Having a young woman with a southern twang make the calls, with obvious call-center background noise was icing on the cake.&lt;div class="blogger-post-footer"&gt;&lt;P&gt;We are proud members of the &lt;A HREF="http://securitybloggers.net/"&gt;Security Bloggers Network&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;This content originally posted on &lt;A HREF="http://www.h-i-r.net/"&gt;HiR Information Report&lt;/A&gt;. Copyright © 1997-2010, HiR&lt;/P&gt;&lt;/div&gt;</description><link>http://www.h-i-r.net/2019/09/scams-two-close-calls.html</link><author>noreply@blogger.com (Ax0n)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5554915078212081470.post-7983106194869768002</guid><pubDate>Tue, 30 Apr 2019 13:57:00 +0000</pubDate><atom:updated>2019-04-30T08:57:41.710-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Electronics</category><category domain="http://www.blogger.com/atom/ns#">risk</category><category domain="http://www.blogger.com/atom/ns#">threat</category><title>Former student pleads guilty in "USB Killer" case</title><description>A few weeks old, from the &lt;a href="https://www.justice.gov/usao-ndny/pr/former-student-pleads-guilty-destroying-computers-college-st-rose" target="_blank"&gt;Department of Justice website&lt;/a&gt;, comes the first mention I've heard of a "USB Killer" being used nefariously at scale:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
Akuthota admitted that on February 14, 2019, he inserted a “USB 
Killer” device into 66 computers, as well as numerous computer monitors 
and computer-enhanced podiums, owned by the college in Albany.&amp;nbsp; The “USB
 Killer” device, when inserted into a computer’s USB port, sends a 
command causing the computer’s on-board capacitors to rapidly charge and
 then discharge repeatedly, thereby overloading and physically 
destroying the computer’s USB port and electrical system.&lt;br /&gt;


&lt;/blockquote&gt;
&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
Akuthota admitted that he intentionally destroyed the computers, and 
recorded himself doing so using his iPhone, including making statements 
such as “I’m going to kill this guy” before inserting the USB Killer 
into a computer’s USB port.&amp;nbsp; Akuthota also admitted that his actions 
caused $58,471 in damage, and has agreed to pay restitution in that 
amount to the College.&lt;/blockquote&gt;
&lt;br /&gt;
This is the predominant threat model that came to mind when &lt;a href="http://www.h-i-r.net/2015/10/usb-killer-hype.html" target="_blank"&gt;USB Killer Hype&lt;/a&gt; kicked in about a year and a half ago. That is, someone repeatedly using
 it to attack unattended computers. While USB Killer devices are no longer one-off devices, and they have achieved a sort of "commercial viability," the kind that look convincing enough for a random person to insert into their own PC cost more than $60 USD. That's a lot of cash to spend on potentially destroying devices belonging to a random person by just leaving it laying around. Cheaper ones that are chunky (or have no case at all, or have cases emblazoned with menacing 
logos) are easier to come by, but obviously look more suspicious.&lt;br /&gt;
This is a pretty "clean" way for someone to destroy a computer they have physical access to, but ultimately, "physical access is total access" as the saying goes. &lt;div class="blogger-post-footer"&gt;&lt;P&gt;We are proud members of the &lt;A HREF="http://securitybloggers.net/"&gt;Security Bloggers Network&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;This content originally posted on &lt;A HREF="http://www.h-i-r.net/"&gt;HiR Information Report&lt;/A&gt;. Copyright © 1997-2010, HiR&lt;/P&gt;&lt;/div&gt;</description><link>http://www.h-i-r.net/2019/04/former-student-pleads-guilty-in-usb.html</link><author>noreply@blogger.com (Ax0n)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5554915078212081470.post-3479055523829322217</guid><pubDate>Mon, 29 Apr 2019 03:33:00 +0000</pubDate><atom:updated>2019-04-28T22:35:45.087-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">news</category><category domain="http://www.blogger.com/atom/ns#">openbsd</category><category domain="http://www.blogger.com/atom/ns#">unix</category><title>OpenBSD 6.5 released early</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDDspogSKAh0ZADv355UOFJuKhv6aVlxcd3Iyk0GYoW9Rnf5-vto3QdfR7ZT3d_MBi62qvsyBtCVL0WdrFb6Xkr6DTlkA3Xkh7oSXcgjQzujqDE0MZUvaTlll_9m95YDtklm0T7I3zLpo/s1600/puffy65.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="199" data-original-width="599" height="106" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDDspogSKAh0ZADv355UOFJuKhv6aVlxcd3Iyk0GYoW9Rnf5-vto3QdfR7ZT3d_MBi62qvsyBtCVL0WdrFb6Xkr6DTlkA3Xkh7oSXcgjQzujqDE0MZUvaTlll_9m95YDtklm0T7I3zLpo/s320/puffy65.gif" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
A few days late posting this, but &lt;a href="http://www.openbsd.org/65.html" target="_blank"&gt;OpenBSD 6.5&lt;/a&gt; hit the wire last week, ahead of the May 1 target release date. Our &lt;a href="http://www.h-i-r.net/p/setting-up-openbsd-relayd-based-httpd.html" target="_blank"&gt;OpenBSD Web Server Guide&lt;/a&gt; -- using the built-in httpd -- has been updated. And the PHP-FPM quirks from OpenBSD 6.4 got ironed out.&lt;br /&gt;
&lt;br /&gt;
As far as installation and daily use go, you probably won't notice much has changed in OpenBSD 6.5. There was a ton of work done in areas of hardware support and network-stack enhancements. &lt;br /&gt;
&lt;br /&gt;
If your console supports it, you may notice a new default console font (called "&lt;a href="https://www.cambus.net/spleen-monospaced-bitmap-fonts/" target="_blank"&gt;Spleen&lt;/a&gt;"). I've seen this on my OpenBSD-Current laptop for a few months. At first, I didn't really like it, but it's quite readable and has grown on me when working in text-only mode. I'm considering setting it as my default xterm font as well.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://www.cambus.net/content/2018/09/spleen-hello.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="550" data-original-width="800" height="220" src="https://www.cambus.net/content/2018/09/spleen-hello.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
If you use OpenBSD-CURRENT with snapshots, however, there's already some fun stuff unfolding there, with &lt;a href="https://man.openbsd.org/sysupgrade" target="_blank"&gt;sysupgrade(8)&lt;/a&gt; among them. This makes in-place upgrades a breeze. While it's not available in OpenBSD 6.5, upgrading from one release to the next should get a lot easier in about a year's time. The 6.6 to 6.7 upgrade will be the first supported release with this tool, unless they backport it to 6.5 with an errata/patch -- unlikely, indeed...&lt;br /&gt;
&lt;blockquote class="twitter-tweet" data-lang="en"&gt;
&lt;div dir="ltr" lang="en"&gt;
Here's our new sysupgrade utility in action: a fully unattended snapshot upgrade with just one command. &lt;a href="https://t.co/wRF8jlHvA6"&gt;https://t.co/wRF8jlHvA6&lt;/a&gt; &lt;a href="https://t.co/NVOO9yHTns"&gt;pic.twitter.com/NVOO9yHTns&lt;/a&gt;&lt;/div&gt;
— OpenBSD (@openbsd) &lt;a href="https://twitter.com/openbsd/status/1121889666918227968?ref_src=twsrc%5Etfw"&gt;April 26, 2019&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async="" charset="utf-8" src="https://platform.twitter.com/widgets.js"&gt;&lt;/script&gt;
&lt;div class="blogger-post-footer"&gt;&lt;P&gt;We are proud members of the &lt;A HREF="http://securitybloggers.net/"&gt;Security Bloggers Network&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;This content originally posted on &lt;A HREF="http://www.h-i-r.net/"&gt;HiR Information Report&lt;/A&gt;. Copyright © 1997-2010, HiR&lt;/P&gt;&lt;/div&gt;</description><link>http://www.h-i-r.net/2019/04/openbsd-65-released-early.html</link><author>noreply@blogger.com (Ax0n)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDDspogSKAh0ZADv355UOFJuKhv6aVlxcd3Iyk0GYoW9Rnf5-vto3QdfR7ZT3d_MBi62qvsyBtCVL0WdrFb6Xkr6DTlkA3Xkh7oSXcgjQzujqDE0MZUvaTlll_9m95YDtklm0T7I3zLpo/s72-c/puffy65.gif" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5554915078212081470.post-4987000876440274819</guid><pubDate>Mon, 03 Dec 2018 05:12:00 +0000</pubDate><atom:updated>2018-12-02T23:12:17.679-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">linux</category><category domain="http://www.blogger.com/atom/ns#">openbsd</category><category domain="http://www.blogger.com/atom/ns#">ubuntu</category><category domain="http://www.blogger.com/atom/ns#">unix</category><category domain="http://www.blogger.com/atom/ns#">virtualization</category><title>OpenBSD VMM Hypervisor Part 4: Running Ubuntu (and possibly other distros)</title><description>TL;DR: you cheat.&lt;br /&gt;
&lt;br /&gt;
I've been trying for almost a year to figure out how to get the &lt;a href="https://gist.github.com/reyk/6d369c5c0bd0c76f4906f83933f3bb71" target="_blank"&gt;cloud-init meta-data service&lt;/a&gt; to work with the Ubuntu Cloud image. I've asked on misc@ and other OpenBSD groups, and no one has an answer. The &lt;a href="https://github.com/reyk/meta-data" target="_blank"&gt;documentation&lt;/a&gt; is vague. If anyone ever figures out how to configure meta-data, let me know. I'd still like to give it a shot.&lt;br /&gt;
&lt;br /&gt;
Last week, I rescued a server from a pile of computers destined to be scrapped and recycled. For me, it's the perfect setup for getting serious with OpenBSD VMM in my home lab. Two older Xeon E5-2620 CPUs and 128 GB of RAM. No hard drives, but it came with enough empty drive trays for getting started. I threw a pair of old SAS drives into it.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwI3Nv5jyLwIGKA4lNFeo_HYYyGMfHnH-vFPteBkKwRndMZt0AoCpxgRyiSne8t7BySuRjiwTmATg87v36sreLTwMujSdeYqkqULXDUUn0hzAl_YqntunTmL97bLIRJm1rmefbrlCxtzw/s1600/vmmserver.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1200" data-original-width="1600" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwI3Nv5jyLwIGKA4lNFeo_HYYyGMfHnH-vFPteBkKwRndMZt0AoCpxgRyiSne8t7BySuRjiwTmATg87v36sreLTwMujSdeYqkqULXDUUn0hzAl_YqntunTmL97bLIRJm1rmefbrlCxtzw/s400/vmmserver.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
No surprise, OpenBSD just worked. This renewed my fervor for replicating a bunch of my cloud instances at home, and there's a lot of Ubuntu in use. &lt;br /&gt;
&lt;br /&gt;
I decided to bite the bullet and just use qemu to do the installation and configuration of Ubuntu. Install qemu from packages:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #38761d;"&gt;doas pkg_add qemu&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Download Ubuntu Server. I've actually used both 18.04 LTS and 16.04 LTS. I'm focusing on 16.04 for this because that's what I'm running on most of my EC2 instances.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Create a disk image.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #38761d;"&gt;vmctl create qcow2:ubuntu16lts.qcow2 -s 20G&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Boot the ubuntu ISO and attach the new ubuntu disk image to qemu:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #38761d;"&gt;qemu-system-x86_64 -boot d -cdrom ~/Downloads/ubuntu-16.04.5-server-amd64.iso -drive file=ubuntu16lts.qcow2,media=disk -m 640&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Install Ubuntu as usual. I didn't bother adding anything other than the SSH server during installation. qemu is really slow on OpenBSD, but it works... eventually. When the install is done, shut down and then restart qemu without the installation ISO attached.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #38761d;"&gt;qemu-system-x86_64 -drive file=ubuntu16lts.qcow2,media=disk -m 640&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Log in with the user-level account you created. There are only two things to tweak before it's ready to run in vmm: Configuring the serial console, and the network interface.&lt;br /&gt;
&lt;br /&gt;
Under qemu, Ubuntu sees "ens3" as the network interface. Under vmm, the network interface is "enp0s3". Change "ens3" to "enp0s3" in /etc/network/interfaces if you're using 16.04. On Ubuntu 18.04, you must instead change the "netplan" config file in /etc/netplan/50-cloud-init.yaml with the same kind of change, ens3 to enp0s3.&lt;br /&gt;
&lt;br /&gt;
To configure the serial console, edit /etc/default/grub and change this line:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #3d85c6;"&gt;GRUB_CMDLINE_LINUX=""&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
to&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #3d85c6;"&gt;GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0,115200n8"&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
then run&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #38761d;"&gt;sudo update-grub&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Shut down qemu again. Your disk image is basically ready to go under vmm.&lt;br /&gt;
&lt;br /&gt;
To save the trouble of having to mess with qemu again, I recommend creating derivative images of the one you just created, and using those for vmm.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #38761d;"&gt;vmctl create qcow2:ubuntu16lts-1.qcow2 -b ubuntu16lts.qcow2&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Add the new disk image to a configuration clause in /etc/vm.conf on your OpenBSD host system. Mine looks like this:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #3d85c6;"&gt;vm "Ubuntu16.04" {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; disable&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; owner axon&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; memory 4096M&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; disk "/home/axon/vmm/ubuntu16lts-1.qcow2"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; interface {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; switch "local"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lladdr fe:e1:ba:f0:eb:b0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;
For more information about setting up switches and networks in vmm, see &lt;a href="http://www.h-i-r.net/2017/04/openbsd-vmm-hypervisor-part-2.html" target="_blank"&gt;Part 2 of my VMM series&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Voila! Ubuntu in VMM!&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPu-70VeNpVTvlIEXNBlIGbqKgeUIHEpB5KaIsADu4RZbAF9yCXozzJeKkl4qf0dUk9xJm9DJswUFc70HSjQs9-fm2GqK4SyczfuMLPyGDOYBqmG30HU4WMUMS69cBDsEBYc1c5TNkaYM/s1600/ubuntu-vmm.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="442" data-original-width="662" height="266" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPu-70VeNpVTvlIEXNBlIGbqKgeUIHEpB5KaIsADu4RZbAF9yCXozzJeKkl4qf0dUk9xJm9DJswUFc70HSjQs9-fm2GqK4SyczfuMLPyGDOYBqmG30HU4WMUMS69cBDsEBYc1c5TNkaYM/s400/ubuntu-vmm.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Although the configuration files you must edit to make it work might vary, you can do the same thing and it may very well work for text-mode-only distributions.&lt;br /&gt;
&lt;br /&gt;
I actually didn't need to use qemu to get arch linux installed in vmm, but it was somewhat tedious to do entirely in vmm, and it took me a few tries to get it right. Qemu might have been easier.&lt;div class="blogger-post-footer"&gt;&lt;P&gt;We are proud members of the &lt;A HREF="http://securitybloggers.net/"&gt;Security Bloggers Network&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;This content originally posted on &lt;A HREF="http://www.h-i-r.net/"&gt;HiR Information Report&lt;/A&gt;. Copyright © 1997-2010, HiR&lt;/P&gt;&lt;/div&gt;</description><link>http://www.h-i-r.net/2018/12/openbsd-vmm-hypervisor-part-4-running.html</link><author>noreply@blogger.com (Ax0n)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwI3Nv5jyLwIGKA4lNFeo_HYYyGMfHnH-vFPteBkKwRndMZt0AoCpxgRyiSne8t7BySuRjiwTmATg87v36sreLTwMujSdeYqkqULXDUUn0hzAl_YqntunTmL97bLIRJm1rmefbrlCxtzw/s72-c/vmmserver.jpg" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5554915078212081470.post-3012400863671378946</guid><pubDate>Fri, 02 Nov 2018 02:44:00 +0000</pubDate><atom:updated>2018-11-01T21:44:46.555-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">openbsd</category><category domain="http://www.blogger.com/atom/ns#">unix</category><category domain="http://www.blogger.com/atom/ns#">virtualization</category><title>OpenBSD vmm Hypervisor Part 3: qcow2 and derived disk images</title><description>&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
With OpenBSD 6.4, the VMM hypervisor got support for qcow2 disk images. This format is used by QEMU, but it has several features that make it a better choice than raw image files. The images are dynamically-allocated, so the disk image file grows as you use more space instead of taking up the entire filesystem size when the image is created. It won't ever shrink, though. "Derived images" are also supported. While VMM doesn't officially support snapshots yet, you can kind of get away with using derived images to do something similar. I'll cover that toward the end of this article.
&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
You will probably want to have the networking set up on your OpenBSD VM host before you continue. That information is covered in &lt;a href="http://www.h-i-r.net/2017/04/openbsd-vmm-hypervisor-part-2.html" target="_blank"&gt;Part 2 of my VMM series&lt;/a&gt;.&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
To create a qcow2 image, prefix the image file name with qcow2:&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;span style="color: #6aa84f;"&gt;vmctl create qcow2:obsd64-base.qcow2 -s 10G&lt;/span&gt;&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
--OR--&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
You can also use the qemu-img utility (from qemu in the package repository) to convert an existing raw image to qcow2 format, if you've already been using VMM before OpenBSD 6.4 was released. This image file will not be dynamically sized, but it can serve as a base image for derivatives:&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;span style="color: #6aa84f;"&gt;qemu-img convert obsd64.img obsd64-base.qcow2&lt;/span&gt;&lt;/div&gt;
&lt;span style="color: #6aa84f;"&gt;
&lt;/span&gt;&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
Start the VM using your bsd.rd as the boot image, then follow the installer prompts.&amp;nbsp;&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;span style="color: #6aa84f;"&gt;doas vmctl start obsd64-base -n local -m 512m -d obsd64-base.qcow2 -b /bsd.rd -c&lt;/span&gt;&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
When the install is done, rebooting will just bring the installer back. Exit to shell instead, type "halt -p" and use the ~. command sequence to exit the VM. Anything else you press will probably reboot the system (back into the installer). Now you have a pristine, freshly-installed OpenBSD image to start from.&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
To create a derived image, select your base image with the -b option to vmctl create:
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;span style="color: #6aa84f;"&gt;vmctl create qcow2:obsd64-test1.qcow2 -b obsd64-base.qcow2 &lt;/span&gt;&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;span style="color: red;"&gt;WARNING: &lt;/span&gt;If you make any changes to the base image, all derived image files it was based on will become corrupt and unusable. You can remove write access to the base image if you want. The VMs relying on derived images will run fine.&amp;nbsp;&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;span style="color: #6aa84f;"&gt;chmod 400 obsd64-base.qcow2 &lt;/span&gt;&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
Now, create a VM in /etc/vm.conf with the new obsd64-test1.qcow2 image file. All changes will be stored in this new image file. The original filesystem image will remain unchanged, and you can make as many derived images as you want from it. &lt;/div&gt;
&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;span style="color: #3d85c6;"&gt;# bridge0 for VMs, NAT and dhcpd (required for networking in this example)&lt;/span&gt;&lt;/div&gt;
&lt;span style="color: #3d85c6;"&gt;
&lt;/span&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;span style="color: #3d85c6;"&gt;switch "local" {&lt;/span&gt;&lt;/div&gt;
&lt;span style="color: #3d85c6;"&gt;
&lt;/span&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;span style="color: #3d85c6;"&gt;        interface bridge0&lt;/span&gt;&lt;/div&gt;
&lt;span style="color: #3d85c6;"&gt;
&lt;/span&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;span style="color: #3d85c6;"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;span style="color: #3d85c6;"&gt;
&lt;/span&gt;&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;span style="color: #3d85c6;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style="color: #3d85c6;"&gt;
&lt;/span&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;span style="color: #3d85c6;"&gt;# OpenBSD Stable&lt;/span&gt;&lt;/div&gt;
&lt;span style="color: #3d85c6;"&gt;
&lt;/span&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;span style="color: #3d85c6;"&gt;vm "test.vm" {&lt;/span&gt;&lt;/div&gt;
&lt;span style="color: #3d85c6;"&gt;
&lt;/span&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;span style="color: #3d85c6;"&gt;        disable&lt;/span&gt;&lt;/div&gt;
&lt;span style="color: #3d85c6;"&gt;
&lt;/span&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;span style="color: #3d85c6;"&gt;        owner axon&lt;/span&gt;&lt;/div&gt;
&lt;span style="color: #3d85c6;"&gt;
&lt;/span&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;span style="color: #3d85c6;"&gt;        memory 512M &lt;/span&gt;&lt;/div&gt;
&lt;span style="color: #3d85c6;"&gt;
&lt;/span&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;span style="color: #3d85c6;"&gt;        disk "/home/axon/vmm/obsd64-test1.qcow2"&lt;/span&gt;&lt;/div&gt;
&lt;span style="color: #3d85c6;"&gt;
&lt;/span&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;span style="color: #3d85c6;"&gt;        interface { &lt;/span&gt;&lt;/div&gt;
&lt;span style="color: #3d85c6;"&gt;
&lt;/span&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;span style="color: #3d85c6;"&gt;                switch "local" &lt;/span&gt;&lt;/div&gt;
&lt;span style="color: #3d85c6;"&gt;
&lt;/span&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;span style="color: #3d85c6;"&gt;                lladdr fe:e1:ba:d0:eb:ab&lt;/span&gt;&lt;/div&gt;
&lt;span style="color: #3d85c6;"&gt;
&lt;/span&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;span style="color: #3d85c6;"&gt;        }&lt;/span&gt;&lt;/div&gt;
&lt;span style="color: #3d85c6;"&gt;
&lt;/span&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;span style="color: #3d85c6;"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;span style="color: #3d85c6;"&gt;
&lt;/span&gt;&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
Reload vmm's configuration:&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;span style="color: #6aa84f;"&gt;doas vmctl reload&lt;/span&gt;&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
Then go ahead and boot it up with the console attached:&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;span style="color: #6aa84f;"&gt;vmctl start test.vm -c&lt;/span&gt;&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
For snapshot-like functionality, you can make a copy of your derived image and save it with another file name in the same directory. You should shut down the VM before you do this, though. To restore, just copy it back over the derived image, or create a new vm clause in /etc/vm.conf pointing to your saved derived image file.&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;span style="color: #6aa84f;"&gt;cp obsd64-test1.qcow2 snapshot-2018-11-01_obsd64-test1.qcow2&lt;/span&gt;&lt;/div&gt;
&lt;span style="color: #6aa84f;"&gt;
&lt;/span&gt;&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
You can run multiple VMs at the same time, with different derived images from the base image as well. If I create a new derived image file and add a vm clause for it, both VMs can run at the same time.&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;span style="color: #6aa84f;"&gt;vmctl create qcow2:obsd64-test2.qcow2 -b obsd64-base.qcow2&lt;/span&gt;&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
I added this to /etc/vm.conf:&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;span style="color: #3d85c6;"&gt;# OpenBSD test2&lt;/span&gt;&lt;/div&gt;
&lt;span style="color: #3d85c6;"&gt;
&lt;/span&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;span style="color: #3d85c6;"&gt;vm "test2.vm" {&lt;/span&gt;&lt;/div&gt;
&lt;span style="color: #3d85c6;"&gt;
&lt;/span&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;span style="color: #3d85c6;"&gt;        disable&lt;/span&gt;&lt;/div&gt;
&lt;span style="color: #3d85c6;"&gt;
&lt;/span&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;span style="color: #3d85c6;"&gt;        owner axon&lt;/span&gt;&lt;/div&gt;
&lt;span style="color: #3d85c6;"&gt;
&lt;/span&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;span style="color: #3d85c6;"&gt;        memory 512M&lt;/span&gt;&lt;/div&gt;
&lt;span style="color: #3d85c6;"&gt;
&lt;/span&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;span style="color: #3d85c6;"&gt;        disk "/home/axon/vmm/obsd64-test2.qcow2"&lt;/span&gt;&lt;/div&gt;
&lt;span style="color: #3d85c6;"&gt;
&lt;/span&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;span style="color: #3d85c6;"&gt;        interface {&lt;/span&gt;&lt;/div&gt;
&lt;span style="color: #3d85c6;"&gt;
&lt;/span&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;span style="color: #3d85c6;"&gt;                switch "local"&lt;/span&gt;&lt;/div&gt;
&lt;span style="color: #3d85c6;"&gt;
&lt;/span&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;span style="color: #3d85c6;"&gt;                lladdr fe:e1:ba:d0:eb:ac&lt;/span&gt;&lt;/div&gt;
&lt;span style="color: #3d85c6;"&gt;
&lt;/span&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;span style="color: #3d85c6;"&gt;        }&lt;/span&gt;&lt;/div&gt;
&lt;span style="color: #3d85c6;"&gt;
&lt;/span&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;span style="color: #3d85c6;"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;span style="color: #3d85c6;"&gt;
&lt;/span&gt;&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
Reload vmm, and start up your VMs! &lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;span style="color: #6aa84f;"&gt;doas vmctl reload&lt;/span&gt;&lt;/div&gt;
&lt;span style="color: #6aa84f;"&gt;
&lt;/span&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;span style="color: #6aa84f;"&gt;vmctl start test.vm&lt;/span&gt;&lt;/div&gt;
&lt;span style="color: #6aa84f;"&gt;
&lt;/span&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;span style="color: #6aa84f;"&gt;vmctl start test2.vm&lt;/span&gt;&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
You can attach to the consoles of each to see that they're running. Remember that you can use the &lt;i&gt;[RETURN]~. &lt;/i&gt;key sequence to exit the console.&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; -qt-paragraph-type: empty; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;span style="color: #6aa84f;"&gt;vmctl console test.vm&lt;/span&gt;&lt;/div&gt;
&lt;span style="color: #6aa84f;"&gt;
&lt;/span&gt;&lt;div style="-qt-block-indent: 0; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-indent: 0px;"&gt;
&lt;span style="color: #6aa84f;"&gt;vmctl console test2.vm&lt;/span&gt;&lt;/div&gt;
&lt;style type="text/css"&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;div class="blogger-post-footer"&gt;&lt;P&gt;We are proud members of the &lt;A HREF="http://securitybloggers.net/"&gt;Security Bloggers Network&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;This content originally posted on &lt;A HREF="http://www.h-i-r.net/"&gt;HiR Information Report&lt;/A&gt;. Copyright © 1997-2010, HiR&lt;/P&gt;&lt;/div&gt;</description><link>http://www.h-i-r.net/2018/11/openbsd-vmm-hypervisor-part-3-qcow2-and.html</link><author>noreply@blogger.com (Ax0n)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5554915078212081470.post-3117925035047227203</guid><pubDate>Tue, 30 Oct 2018 03:19:00 +0000</pubDate><atom:updated>2018-10-29T22:19:54.990-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">openbsd</category><category domain="http://www.blogger.com/atom/ns#">unix</category><category domain="http://www.blogger.com/atom/ns#">virtualization</category><title>New OpenBSD FAQ: Virtualization</title><description>&lt;a href="http://www.h-i-r.net/search/label/openbsd" target="_blank"&gt;OpenBSD&lt;/a&gt; has, arguably, some of the best officially-maintained documentation of any modern operating system. Solene Rapenne added a new FAQ section for &lt;a href="http://www.openbsd.org/faq/faq16.html" target="_blank"&gt;Virtualization&lt;/a&gt; that covers getting OpenBSD's &lt;a href="http://www.h-i-r.net/search?q=vmm" target="_blank"&gt;VMM&lt;/a&gt; hypervisor off the ground, and it gets the basics out of the way pretty well.&lt;br /&gt;
&lt;br /&gt;
The FAQ kind of glosses over the more elaborate network configuration schemes, one of which I covered in &lt;a href="http://www.h-i-r.net/2017/04/openbsd-vmm-hypervisor-part-2.html" target="_blank"&gt;Part 2 of my VMM article&lt;/a&gt; a while ago, though if you poke around between the &lt;a href="http://www.openbsd.org/faq/" target="_blank"&gt;FAQ&lt;/a&gt; and &lt;a href="https://man.openbsd.org/" target="_blank"&gt;man pages&lt;/a&gt;, you can find pretty much all you need.&lt;br /&gt;
&lt;br /&gt;
There are some new features to VMM which I plan on writing about soon. Stay tuned!&lt;br /&gt;
&lt;br /&gt;
Via &lt;a href="http://undeadly.org/cgi?action=article;sid=20181029144519" target="_blank"&gt;Undeadly&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;P&gt;We are proud members of the &lt;A HREF="http://securitybloggers.net/"&gt;Security Bloggers Network&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;This content originally posted on &lt;A HREF="http://www.h-i-r.net/"&gt;HiR Information Report&lt;/A&gt;. Copyright © 1997-2010, HiR&lt;/P&gt;&lt;/div&gt;</description><link>http://www.h-i-r.net/2018/10/new-openbsd-faq-virtualization.html</link><author>noreply@blogger.com (Ax0n)</author><thr:total>0</thr:total></item></channel></rss>