feat(netlab): support TAILSCALE_AUTHKEY for headless cloud-init deployment
This commit is contained in:
@@ -36,6 +36,7 @@ check_debian() {
|
|||||||
HOSTNAME="${NETLAB_HOSTNAME:-netlab}"
|
HOSTNAME="${NETLAB_HOSTNAME:-netlab}"
|
||||||
SSH_PORT="${SSH_PORT:-15222}"
|
SSH_PORT="${SSH_PORT:-15222}"
|
||||||
TIMEZONE="${TZ:-Europe/Paris}"
|
TIMEZONE="${TZ:-Europe/Paris}"
|
||||||
|
TAILSCALE_AUTHKEY="${TAILSCALE_AUTHKEY:-}"
|
||||||
|
|
||||||
main() {
|
main() {
|
||||||
log_info "=== Network Lab Server Deployment ==="
|
log_info "=== Network Lab Server Deployment ==="
|
||||||
@@ -55,7 +56,11 @@ main() {
|
|||||||
curl -fsSL https://tailscale.com/install.sh | sh
|
curl -fsSL https://tailscale.com/install.sh | sh
|
||||||
|
|
||||||
log_info "Connecting to Tailscale..."
|
log_info "Connecting to Tailscale..."
|
||||||
sudo tailscale up --ssh --advertise-exit-node
|
if [[ -n "$TAILSCALE_AUTHKEY" ]]; then
|
||||||
|
sudo tailscale up --ssh --advertise-exit-node --auth-key="$TAILSCALE_AUTHKEY"
|
||||||
|
else
|
||||||
|
sudo tailscale up --ssh --advertise-exit-node
|
||||||
|
fi
|
||||||
|
|
||||||
log_info "Configuring sysctl for exit-node and containerlab support..."
|
log_info "Configuring sysctl for exit-node and containerlab support..."
|
||||||
cat << EOF | sudo tee /etc/sysctl.d/99-netlab.conf > /dev/null
|
cat << EOF | sudo tee /etc/sysctl.d/99-netlab.conf > /dev/null
|
||||||
@@ -77,7 +82,6 @@ EOF
|
|||||||
sudo usermod -aG docker "$USER"
|
sudo usermod -aG docker "$USER"
|
||||||
|
|
||||||
log_info "Configuring SSH on port $SSH_PORT..."
|
log_info "Configuring SSH on port $SSH_PORT..."
|
||||||
# Create drop-in config for custom SSH port
|
|
||||||
sudo mkdir -p /etc/ssh/sshd_config.d
|
sudo mkdir -p /etc/ssh/sshd_config.d
|
||||||
cat << EOF | sudo tee /etc/ssh/sshd_config.d/99-netlab.conf > /dev/null
|
cat << EOF | sudo tee /etc/ssh/sshd_config.d/99-netlab.conf > /dev/null
|
||||||
# Custom SSH port for public access
|
# Custom SSH port for public access
|
||||||
@@ -91,15 +95,12 @@ EOF
|
|||||||
sudo ufw --force reset > /dev/null
|
sudo ufw --force reset > /dev/null
|
||||||
sudo ufw default deny incoming > /dev/null
|
sudo ufw default deny incoming > /dev/null
|
||||||
sudo ufw default allow outgoing > /dev/null
|
sudo ufw default allow outgoing > /dev/null
|
||||||
# Allow custom SSH port from public internet
|
|
||||||
sudo ufw allow ${SSH_PORT}/tcp > /dev/null
|
sudo ufw allow ${SSH_PORT}/tcp > /dev/null
|
||||||
# Allow all traffic on Tailscale interface
|
|
||||||
sudo ufw allow in on tailscale0 > /dev/null
|
sudo ufw allow in on tailscale0 > /dev/null
|
||||||
# Temporarily allow SSH port 22 during setup (safety net)
|
# Temporarily allow SSH port 22 during setup (safety net)
|
||||||
sudo ufw allow 22/tcp > /dev/null
|
sudo ufw allow 22/tcp > /dev/null
|
||||||
sudo ufw --force enable > /dev/null
|
sudo ufw --force enable > /dev/null
|
||||||
|
|
||||||
# Schedule SSH port 22 rule removal in 5 minutes
|
|
||||||
log_warn "SSH port 22 temporarily open for 5 minutes (safety net)."
|
log_warn "SSH port 22 temporarily open for 5 minutes (safety net)."
|
||||||
log_warn "Verify Tailscale SSH or custom port ${SSH_PORT} works, then wait or run: sudo ufw delete allow 22/tcp"
|
log_warn "Verify Tailscale SSH or custom port ${SSH_PORT} works, then wait or run: sudo ufw delete allow 22/tcp"
|
||||||
echo "sudo ufw delete allow 22/tcp && logger 'UFW: SSH port 22 closed by scheduled task'" | sudo at now + 5 minutes 2>/dev/null || {
|
echo "sudo ufw delete allow 22/tcp && logger 'UFW: SSH port 22 closed by scheduled task'" | sudo at now + 5 minutes 2>/dev/null || {
|
||||||
@@ -107,7 +108,6 @@ EOF
|
|||||||
log_warn " sudo ufw delete allow 22/tcp"
|
log_warn " sudo ufw delete allow 22/tcp"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Configure MOTD
|
|
||||||
log_info "Configuring MOTD..."
|
log_info "Configuring MOTD..."
|
||||||
sudo chmod -x /etc/update-motd.d/* 2>/dev/null || true
|
sudo chmod -x /etc/update-motd.d/* 2>/dev/null || true
|
||||||
|
|
||||||
@@ -119,7 +119,6 @@ TS_FQDN=$(tailscale status --json 2>/dev/null | awk -F'"' '
|
|||||||
')
|
')
|
||||||
[[ -z "$TS_FQDN" ]] && TS_FQDN="$(hostname).ts.net"
|
[[ -z "$TS_FQDN" ]] && TS_FQDN="$(hostname).ts.net"
|
||||||
|
|
||||||
# Get configured SSH port from sshd config
|
|
||||||
SSH_PORT=$(grep -h "^Port " /etc/ssh/sshd_config.d/*.conf 2>/dev/null | awk '{print $2}' | head -1)
|
SSH_PORT=$(grep -h "^Port " /etc/ssh/sshd_config.d/*.conf 2>/dev/null | awk '{print $2}' | head -1)
|
||||||
[[ -z "$SSH_PORT" ]] && SSH_PORT="22"
|
[[ -z "$SSH_PORT" ]] && SSH_PORT="22"
|
||||||
|
|
||||||
@@ -131,7 +130,7 @@ echo "| |\ | |___ | | | |___ / ___ \| |_) |"
|
|||||||
echo "|_| \_|_____| |_| |_____/_/ \_\____/"
|
echo "|_| \_|_____| |_| |_____/_/ \_\____/"
|
||||||
echo ""
|
echo ""
|
||||||
echo "ContainerLab Network Lab Server"
|
echo "ContainerLab Network Lab Server"
|
||||||
echo "─────────────────────────────────────────"
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||||
echo "Access:"
|
echo "Access:"
|
||||||
echo " • SSH (public) : port ${SSH_PORT}"
|
echo " • SSH (public) : port ${SSH_PORT}"
|
||||||
echo " • SSH (Tailscale) : ${TS_FQDN}"
|
echo " • SSH (Tailscale) : ${TS_FQDN}"
|
||||||
@@ -143,21 +142,20 @@ echo "Useful commands:"
|
|||||||
echo " containerlab deploy -t <topology>.clab.yml"
|
echo " containerlab deploy -t <topology>.clab.yml"
|
||||||
echo " containerlab inspect --all"
|
echo " containerlab inspect --all"
|
||||||
echo " containerlab destroy -t <topology>.clab.yml"
|
echo " containerlab destroy -t <topology>.clab.yml"
|
||||||
echo "─────────────────────────────────────────"
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||||
echo ""
|
echo ""
|
||||||
MOTD
|
MOTD
|
||||||
sudo chmod +x /etc/update-motd.d/00-netlab
|
sudo chmod +x /etc/update-motd.d/00-netlab
|
||||||
|
|
||||||
# Get Tailscale hostname for display
|
|
||||||
TS_FQDN=$(tailscale status --json 2>/dev/null | awk -F'"' '
|
TS_FQDN=$(tailscale status --json 2>/dev/null | awk -F'"' '
|
||||||
/"Self"/ { in_self=1 }
|
/"Self"/ { in_self=1 }
|
||||||
in_self && /"DNSName"/ { gsub(/\.$/, "", $4); print $4; exit }
|
in_self && /"DNSName"/ { gsub(/\.$/, "", $4); print $4; exit }
|
||||||
' || echo "${HOSTNAME}.ts.net")
|
' || echo "${HOSTNAME}.ts.net")
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
log_info "=========================================="
|
log_info "======================================================"
|
||||||
log_info "Deployment complete!"
|
log_info "Deployment complete!"
|
||||||
log_info "=========================================="
|
log_info "======================================================"
|
||||||
echo ""
|
echo ""
|
||||||
echo "Access:"
|
echo "Access:"
|
||||||
echo " - Public SSH: ssh -p ${SSH_PORT} ${USER}@<public-ip>"
|
echo " - Public SSH: ssh -p ${SSH_PORT} ${USER}@<public-ip>"
|
||||||
|
|||||||
Reference in New Issue
Block a user