**WIP** Home-grown alternative implementation of Apple Internet Router 3.0
Find a file
2024-10-18 13:20:47 +11:00
atalk switch to vanity import path 2024-10-18 13:20:47 +11:00
aurp Fix Null event tuple coding 2024-05-12 12:08:33 +10:00
router switch to vanity import path 2024-10-18 13:20:47 +11:00
status Tweak statuses 2024-04-26 13:59:21 +10:00
.gitignore Skip peers that don't resolve 2024-04-19 22:07:48 +10:00
Dockerfile Add Dockerfile 2024-08-11 18:50:26 +10:00
go.mod switch to vanity import path 2024-10-18 13:20:47 +11:00
go.sum switch to vanity import path 2024-10-18 13:20:47 +11:00
jrouter.yaml Add peer list function 2024-04-21 15:14:16 +10:00
LICENSE Add LICENSE 2024-03-18 09:44:22 +11:00
main.go switch to vanity import path 2024-10-18 13:20:47 +11:00
README.md switch to vanity import path 2024-10-18 13:20:47 +11:00

jrouter

Home-grown alternative implementation of Apple Internet Router 3.0

Goals

  • Full compatibility with Apple Internet Router 3.0
  • Function on modern operating systems
  • EtherTalk support
  • Be observable (there's a HTTP server with a /status page)

TashTalk could be a stretch goal, if I can acquire one!

Things that used to be caveats

  • Previously it would listen for all EtherTalk traffic, regardless of destination. Now it doesn't do that, which should help it co-exist with other routers on the same host.
  • You can configure an alternate Ethernet address if you are reusing the same network interface for multiple different EtherTalk software.
  • In addition to the configured EtherTalk network and zone, it now learns routes and zones from other EtherTalk routers, and should share them across AURP.
  • There's a status server. Browse to http://[your router]:9459/status to see information about the state of jrouter.

Caveats

Things I plan to fix Real Soon Now:

  • Some packet types need splitting to fit within limits. Some of these aren't implemented yet (mainly encapsulated). The unimplemented ones seem unlikely to hit those limits unless you are running a lot of routers or zones locally.
  • I plan to add a Prometheus metrics endpoint and at least add log levels / verbosity config.
  • The AURP implementation is mostly there, but not fully complete. The main thing missing is sequence number checking.

Things I plan to fix At Some Point:

  • For expediency I made it act as a seed router. At some point I might add "soft seed" functionality.

How to use

WARNING: It Sorta Works™

First, set up a jrouter.yaml (use the one in this repo as an example).

TODO: explain the configuration file

Building and running directly

  1. Install Go.
  2. Run these commands (for Debian-variety Linuxen, e.g. Ubuntu, Raspbian, Mint...):
sudo apt install git build-essential libpcap-dev
go install drjosh.dev/jrouter@latest
sudo setcap 'CAP_NET_BIND_SERVICE=ep CAP_NET_RAW=ep' ~/go/bin/jrouter
  1. Configure jrouter.yaml
  2. To run:
~/go/bin/jrouter

Notes:

  • git is needed for go install to fetch the module
  • build-essential andlibpcap-dev are needed for gopacket, which uses CGo
  • NET_BIND_SERVICE is needed for jrouter to bind UDP port 387 (for talking between AIRs)
  • NET_RAW is needed for jrouter to listen for and send EtherTalk packets

TODO: instructions for non-Linux / non-Debian-like machines

With Docker

  1. Clone the repo and cd into it.
  2. docker build -t jrouter .
  3. Example docker run command:
    docker run \
      -v ./cfg:/etc/jrouter \
      --cap-add NET_RAW \
      --net host \
      --name jrouter \
      jrouter
    

Notes:

  • Put jrouter.yaml inside a cfg directory (or some path of your choice and bind-mount it at /etc/jrouter) for it to find the config file.
  • --cap-add NET_RAW and --net host is needed for EtherTalk access to the network interface.
  • By using --net host, the default AURP port (387) will be bound without -p.

Bug reports? Feature requests? Complaints? Praise?

You can contact me on the Fediverse at @DrJosh9000@cloudisland.nz, or email me at josh.deprez@gmail.com.