<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Mohammad Alsaraf</title>
    <description>The latest articles on DEV Community by Mohammad Alsaraf (@sarrph).</description>
    <link>https://dev.to/sarrph</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3844553%2Fac09d4a6-e95b-4b1b-a898-a8d482538732.png</url>
      <title>DEV Community: Mohammad Alsaraf</title>
      <link>https://dev.to/sarrph</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sarrph"/>
    <language>en</language>
    <item>
      <title>Open a private admin page with an SSH tunnel, no open port needed</title>
      <dc:creator>Mohammad Alsaraf</dc:creator>
      <pubDate>Mon, 09 Nov 2026 06:00:00 +0000</pubDate>
      <link>https://dev.to/sarrph/open-a-private-admin-page-with-an-ssh-tunnel-no-open-port-needed-1ba7</link>
      <guid>https://dev.to/sarrph/open-a-private-admin-page-with-an-ssh-tunnel-no-open-port-needed-1ba7</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fquhkk4bzhab4pvdlu9bo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fquhkk4bzhab4pvdlu9bo.png" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Many server apps come with a web page for setup or admin: dashboards, database tools, code editors. Putting those pages on the open internet invites password guessing, and on a NAT VPS every open port is one of your few forwarded ports. An &lt;strong&gt;SSH tunnel&lt;/strong&gt; gives you a third option: the page stays private on the server, and only you reach it, through the SSH connection you already use.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqh79x6wjxjehtpmyts2z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqh79x6wjxjehtpmyts2z.png" alt="Diagram: your browser opens localhost:8080, an encrypted SSH tunnel carries it through your SSH port to the admin page on 127.0.0.1:3001 on your server" width="800" height="208"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Make the app listen only on the server itself
&lt;/h2&gt;

&lt;p&gt;Set your app to listen on &lt;code&gt;127.0.0.1&lt;/code&gt; (also called localhost) instead of &lt;code&gt;0.0.0.0&lt;/code&gt;. The setting is usually called &lt;em&gt;host&lt;/em&gt;, &lt;em&gt;bind&lt;/em&gt; or &lt;em&gt;listen address&lt;/em&gt;. Then nothing outside the server can reach it. Check with &lt;code&gt;ss&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx4p7lpq4o3bzk6hzf0jl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx4p7lpq4o3bzk6hzf0jl.png" alt="ss shows SSH listening on all addresses and the admin app only on 127.0.0.1 port 3001" width="798" height="258"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;SSH on port 22 is reachable; the app on 3001 is only reachable from the server itself.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  2. Open the tunnel from your computer
&lt;/h2&gt;

&lt;p&gt;On your own computer (Linux, macOS, or Windows 10 and 11 in PowerShell, which include &lt;code&gt;ssh&lt;/code&gt;), run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh &lt;span class="nt"&gt;-N&lt;/span&gt; &lt;span class="nt"&gt;-L&lt;/span&gt; 8080:localhost:3001 root@natbox.io &lt;span class="nt"&gt;-p&lt;/span&gt; YOUR_SSH_PORT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-L 8080:localhost:3001&lt;/code&gt;: connections to port 8080 on &lt;em&gt;your computer&lt;/em&gt; go to port 3001 on &lt;em&gt;the server&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-N&lt;/code&gt;: just the tunnel, no shell. Leave the window open while you work; press Ctrl+C to close it.&lt;/li&gt;
&lt;li&gt;Use your own SSH port from the client area, the same one you log in with.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw79fuyghlkylcpgh411j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw79fuyghlkylcpgh411j.png" alt="On the laptop: the ssh -L command, then curl to localhost:8080 returns the page from the server" width="800" height="332"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Open it in your browser
&lt;/h2&gt;

