ZeroNS: a name service centered around the ZeroTier Central API

Overview

ZeroNS: a name service centered around the ZeroTier Central API

ZeroNS provides names that are a part of ZeroTier Central's configured networks; once provided a network it:

  • Listens on the local interface joined to that network -- you will want to start one ZeroNS per ZeroTier network.
  • Provides general DNS by forwarding all queries to /etc/resolv.conf resolvers that do not match the TLD, similar to dnsmasq.
  • Tells Central to point all clients that have the "Manage DNS" settings turned on to resolve to it.
  • Finally, sets a provided TLD (.domain is the default), as well as configuring A (IPv4) and AAAA (IPv6) records for:
    • Member IDs: zt-. will resolve to the IPv4/v6 addresses for them.
    • Names: if the names are compatible with DNS names, they will be converted as such: to ..
      • Please note that collisions are possible and that it's up to the admin to prevent them.

Installation

Please obtain a working rust environment first.

cargo install --git https://github.com/zerotier/zeronsd --branch main

Usage

Setting ZEROTIER_CENTRAL_TOKEN in the environment is required. You must be able to administer the network to use zeronsd with it. Also, running as root is required as many client resolvers do not work over anything but port 53. Your zeronsd instance will listen on both udp and tcp, port 53.

Tip: running sudo? Pass the -E flag to import your current shell's environment, making it easier to add the ZEROTIER_CENTRAL_TOKEN.

zeronsd start 

You must have already joined a network and obviously, zerotier-one should be running!

It should print some diagnostics after it has talked to your zerotier-one instance to figure out what IP to listen on. After that it should communicate with the central API and set everything else up automatically.

Flags

  • -d will set a TLD for your records; the default is domain.
  • -f will parse a file in /etc/hosts format and append it to your records.
  • -s path to authtoken.secret which is needed to talk to ZeroTier on localhost. You can provide this file with this argument, but it is auto-detected on multiple platforms including Linux, OS X and Windows.
  • -t path to file containing your ZeroTier Central token.

TTLs

Records currently have a TTL of 60s, and Central's records are refreshed every 30s through the API. I felt this was a safer bet than letting timeouts happen.

Acknowledgements

ZeroNS demands a lot out of the trust-dns toolkit and I personally am grateful such a library suite exists. It made my job very easy.

Author

Erik Hollensbe [email protected]

