We offer the following services in-a-box for self-hosting Retro-computing hobbyists:
- A separate network for your retro computers to keep everything secure & tidy
- A TLS-downgrading proxy, to browse modern websites with old browsers
- A (necessarily insecure!) Win9x/2000/XP-compatible Samba server, e.g. to easily share drivers
- A (necessarily insecure!) XP-compatible Wi-Fi access point
- An NTP server to keep the clocks in sync (optionally Stratum 1 when paired with a GNSS receiver)
-
Easy-to-fake DNS-responses, e.g. by pointing
time.windows.comto ourselves, NTP will work out-of-the-box on many Windows versions - Integrated DHCP + DNS so hosts can easily find each other
- PXE boot ready integrated DHCP + TFTP to boot/install from the network
Warning! Retrospect is still in development, expect bugs!
A Raspberry Pi (or similar) with a second USB Wi-Fi dongle could be ideal. The builtin Wi-Fi connects to your home network, the ethernet port to your retro-side switch and the USB Wi-Fi dongle can be used to host (insecure!) Retro Wi-Fi access.
More elaborate setups are also possible, but are out-of-scope for this documentation. For example, you could use VLAN's or run Retrospect on a VM.
In short, your options are:
- Use a pre-build Raspberry Pi image
- Retrospect loves Raspberry Pi!
- Pre-build images make it easy to get started
- Build your own pre-configured Raspberry Pi image
- Custom SD images should require no further configuration to the booted system
- Build an image for a similar device, like the Banana Pi
- Build a pre-configured VM image
- "Just works" inside QEMU
- However, the netwerk setup requires additional steps not described here
- Build a pre-configured docker image
- Again, you're on your own for the networking side
- Use the NixOS module from any NixOS system
The following options are available to tweak Retrospect to your situation. Use these options to build a pre-configured image, or change the settings after booting an existing image.
| Option | Description | Default |
|---|---|---|
| lan.interface | Internal (LAN/retro-side) interface | "end0" |
| lan.address | Retrospect's IP on the retro network | (head config.networking.interfaces."${cfg.lan.interface}".ipv4.addresses).address |
| lan.prefixLength | LAN prefix length (inverse subnet size) | (head config.networking.interfaces."${cfg.lan.interface}".ipv4.addresses).prefixLength |
| lan.dhcpPool | DHCP address pool for the retro network | "${cfg.lan.address}/${toString cfg.lan.prefixLength}" |
| lan.domain | Domain part of our FQDN | config.networking.domain |
| lan.reverseDomain | None | "95.31.172.in-addr.arpa." |
| mgmt.interface | Management interface (not part of retro network) | "wlan0" |
| mgmt.address | Management IP address | null |
| mgmt.prefixLength | Management prefix length (inverse subnet size) | 64 |
| dhcp4.enable | Enable the builtin DHCP server | true |
| dhcp4.interfaces | Retro-side network interfaces | [lan.interface "br0"] ++ optionals super.wifiAP.enable [ super.wifiAP.interface.name ] |
| dhcp4.subnet | Subnet for the retro network | "${lan.address}/${toString lan.prefixLength}" |
| dhcp4.pool | DHCP address pool for the retro network | lan.dhcpPool |
| dhcp4.options.dnsServers | DNS servers to advertise on the retro network | [lan.address] |
| dhcp4.options.ntpServers | NTP servers to advertise on the retro network | [lan.address] |
| dhcp4.options.router | Default gateway for the retro network | lan.address |
| dhcp4.options.nextServer | TFTP/PXE boot server to advertise on the retro network | lan.address |
| dhcp4.options.bootFileName | PXE boot filename to advertise on the retro network | "ipxe.efirom" |
| dns.enable | Enable the builtin DNS sever | true |
| dns.localDomains | List of domains that can be updated via DDNS (e.g. by a DHCP server) | [config.networking.domain] |
| dns.allowedIPv6Ranges | IPv6 ranges that are allowed to query our DNS server | [ { address = "fe80::"; prefixLength = 10; } ] |
| ntp.enable | Enable the builtin NTP server | true |
| samba.enable | Enable the builtin Samba/CIFS/Netbeui server | true |
| samba.serverName | Samba Server Name | config.networking.hostName |
| samba.workgroup | Workgroup name | config.networking.domain |
| samba.allowedIPv4Ranges | IPv4 ranges allowed access to Samba | [
"127.0.0.1"
"${super.lan.address}/${toString super.lan.prefixLength}"
] |
| samba.allowedIPv6Ranges | IPv6 ranges allowed access to Samba | ["::1"] |
| samba.shares | Network shares to serve | {} |
| samba.wsdd.enable | Enable the Web Service Discovery daemon | cfg.enable |
| proxy.enable | Enable the builtin TLS-downgrading proxy | true |
| proxy.listenAddress | Address the proxy listens on | super.lan.address |
| proxy.listenPort | Port the proxy listens on | 8888 |
| proxy.ssl_db | Path to the SSL database | "/var/cache/squid/ssl_db" |
| proxy.timeout | Connection timeout in seconds | 7 |
| proxy.allow | Hosts/addresses allowed to use the proxy | [ "${super.lan.address}/${toString super.lan.prefixLength}" ] |
| proxy.filter | Optional path to file containing tinyproxy filters. | null |
| proxy.caroot | Directory to store CA certificate + key | "/etc/squid" |
| proxy.allowedHeaders | List of HTTP headers to allow through | [''"Host"''] |
| tftp.enable | Enable builtin TFTP server (for PXE boot) | false |
| tftp.rootDir | PXE root directory | "${pkgs.ipxe}" |
| tftp.allowedIPv4Ranges | IPv4 ranges allowed to access the TFTP server | [
"127.0.0.1/8"
"${lan.address}/${toString lan.prefixLength}"
] |
| tftp.allowedIPv6Ranges | IPv6 ranges allowed to access the TFTP server | [
"::1/64"
] |
| wifiAP.enable | Enable the (legacy-compatible) Wi-Fi access point | false |
| wifiAP.interface.name | Wi-Fi interface to run access point on | "wlan0" |
| wifiAP.interface.mac | MAC address to configure on the Wi-Fi interface | "dc:a6:32:c9:18:10" |
| wifiAP.interface.driver | Driver to use for the Wi-Fi interface | "nl80211" |
| wifiAP.bridgeInterface | Bridge/network to add Wi-Fi interface to | "br0" |
| wifiAP.ssid | SSID for the Wi-Fi access point | config.networking.domain |
| wifiAP.psk | Passphrase for the Wi-Fi access point | "w1f!@${config.networking.hostName}" |
| wifiAP.countryCode | Country code for the Wi-Fi access point | "nl" |
Many thanks to:
- The NixOS project
- The PowerDNS community
- Radicle, the sovereign forge
- jdan
This project is being developed on Radicle, the sovereign forge.
If you've got rad installed you can clone the
project directly:
rad clone rad:zemTuepX432FzYVwpFRwMbduS9L5
You can also browse the code directly from your browser.
Contributions are welcome :)