Bashscript: How to Setup Zerotier Bridge / Routing

Bashscript: How to Setup Zerotier Bridge / Routing

Here a little helper script for easy setup your  Zerotier Node for accessing local LAN

#!/bin/bash
#
# Zerotier - Network Route and Bridge
#
# (c) 2022 suuhmer
#
# Infos /Source: 
# https://zerotier.atlassian.net/wiki/spaces/SD/pages/224395274/Route+between+ZeroTier+and+Physical+Networks
#

MODE=$1

echo " ============================================="
echo "* Zerotier-Helper.sh - Setup Route & Bridge   *"
echo "*                                             *"
echo "*                          (c) 2022 suuhmer   *"
echo " ============================================="
echo; sleep 2

# Installing and Join Setup
if [ "$1" == "--install" ]; then
   NETWORK_ID=XXXXXX

   echo "Installing first zerotier client..."; sleep 2
   curl -s https://install.zerotier.com | bash

   if [ -z $2 ]; then
      echo -n "No networkid entered, please set up now.."; read NETWORK_ID
   fi

   zerotier-cli join $NETWORK_ID
   zerotier-cli listnetworks

   echo "setup and installed.."
fi

setup_routing() {
   PHY_IFACE=$(route -4 | grep defaul | cut -d " " -f45);
   ZT_IFACE=$(ifconfig | grep -E "^zt" | cut -d ":" -f 1)

   sysctl -w net.ipv4.ip_forward=1

   echo "setup: Physical Interface: $PHY_IFACE and Zerotier IF: $ZT_IFACE"
   sleep 2; echo

   iptables -t nat -A POSTROUTING -o $PHY_IFACE -j MASQUERADE
   iptables -A FORWARD -i $PHY_IFACE -o $ZT_IFACE -m state --state RELATED,ESTABLISHED -j ACCEPT
   iptables -A FORWARD -i $ZT_IFACE -o $PHY_IFACE -j ACCEPT

   echo "finished"
}

# sudo apt install iptables-persistent
# sudo bash -c iptables-save > /etc/iptables/rules.v4

setup_bridging(){
   echo -n "No networkid entered, please set up now.."; read NETWORK_ID
   BR_IF="br0"
   echo -n "No Bridge Address entered, please set up now.."; read BR_ADDR
   echo -n "No Gateway Address entered, please set up now.."; read GW_ADDR
   PHY_IFACE=$(route -4 | grep defaul | cut -d " " -f45);
   ZT_IF=$(ifconfig | grep -E "^zt" | cut -d ":" -f 1)

   # setup no auto manage of routes tec
   zerotier-cli set $NETWORK_ID allowManaged=0

   echo "Remove somehting..."
   apt remove --purge --auto-remove dhcpcd5 fake-hwclock ifupdown isc-dhcp-client isc-dhcp-common openresolv

   ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf;
   systemctl enable systemd-networkd;
   systemctl enable systemd-resolved;
   systemctl enable systemd-timesyncd;

   #Setup bridge systemd files...
cat << EOF | tee /etc/systemd/network/25-bridge-br0.network
[Match]
Name=$BR_IF

[Network]
Address=$BR_ADDR
Gateway=$GW_ADDR
DNS=1.1.1.1
EOF

cat << EOF | tee /etc/systemd/network/br0.netdev
[NetDev]
Name=$BR_IF
Kind=bridge
EOF

cat << EOF | tee /etc/systemd/network/25-bridge-br0-zt.network
[Match]
Name=$ZT_IF

[Network]
Bridge=$BR_IF
EOF

cat << EOF | tee /etc/systemd/network/25-bridge-br0-en.network
[Match]
Name=$PHY_IFACE

[Network]
Bridge=$BR_IF
EOF

   echo "Review configs.."
   echo
   tail -n+0 /etc/systemd/network/*
   iptables -A FORWARD -p all -i br0 -j ACCEPT

   echo "Reboot press enter... "; read NULL;
   #reboot
}

#
## MAIN
#

if [ $MODE == "--set-routing" ]; then
   setup_routing
elif [ $MODE == "--set-bridge" ]; then
   setup_bridging
else
   echo "Wrong input / Help"
   echo "Setup help: $0 [--set-routing|--set-bridge] [--install <NETWORK-ID>]"
   exit 1
fi

exit 0