Sijmen’s Wii

4 min read Original article ↗

Wouldn’t you believe it, this site is running off my special home server: a Nintendo Wii with a 729 MHz PowerPC CPU and a whopping 64 MB usable RAM! It runs NetBSD 10.1 and serves this site exclusively over IPv6 – clients connecting through IPv4 are proxied (on the IP level) via another server.

See Alex Haydock’s blog post that inspired this.

Also available on Gopher: gopher://wii.sjmulder.nl (proxy)

Network trouble

The only trouble I encountered while setting this up was with networking. I had originally purchased a UGREEN USB 2.0 Ethernet Adapter, which uses the AX88772A chip which supposedly works with the Wii, but it didn’t work in the Wii Menu (also not in the other USB port), nor in NetBSD where the axe driver repeatedly printed error messages about invalid buffers.

So instead I got the TP-Link USB 3.0 Gigabit Ethernet Adapter which uses the ubiquitous and widely supported Realtek 8153 chip. It’s not supported by the Wii Menu, but that’s fine – it works perfectly in NetBSD.

Setup

A fairly basic NetBSD 10.1 installation. I set up binary packages from pkgsrc:

wii# export PKG_PATH=https://cdn.NetBSD.org/pub/pkgsrc/packages/NetBSD/powerpc/10.1/All
wii# pkg_add pkgin
wii# pkgin install git tmux fastfetch nostt ...

For the IPv6 address, normally NetBSD assigns a link-local address and uses router solicitation to assign a rotating outbound privacy address and a more static local inbound address. But I needed a fixed publicly routable address, so in /etc/ifconfig.ure0:

inet6 2a02:a45f:8eaa:0::2/64 alias
rtsol

This assigns a static alias, using my ISP-assigned prefix and ::2 as the identifier (I use ::1 for something else). The rtsol directive keeps the router solicitation for the dynamic addresses and routing.

Then I opened port 80 for that IPv6 address on my router and added an AAAA record for it at my domain registrar.

Some tweaks in /etc/rc.conf:

# disable some things we don't need
ntpd=NO
mdnsd=NO
postfix=NO

# web server
httpd=YES
httpd_wwwchroot="/var/www"
httpd_wwwdir="/htdocs"
httpd_vhost="wii.sjmulder.nl"

This uses some variables I added to /etc/rc.d/httpd to use httpd’s chroot and vhost features:

...
httpd_wwwuser_arg=${httpd_wwwuser:+-U \'$httpd_wwwuser\'}
httpd_wwwchroot_arg=${httpd_wwwchroot:+-t \'$httpd_wwwchroot\'}
command_args="$httpd_wwwuser_arg $httpd_wwwchroot_arg -b '$httpd_wwwdir' '$httpd_vhost'"
required_dirs="$httpd_wwwchroot$httpd_wwwdir"

run_rc_command "$1"

For Gopher, first, install the server:

wii# pkgin install geomyidae
Copy the example RC file as prompted. Then in /etc/rc.conf:
geomyidae=YES
geomyidae_flags="-c -b /var/www/gopher"

Note the use of -c for chroot, and the custom directory – this was so it could live under the git-versioned /var/www. Then start it:

wii# /etc/rc.d/geomyidae start

IPv4 forwarding

Since the Wii is on a home network, and the router already has HTTP and SSH forwarded to another host, the options for exposing the Wii on IPv4 are limited.

I dismissed an IPv4+IPv6 reverse proxy, since I feel that defeats the purpose. It’s fun that your browser gets to talk to the Wii directly. As a stopgap, I did implement an IPv4-only reverse proxy initially, but that means the HTTP connection terminates at two different places depending on the address family used, complicating e.g. HTTPS certificate renewal.

What I did in the end instead, was to rent another IPv4 address for my OpenBSD server hosted at TransIP, and make it redirect (forward) any traffic coming into that IP address directly to the Wii over IPv6.

First, I had to switch to manual IP assignment in /etc/hostname.vio0 so I could actually use the second IP address:

#inet auto
inet 37.97.173.114
inet alias 37.97.174.2
inet6 autoconf
inet6 2a01:7c8:aac0:9c::1

Gateway goes in /etc/mygate. Then, enable forwarding in /etc/sysctl.conf:

net.inet.ip.forwarding=1
net.inet6.ip6.forwarding=1

Finally, the actual forwarding in /etc/pf.conf:

pass in on egress inet to 37.97.174.2 \
  af-to inet6 from 2a01:7c8:aac0:9c::1 to 2a02:a45f:8eaa::2/128

This instructs pf to pass any packets coming into that extra IP address to the Wii’s IPv6 address (to) with address translation (af-to), with the return address set to the VPS (from). My understanding is that af-to is usally used in scenarios where the IPv4 address would go into the lower part of the IPv6 address, but it works just fine with /128.

Plans

First I’ll need to deal with some basics:

Then, not sure what I’m going to use this for. SSH and web, sure, but that’s a bit basic. Maybe write or run a fun little web application to show that you don’t need 16 cores and 64 GB of RAM for some CRUD site.

Thoughts or comments? Drop me an email or message me on Mastodon!

—Sijmen J. Mulder, 2026