ClassicStack is an AppleTalk router and classic LAN services stack that bridges legacy Macintosh networking into modern environments.
- AppleTalk Phase 2 routing across EtherTalk and LocalTalk transports.
- AFP file server over both classic DDP and modern TCP transports.
- MacIP gateway for IP-over-AppleTalk clients.
- Optional IPX, NetBEUI, NetBIOS, and SMB1 services (build-tag gated).
- Shared raw-link bridge settings for EtherTalk, MacIP, IPX, and NetBEUI.
Requirements:
- Go 1.23+
- Npcap on Windows for pcap mode: https://npcap.com/#download
- libpcap on Linux/macOS for pcap mode
Build default binary (all optional protocol hooks enabled):
go build -tags all -o classicstack ./cmd/classicstackBuild with a custom protocol tag set:
go build -tags "ipx netbeui netbios smb" -o classicstack ./cmd/classicstackor:
go build -tags all -o classicstack ./cmd/classicstackBuild router-only variant (no optional build-tag services):
go build -o classicstack ./cmd/classicstackRun tests:
go test ./...- Copy server.toml.example to server.toml.
- Edit bridge/device/network values.
- Run with no flags (auto-loads server.toml) or pass -config.
Examples:
./classicstack -config server.toml.\classicstack.exe -config server.tomlConfig loading rules:
- -config cannot be combined with other flags.
- When no flags are passed, server.toml is loaded automatically if present.
Bridge defaults live in [Bridge] and are reused by EtherTalk, MacIP, IPX, and NetBEUI.
| Key | Type | Default | Description |
|---|---|---|---|
| mode | string | pcap | Raw-link backend: pcap, tap, tun. |
| device | string | (empty) | Interface/device name used by shared raw-link consumers. |
| hw_address | string | DE:AD:BE:EF:CA:FE | Shared host MAC identity. |
| bridge_mode | string | auto | Frame adaptation mode: auto, ethernet, wifi. |
Important: legacy bridge keys under [EtherTalk] are no longer accepted in config files. Use [Bridge] only.
Per-protocol pcap filter overrides:
- [EtherTalk].filter
- [MacIP].filter
- [IPX].filter
- [NetBEUI].filter
These filters apply only in pcap mode.
| Key | Default | Notes |
|---|---|---|
| enabled | true | Enables LocalTalk-over-UDP port. |
| interface | 0.0.0.0 | Local IPv4 bind/join interface. |
| seed_network | 1 | Seed network ID for this segment. |
| seed_zone | LToUDP Network | Seed zone name. |
| Key | Default | Notes |
|---|---|---|
| port | (empty) | Serial device path/name; empty disables. |
| seed_network | 2 | Seed network ID for this segment. |
| seed_zone | TashTalk Network | Seed zone name. |
| Key | Default | Notes |
|---|---|---|
| bridge_host_mac | (empty) | Optional host adapter MAC for wifi bridge shim. |
| filter | (protocol default) | Optional BPF override in pcap mode. |
| seed_network_min | 3 | Seed network range start. |
| seed_network_max | 5 | Seed network range end. |
| seed_zone | EtherTalk Network | Seed zone name. |
| Key | Default | Notes |
|---|---|---|
| enabled | false | Enables MacIP gateway. |
| mode | pcap | pcap or nat. |
| zone | (empty) | Registration zone override. |
| nat_subnet | 192.168.100.0/24 | Subnet/pool for NAT mode. |
| nat_gw | (empty) | Gateway address advertised in NAT mode. |
| lease_file | (empty) | Optional lease persistence file. |
| ip_gateway | (empty) | Upstream gateway address. |
| dhcp_relay | false | Translate/relay DHCP for clients. |
| nameserver | (empty) | DNS server for clients. |
| filter | (protocol default) | Optional BPF override in pcap mode. |
IPX is optional and requires build tag ipx or all.
| Key | Default | Notes |
|---|---|---|
| enabled | false | Enables IPX router services. |
| interface | (empty) | Raw-link interface; empty reuses bridge device. |
| framing | ethernet_ii | One of ethernet_ii, raw_802_3, llc, snap. |
| internal_network | (empty) | 8 hex digits; empty falls back to default network. |
| filter | ipx (internal default) | Optional BPF override in pcap mode. |
NetBEUI is optional and requires build tag netbeui or all.
| Key | Default | Notes |
|---|---|---|
| enabled | false | Enables NetBEUI raw-link port. |
| interface | (empty) | Raw-link interface; empty reuses bridge device. |
| filter | llc (internal default) | Optional BPF override in pcap mode. |
NetBIOS is optional and requires build tag netbios or all.
| Key | Default | Notes |
|---|---|---|
| enabled | false | Enables NetBIOS service. |
| transports | ["tcp"] | Allowed values: tcp, netbeui, ipx. |
| scope_id | (empty) | Optional NetBIOS scope ID. |
NetBIOS server/workgroup identity is derived from SMB server/workgroup values.
SMB is optional and requires build tag smb or all.
| Key | Default | Notes |
|---|---|---|
| enabled | false | Enables SMB server. |
| nbt_binding | :139 | NetBIOS-over-TCP listener. |
| direct_binding | (empty) | Optional direct SMB listener (for example :445). |
| guest_ok | false | Allows guest sessions. |
| server_name | CLASSICSTACK | Computer/server name. |
| workgroup | WORKGROUP | Workgroup/domain label. |
SMB shares are configured as [SMB.Volumes.] sections.
Example:
[SMB]
enabled = true
nbt_binding = ":139"
guest_ok = true
server_name = "CLASSICSTACK"
workgroup = "WORKGROUP"
[SMB.Volumes.Public]
name = "Public"
path = "./public"
fs_type = "local_fs"
read_only = falseAFP runs over ddp, tcp, or both.
| Key | Default | Notes |
|---|---|---|
| enabled | true | Enables AFP service. |
| name | ClassicStack (example) | Advertised AFP server name. |
| zone | (empty) | Registration zone override. |
| protocols | ddp,tcp | AFP transports. |
| binding | :548 | DSI listener. |
| extension_map | (empty) | Extension map file path. |
| cnid_backend | sqlite | sqlite or memory. |
| use_decomposed_names | true | Reserved-character mapping behavior. |
| appledouble_mode | modern | modern or legacy sidecar layout. |
AFP volumes are configured as [AFP.Volumes.] sections.
[Logging]:
- level: debug, info, warn
- parse_packets: protocol decode logging
- parse_output: file target for parsed logs
- log_traffic: raw traffic logging
[Capture]:
- localtalk, ethertalk, ipx capture output paths
- snaplen for capture truncation length
List pcap devices:
.\classicstack.exe -list-pcap-devicesPrint version:
./classicstack -versionWarning: this project is pragmatic and evolving. Validate behavior in your environment before production use.
AppleTalk routing was originally inspired by tashrouter: https://github.com/lampmerchant/tashrouter
GPL-3.0.
- High-level runtime map: ARCHITECTURE.md
- Protocol notes: spec