Comments
  • ZeroNSd segfault in Alpine docker

    ZeroNSd segfault in Alpine docker

    Disclaimer: I know nothing about Rust, Rust programming, Cargo, Rust and such; this could well be entirely my fault, please be lenient.

    I was trying to setup this in a container (FROM rust:alpine), but standard zeronsd start -d <domain> <network-id> simply exited with an uninformative "Segmentation fault" error.

    I then made a VirualBox VM with the same content as Docker Container, compiled with debugging symbols and fired-up rust-gdb --args /home/mcondarelli/zeronsd/target/debug/zeronsd start ... Sure enough I got the same error.

    alpine:~# ./start.zeronsd.sh 
    GNU gdb (GDB) 10.2
    Copyright (C) 2021 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.
    Type "show copying" and "show warranty" for details.
    This GDB was configured as "x86_64-alpine-linux-musl".
    Type "show configuration" for configuration details.
    For bug reporting instructions, please see:
    <https://www.gnu.org/software/gdb/bugs/>.
    Find the GDB manual and other documentation resources online at:
        <http://www.gnu.org/software/gdb/documentation/>.
    
    For help, type "help".
    Type "apropos word" to search for commands related to "word"...
    Reading symbols from /home/mcondarelli/zeronsd/target/debug/zeronsd...
    (gdb) r
    Starting program: /home/mcondarelli/zeronsd/target/debug/zeronsd start -d <domain> <network-id>
    [New LWP 12918]
    
    Thread 1 "zeronsd" received signal SIGSEGV, Segmentation fault.
    0x0000000000000000 in ?? ()
    (gdb) bt
    #0  0x0000000000000000 in ?? ()
    #1  0x00007ffff76ffc7a in openssl::ssl::SslMethod::tls () at /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/openssl-0.10.35/src/ssl/mod.rs:324
    #2  0x00007ffff76f53c2 in native_tls::imp::TlsConnector::new (builder=0x7ffffffedcc0) at /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/native-tls-0.2.7/src/imp/openssl.rs:257
    #3  0x00007ffff76f6c32 in native_tls::TlsConnectorBuilder::build (self=0x7ffffffedcc0) at /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/native-tls-0.2.7/src/lib.rs:433
    #4  0x00007ffff75e26e0 in reqwest::connect::Connector::new_default_tls<core::option::Option<std::net::ip::IpAddr>> (http=..., tls=..., proxies=Arc(strong=2, weak=0) = {...}, user_agent=..., 
        local_addr=<error reading variable: Cannot access memory at address 0x0>, nodelay=true) at /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/reqwest-0.11.4/src/connect.rs:220
    #5  0x00007ffff75b57ed in reqwest::async_impl::client::ClientBuilder::build (self=...) at /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/reqwest-0.11.4/src/async_impl/client.rs:253
    #6  0x00007ffff75b654d in reqwest::async_impl::client::Client::new () at /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/reqwest-0.11.4/src/async_impl/client.rs:1088
    #7  0x00007ffff75235cc in zerotier_central_api::apis::configuration::{{impl}}::default () at /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/zerotier-central-api-1.0.2/src/apis/configuration.rs:45
    #8  0x00007ffff70603a2 in zeronsd::utils::central_config (token=<error reading variable: Cannot access memory at address 0x5>) at src/utils.rs:21
    #9  0x00007ffff6fc0f36 in zeronsd::start (args=0x7ffff8002e38) at src/main.rs:60
    #10 0x00007ffff6fc4856 in zeronsd::main () at src/main.rs:211
    (gdb) 
    

    An attempt to follow initialization seems to crash when stepping into /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/native-tls-0.2.7/src/imp/openssl.rs#94 ..> ONCE.call_once(openssl_probe::init_ssl_cert_env_vars);.

    What am I doing so wrong?

    opened by mcondarelli 29
  • Mistyped flow rule values

    Mistyped flow rule values

    On zeronsd startup I'm hitting this error:

    ERROR - error syncing members: error in serde: invalid value: integer `4294967295`, expected i32 at line 1 column 5850
    

    The rule I have causing this problem:

    # Create a tag for which group someone is in
    tag group
      id 1000
      default 0
      flag 0 productivity
      flag 1 homelab_mgmt
      flag 2 gaming
      flag 3 media
      enum 4294967295 everything    # max uint, catches all flags
    ;
    

    In case it isn't clear, what I'm trying to accomplish is having a dropdown value that, when tand'd with any set of flags, is always positive. The rule that makes use of it:

    # Drop any traffic between computers that don't share at least one group
    break
      tand group 0
    ;
    

    The ZeroTier Rules Engine documentation states:

    [enum ] # value can be any 32-bit unsigned integer

    So I believe something is mistyped in zeronsd and should be u32 instead of i32?

    For now I am easily working around this by changing the enum to 2147483647, which is u31 effectively and fit's in a i32. (so it'll match flags 0-30, but not flag 31).

    opened by altano 17
  • Some way to list all the host names on a zerotier network without being a network administrator

    Some way to list all the host names on a zerotier network without being a network administrator

    Hi!

    It'd be cool to be able to see the names of everything on the network without having to go to Central. We talked about allowing AXFR from localhost and that makes sense. But I also think allowing it for the whole zerotier subnet makes sense too for some uses at least, like the home lab type network. So behind a flag?

    For example, I'm going to be running zeronsd on some server, but spending most of my time working and administrating stuff from a laptop, and I can never remember the names of things.

    I just saw on the trust-dns readme AXFR is an on/off thing at the moment. No limiting by address.

    Other options would be.. Host as hostsfile or something on some http endpoint in zeronsd, which seems less good.

    enhancement 
    opened by laduke 14
  • Flow rule exception?

    Flow rule exception?

    What's a good flow rule to include at the top of our rules if we want DNS queries against zeronsd to always resolve for everyone in the ZT network?

    I've tried two approaches and neither work for some reason.

    Approach 1 - Allow UDP on port 53 destined for my zeronsd server:

    accept
      ztdest <zeronsd vl1 addr>
      and dport 53
      and ipprotocol udp
    ;
    

    Approach 2 - From ZT docs, allow UDP server traffic:

    tag udpserver
      id 1001
      default 0
      flag 0 is_udp_server
    ;
    
    # Accept UDP traffic if the value of the udpserver tag is
    # 1 when both sender and receiver tags are ORed together, 
    # or if UDP traffic is multicast. This allows multicast mDNS 
    # and Netbios announcements and allows UDP traffic to and 
    # from UDP servers, but prohibits other horizontal UDP traffic.
    accept
      ipprotocol udp
      and tor udpserver 1
      or chr multicast
    ;
    
    break ipprotocol udp;
    

    I'm testing with:

    $ dig +short @<ZERONSD-ZT-IP> machine.in.my.zt.domain
    ;; connection timed out; no servers could be reached
    
    opened by altano 12
  • Support for running within Docker

    Support for running within Docker

    👋 Coming over from Reddit. 😅 (I put together ZeroDNS.)

    ZeroNS appears to resolve one of my goals with ZeroDNS – name resolution of ZeroTier peers. However, the other goal seems unsolved: allowing a Docker Compose stack to make use of said name resolution.

    Maybe this is my networking ignorance showing – but would it make sense to have an edition of ZeroNS that runs within a Docker container, as well?

    e.g. I currently have a few compose stacks that use a ZeroDNS container as their network router (via networks: ["container:zerodns"], or equivalent).

    (May also be worth noting this is without setting up ZeroNS locally – I won't be able to get to this for a few days.)

    (Also, I'm willing to take this up in the future; just inquiring at the moment.)

    opened by jmuchovej 12
  • can `dig` but cannot `ping` on debian/ubuntu

    can `dig` but cannot `ping` on debian/ubuntu

    Hi, I have been using zerotier for a while on my private network and just started to deploy zeronsd.

    I followed the official zeronsd documentation as well as referring to Alan Norbauer's notes for set-up

    • https://docs.zerotier.com/zeronsd/quickstart/
    • https://alan.norbauer.com/articles/zerons-setup

    Here are my configurations (all 3 nodes listed below are under different physical network)

    | | Home Server | Office Client | Mobile Phone | | ------ | ------------------ | ------------------ | ------------------- | | OS | Debian 11.3 | Ubuntu 20.04 | Android 11 | | ZeroTier Version | v1.10.1 | v1.10.1 | v1.8.9-1 | | allownDNS | 1 | 1 | "Network DNS" tab chosen when joining network | | ZeroTier IP | 172.27.27.27 | 172.27.50.50 | 172.27.200.10 | | Zerotier Systemd Manager Version | v0.3.1 | N/A | N/A | | ZeroNSD Version | v0.5.2 | N/A | N/A | | ZeroNSD Domain | sv.myowndomain.com | dt.myowndomain.com | mob.myowndomain.com |

    myowndomain.com is my own domain registered at Godaddy.com but no public DNS settings done there (just registered).

    • What I can do
      • Can ping each other using ZeroTier IPs
      • Can access web services (http, samba, etc) deployed on Home Server from Office Client and Mobile Phone using ZeroTier IP
      • Can see myowndomain.com automatically filled in Search Domain and 172.27.27.27 listed in Servers in ZeroTier Web Settings page
      • Can dig each other, e.g.

    dig on Home Server (Debian)

    > dig +short @172.27.27.27 sv.myowndomain.com
    172.27.27.27
    > dig +short @172.27.27.27 dt.myowndomain.com
    172.27.50.50
    > dig +short @172.27.27.27 mob.myowndomain.com
    172.27.200.10
    

    dig on Office Client (Ubuntu)

    > dig +short @172.27.27.27 sv.myowndomain.com
    172.27.27.27
    > dig +short @172.27.27.27 dt.myowndomain.com
    172.27.50.50
    > dig +short @172.27.27.27 mob.myowndomain.com
    172.27.200.10
    
    • What I CANNOT do
      • Cannot ping each other (even itself) using ZeroNSD domains, nor can access web services on the server using domain
    > ping sv.myowndomain.com
    ping: sv.myowndomain.com: Name or service not known
    > ping dt.myowndomain.com
    ping: dt.myowndomain.com: Name or service not known
    

    Any help would be highly appreciated! Thanks!

    opened by wxrl 11
  • windows DNS resolution + zeronsd

    windows DNS resolution + zeronsd

    • zerotier container running and connected to the network
    • zeronsd container running
    • ~~2nd client windows with allow dns checked, but the interface does not have the dns server on it~~ NRPT works
    • ping works from both clients
    • resolving from both clients does not work

    If anything else is needed, please ask and I will add it here and on the gist.

    Output of dig, nslookup, container, etc https://gist.github.com/Kegelcizer/0bbba2ab8e95c5a965337edf69e064dd

    opened by Kegelcizer 11
  • 0.4.1 has multiple building issues

    0.4.1 has multiple building issues

    1. The Cargo.lock is not updated, so --locked can't be used with cargo build:
    error: the lock file (...)/zeronsd-0.4.1/Cargo.lock needs to be updated but --locked was passed to prevent this
    If you want to try to generate the lock file without accessing the network, remove the --locked flag and use --offline instead.
    

    This makes the package non-reproducible, because it forces the builder to update the dependencies with cargo update on every build. More info: https://wiki.archlinux.org/title/Rust_package_guidelines#Prepare

    1. If the deps are updated, one of the subsequent tests fails:
    running 9 tests
    test tests::test_central_token ... ok
    test tests::test_central_token_panic - should panic ... ok
    test tests::test_domain_or_default ... ok
    test tests::test_parse_ip_from_cidr ... ok
    test tests::test_supervise_systemd_green ... FAILED
    test tests::test_parse_hosts_duplicate ... ok
    test tests::test_supervise_systemd_red ... ok
    test tests::test_parse_hosts ... ok
    test tests::test_parse_member_name ... ok
    
    failures:
    
    ---- tests::test_supervise_systemd_green stdout ----
    thread 'tests::test_supervise_systemd_green' panicked at 'assertion failed: `(left == right)`
      left: `"\n[Unit]\nDescription=zeronsd for network 1234567891011121\nRequires=zerotier-one.service\nAfter=zerotier-one.service\n\n[Service]\nType=simple\nExecStart=zeronsd start -t /proc/cpuinfo 1234567891011121\nTimeoutStopSec=30\nRestart=always\n\n[Install]\nWantedBy=default.target\n"`,
     right: `"\n[Unit]\nDescription=zeronsd for network 1234567891011121\nRequires=zerotier-one.service\nAfter=zerotier-one.service\n\n[Service]\nType=simple\nExecStart=zeronsd start -t /proc/cpuinfo 1234567891011121\nTimeoutStopSec=30\n\n[Install]\nWantedBy=default.target\n"`: basic', src/tests.rs:171:13
    
    
    failures:
        tests::test_supervise_systemd_green
    
    test result: FAILED. 8 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.05s
    
    error: test failed, to rerun pass '--lib'
    
    opened by devvick 10
  • Client nodes can't access DNS

    Client nodes can't access DNS

    I have zeronsd installed on a parent server and it can access all nodes within its network via DNS. However, the children nodes cannot access each other with DNS. Am I supposed to install zeronsd on every client?

    opened by anthonyma94 8
  • Zeronsd does not compile due to update with clap

    Zeronsd does not compile due to update with clap

    Since clap updated to a new major verison yesterday, Zeronsd does not compile correctly. The specific errors are

    error[E0107]: this struct takes 0 lifetime arguments but 1 lifetime argument was supplied
      --> /home/ubuntu/.cargo/registry/src/github.com-1ecc6299db9ec823/zeronsd-0.2.4/src/supervise.rs:91:18
       |
    91 | impl From<&clap::ArgMatches<'_>> for Properties {
       |                  ^^^^^^^^^^---- help: remove these generics
       |                  |
       |                  expected 0 lifetime arguments
       |
    note: struct defined here, with 0 lifetime parameters
      --> /home/ubuntu/.cargo/registry/src/github.com-1ecc6299db9ec823/clap-3.0.0/src/parse/matches/arg_matches.rs:71:12
       |
    71 | pub struct ArgMatches {
       |            ^^^^^^^^^^
    
    error[E0107]: this struct takes 0 lifetime arguments but 1 lifetime argument was supplied
      --> /home/ubuntu/.cargo/registry/src/github.com-1ecc6299db9ec823/zeronsd-0.2.4/src/main.rs:39:29
       |
    39 | fn unsupervise(args: &clap::ArgMatches<'_>) -> Result<(), anyhow::Error> {
       |                             ^^^^^^^^^^---- help: remove these generics
       |                             |
       |                             expected 0 lifetime arguments
       |
    note: struct defined here, with 0 lifetime parameters
      --> /home/ubuntu/.cargo/registry/src/github.com-1ecc6299db9ec823/clap-3.0.0/src/parse/matches/arg_matches.rs:71:12
       |
    71 | pub struct ArgMatches {
       |            ^^^^^^^^^^
    
    error[E0107]: this struct takes 0 lifetime arguments but 1 lifetime argument was supplied
      --> /home/ubuntu/.cargo/registry/src/github.com-1ecc6299db9ec823/zeronsd-0.2.4/src/main.rs:43:27
       |
    43 | fn supervise(args: &clap::ArgMatches<'_>) -> Result<(), anyhow::Error> {
       |                           ^^^^^^^^^^---- help: remove these generics
       |                           |
       |                           expected 0 lifetime arguments
       |
    note: struct defined here, with 0 lifetime parameters
      --> /home/ubuntu/.cargo/registry/src/github.com-1ecc6299db9ec823/clap-3.0.0/src/parse/matches/arg_matches.rs:71:12
       |
    71 | pub struct ArgMatches {
       |            ^^^^^^^^^^
    
    error[E0107]: this struct takes 0 lifetime arguments but 1 lifetime argument was supplied
      --> /home/ubuntu/.cargo/registry/src/github.com-1ecc6299db9ec823/zeronsd-0.2.4/src/main.rs:47:23
       |
    47 | fn start(args: &clap::ArgMatches<'_>) -> Result<(), anyhow::Error> {
       |                       ^^^^^^^^^^---- help: remove these generics
       |                       |
       |                       expected 0 lifetime arguments
       |
    note: struct defined here, with 0 lifetime parameters
      --> /home/ubuntu/.cargo/registry/src/github.com-1ecc6299db9ec823/clap-3.0.0/src/parse/matches/arg_matches.rs:71:12
       |
    71 | pub struct ArgMatches {
       |            ^^^^^^^^^^
    
    error[E0107]: this struct takes 0 lifetime arguments but 1 lifetime argument was supplied
      --> /home/ubuntu/.cargo/registry/src/github.com-1ecc6299db9ec823/zeronsd-0.2.4/src/supervise.rs:92:26
       |
    92 |     fn from(args: &clap::ArgMatches<'_>) -> Self {
       |                          ^^^^^^^^^^---- help: remove these generics
       |                          |
       |                          expected 0 lifetime arguments
       |
    note: struct defined here, with 0 lifetime parameters
      --> /home/ubuntu/.cargo/registry/src/github.com-1ecc6299db9ec823/clap-3.0.0/src/parse/matches/arg_matches.rs:71:12
       |
    71 | pub struct ArgMatches {
       |            ^^^^^^^^^^
    
    For more information about this error, try `rustc --explain E0107`.
    

    for now I installed with cargo install --locked zeronsd

    opened by patmagauran 8
  • ZeroTier DNS not working on Windows but working perfectly on Linux

    ZeroTier DNS not working on Windows but working perfectly on Linux

    So here is my setup

    I have 2 machines: one is my personal Server running Debian 10 with nginx/php/mysql and samba, let's call it deb-srv, and the other is my Laptop, which is installed with Linux Mint 20.1 together with Windows 10 Home (dual systems, not on VM) and is under another physical sub network.

    I have ZeroTier and zeronsd installed and configured on deb-srv using intra.mydomain.com, and all 3 systems joined in the same ZeroTier network (so there are 3 nodes under the network, but always up to 2 nodes are online), for which I have verified by connecting via ZeroTier Intranet IPs.

    I CAN connect to deb-srv using intra.mydomain.com (ping, ssh, http/https, samba) from my Laptop when under Linux Mint, but if I reboot to Windows on the same laptop (still under the same physical network), I can only connect to deb-srv using the ZeroTier Intranet IP but not intra.mydomain.com.

    I have confirmed on either GUI and command line (powershell) that allowDNS is TRUE for the Windows client, and I have tried to restart the whole Windows system and the windows ZeroTier-One client for several times, but still not working.

    Also I tried to set manually again by zerotier-cli set network-id allowDNS=1, as well as un-check and re-check the allowDNS checkbox and restart the client - still no hope

    I also tried under Administrator to ipconfig /flushdns as well as Clear-DnsClientCache and then reboot the system - still no hope...

    I also tried to quit from the ZeroTier network from Windows and re-join, still nothing changed...

    Under Windows on the Laptop:

    ping intra.mydomain.com Ping request could not find host intra.mydomain.com. Please check the name and try again.

    ping 172.30..

    Pinging 172.30.. with 32 bytes of data: Reply from 172.30..: bytes=32 time=27ms TTL=64 Reply from 172.30..: bytes=32 time=27ms TTL=64

    opened by wxrl 8
  • zeronsd-xxxxxxx.service fails after start

    zeronsd-xxxxxxx.service fails after start

    I tried to set up ZeroTier with ZeroNSD, but I can't get the latter one to run. I tried to set up ZeroNSD in two different ways, which led to different errors. For both setups I put the Token in /var/lib/zerotier-one/token.

    1. I installed ZeroNSD on the same server as ZeroTier. journalctl tells me the following:
    zeronsd[21772]: Error: Error: Unexpected Response Response { url: Url { scheme: "http", cannot_be_a_base: false, username: "", password: None, host: Some(Ipv4(127.0.0.1)), port: Some(9993), path: "/network/ea818c27fb295a73", query: None, fragment: None }, status: 404, headers: {"cache-control": "no-cache", "pragma": "no-cache", "content-type": "application/json", "content-length": "2", "connection": "close"} }. Are you joined to ea818c27fb295a73?
    
    1. I installed ZeroNSD on a different server in the ZeroTier network. Here, ZeroTier was already installed via the Snap package so I edited the service file in the following way:
    [Unit]
    Description=zeronsd for network ea818c27fb295a73
    Requires=snap.zerotier.one.service
    After=snap.zerotier.one.service
    
    [Service]
    Type=simple
    ExecStart=/usr/bin/zeronsd start -t /var/lib/zerotier-one/token -w -d beyond.corp ea818c27fb295a73
    TimeoutStopSec=30
    Restart=always
    
    [Install]
    WantedBy=default.target
    

    Here, the journalctl output is this:

    zeronsd[1094963]: Dec 12 15:16:34.274  INFO zeronsd::init: Welcome to ZeroNS!
    zeronsd[1094963]: Error: No such file or directory (os error 2)
    

    Unfortunately, I don't even know which file or directory it tries to read here.

    I already saw #195, but the solution there didn't help.

    Does anyone have an idea why this fails? And what is the recommended place to install ZeroNDS (same server or different one)?

    opened by NicolaiRuckel 0
  • Error: failed to parse header value

    Error: failed to parse header value

    Cant start zeronsd

    sudo /usr/bin/zeronsd start -l trace -t /home/daniel/zttoken -d lan a....3
    Dec 01 13:23:43.601  INFO zeronsd::init: Welcome to ZeroNS!
    Error: failed to parse header value
    

    running in a VM OS: Ubuntu 22.04.1 LTS x86_64 Kernel: 5.15.0-53-generic

    opened by danielskapunk 0
  • zeronsd does not listen on port 53 on MacOS

    zeronsd does not listen on port 53 on MacOS

    Hi!

    I can see typical startup output:

    /usr/local/bin/zeronsd start -t /private/var/lib/zerotier-one/token -d zerotier <network-id>
    Oct 18 09:23:48.614  INFO zeronsd::init: Welcome to ZeroNS!
    Oct 18 09:23:49.583  INFO zeronsd::init: Your IP for this network: 172.25.221.93
    Oct 18 09:23:49.961  INFO zeronsd::authority: Adding new record <blanked>
    Oct 18 09:23:49.961  INFO zeronsd::authority: Adding new record <blanked>
    Oct 18 09:23:49.961  INFO zeronsd::authority: Adding/Replacing record <blanked>
    ...
    

    The records that are added looked correct to me.

    But then I tried to resolve using the IP (172.25.221.93) and nothing happened. Looking at the list of open ports (sudo lsof -i -P -n | grep LISTEN|grep 53) shows nothing listening on port 53.

    I then tried to launch with debug and trace log levels, but did not see any other information that would point me to the issue. Do you have any other ideas on how to debug this?

    OS: MacOS 12.4 installed: via brew (github repo instructions)

    opened by peterhoneder 1
  • Can't build on Alpine 3.16.2

    Can't build on Alpine 3.16.2

    Hello again!

    I get this build error towards the end of cargo install zeronsd:

       Compiling progenitor v0.2.0
       Compiling zerotier-one-api v1.1.0
       Compiling zerotier-central-api v1.1.0
    error[E0061]: this function takes 1 argument but 0 arguments were supplied
       --> /root/.cargo/registry/src/github.com-1ecc6299db9ec823/zerotier-one-api-1.1.0/build.rs:7:25
        |
    7   |     let mut generator = progenitor::Generator::new();
        |                         ^^^^^^^^^^^^^^^^^^^^^^^^^^-- supplied 0 arguments
        |                         |
        |                         expected 1 argument
        |
    note: associated function defined here
       --> /root/.cargo/registry/src/github.com-1ecc6299db9ec823/progenitor-impl-0.2.0/src/lib.rs:124:12
        |
    124 |     pub fn new(settings: &GenerationSettings) -> Self {
        |            ^^^
    
    For more information about this error, try `rustc --explain E0061`.
    error: could not compile `zerotier-one-api` due to previous error
    warning: build failed, waiting for other jobs to finish...
    error[E0061]: this function takes 1 argument but 0 arguments were supplied
       --> /root/.cargo/registry/src/github.com-1ecc6299db9ec823/zerotier-central-api-1.1.0/build.rs:7:25
        |
    7   |     let mut generator = progenitor::Generator::new();
        |                         ^^^^^^^^^^^^^^^^^^^^^^^^^^-- supplied 0 arguments
        |                         |
        |                         expected 1 argument
        |
    note: associated function defined here
       --> /root/.cargo/registry/src/github.com-1ecc6299db9ec823/progenitor-impl-0.2.0/src/lib.rs:124:12
        |
    124 |     pub fn new(settings: &GenerationSettings) -> Self {
        |            ^^^
    
    error: failed to compile `zeronsd v0.5.0`, intermediate artifacts can be found at `/tmp/cargo-installkW7HZG`
    
    Caused by:
      build failed
    

    Versions:

    • Alpine 3.16.2
    • rustc/cargo 1.60.0
    opened by altano 4
  • Cannot find local zerotier-one server that doesn't listen on port 9993

    Cannot find local zerotier-one server that doesn't listen on port 9993

    Trying to start zeronsd on a host where zerotier-one server doesn't listen on port 9993 fails with the following message:

    Aug 22 04:37:07.328  INFO zeronsd::init: Welcome to ZeroNS!
    Error: Error: Communication Error error sending request for url (http://127.0.0.1:9993/network/<network-id>): error trying to connect: tcp connect error: Connection refused (os error 111). Are you joined to <network-id>?
    
    enhancement 
    opened by bolu61 2
  • (Feature Request) Mechanism to Deploy Internal TLS/SSL Certs to ZeroTier Clients?

    (Feature Request) Mechanism to Deploy Internal TLS/SSL Certs to ZeroTier Clients?

    I know this is probably a long ways away, but now that ZeroNS is right around the corner, it would be awesome if there could be a way to distribute internal certificates to ZeroTier clients. (I know this might be out of scope of the project, but it would be pretty awesome)

    opened by pldmgg 1
Releases(v0.5.2)
  • v0.5.2(May 21, 2022)

    This fixes a number of issues with the packages:

    • debian & earlier ubuntu packages would encounter an issue supporting the right glibc version in some scenarios.
    • newer ubuntu packages (22 & up) supported libssl3 in the package definition, but the linker actually linked against libssl1.1
    • docker images were missing the ca-certificates bundle from before. Accidentally deleted a line of code.

    Additional measures were taken to ensure this will not occur in the future.

    Source code(tar.gz)
    Source code(zip)
    zeronsd-0.5.2-1.x86_64.rpm(3.46 MB)
    zeronsd-0.5.2-x86_64.msi(4.05 MB)
    zeronsd-ubuntu22_0.5.2_amd64.deb(3.02 MB)
    zeronsd_0.5.2_amd64.deb(2.13 MB)
  • v0.5.1(May 14, 2022)

  • v0.5.0(May 14, 2022)

  • v0.4.3(Apr 15, 2022)

    NS records are now published by the nameserver, both in standard DNS format and the DoT format proposed by facebook here:

    https://tools.ietf.org/id/draft-bretelle-dprive-dot-spki-in-ns-name-00.html#formatting-dot-spki-in-name-server-name

    Additionally, improvements to testing were made which resulted in some stability and performance improvements, particularly around how hostnames are generated, which would only be an issue with larger (200+ nodes) networks.

    Packages for Windows are now available.

    Docker, Linux, and OS X (via homebrew tap @ https://github.com/zerotier/homebrew-tap) packages are still available.

    Source code(tar.gz)
    Source code(zip)
    zeronsd-0.4.3-1.x86_64.rpm(2.38 MB)
    zeronsd-0.4.3-x86_64.msi(4.14 MB)
    zeronsd_0.4.3-ubuntu22_amd64.deb(2.20 MB)
    zeronsd_0.4.3_amd64.deb(2.14 MB)
  • v0.4.2(Apr 2, 2022)

  • v0.4.1(Apr 1, 2022)

    This fixes some regressions with the supervise command: if you had ever used supervise to setup your service and upgraded to 0.4.0 you will need this patch, and run this command:

    zeronsd unsupervise <network id>
    zeronsd supervise <args> <network id>
    

    This also includes a patch to restore the dependency on the pre-installed openssl on operating systems; we were using a statically linked version in 0.4.0 that was preventing us from creating packages for some platforms.

    There are no windows releases for the 0.4 series until we can figure out the openssl dependency. Sorry!

    Source code(tar.gz)
    Source code(zip)
    zeronsd-0.4.1-1.x86_64.rpm(2.37 MB)
    zeronsd_0.4.1_amd64.deb(2.13 MB)
  • v0.4.0(Mar 30, 2022)

    zeronsd 0.4 includes a major rewrite of our "authority" code which is the database responsible for holding your records. This includes the fetching code from central as well as the DNS resolution portion of the database.

    It also includes a new feature: DNS-over-TLS support. You can enable this by configuring a certificate and key for your server in the configuration file and at the commandline. Please note our sister project zerotier-systemd-manager was also updated to exploit this funcionality; check the README over there for more details.

    Updates to logging were also added; we now depend on the tracing crate and now log levels can be configured at the commandline as well as the configuration file. tracing is a much faster logger than the previous implementation, so feel free to dial it up!

    Finally, we have upgraded our trust-dns dependency to 0.21.2, which brings in many performance fixes and there were additional fixes to supporting zeronsd in library mode.

    Source code(tar.gz)
    Source code(zip)
    zeronsd-0.4.0-1.x86_64.rpm(3.31 MB)
    zeronsd_0.4.0_amd64.deb(3.03 MB)
  • v0.3.1(Feb 23, 2022)

    This includes some code cleanup by @tranzystorek-io as well as fixes several fundamental issues:

    • supervise and unsupervise commands would hang after performing work
    • supervise and unsupervise commands would no longer output instructions on what to do after running the command
    • supervise and unsupervise commands were not allowing config files to be propagated.

    Thanks for using zeronsd. Please remember we are actively swallowing bugs daily!

    Source code(tar.gz)
    Source code(zip)
    zeronsd-0.3.1-1.x86_64.rpm(2.26 MB)
    zeronsd-0.3.1-x86_64.msi(3.08 MB)
    zeronsd_0.3.1_amd64.deb(2.04 MB)
  • v0.3.0(Feb 22, 2022)

    v0.3 is a major update with a lot of new changes:

    • Code reorganization, much of the code was reworked to be more effective for future changes:
      • Can now be consumed as a library
      • Integration tests are not a part of the main package any longer
    • Configuration files! See README for more information
    • env_logger is in use: use ZERONSD_LOG to tweak logging parameters. See README for more information.
    • Updated to latest changes when working with Zerotier Central
    • home.arpa. is now the default TLD, it is no longer domain.. This may break some installations, so beware!
    • MSI Windows installer now sets a firewall exception for DNS.
    Source code(tar.gz)
    Source code(zip)
    zeronsd-0.3.0-1.x86_64.rpm(2.25 MB)
    zeronsd-0.3.0-x86_64.msi(3.07 MB)
    zeronsd_0.3.0_amd64.deb(2.04 MB)
  • v0.2.6(Feb 20, 2022)

    Most of this release belongs to @tranzystorek-io and @keepwn who submitted pull requests to fix a number of issues:

    @tranzystorek-io:

    • Correct permissions for RC scripts on Alpine
    • Upgrade argument parser to clap v3 (colorized output and a few other niceties)
    • Several other smaller but important refactors

    @keepwn:

    • Fix the forward resolver (the fallback for DNS queries that hit zeronsd that it doesn't manage) to use resolv.conf instead of 8.8.8.8/8.8.4.4

    Thanks to these contributors!

    Source code(tar.gz)
    Source code(zip)
    zeronsd-0.2.6-1.x86_64.rpm(2.12 MB)
    zeronsd-0.2.6-x86_64.msi(2.81 MB)
    zeronsd_0.2.6_amd64.deb(1.92 MB)
  • v0.2.5(Feb 1, 2022)

    First release since August! It's been a while! This release contains several fixes:

    • Dependencies were managed better / upgraded across the board
    • We now conform to "Rust 2021".
    • Error messages were better described when errors connecting to zerotier-one were encountered (thanks @laduke for the patch!)
    • ZEROTIER_CENTRAL_INSTANCE can now specify non-canonical instances of zerotier central (thanks @glimberg for the request!)

    Additionally, thanks to the diligence of @altano we have a pretty comfortable Alpine Linux solution now, as well as quality containerization techniques with it:

    • The README goes into how to run your own containerized zeronsd that runs independently of the host (but still shares a networking stack). This allows you to better manage your zeronsd instances; it is not a security improvement over running on the host due to how the authtoken is handled.
    • Alpine Linux on the host machine is now a first class product with openrc support in for zeronsd supervise and zeronsd unsupervise. These scripts were provided by @altano and adapted into the source code.

    To pull the docker images: docker pull zerotier/zeronsd:alpine-v0.2.5 or zerotier/zeronsd:alpine-latest.

    A gentle reminder we also have Homebrew, Windows, .deb and .rpm packages as well as through cargo. These are the preferred and supported versions of zeronsd. Check out the README for more information!

    NOTE: the windows and mac os x builds contain post-tag compiler fixes for situations where the code would not build, but these do not alter functionality under these platforms.

    Source code(tar.gz)
    Source code(zip)
    zeronsd-0.2.5-1.x86_64.rpm(2.13 MB)
    zeronsd-0.2.5-x86_64.msi(2.80 MB)
    zeronsd_0.2.5_amd64.deb(1.92 MB)
  • v0.2.4(Aug 28, 2021)

  • v0.2.3(Jul 28, 2021)

    #94 exposed a serious bug where when renaming nodes, the record set would be appended to, not replaced. This resulted in a number of issues with A and AAAA records showing two independent IPs for the named record, one for each point-in-time ip assignment.

    Summarily:

    bob -> 1.2.3.4
    alice -> 1.2.3.5
    

    then rename alice to bob, and bob to snuffy

    snuffy -> 1.2.3.4
    bob -> 1.2.3.4, 1.2.3.5 // wrong!!!
    

    Previously to this patch a restart of the service will resolve things, as zeronsd is stateless and cannot be corrupted persistently.

    Builds are available for the usual platforms, including docker and homebrew via our homebrew-tap.

    Source code(tar.gz)
    Source code(zip)
    zeronsd-0.2.3-1.x86_64.rpm(3.16 MB)
    zeronsd-0.2.3-x86_64.msi(2.77 MB)
    zeronsd_0.2.3_amd64.deb(1.90 MB)
  • v0.2.2(Jun 26, 2021)

    This release contains a small, but critical fix for nameserver settings in central. To apply this fix, merely install the package and restart the service.

    In the 0.2.x releases, a regression occurred where the network with the CIDR portion would be applied as a nameserver entry in ZeroTier Central, instead of only the IP. This causes some issues in a variety of circumstances, but not all of them.

    Please find releases on Homebrew and Docker in their respective locations (see the README), as well as these packages below.

    Source code(tar.gz)
    Source code(zip)
    zeronsd-0.2.2-1.x86_64.rpm(3.16 MB)
    zeronsd-0.2.2-x86_64.msi(2.77 MB)
    zeronsd_0.2.2_amd64.deb(1.89 MB)
  • v0.2.1(Jun 23, 2021)

  • v0.2.0(Jun 23, 2021)

    This release brings IPv6 support for the following scenarios:

    • Manual Addressing
    • RFC4193
    • 6PLANE (No PTR record support)

    It also brings the following additional changes:

    • zeronsd supervise for Mac OS X via launchd (thanks @laduke and @jmuchoevj for figuring this out!)
    • Standardized, structured logging; colorized when printed to TTY
    • Fixes for situations where the SOA record was not properly inserted
    • Use the new -w flag to enable wildcard names:
      • This feature sets all names in zeronsd to have an implicit wildcard for the subdomain beneath. What this means, is that for a member that has the name islay.domain, one.islay.domain will resolve to its address.
    Source code(tar.gz)
    Source code(zip)
    zeronsd-0.2.0-1.x86_64.rpm(3.16 MB)
    zeronsd_0.2.0_amd64.deb(1.90 MB)
  • v0.1.7(Jun 15, 2021)

    v0.1.7 largely affects linux hosts and covers some supervisory issues. After installing you will want to zerosnd unsupervise && zeronsd supervise && systemctl daemon-reload your networks.

    It also contains some small fixes for errant situations where the listener would crash and leave the daemon in a hung state, and other diagnostic issues.

    You can download a release below for your platform, or use our docker | Homebrew solutions.

    Thanks for using zeronsd and ZeroTier!

    Source code(tar.gz)
    Source code(zip)
    zeronsd-0.1.7-1.x86_64.rpm(3.08 MB)
    zeronsd-0.1.7-x86_64.msi(2.71 MB)
    zeronsd_0.1.7_amd64.deb(1.86 MB)
  • v0.1.6(Jun 11, 2021)

    It is strongly encouraged you upgrade to this release and the latest release of zerotier-systemd-manager on linux hosts if you have been using zeronsd in the past. It contains many bug fixes and improvements.

    It is also important that as of this release, zeronsd has evolved to the beta stage of release testing. Please be aware it is completely usable in a lot of situations, but maybe don't run your internal facebook clone against it yet.

    • hostname translation! Got a computer named Joe's Computer you don't want to change? Now, zeronsd will turn that into joes-computer.domain. Previously it would just ignore it.
    • many diagnostic messages were improved and logging output was also made clearer
    • performance was slightly increased now that zeronsd has limited threads to the number of cpus on the host (accounting for hyperthreading). Before this number was static and low intentionally, let us know if you run into trouble with this setting. Performance increased by a factor of 300% for cache-less A record lookups of a single domain on a 24 thread machine during testing.
    • Multiple listening addresses! Now, if you have a zerotier network with multiple addresses, zerotier will gladly use all of them to listen on. This feature is expected to evolve to be less coarse in the future. Note additionally, that only ipv4 DNS servers will be distributed to central to propagate to clients; IPv6 is still unsupported in zeronsd and will arrive in 0.2.0.
      • Related to this change, A and AAAA records can now present round robin selection lists for hosts that have multiple listening addresses.
    • zeronsd supervise had a setup bug that would sometimes cause it to not boot at the appropriate time to sync up with zerotier; thanks to @devvick for sorting this one out for us!
    • Finally, hosts files now refresh within 30 seconds of your edits. They are presented and updated like normal domains on the network.

    Pro tip: try nmap -oG - <subnet> to list all the names on your network using Windows, OS X or Linux with zerotier-systemd-manager.

    Source code(tar.gz)
    Source code(zip)
    zeronsd-0.1.6-1.x86_64.rpm(3.07 MB)
    zeronsd-0.1.6-x86_64.msi(2.71 MB)
    zeronsd_0.1.6_amd64.deb(1.85 MB)
  • v0.1.5(Jun 1, 2021)

    This release mostly honestly includes integration tests, which did catch quite a few bugs, the fixes for are contained within.

    • Restrictions on named hosts (from the central member's "name" field) are less restrictive and also diagnostics should be easier to understand now.
    • Comment and whitespace handling in hosts files is much more sane.
    • In some situations the zeronsd instance would fail to properly evaluate the network from zerotier-one, failing to start the daemon. This has been resolved.
    • Additionally, docker packaging has been resolved and is now future-proofed with package testing.
    Source code(tar.gz)
    Source code(zip)
    zeronsd-0.1.5-1.x86_64.rpm(3.00 MB)
    zeronsd-0.1.5-x86_64.msi(2.64 MB)
    zeronsd_0.1.5_amd64.deb(1.81 MB)
  • v0.1.4(May 27, 2021)

    This fixes a number of issues:

    • The hosts file refresher would load the records on boot, and then the expiration code would immediately expire it.
    • Several situations where the RR would be extended instead of replaced, in A, AAAA, and PTR situations.
    • PTRs were not being properly evacuated in a few situations.
    • Named records were also not being evacuated if tickled right; this is mostly related to situations where you have a hosts file and a named record that were in conflict.
    Source code(tar.gz)
    Source code(zip)
    zeronsd-0.1.4-1.x86_64.rpm(3.00 MB)
    zeronsd-0.1.4-x86_64.msi(2.63 MB)
    zeronsd_0.1.4_amd64.deb(1.81 MB)
  • v0.1.3(May 27, 2021)

    This release brings two improvements and one notable regression:

    • zeronsd supervise and zeronsd unsupervise can be used to automatically join a zeronsd to your network through systemd. Must be on linux and using systemd to use appropriately.
    • Several issues with managing the catalog were fixed.
    • IPv6 support is currently on further hold until 0.2.x ships. This is because it needs a significant rework for how users use IPv6 with zerotier. We apologize if there is anyone depending on the existing functionality; for what it's worth, it should improve soon.
    • Diagnostics for when records are added/removed to the catalog were also added.
    Source code(tar.gz)
    Source code(zip)
    zeronsd-0.1.3-1.x86_64.rpm(3.00 MB)
    zeronsd-0.1.3-x86_64.msi(2.63 MB)
    zeronsd_0.1.3_amd64.deb(1.81 MB)
  • v0.1.2(May 21, 2021)

    This includes windows packages and also bumps the dependencies in trust-dns which contain fixes for forwarding requests on windows hosts.

    This still does not address service installation in any of the packages; expect more soon on that front. The MSI installer will install the binary and adjust your path, but that's about it.

    Feedback on these releases is always welcome.

    Note: homebrew and docker should also be updated.

    Source code(tar.gz)
    Source code(zip)
    zeronsd-0.1.2-1.x86_64.rpm(2.95 MB)
    zeronsd-0.1.2-x86_64.msi(2.60 MB)
    zeronsd_0.1.2_amd64.deb(1.78 MB)
  • v0.1.1(May 13, 2021)

    Docker images are coming to dockerhub. There are also instructions in the README that describe how to build your own.

    rpms and debs are included in this release as well. They do not configure any init scripts, however. Just installation of the binary and pulling in of dependencies. Let us know in the issues if you want/need more.

    Additionally, the following changes were made:

    • whitespace in central's named hosts is now trimmed for DNS usage. Additionally, empty and invalid strings will no longer cause an inscrutable error every 30 seconds. Now you will know what is wrong.
    • Core dependencies were updated; trust-dns was updated to 0.20.2.
    Source code(tar.gz)
    Source code(zip)
    zeronsd-0.1.1-1.x86_64.rpm(2.95 MB)
    zeronsd_0.1.1_amd64.deb(1.78 MB)
Owner
ZeroTier, Inc.
Directly Connecting the World's Devices with Universal Software Defined Networking
ZeroTier, Inc.
A SOAP client for Brazilian Central Bank's Time Series Management System

A SOAP client for Brazilian Central Bank's Time Series Management System

Felipe Noronha 3 May 4, 2022
Implementation of algorithms for Domain Name System (DNS) Cookies construction

DNS Cookie RFC7873 left the construction of Server Cookies to the discretion of the DNS Server (implementer) which has resulted in a gallimaufry of di

Rushmore Mushambi 2 Feb 4, 2022
Dns subdomain finding tool, based off of the c application of the same name

dnsmap-rs Tool for brute-forcing/scanning for existing subdomains in a domain. Based on dnsmap c application that is packaged in kali linux. Can query

Tomás Alvarez 3 Oct 19, 2022
A super minimal wrapper around unix sockets for IPC on top of tokio.

tokio-unix-ipc This crate implements a minimal abstraction over UNIX domain sockets for the purpose of IPC on top of tokio.

Armin Ronacher 26 Nov 18, 2022
The goal of this challenge is to create an isometric, decorated scene in which the character can move around the objects in the room.

The goal of this challenge is to create an isometric, decorated scene in which the character can move around the objects in the room.

Ivan Reshetnikov 0 Feb 4, 2022
Modrinth API is a simple library for using Modrinth's API in Rust projects

Ferinth is a simple library for using the Modrinth API in Rust projects. It uses reqwest as its HTTP(S) client and deserialises responses to typed structs using serde.

null 20 Dec 8, 2022
The Safe Network Core. API message definitions, routing and nodes, client core api.

safe_network The Safe Network Core. API message definitions, routing and nodes, client core api. License This Safe Network repository is licensed unde

MaidSafe 101 Dec 19, 2022
Proxy copilot api to openai's gpt-4 api

Proxying Copilot API to OpenAI's GPT-4 API Usage Start the Server export GHU_TOKEN=ghu_xxxx; ./copilot2chat Or sh start.sh start # start the server th

Smark 3 Dec 6, 2023
Modular IPC-based desktop launcher service

Pop Launcher Modular IPC-based desktop launcher service, written in Rust. Desktop launchers may interface with this service via spawning the pop-launc

Pop!_OS 125 Dec 23, 2022
Open Internet Service to store transaction history for NFTs/Tokens on the Internet Computer

CAP - Certified Asset Provenance Transaction history & asset provenance for NFT’s & Tokens on the Internet Computer CAP is an open internet service pr

Psychedelic 42 Nov 10, 2022
Cover is an open internet service for canister code verification on the Internet Computer

Cover Cover (short for Code Verification) is an open internet service that helps verify the code of canisters on the Internet Computer. Visit our webs

Psychedelic 14 Oct 31, 2022
Prometheus instrumentation service for the NGINX RTMP module.

nginx-rtmp-exporter Prometheus instrumentation service for the NGINX RTMP module. Usage nginx-rtmp-exporter [OPTIONS] --scrape-url <SCRAPE_URL> O

kaylen ✨ 2 Jul 3, 2022
Simple CLI to manage your systemd clash.service and config subscriptions on Linux.

clashrup Simple CLI to manage your systemd clash.service and config subscriptions on Linux. Setup, update, apply overrides, and manage via systemctl.

Spencer (Shangbo Wu) 44 Jan 29, 2023
Docker daemon API in Rust

Bollard: an asynchronous rust client library for the docker API Bollard leverages the latest Hyper and Tokio improvements for an asynchronous API cont

Niel Drummond 439 Jan 3, 2023
A pure Rust implementation of WebRTC API

A pure Rust implementation of WebRTC API

WebRTC.rs 2.7k Jan 7, 2023
A rust client and structures to interact with the Clever-Cloud API.

Clever-Cloud Software Development Kit - Rust edition This crate provides structures and client to interact with the Clever-Cloud API. Status This crat

Clever Cloud 6 Jun 3, 2022
Revolt backend API server, built with Rust.

Delta Description Delta is a blazing fast API server built with Rust for Revolt. Features: Robust and efficient API routes for running a chat platform

Revolt 741 Dec 26, 2022
A wrapper for the Google Cloud DNS API

cloud-dns is a crate providing a client to interact with Google Cloud DNS v1

Embark 5 May 24, 2022
Obtain (wildcard) certificates from let's encrypt using dns-01 without the need for API access to your DNS provider.

Agnos Presentation Agnos is a single-binary program allowing you to easily obtain certificates (including wildcards) from Let's Encrypt using DNS-01 c

Arthur Carcano 246 Dec 20, 2022