&lt;p&gt;Go to &lt;code&gt;http://localhost:8080&lt;/code&gt;. You are looking at the page on your server, carried over the encrypted SSH connection. In our test it is a small private log browser that only listens on 127.0.0.1:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbbacg35v81b8enjx2mtr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbbacg35v81b8enjx2mtr.png" alt="A browser showing the server's private page at http://localhost:8080" width="799" height="502"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Tips
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Several pages at once:&lt;/strong&gt; add more &lt;code&gt;-L&lt;/code&gt; options, for example &lt;code&gt;-L 8080:localhost:3001 -L 8081:localhost:8443&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Save typing:&lt;/strong&gt; put it in &lt;code&gt;~/.ssh/config&lt;/code&gt; on your computer, then run &lt;code&gt;ssh -N mybox&lt;/code&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ssh"&gt;&lt;code&gt;&lt;span class="k"&gt;Host&lt;/span&gt; mybox
    &lt;span class="k"&gt;HostName&lt;/span&gt; natbox.io
    &lt;span class="k"&gt;Port&lt;/span&gt; YOUR_SSH_PORT
    &lt;span class="k"&gt;User&lt;/span&gt; root
    &lt;span class="k"&gt;LocalForward&lt;/span&gt; &lt;span class="m"&gt;8080&lt;/span&gt; localhost:3001
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"Address already in use":&lt;/strong&gt; something on your computer already uses 8080. Pick another local number, such as 8090.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Over IPv6:&lt;/strong&gt; you can also connect to your server's IPv6 address on port 22, if your network has IPv6.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Good candidates: the admin page of &lt;a href="https://natbox.io/guides/uptime-kuma" rel="noopener noreferrer"&gt;Uptime Kuma&lt;/a&gt;, a database tool for &lt;a href="https://natbox.io/guides/postgresql" rel="noopener noreferrer"&gt;PostgreSQL&lt;/a&gt;, or any app you only use yourself. For a public website, use a proper reverse proxy with HTTPS instead: see &lt;a href="https://natbox.io/guides/caddy-https" rel="noopener noreferrer"&gt;HTTPS with Caddy&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Get new tutorials in Telegram.&lt;/strong&gt; Follow &lt;a href="https://t.me/natboxio" rel="noopener noreferrer"&gt;@natboxio&lt;/a&gt;: every new post, plus short server tips.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>ssh</category>
      <category>devops</category>
      <category>selfhosted</category>
    </item>
    <item>
      <title>Disk full? Find what is filling your server, and clean it up safely</title>
      <dc:creator>Mohammad Alsaraf</dc:creator>
      <pubDate>Sat, 07 Nov 2026 06:00:00 +0000</pubDate>
      <link>https://dev.to/sarrph/disk-full-find-what-is-filling-your-server-and-clean-it-up-safely-4fil</link>
      <guid>https://dev.to/sarrph/disk-full-find-what-is-filling-your-server-and-clean-it-up-safely-4fil</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzbrrq1rupf6ef8xde51f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzbrrq1rupf6ef8xde51f.png" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When a disk fills up, apps start failing in odd ways: databases stop writing, updates break halfway, and logins can get slow. Small servers fill up faster, so it pays to know where the space goes. Here is how to find out in a few minutes, and what is safe to delete.&lt;/p&gt;

&lt;p&gt;About 10 minutes. Debian and Ubuntu commands; the checks work the same on AlmaLinux and Alpine.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. How full is the disk?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcalr4hb62vnbrwgekdy1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcalr4hb62vnbrwgekdy1.png" alt="df -h shows a 5.2 GB disk with 1.9 GB used, 37 percent" width="800" height="205"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;df -h /&lt;/code&gt; shows the size of your disk, how much is used and how much is left. On your server the first column shows your own server's name. The &lt;strong&gt;Graphs&lt;/strong&gt; tab in the client area shows the same number. Above about 85% it is time to clean up.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Which folders are big?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;du&lt;/code&gt; adds up folder sizes. Start at the top and work down into the biggest folder:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj5rhumnhn5sha0xwqenx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj5rhumnhn5sha0xwqenx.png" alt="du shows /root at 901 MB and /var at 722 MB; inside /var, /var/log is 641 MB" width="800" height="396"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The -x keeps du on your disk, and sort -h puts the biggest last.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  3. Or browse it with ncdu
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;ncdu&lt;/code&gt; does the same thing with a menu you can move around in with the arrow keys and Enter. Press d on a file to delete it (it asks first) and q to quit.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; ncdu
ncdu &lt;span class="nt"&gt;-x&lt;/span&gt; /
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl3brrkkqlaqwzrt14t7n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl3brrkkqlaqwzrt14t7n.png" alt="ncdu showing /root as the biggest folder at 900 MB" width="800" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. List the biggest files
&lt;/h2&gt;

