#

workshop

(50 articles)

FIPS - Workshop

# Release page: https://github.com/jmcorgan/fips/releases/tag/v0.3.0 ## Linux (deb) ## 1) Download latest release `wget https://github.com/jmcorgan/fips/releases/download/v0.3.0/fips_0.3.0_arm64.deb` ## 2) Install `apk install fips_0.3.0_arm64.deb` ## 4) Configure `sudo vi /etc/fips/fips.yaml` ```yaml # FIPS Node Configuration node: identity: # By default, a new ephemeral keypair is generated on each start. # Uncomment persistent to keep the same identity across restarts; # on first start a keypair is saved to fips.key/fips.pub next to # this config file (mode 0600/0644). # persistent: true # # Or set an explicit key (overrides persistent): # nsec: "nsec1..." discovery: # Optional Nostr-mediated overlay endpoint discovery. nostr: enabled: true policy: open # disabled | configured_only | open open_discovery_max_pending: 64 # caps queued open-discovery retries app: "fips-overlay-v1" advertise: true advert_relays: - "wss://relay.damus.io" - "wss://nos.lol" - "wss://offchain.pub" dm_relays: - "wss://relay.damus.io" - "wss://nos.lol" - "wss://offchain.pub" # # Optional override. If omitted, FIPS uses the built-in STUN list. # # Built-in relay/STUN defaults are best-effort and should be # # overridden by operators for production use. # stun_servers: # - "stun:stun.l.google.com:19302" # - "stun:stun.cloudflare.com:3478" # - "stun:global.stun.twilio.com:3478" tun: enabled: true name: fips0 mtu: 1280 dns: enabled: true # bind_addr defaults to "::1" (IPv6 loopback). The shipped # fips-dns-setup script configures systemd-resolved with a global # /etc/systemd/resolved.conf.d/fips.conf drop-in pointing at # [::1]:5354. # # Set "::" to expose the responder to mesh peers as well (e.g. for # gateway hosts that resolve .fips on behalf of LAN clients). The # mesh-interface filter in src/upper/dns.rs will still defend # /etc/fips/hosts aliases from cross-mesh enumeration. # bind_addr: "::1" port: 5354 transports: udp: bind_addr: "0.0.0.0:2121" # advertise_on_nostr: true # public: false # false => advertise udp:nat; true => advertise bound host:port # accept_connections: true # default; refuse inbound msg1 when false # outbound_only: false # true => bind ephemeral, no listener on a # # known port. Forces advertise_on_nostr=false # # and accept_connections=false. Pure-client # # posture; bind_addr is ignored. tcp: # Accepts inbound connections. No static outbound peers. bind_addr: "0.0.0.0:8443" # advertise_on_nostr: true # Ethernet transport — uncomment and set your interface name. ethernet: interface: "eth0" discovery: true announce: true auto_connect: true accept_connections: true # Bluetooth Low Energy transport — requires BlueZ and the 'ble' feature. # ble: # adapter: "hci0" # mtu: 2048 # advertise: true # scan: true # auto_connect: true # accept_connections: true # Outbound LAN gateway. Allows non-FIPS hosts on the LAN to reach # mesh destinations via DNS-allocated virtual IPs and kernel NAT. # Requires: IPv6 forwarding enabled, fips daemon running with DNS. # gateway: # enabled: true # pool: "fd01::/112" # lan_interface: "eth0" # dns: # listen: "[::1]:5353" # # upstream must match the daemon's dns.bind_addr above. The # # default "[::1]:5354" matches the daemon's default. If you set # # the daemon to bind on a wildcard ("::") or specific address, # # update upstream to match — explicit ::1 sockets do not accept # # v4 traffic. # upstream: "[::1]:5354" # ttl: 60 # pool_grace_period: 60 # conntrack: # tcp_established: 432000 # udp_timeout: 30 # udp_assured: 180 # icmp_timeout: 30 peers: [] # Static peers for bootstrapping (UDP or TCP): # - npub: "npub1qmc3cvfz0yu2hx96nq3gp55zdan2qclealn7xshgr448d3nh6lks7zel98" # alias: "gateway" # via_nostr: true # addresses: # - transport: udp # addr: "test-us01.fips.network:2121" # IP or hostname (e.g., "peer.example.com:2121") # - transport: udp # addr: "nat" # Use node.discovery.nostr for Nostr/STUN hole punching # connect_policy: auto_connect ``` ## 3) Start the service `sudo systemctl start fips` / `sudo systemctl restart fips` ## 5) Monitor ### Logs `sudo journalctl -u fips -n 100 --no-pager` ### TUI (fipstop) `sudo fipstop` opens TUI to monitor your FIPS node activity # MacOS (from source) ## 1) Clone `git clone https://github.com/jmcorgan/fips.git` `cd fips` ## 2) Build ```sh make -C packaging pkg ``` ```sh sudo installer -pkg deploy/fips-*-macos-*.pkg -target / ``` ## 3) Configure ```sh sudo nano /usr/local/etc/fips/fips.yaml ``` set to: ```yaml node: identity: persistent: true discovery: nostr: enabled: true policy: open open_discovery_max_pending: 64 app: fips-overlay-v1 advertise: true advert_relays: - wss://relay.damus.io - wss://nos.lol - wss://offchain.pub dm_relays: - wss://relay.damus.io - wss://nos.lol - wss://offchain.pub tun: enabled: true name: fips0 mtu: 1280 dns: enabled: true port: 5354 transports: udp: bind_addr: 0.0.0.0:2121 public: false tcp: bind_addr: 0.0.0.0:8443 ethernet: interface: en0 discovery: true announce: true auto_connect: true accept_connections: true peers: [] ``` ## 4) (Re)start ```sh sudo launchctl kickstart -k system/com.fips.daemon ``` ## 5) HOTFIX - DNS config The latest release doesn't properly configure the dns server to ipv6, fixed in next release. For now: ```sh sudo tee /etc/resolver/fips > /dev/null <<'EOF' nameserver ::1 port 5354 EOF ``` ```sh sudo dscacheutil -flushcache sudo killall -HUP mDNSResponder ``` Verify: ```sh scutil --dns | grep -A4 'domain.*fips' ping6 -c 2 npub<your-npub>.fips ``` ## 6) Monitor ### Logs ```sh sudo tail -f /usr/local/var/log/fips/fips.log ``` ### TUI (fipstop) ```sh sudo fipstop ``` opens TUI to monitor your FIPS node activity ## Troubleshooting ### Not finding peers set `node.discovery.nostr.policy` to `configured_only` and try configuring peers manually to our bootstrap nodes: ```yaml peers: - npub: "npub1260n42s06vzc7796w0fh3ny7zcpw6tlk4gq3940gmfrzl5c9pv2s3657q8" alias: "test-de01" connect_policy: auto_connect addresses: - transport: udp addr: "217.160.76.169:2121" - npub: "npub17lpmzulpc98d8ff727k6e98atxn3phzupzsqqwe54ytduym747ws4tw5zm" alias: "test-es01" connect_policy: auto_connect addresses: - transport: udp addr: "82.223.139.182:2121" - npub: "npub1u0z26dc4qeneu5rvwvmpfhtwh3522ed6rlgxr9jarrfnjrc6ew4qxjysrs" alias: "test-uk01" connect_policy: auto_connect addresses: - transport: udp addr: "88.208.241.33:2121" - npub: "npub1qmc3cvfz0yu2hx96nq3gp55zdan2qclealn7xshgr448d3nh6lks7zel98" alias: "test-us01" connect_policy: auto_connect addresses: - transport: tcp addr: "217.77.8.91:443" - transport: udp addr: "217.77.8.91:2121" - npub: "npub10yffd020a4ag8zcy75f9pruq3rnghvvhd5hphl9s62zgp35s560qrksp9u" alias: "test-us02" connect_policy: auto_connect addresses: - transport: tcp addr: "23.182.128.74:443" - transport: udp addr: "23.182.128.74:2121" - npub: "npub136yqae6na688fs75g95ppps3lxe07fvxefj77938zf47uhm6074sxw8ctm" alias: "test-us03" connect_policy: auto_connect addresses: - transport: udp addr: "54.183.70.180:2121" - transport: tcp addr: "54.183.70.180:443" # Uncomment only if you have a Tor SOCKS5 transport configured locally # - transport: tor # addr: "7c5mtyo5mk477t7l4mg56xs4wcnt4zrsqtjampijy532ggxgdg42gcyd.onion:443" - npub: "npub1gd7ye2qp2lphhzx75fynnjzaxx4dqanddecet0wtt5ss5ek8h9ps62wdkf" alias: "test-us04" connect_policy: auto_connect addresses: - transport: udp addr: "74.208.245.160:2121" ``` ## Ping not working On macOS the `ping` command is ipv4 only. use `ping6` instead `ping6 npub1q4th2mnqdu34x0zz7f889fgjxx55h6lzpr4nulglp9y0txhwk0ssexaf2q.fips`