&lt;p&gt;Usually a few large files are to blame. This lists every file over 100 MB:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr311mdcjbvps7ycn21qt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr311mdcjbvps7ycn21qt.png" alt="find lists a 900 MB old backup archive and a 640 MB log file" width="798" height="168"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here it is an old backup someone forgot about, and an app log that was never rotated.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Clean up safely
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Package cache:&lt;/strong&gt; &lt;code&gt;apt-get clean&lt;/code&gt; removes downloaded package files. Always safe.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Old kernels and packages:&lt;/strong&gt; &lt;code&gt;apt autoremove&lt;/code&gt; removes packages nothing needs any more. Read the list before you say yes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The system journal:&lt;/strong&gt; &lt;code&gt;journalctl --vacuum-size=50M&lt;/code&gt; keeps only the newest 50 MB of logs. See &lt;code&gt;journalctl --disk-usage&lt;/code&gt; first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A huge log file an app still writes to:&lt;/strong&gt; empty it with &lt;code&gt;truncate -s 0 FILE&lt;/code&gt; rather than deleting it. If you delete a file a running program has open, the space is only freed when that program restarts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Old backups:&lt;/strong&gt; copy them off the server first (see &lt;a href="https://natbox.io/guides/backups" rel="noopener noreferrer"&gt;the backups guide&lt;/a&gt;), then delete them.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4r5f95bobc07ljd5dot2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4r5f95bobc07ljd5dot2.png" alt="After cleaning: 371 MB used, 7 percent" width="799" height="276"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From 37% to 7% used.&lt;/p&gt;

&lt;h2&gt;
  
  
  Snapshots use disk space too
&lt;/h2&gt;

&lt;p&gt;Snapshots you take in the client area's &lt;strong&gt;Snapshots&lt;/strong&gt; tab are stored on your server's disk, so a snapshot keeps the files it saved, even after you delete them. If space is tight, delete snapshots you no longer need. More in the &lt;a href="https://natbox.io/docs" rel="noopener noreferrer"&gt;docs&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stop it happening again
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Make your app logs rotate: add a file in &lt;code&gt;/etc/logrotate.d/&lt;/code&gt;, or log to the journal by running the app as a service (&lt;a href="https://natbox.io/guides/run-an-app" rel="noopener noreferrer"&gt;how&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Cap the journal for good: set &lt;code&gt;SystemMaxUse=100M&lt;/code&gt; in &lt;code&gt;/etc/systemd/journald.conf&lt;/code&gt;, then &lt;code&gt;systemctl restart systemd-journald&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Keep backups off the server, not next to the data they protect.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Still short of space? You can move to a bigger plan from the client area at any time. See &lt;a href="https://natbox.io/#plans" rel="noopener noreferrer"&gt;the plans&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Get new tutorials in Telegram.&lt;/strong&gt; Follow &lt;a href="https://t.me/natboxio" rel="noopener noreferrer"&gt;@natboxio&lt;/a&gt;: every new post, plus short server tips.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>devops</category>
      <category>sysadmin</category>
      <category>selfhosted</category>
    </item>
    <item>
      <title>Keep commands running after you disconnect, with tmux</title>
      <dc:creator>Mohammad Alsaraf</dc:creator>
      <pubDate>Thu, 05 Nov 2026 06:00:00 +0000</pubDate>
      <link>https://dev.to/sarrph/keep-commands-running-after-you-disconnect-with-tmux-18hp</link>
      <guid>https://dev.to/sarrph/keep-commands-running-after-you-disconnect-with-tmux-18hp</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3i6s9ejdvesbpe7ve4ik.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3i6s9ejdvesbpe7ve4ik.png" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You start a big download or a backup over SSH, your Wi-Fi drops, and the command dies with your connection. &lt;strong&gt;tmux&lt;/strong&gt; fixes that: it keeps a terminal running on the server, so you can disconnect, go home, and pick it up again later exactly where it was.&lt;/p&gt;

&lt;p&gt;About 5 minutes. Works on any natbox plan. Commands for Debian and Ubuntu; on AlmaLinux use &lt;code&gt;dnf install -y tmux&lt;/code&gt;, on Alpine &lt;code&gt;apk add tmux&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Install tmux and start a session
&lt;/h2&gt;

&lt;p&gt;Log in to your server (&lt;code&gt;ssh root@natbox.io -p YOUR_PORT&lt;/code&gt;), install tmux and start a session with a name you will remember:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; tmux
tmux new &lt;span class="nt"&gt;-s&lt;/span&gt; download
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhycsj5uir38jlgg96wzc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhycsj5uir38jlgg96wzc.png" alt="Installing tmux and starting a session called download" width="799" height="162"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Run your long command inside it
&lt;/h2&gt;

&lt;p&gt;You are now inside tmux: it looks like a normal terminal, with a green bar at the bottom showing the session name. Start anything that takes a while. Here we download a 756 MB Debian image:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F90wpafbsz2mfygr7q81l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F90wpafbsz2mfygr7q81l.png" alt="A curl download running inside a tmux session called download, with the green tmux status bar at the bottom" width="800" height="239"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The green bar shows you are inside tmux: session download, window 0.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  3. Detach, and log out if you like
&lt;/h2&gt;

&lt;p&gt;Press Ctrl+B, let go, then press D. You are back in your normal shell, and tmux tells you the session is still alive. &lt;code&gt;tmux ls&lt;/code&gt; lists your sessions. You can now close the window, log out, or lose your connection: the command keeps running on the server.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn7zan2p8stpbovlfi5me.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn7zan2p8stpbovlfi5me.png" alt="Detaching from tmux and listing sessions with tmux ls" width="800" height="258"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  4. Come back to it
&lt;/h2&gt;

&lt;p&gt;Log in again, from any computer, and reattach:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;tmux attach &lt;span class="nt"&gt;-t&lt;/span&gt; download
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything is where you left it. Our download had kept going and was at 94%:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftpalbd6l86avzkunnzba.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftpalbd6l86avzkunnzba.png" alt="After reattaching, the download is at 94 percent" width="800" height="239"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When the command has finished, type &lt;code&gt;exit&lt;/code&gt; to close the session.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Bonus: two panes side by side
&lt;/h2&gt;

&lt;p&gt;Inside tmux, Ctrl+B then % splits the window in two. Here the left pane follows an app's log with &lt;code&gt;journalctl -fu myapp&lt;/code&gt; while the right pane checks memory and disk. Ctrl+B then an arrow key moves between panes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm0lljgbjo2okjg8msq6d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm0lljgbjo2okjg8msq6d.png" alt="A tmux window split into two panes: an app log on the left, memory and disk checks on the right" width="799" height="244"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The keys you need
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;tmux new -s NAME&lt;/code&gt;: start a session. &lt;code&gt;tmux ls&lt;/code&gt;: list sessions. &lt;code&gt;tmux attach -t NAME&lt;/code&gt;: go back in.&lt;/li&gt;
&lt;li&gt;
Ctrl+B then D: detach. Ctrl+B then % or ": split side by side or top and bottom.&lt;/li&gt;
&lt;li&gt;
Ctrl+B then [: scroll back with the arrow keys or Page Up; Q to stop scrolling.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  tmux or a service?
&lt;/h2&gt;

&lt;p&gt;tmux is for jobs you start by hand and want to watch: downloads, backups, updates, a game server console. Anything that should run all the time and start again after a reboot, such as a bot or a website, belongs in a systemd service instead: see &lt;a href="https://natbox.io/guides/run-an-app" rel="noopener noreferrer"&gt;Keep an app running&lt;/a&gt;. A tmux session does not survive a server restart.&lt;/p&gt;

&lt;p&gt;No server yet? &lt;a href="https://natbox.io/free-vps-trial" rel="noopener noreferrer"&gt;Try one free for a month&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Get new tutorials in Telegram.&lt;/strong&gt; Follow &lt;a href="https://t.me/natboxio" rel="noopener noreferrer"&gt;@natboxio&lt;/a&gt;: every new post, plus short server tips.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>tmux</category>
      <category>ssh</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Welcome to the natbox blog, and our new video library</title>
      <dc:creator>Mohammad Alsaraf</dc:creator>
      <pubDate>Wed, 04 Nov 2026 06:00:00 +0000</pubDate>
      <link>https://dev.to/sarrph/welcome-to-the-natbox-blog-and-our-new-video-library-3fg7</link>
      <guid>https://dev.to/sarrph/welcome-to-the-natbox-blog-and-our-new-video-library-3fg7</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3c6jx6c9rz0yc3r6g6yg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3c6jx6c9rz0yc3r6g6yg.png" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;natbox runs small Linux servers with root over SSH, your own block of IPv4 ports and a routed /80 of IPv6, from $1.00 a month. This blog is where we will post step-by-step tutorials, longer guides, and news when something changes on our side.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you will find here
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tutorials:&lt;/strong&gt; one task from start to finish, with every command, written for a natbox server but useful on any Linux VPS.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Guides:&lt;/strong&gt; the background to the tutorials, such as how NAT ports and IPv6 work, and how to choose a plan.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Announcements and updates:&lt;/strong&gt; new features, changes to plans, and anything that affects your server.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Our reference guides stay in &lt;a href="https://natbox.io/guides" rel="noopener noreferrer"&gt;Guides&lt;/a&gt;, and the basics of your account are in the &lt;a href="https://natbox.io/docs" rel="noopener noreferrer"&gt;docs&lt;/a&gt;. Blog posts link to them rather than repeat them.&lt;/p&gt;

&lt;h2&gt;
  
  
  New: videos
&lt;/h2&gt;

&lt;p&gt;We have also put all our videos on one page: &lt;a href="https://natbox.io/video" rel="noopener noreferrer"&gt;natbox.io/video&lt;/a&gt;. They play from our own server, with no YouTube embed and no cookies, and the longer ones have English captions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://natbox.io/video#first-server" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7bxkaep9e2w0tbdx241q.png" alt="Video thumbnail: Free Linux server plus SSH in 2 minutes" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Our first-server tutorial. Watch it on the video page.&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://natbox.io/video#first-server" rel="noopener noreferrer"&gt;Get a free server and log in over SSH&lt;/a&gt; (2:10): start a free trial, log in, change your password, and see how your ports and IPv6 work.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://natbox.io/video#discord-bot" rel="noopener noreferrer"&gt;Host a Discord bot 24/7&lt;/a&gt; (1:39): install a bot, keep its token safe, and run it as a systemd service that restarts by itself.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://natbox.io/video#shorts" rel="noopener noreferrer"&gt;Three Shorts&lt;/a&gt; of under 35 seconds, including &lt;a href="https://natbox.io/nat-vps" rel="noopener noreferrer"&gt;what a NAT VPS is&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Follow along
&lt;/h2&gt;

&lt;p&gt;Add &lt;a href="https://natbox.io/blog/feed.xml" rel="noopener noreferrer"&gt;natbox.io/blog/feed.xml&lt;/a&gt; to your feed reader, or follow us on &lt;a href="https://x.com/natboxio" rel="noopener noreferrer"&gt;X&lt;/a&gt; and &lt;a href="https://www.youtube.com/@natboxio" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;. If there is a tutorial you would like to see, &lt;a href="https://my.natbox.io/tickets/create" rel="noopener noreferrer"&gt;open a ticket&lt;/a&gt; or email &lt;a href="mailto:support@natbox.io"&gt;support@natbox.io&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;New to natbox? &lt;a href="https://natbox.io/free-vps-trial" rel="noopener noreferrer"&gt;Try a server free for a month&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>announcement</category>
    </item>
    <item>
      <title>What's new at natbox: Telegram bot, snapshots, keeping your trial and CaptchaBox</title>
      <dc:creator>Mohammad Alsaraf</dc:creator>
      <pubDate>Wed, 04 Nov 2026 06:00:00 +0000</pubDate>
      <link>https://dev.to/sarrph/whats-new-at-natbox-telegram-bot-snapshots-keeping-your-trial-and-captchabox-2j3i</link>
      <guid>https://dev.to/sarrph/whats-new-at-natbox-telegram-bot-snapshots-keeping-your-trial-and-captchabox-2j3i</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqu2asjgcb93hdobd5eun.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqu2asjgcb93hdobd5eun.png" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A lot has changed in the client area over the last few days. Here is everything new, and where to find it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Manage your servers from Telegram
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://t.me/NatboxBot" rel="noopener noreferrer"&gt;@NatboxBot&lt;/a&gt; lets you check and control your servers from Telegram. Link it from the &lt;a href="https://my.natbox.io/telegram" rel="noopener noreferrer"&gt;Telegram page&lt;/a&gt; in the client area (account menu, then &lt;strong&gt;Telegram&lt;/strong&gt; ). After that you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;see each server's status, SSH command, ports, IPv6 address, traffic and paid-until date;&lt;/li&gt;
&lt;li&gt;start, stop and restart a server (stop and restart ask you first);&lt;/li&gt;
&lt;li&gt;pay an unpaid invoice from your account credit, or open it on the website to pay another way;&lt;/li&gt;
&lt;li&gt;get notices for new invoices, payments, support replies, and when a server is set up or a trial is about to end.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://t.me/NatboxBot" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4a62hfdsptaopd1l89fj.png" alt="@NatboxBot in Telegram: server status, SSH command, traffic, and Restart and Stop buttons" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The bot also has a small app (the &lt;strong&gt;Open app&lt;/strong&gt; button) with the same features. You can even create an account in the bot. For safety the bot never shows passwords and cannot reinstall a server, and there are no payments inside Telegram.&lt;/p&gt;

&lt;h2&gt;
  
  
  Snapshots you control
&lt;/h2&gt;

&lt;p&gt;The new &lt;strong&gt;Snapshots&lt;/strong&gt; tab on each server saves the server exactly as it is, for example before a big update, and lets you go back to it later. You can keep 1 snapshot on the free trial and the VPN plan, 2 on Nano, 3 on Box and Box CPU, and 5 on Box Plus. Snapshots use your server's disk space and are stored on the same machine, so keep your own off-site backups as well. The &lt;a href="https://natbox.io/guides/backups" rel="noopener noreferrer"&gt;backups guide&lt;/a&gt; shows how.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep your free trial server
&lt;/h2&gt;

&lt;p&gt;If you like your free trial, you no longer need to start again on a new server. Open the trial in the client area and choose a paid plan to keep it, with all your files and settings. We also email you 7 days and 2 days before a trial ends, so it never ends by surprise.&lt;/p&gt;

&lt;h2&gt;
  
  
  PayPal from $1
&lt;/h2&gt;

&lt;p&gt;You can now pay with PayPal from $1, so a single month of Nano or Box can be paid directly. Crypto payments start at $3, and account credit works for any amount. The VPN plan and burner servers have their own payment options, listed in the &lt;a href="https://natbox.io/docs" rel="noopener noreferrer"&gt;docs&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  CaptchaBox: a free captcha for your own sites
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://captcha.natbox.io/" rel="noopener noreferrer"&gt;CaptchaBox&lt;/a&gt; keeps bots out of your website's forms without image puzzles, cookies or Google. Visitors' browsers solve a small puzzle in the background, and your server checks the answer. It is free for 10,000 checks a month, and switching from reCAPTCHA is easy because the server check uses the same answer format. We use it on our own sign-in and sign-up pages.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://captcha.natbox.io/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsrt7xm549130zbp7nb5u.png" alt="CaptchaBox: a free captcha with no puzzles and no cookies" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Watch CaptchaBox in one minute on captcha.natbox.io.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;Follow this blog for tutorials and news, or subscribe with the &lt;a href="https://natbox.io/blog/feed.xml" rel="noopener noreferrer"&gt;RSS feed&lt;/a&gt;. You can also watch our &lt;a href="https://natbox.io/video" rel="noopener noreferrer"&gt;videos&lt;/a&gt;. Questions or ideas: &lt;a href="https://my.natbox.io/tickets/create" rel="noopener noreferrer"&gt;open a ticket&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>update</category>
    </item>
    <item>
      <title>How a NAT VPS works: shared IPv4, your own ports, and a routed /80 of IPv6</title>
      <dc:creator>Mohammad Alsaraf</dc:creator>
      <pubDate>Fri, 30 Oct 2026 22:10:38 +0000</pubDate>
      <link>https://dev.to/sarrph/how-a-nat-vps-works-shared-ipv4-your-own-ports-and-a-routed-80-of-ipv6-2bjd</link>
      <guid>https://dev.to/sarrph/how-a-nat-vps-works-shared-ipv4-your-own-ports-and-a-routed-80-of-ipv6-2bjd</guid>
      <description>&lt;p&gt;A NAT VPS is a small Linux server that shares one public IPv4 address with other servers. That sounds like a big limitation, but it's what makes a $1 server possible. Here's how the networking works.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why share an IPv4 address?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;IPv4 addresses are scarce and cost money. Most small servers don't need all 65,535 ports on one. A bot, a monitor or a small API often needs just a handful.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Forwarded ports&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Each server gets its own block of ports on the shared address, for example 11600 to 11619. The host forwards those ports to the server with destination NAT, so connections arrive directly:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh root@example.com -p 11600
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Your first port is usually SSH, and the rest are yours for anything, TCP or UDP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hosting websites on 80 and 443&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Only one machine can own port 443 on an IP address, so how do many servers share it? By hostname. For HTTPS, the browser sends the site name in the TLS handshake (SNI), before anything is encrypted. A proxy on the host reads that name and passes the connection along without decrypting it. Your TLS keys stay on your server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IPv6 removes the problem&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With IPv6 there's no shortage. Each server can get a whole routed /80, which is a huge block of public addresses. Anyone with IPv6 can reach any port directly, with no forwarding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you give up&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No dedicated IPv4 address&lt;/li&gt;
&lt;li&gt;Only the ports in your block on IPv4&lt;/li&gt;
&lt;li&gt;Often no Docker, depending on the container setup&lt;/li&gt;
&lt;li&gt;Often no outgoing mail on ports 25, 465 and 587, to protect the shared address&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;When it's a good fit&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A NAT VPS suits bots, personal tools, monitoring, small APIs and learning Linux. It's a poor fit if you need a public IP of your own or many inbound ports over IPv4.&lt;/p&gt;

&lt;p&gt;I run natbox.io, which offers servers like this from $1 a month, with a free one-month trial: &lt;a href="https://natbox.io/?ref=devto" rel="noopener noreferrer"&gt;https://natbox.io/?ref=devto&lt;/a&gt;&lt;/p&gt;

</description>
      <category>linux</category>
      <category>networking</category>
      <category>selfhosted</category>
      <category>ipv6</category>
    </item>
    <item>
      <title>The $0.25 Burner VPS Is the Best Thing I Didn't Know I Needed</title>
      <dc:creator>Mohammad Alsaraf</dc:creator>
      <pubDate>Mon, 06 Apr 2026 17:44:36 +0000</pubDate>
      <link>https://dev.to/sarrph/the-025-burner-vps-is-the-best-thing-i-didnt-know-i-needed-40h1</link>
      <guid>https://dev.to/sarrph/the-025-burner-vps-is-the-best-thing-i-didnt-know-i-needed-40h1</guid>
      <description>&lt;p&gt;Here's a scenario I've been in too many times: I need to test something in a clean Linux environment. Not my laptop — a real server. And I need it for maybe two hours.&lt;br&gt;
My options used to be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Spin up a DigitalOcean droplet, forget to delete it, notice three weeks later that I've spent $18&lt;/li&gt;
&lt;li&gt;Use a Docker container locally, except the whole point is testing how it behaves with real inbound traffic&lt;/li&gt;
&lt;li&gt;Ask a friend if I can SSH into something (awkward)&lt;/li&gt;
&lt;li&gt;Use some free tier that takes 15 minutes to provision and has weird restrictions&lt;/li&gt;
&lt;li&gt;NATBox has a thing called a Burner VPS. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's $0.25. It lasts 24 hours. After that it's gone — automatically wiped, no lingering data, no grace period, nothing.&lt;br&gt;
I've used it four times now. Twice for testing deployment scripts against a fresh Debian install. Once to spin up a quick reverse proxy for something I was debugging. Once just because I wanted to see what Alpine Linux looks like when you actually have to configure it from scratch.&lt;br&gt;
The workflow is: order it, get SSH credentials in your inbox, do your thing, walk away. You don't have to delete it. You don't have to remember it exists. It costs less than a candy bar.&lt;br&gt;
If you've ever thought "I just need a throwaway server for a few hours" — this is exactly that. The fact that it auto-deletes is actually a feature, not a limitation. No cleanup. No accidentally running up charges. No orphaned droplets sitting around costing you $6/mo because you forgot.&lt;br&gt;
natbox.io, Burner plan, $0.25. I don't know why more hosting providers don't offer this.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>learning</category>
      <category>linux</category>
    </item>
    <item>
      <title>I Spent $0.99 on a VPS and Honestly? It Works.</title>
      <dc:creator>Mohammad Alsaraf</dc:creator>
      <pubDate>Mon, 06 Apr 2026 17:31:20 +0000</pubDate>
      <link>https://dev.to/sarrph/i-spent-099-on-a-vps-and-honestly-it-works-3cp3</link>
      <guid>https://dev.to/sarrph/i-spent-099-on-a-vps-and-honestly-it-works-3cp3</guid>
      <description>&lt;p&gt;I've been running side projects on the internet for about six years now. In that time I've paid for shared hosting, a few droplets, a couple of hetzner boxes, and one time I rented a dedicated server for something that absolutely did not need a dedicated server. You know how it goes.&lt;br&gt;
A few months ago I needed something small — just a place to run a lightweight Python script that checks a price API every 15 minutes and pings me when something changes. Nothing fancy. The script uses maybe 20MB of RAM when it's running. I did not need a $6/mo DigitalOcean droplet for this. I especially did not need the "recommended" $12/mo plan with 2GB RAM and backups enabled.&lt;br&gt;
I found NATBox while scrolling through some forum thread. Someone mentioned they'd been using it for bots and small automation jobs. The pricing page said $0.99/mo for 256MB RAM, 3GB SSD, and — this part caught my eye — 20 dedicated ports.&lt;br&gt;
I thought: okay, this is probably some sketchy thing running on someone's gaming PC. Let me try it anyway.&lt;br&gt;
&lt;strong&gt;What actually happens when you order&lt;/strong&gt;&lt;br&gt;
The ordering process is manual, which sounds alarming but in practice is fine. You fill out a form, they send you a PayPal or crypto payment link within an hour or two, and once you pay, they provision your container and email you an SSH command. No control panel. No wizard. Just:&lt;br&gt;
&lt;em&gt;ssh &lt;a href="mailto:root@147.135.215.238"&gt;root@147.135.215.238&lt;/a&gt; -p [your_port]&lt;/em&gt;&lt;br&gt;
And that's it. You're in. Full root. Real Linux.&lt;br&gt;
&lt;strong&gt;The ports thing&lt;/strong&gt;&lt;br&gt;
This is actually the clever part. NATBox runs LXC containers behind a shared IP, so instead of giving you a dedicated public IP, they give you 20 dedicated ports on their host. Port 1 is your SSH. Ports 2-20 forward into your container.&lt;br&gt;
For my use case — a script that doesn't need any inbound connections — this doesn't matter at all. But if you're running a web server, a bot, a game server, a proxy, whatever: you just bind to the port inside your container and it's reachable from the outside world at that port on the host IP. It works.&lt;br&gt;
&lt;strong&gt;One month in&lt;/strong&gt;&lt;br&gt;
The script runs. It has not gone down. I paid $0.99. I have genuinely nothing to complain about.&lt;br&gt;
Would I run a production app with real users here? Probably not — not because of reliability concerns, but because you'd want a dedicated IP, more RAM headroom, and the ability to scale. But for bots, scrapers, learning projects, dev environments, or just having a Linux shell in the cloud? NATBox is legitimately good.&lt;br&gt;
The fact that it exists at $0.99 is kind of wild. I keep expecting to find the catch. So far there isn't one.&lt;br&gt;
Find it at: natbox.io — Nano plan, $0.99/mo&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>startup</category>
    </item>
    <item>
      <title>Why I Built a $0.99 VPS and What I Learned</title>
      <dc:creator>Mohammad Alsaraf</dc:creator>
      <pubDate>Thu, 26 Mar 2026 10:42:23 +0000</pubDate>
      <link>https://dev.to/sarrph/why-i-built-a-099-vps-and-what-i-learned-2a77</link>
      <guid>https://dev.to/sarrph/why-i-built-a-099-vps-and-what-i-learned-2a77</guid>
      <description>&lt;p&gt;I got tired of paying $5-10/mo for a VPS I only needed to run a bot or test a script. So I built NATBox — NAT-based Linux containers starting at $0.99/mo. Here's what I actually learned building it.&lt;br&gt;
&lt;strong&gt;NAT vs dedicated IP — most people don't need a dedicated IP&lt;/strong&gt;&lt;br&gt;
The whole idea behind NAT VPS is simple: instead of giving each container its own public IP (expensive), you share one host IP and assign each container a dedicated range of ports. 20 ports per container, forwarded via iptables from the host. Port 1 of your range is SSH. Ports 2-20 are yours — run web servers, bots, proxies, whatever.&lt;br&gt;
For most lightweight workloads, this is completely fine. You only need a dedicated IP if you're running something that requires it — like a mail server. For everything else, 20 ports is plenty.&lt;br&gt;
&lt;strong&gt;The provisioning stack is a bash script&lt;/strong&gt;&lt;br&gt;
No Laravel. No Node. No fancy dashboard. The entire backend — create, suspend, renew, delete, expiry checks, email notifications, iptables rules — is a single bash script managing LXC containers and a pipe-delimited flat file as a database.&lt;br&gt;
It's not pretty, but it's reliable, fast, and I understand every line of it. When something breaks at 2am, I can fix it in under 5 minutes.&lt;br&gt;
&lt;strong&gt;The weirdest bugs I hit&lt;/strong&gt;&lt;br&gt;
Building this taught me more about Linux internals than anything else I've done. A few memorable ones:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pam_loginuid.so
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;was silently killing SSH sessions inside LXC because /&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;proc/self/loginuid
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;isn't writable in containers. The fix: comment it out in&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;/&lt;span class="n"&gt;etc&lt;/span&gt;/&lt;span class="n"&gt;pam&lt;/span&gt;.&lt;span class="n"&gt;d&lt;/span&gt;/&lt;span class="n"&gt;sshd&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;before the container ever boots.&lt;br&gt;
dnf on Fedora was getting OOM-killed inside 256MB containers just resolving package metadata. Fix: pre-create a 512MB swapfile on the host into the container's rootfs before starting it.&lt;br&gt;
OpenSSH 9.2 on Debian 12 calls&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="n"&gt;linux_audit_write_entry&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;during session open, which requires&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CAP_AUDIT_WRITE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;. I dropped that cap in an earlier version and SSH started dying immediately after auth. One of those bugs that takes an hour to find and 3 seconds to fix.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What $0.99/mo actually gets you&lt;/strong&gt;&lt;br&gt;
256MB RAM, 3GB SSD, 20 dedicated ports, full root access, your choice of 6 distros. It's a real Linux container, not a toy. I run bots on nano plans. People use them for proxies, learning environments, lightweight APIs, scrapers, testing.&lt;br&gt;
If you want to try it: natbox.io&lt;/p&gt;

</description>
      <category>linux</category>
      <category>networking</category>
      <category>showdev</category>
      <category>sideprojects</category>
    </item>
  </channel>
</rss>
