Tailscale Cheatsheet¶
Tailscale ist eine moderne VPN-Lösung auf WireGuard, die sichere, verschlüsselte Netzwerke zwischen Geräten ohne die Komplexität traditioneller VPN-Setups schafft. Es bietet Null-Konfigurations-Netzwerke mit automatischer Schlüsselverwaltung, NAT-Traversal und nahtlose Verbindungen über verschiedene Netzwerke und Plattformen.
Überblick¶
Architektur und Design Philosophie¶
Tailscale arbeitet an einem Netznetzwerkmodell, bei dem jedes Gerät direkt mit anderen verbindet, wenn es möglich ist, zurück zu Relaisservern (DERP) fallen, wenn direkte Verbindungen nicht möglich sind. Der Service behandelt alle komplexen Netzwerke automatisch, einschließlich NAT-Traversal, Firewall-Konfiguration und Schlüsseldrehung.
Der Tailscale Koordinationsserver verwaltet Geräteauthentifizierung, Schlüsselverteilung und Netzwerktopologie, während der tatsächliche Datenverkehr direkt zwischen Geräten mit WireGuard-Verschlüsselung fließt. Dieser Ansatz bietet sowohl Sicherheit als auch Leistung bei gleichzeitiger einfacher Nutzung.
Schlüsselmerkmale¶
```bash
Core Tailscale Capabilities¶
- WireGuard-based encryption and performance
- Zero-configuration mesh networking
- Automatic NAT traversal and firewall handling
- Cross-platform support (Windows, macOS, Linux, iOS, Android)
- Magic DNS for easy device discovery
- Subnet routing and exit nodes
- Access control lists (ACLs) for fine-grained permissions
- SSO integration with major identity providers
- Audit logging and network monitoring ```_
Installation und Inbetriebnahme¶
Linux Installation¶
```bash
Install on Ubuntu/Debian¶
curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/focal.noarmor.gpg|sudo tee /usr/share/keyrings/tailscale-archive-keyring.gpg >/dev/null curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/focal.list|sudo tee /etc/apt/sources.list.d/tailscale.list sudo apt update sudo apt install tailscale
Install on CentOS/RHEL/Fedora¶
sudo dnf config-manager --add-repo https://pkgs.tailscale.com/stable/centos/8/tailscale.repo sudo dnf install tailscale
Install on Arch Linux¶
sudo pacman -S tailscale
Start and enable Tailscale service¶
sudo systemctl enable --now tailscaled
Authenticate and connect to your network¶
sudo tailscale up
Check status¶
tailscale status
Get your device's Tailscale IP¶
tailscale ip -4 tailscale ip -6
View network map¶
tailscale netmap
Check connection quality¶
tailscale ping
Enable SSH access through Tailscale¶
sudo tailscale up --ssh
Set up as exit node¶
sudo tailscale up --advertise-exit-node
Accept routes from other devices¶
sudo tailscale up --accept-routes
Set custom hostname¶
sudo tailscale up --hostname=my-server ```_
Windows Installation¶
```powershell
Download and install Tailscale for Windows¶
$TailscaleUrl = "https://pkgs.tailscale.com/stable/tailscale-setup-latest.exe" \(TailscaleInstaller = "\)env:TEMP\tailscale-setup.exe"
Invoke-WebRequest -Uri $TailscaleUrl -OutFile $TailscaleInstaller Start-Process -FilePath $TailscaleInstaller -Wait
Connect to network (run as administrator)¶
tailscale up
Check status¶
tailscale status
Enable as exit node¶
tailscale up --advertise-exit-node
Configure Windows firewall for Tailscale¶
New-NetFirewallRule -DisplayName "Tailscale" -Direction Inbound -Protocol UDP -LocalPort 41641 -Action Allow New-NetFirewallRule -DisplayName "Tailscale" -Direction Outbound -Protocol UDP -LocalPort 41641 -Action Allow
Set up automatic startup¶
$TailscaleService = Get-Service -Name "Tailscale" Set-Service -Name "Tailscale" -StartupType Automatic
PowerShell script for automated deployment¶
\(TailscaleConfig = @" \\\\{ "AuthKey": "\)env:TAILSCALE_AUTHKEY", "Hostname": "$env:COMPUTERNAME-tailscale", "AdvertiseExitNode": false, "AcceptRoutes": true \\} "@
\(TailscaleConfig|Out-File -FilePath "\)env:ProgramData\Tailscale\config.json" ```_
macOS Installation¶
```bash
Install via Homebrew¶
brew install tailscale
Or download from Mac App Store¶
https://apps.apple.com/us/app/tailscale/id1475387142¶
Start Tailscale¶
sudo tailscale up
Check status¶
tailscale status
Configure as exit node¶
sudo tailscale up --advertise-exit-node
Enable SSH access¶
sudo tailscale up --ssh
macOS-specific network configuration¶
Allow Tailscale through macOS firewall¶
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --add /Applications/Tailscale.app/Contents/MacOS/Tailscale sudo /usr/libexec/ApplicationFirewall/socketfilterfw --unblockapp /Applications/Tailscale.app/Contents/MacOS/Tailscale
Configure launch daemon for automatic startup¶
sudo launchctl load /Library/LaunchDaemons/com.tailscale.tailscaled.plist ```_
Mobile Device Setup¶
```bash
iOS Setup¶
1. Download Tailscale from App Store¶
2. Sign in with your account¶
3. Device automatically appears in admin console¶
Android Setup¶
1. Download from Google Play Store¶
2. Sign in with your account¶
3. Grant VPN permissions when prompted¶
Generate auth keys for automated mobile deployment¶
tailscale up --authkey=tskey-auth-xxxxxx-xxxxxx
Create reusable auth key (admin console or API)¶
curl -X POST \ -H "Authorization: Bearer \(TAILSCALE_API_KEY" \ -H "Content-Type: application/json" \ -d '\\\\{"capabilities": \\\\{"devices": \\\\{"create": \\\\{"reusable": true, "ephemeral": false\\\\}\\\\}\\\\}\\\\}' \ https://api.tailscale.com/api/v2/tailnet/\)TAILNET/keys
Mobile device management via MDM¶
Example configuration for iOS/Android MDM systems¶
\\{ "authKey": "tskey-auth-xxxxxx-xxxxxx", "hostname": "mobile-device-001", "acceptRoutes": true, "exitNode": "exit-node-hostname" \\} ```_
Netzwerkkonfiguration¶
Subnet Routing¶
```bash
Advertise subnet routes¶
sudo tailscale up --advertise-routes=192.168.1.0/24,10.0.0.0/8
Accept subnet routes from other devices¶
sudo tailscale up --accept-routes
View available routes¶
tailscale status --peers
Enable IP forwarding (Linux)¶
echo 'net.ipv4.ip_forward = 1'|sudo tee -a /etc/sysctl.conf echo 'net.ipv6.conf.all.forwarding = 1'|sudo tee -a /etc/sysctl.conf sudo sysctl -p
Configure iptables for subnet routing¶
sudo iptables -t nat -A POSTROUTING -s 100.64.0.0/10 -o eth0 -j MASQUERADE sudo iptables -A FORWARD -i tailscale0 -j ACCEPT sudo iptables -A FORWARD -o tailscale0 -j ACCEPT
Persistent iptables rules (Ubuntu/Debian)¶
sudo iptables-save|sudo tee /etc/iptables/rules.v4
Advanced routing configuration¶
Route specific traffic through Tailscale¶
sudo ip route add 192.168.100.0/24 dev tailscale0
Set up policy-based routing¶
sudo ip rule add from 100.64.0.0/10 table 100 sudo ip route add default dev tailscale0 table 100
Configure multiple subnet advertisements¶
cat > /etc/tailscale/subnet-config.sh << 'EOF'
!/bin/bash¶
SUBNETS="192.168.1.0/24,10.0.0.0/16,172.16.0.0/12" tailscale up --advertise-routes=$SUBNETS --accept-routes EOF
chmod +x /etc/tailscale/subnet-config.sh ```_
Exit Nodes¶
```bash
Set up device as exit node¶
sudo tailscale up --advertise-exit-node
Use another device as exit node¶
tailscale up --exit-node=exit-node-hostname
Use exit node with specific IP¶
tailscale up --exit-node=100.64.0.1
Disable exit node usage¶
tailscale up --exit-node=""
List available exit nodes¶
tailscale status --peers|grep "exit node"
Configure exit node with specific routes¶
sudo tailscale up --advertise-exit-node --advertise-routes=0.0.0.0/0,::/0
Exit node health monitoring¶
cat > /usr/local/bin/tailscale-exit-node-monitor.sh << 'EOF'
!/bin/bash¶
LOG_FILE="/var/log/tailscale-exit-node.log"
check_exit_node() \\{ if tailscale status|grep -q "exit node"; then echo "$(date): Exit node is active" >> \(LOG_FILE return 0 else echo "\)(date): Exit node is not active, restarting..." >> $LOG_FILE sudo tailscale up --advertise-exit-node return 1 fi \\}
check_connectivity() \\{ if ping -c 1 8.8.8.8 >/dev/null 2>&1; then echo "$(date): Internet connectivity OK" >> \(LOG_FILE return 0 else echo "\)(date): Internet connectivity failed" >> $LOG_FILE return 1 fi \\}
main() \\{ check_exit_node check_connectivity \\}
main EOF
chmod +x /usr/local/bin/tailscale-exit-node-monitor.sh
Add to crontab for monitoring¶
echo "*/5 * * * * /usr/local/bin/tailscale-exit-node-monitor.sh"|crontab - ```_
Magic DNS Konfiguration¶
```bash
Enable Magic DNS (usually enabled by default)¶
tailscale up --accept-dns
Disable Magic DNS¶
tailscale up --accept-dns=false
Configure custom DNS servers¶
tailscale up --accept-dns --dns=1.1.1.1,8.8.8.8
View DNS configuration¶
tailscale status --json|jq '.DNSConfig'
Test Magic DNS resolution¶
nslookup device-name.tailnet-name.ts.net dig device-name.tailnet-name.ts.net
Configure split DNS¶
Add to /etc/systemd/resolved.conf (Linux)¶
[Resolve] DNS=100.100.100.100 Domains=~tailnet-name.ts.net
Restart systemd-resolved¶
sudo systemctl restart systemd-resolved
Custom DNS configuration for specific domains¶
cat > /etc/tailscale/dns-config.json ``<< 'EOF' \{ "nameservers": ["1.1.1.1", "8.8.8.8"], "domains": ["company.local"], "routes": \{ "company.local": ["192.168.1.1"], "internal.corp": ["10.0.0.1"] \} \} EOF ```_
Zugriffskontrolle und Sicherheit¶
Zugangskontrolllisten (ACLs)¶
```json // Example ACL configuration (tailnet policy file) \{ "tagOwners": \{ "tag:server": ["user@company.com"], "tag:client": ["group:employees"], "tag:admin": ["user@company.com"] \},
"groups": \{ "group:employees": ["user1@company.com", "user2@company.com"], "group:admins": ["admin@company.com"], "group:servers": ["tag:server"] \},
"acls": [ \{ "action": "accept", "src": ["group:employees"], "dst": ["tag:server:22", "tag:server:80", "tag:server:443"] \}, \{ "action": "accept", "src": ["group:admins"], "dst": [":"] \}, \{ "action": "accept", "src": ["tag:server"], "dst": ["tag:server:*"] \} ],
"hosts": \{ "database-server": "100.64.0.10", "web-server": "100.64.0.20", "admin-workstation": "100.64.0.30" \},
"autoApprovers": \{ "routes": \{ "192.168.1.0/24": ["tag:server"], "10.0.0.0/8": ["group:admins"] \}, "exitNode": ["tag:server"] \} \} ```_
Authentifizierung und SSO¶
```bash
Configure SSO with Google Workspace¶
(Done through Tailscale admin console)¶
Settings >`` SSO > Add Identity Provider¶
Configure SAML SSO¶
Upload SAML metadata or configure manually:¶
- Entity ID: https://login.tailscale.com/saml/acs¶
- ACS URL: https://login.tailscale.com/saml/acs¶
- Attribute mapping: email, displayName¶
Configure OIDC/OAuth¶
Provider: Custom OIDC¶
Client ID: your-client-id¶
Client Secret: your-client-secret¶
Issuer URL: https://your-provider.com¶
Force re-authentication¶
tailscale logout tailscale up
Configure device authorization¶
Require approval for new devices¶
Settings > Device Approval > Require approval¶
Set up device tags for automated approval¶
tailscale up --authkey=tskey-auth-xxxxxx --advertise-tags=tag:server
Configure session recording (enterprise feature)¶
Settings > Session Recording > Enable¶
Specify recording targets and retention policies¶
Multi-factor authentication¶
Configured at identity provider level¶
Tailscale inherits MFA requirements from SSO provider¶
```_
Schlüsselverwaltung¶
```bash
View device keys¶
tailscale status --json|jq '.Peer[].Key'
Rotate machine key¶
sudo tailscale up --force-reauth
Generate auth keys via API¶
curl -X POST \ -H "Authorization: Bearer \(TAILSCALE_API_KEY" \ -H "Content-Type: application/json" \ -d '\\\\{ "capabilities": \\\\{ "devices": \\\\{ "create": \\\\{ "reusable": false, "ephemeral": true, "preauthorized": true, "tags": ["tag:server"] \\\\} \\\\} \\\\}, "expirySeconds": 3600 \\\\}' \ https://api.tailscale.com/api/v2/tailnet/\)TAILNET/keys
Revoke auth key¶
curl -X DELETE \ -H "Authorization: Bearer \(TAILSCALE_API_KEY" \ https://api.tailscale.com/api/v2/tailnet/\)TAILNET/keys/$KEY_ID
Configure key expiry¶
tailscale up --authkey=tskey-auth-xxxxxx --timeout=24h
Backup and restore device configuration¶
Export device configuration¶
tailscale status --json > tailscale-backup.json
Key rotation automation script¶
cat > /usr/local/bin/tailscale-key-rotation.sh << 'EOF'
!/bin/bash¶
LOG_FILE="/var/log/tailscale-key-rotation.log" ROTATION_INTERVAL_DAYS=30
check_key_age() \\{ LAST_ROTATION=\((tailscale status --json|jq -r '.Self.LastSeen') CURRENT_TIME=\)(date +%s) LAST_ROTATION_TIME=\((date -d "\)LAST_ROTATION" +%s) AGE_DAYS=$(( (CURRENT_TIME - LAST_ROTATION_TIME) / 86400 ))
if [ $AGE_DAYS -gt $ROTATION_INTERVAL_DAYS ]; then
echo "$(date): Key is $AGE_DAYS days old, rotating..." >> $LOG_FILE
return 0
else
echo "$(date): Key is $AGE_DAYS days old, no rotation needed" >> $LOG_FILE
return 1
fi
\\}
rotate_key() \\{ echo "$(date): Starting key rotation" >> \(LOG_FILE sudo tailscale up --force-reauth --authkey=\)TAILSCALE_AUTHKEY if [ \(? -eq 0 ]; then echo "\)(date): Key rotation successful" >> \(LOG_FILE else echo "\)(date): Key rotation failed" >> $LOG_FILE fi \\}
if check_key_age; then rotate_key fi EOF
chmod +x /usr/local/bin/tailscale-key-rotation.sh ```_
Überwachung und Fehlerbehebung¶
Netzwerkdiagnose¶
```bash
Check Tailscale status¶
tailscale status
Detailed status with JSON output¶
tailscale status --json
Check connectivity to specific peer¶
tailscale ping device-name
Network map and topology¶
tailscale netmap
Debug connection issues¶
tailscale debug --help
Check DERP (relay) server connectivity¶
tailscale netcheck
View logs¶
sudo journalctl -u tailscaled -f
Debug specific peer connection¶
tailscale debug peer-status
Check NAT traversal¶
tailscale debug derp-map
Network performance testing¶
tailscale debug ping
Capture network traffic for debugging¶
sudo tcpdump -i tailscale0 -w tailscale-debug.pcap
Check firewall rules affecting Tailscale¶
sudo iptables -L|grep tailscale sudo ufw status|grep tailscale
DNS troubleshooting¶
tailscale debug dns-config nslookup device-name.tailnet.ts.net 100.100.100.100 ```_
Leistungsüberwachung¶
```bash
Monitor Tailscale interface statistics¶
watch -n 1 'cat /proc/net/dev|grep tailscale'
Bandwidth monitoring¶
iftop -i tailscale0 nethogs tailscale0
Connection quality monitoring¶
cat > /usr/local/bin/tailscale-monitor.sh << 'EOF'
!/bin/bash¶
LOG_FILE="/var/log/tailscale-monitor.log" PEERS_FILE="/tmp/tailscale-peers.txt"
Get list of peers¶
tailscale status --peers > $PEERS_FILE
Monitor each peer¶
while read -r line; do if [[ \(line =~ ^([0-9.]+)[[:space:]]+([^[:space:]]+) ]]; then PEER_IP="\)\\{BASH_REMATCH[1]\\}" PEER_NAME="$\\{BASH_REMATCH[2]\\}"
# Ping test
PING_RESULT=$(tailscale ping $PEER_NAME 2>/dev/null|head -1)
# Log result
echo "$(date): $PEER_NAME ($PEER_IP) - $PING_RESULT" >> $LOG_FILE
fi
done < $PEERS_FILE
Check overall network health¶
NETCHECK_RESULT=\((tailscale netcheck 2>/dev/null) echo "\)(date): Network check - $NETCHECK_RESULT" >> $LOG_FILE EOF
chmod +x /usr/local/bin/tailscale-monitor.sh
Add to crontab for regular monitoring¶
echo "*/5 * * * * /usr/local/bin/tailscale-monitor.sh"|crontab -
Performance metrics collection¶
cat > /usr/local/bin/tailscale-metrics.sh << 'EOF'
!/bin/bash¶
METRICS_FILE="/var/log/tailscale-metrics.log"
Get interface statistics¶
RX_BYTES=\((cat /sys/class/net/tailscale0/statistics/rx_bytes) TX_BYTES=\)(cat /sys/class/net/tailscale0/statistics/tx_bytes) RX_PACKETS=\((cat /sys/class/net/tailscale0/statistics/rx_packets) TX_PACKETS=\)(cat /sys/class/net/tailscale0/statistics/tx_packets)
Get peer count¶
PEER_COUNT=$(tailscale status --peers|wc -l)
Log metrics¶
echo "\((date),\)RX_BYTES,\(TX_BYTES,\)RX_PACKETS,\(TX_PACKETS,\)PEER_COUNT" >> $METRICS_FILE EOF
chmod +x /usr/local/bin/tailscale-metrics.sh ```_
Probleme bei der Fehlerbehebung¶
```bash
Connection issues troubleshooting¶
1. Check if tailscaled is running¶
sudo systemctl status tailscaled
2. Restart Tailscale service¶
sudo systemctl restart tailscaled
3. Re-authenticate¶
tailscale logout tailscale up
4. Check firewall rules¶
sudo ufw status sudo iptables -L
5. Verify network connectivity¶
ping 8.8.8.8 tailscale netcheck
DNS resolution issues¶
1. Check DNS configuration¶
tailscale status --json|jq '.DNSConfig'
2. Test Magic DNS¶
nslookup device-name.tailnet.ts.net
3. Reset DNS configuration¶
sudo tailscale up --accept-dns=false sudo tailscale up --accept-dns
4. Check system DNS settings¶
cat /etc/resolv.conf systemd-resolve --status
Performance issues¶
1. Check for direct connections vs DERP relay¶
tailscale status|grep "relay"
2. Test different DERP regions¶
tailscale netcheck
3. Check for packet loss¶
tailscale ping device-name
4. Monitor bandwidth usage¶
iftop -i tailscale0
Authentication issues¶
1. Check auth key validity¶
tailscale up --authkey=tskey-auth-xxxxxx
2. Verify SSO configuration¶
Check admin console for SSO errors¶
3. Clear cached credentials¶
rm -rf ~/.config/tailscale/ sudo rm -rf /var/lib/tailscale/
4. Force re-authentication¶
tailscale up --force-reauth
Subnet routing issues¶
1. Verify IP forwarding is enabled¶
cat /proc/sys/net/ipv4/ip_forward
2. Check iptables rules¶
sudo iptables -t nat -L
3. Verify route advertisement¶
tailscale status|grep "subnets"
4. Test connectivity to subnet¶
ping 192.168.1.1 # Replace with actual subnet IP
Complete reset procedure¶
sudo systemctl stop tailscaled sudo rm -rf /var/lib/tailscale/ sudo systemctl start tailscaled tailscale up ```_
API und Automatisierung¶
Tailscale API Verwendung¶
```bash
Set up API access¶
export TAILSCALE_API_KEY="tskey-api-xxxxxx" export TAILNET="your-tailnet.ts.net"
List devices¶
curl -H "Authorization: Bearer \(TAILSCALE_API_KEY" \ https://api.tailscale.com/api/v2/tailnet/\)TAILNET/devices
Get device details¶
curl -H "Authorization: Bearer \(TAILSCALE_API_KEY" \ https://api.tailscale.com/api/v2/device/\)DEVICE_ID
Update device settings¶
curl -X POST \ -H "Authorization: Bearer \(TAILSCALE_API_KEY" \ -H "Content-Type: application/json" \ -d '\\\\{"name": "new-device-name"\\\\}' \ https://api.tailscale.com/api/v2/device/\)DEVICE_ID
Delete device¶
curl -X DELETE \ -H "Authorization: Bearer \(TAILSCALE_API_KEY" \ https://api.tailscale.com/api/v2/device/\)DEVICE_ID
Create auth key¶
curl -X POST \ -H "Authorization: Bearer \(TAILSCALE_API_KEY" \ -H "Content-Type: application/json" \ -d '\\\\{ "capabilities": \\\\{ "devices": \\\\{ "create": \\\\{ "reusable": true, "ephemeral": false, "preauthorized": true, "tags": ["tag:server"] \\\\} \\\\} \\\\}, "expirySeconds": 86400 \\\\}' \ https://api.tailscale.com/api/v2/tailnet/\)TAILNET/keys
Get ACL policy¶
curl -H "Authorization: Bearer \(TAILSCALE_API_KEY" \ https://api.tailscale.com/api/v2/tailnet/\)TAILNET/acl
Update ACL policy¶
curl -X POST \ -H "Authorization: Bearer \(TAILSCALE_API_KEY" \ -H "Content-Type: application/json" \ -d @acl-policy.json \ https://api.tailscale.com/api/v2/tailnet/\)TAILNET/acl ```_
Infrastruktur als Code¶
```yaml
Terraform configuration for Tailscale¶
terraform \\{ required_providers \\{ tailscale = \\{ source = "tailscale/tailscale" version = "~> 0.13" \\} \\} \\}
provider "tailscale" \\{ api_key = var.tailscale_api_key tailnet = var.tailnet \\}
Create auth key¶
resource "tailscale_tailnet_key" "server_key" \\{ reusable = true ephemeral = false preauthorized = true expiry = 86400 description = "Server deployment key"
tags = [ "tag: server", "tag: production" ] \\}
ACL policy¶
resource "tailscale_acl" "main" \\{ acl = jsonencode(\\{ tagOwners = \\{ "tag: server" = ["user@company.com"] "tag: client" = ["group:employees"] \\}
groups = \\\\{
"group: employees" = ["user1@company.com", "user2@company.com"]
"group: admins" = ["admin@company.com"]
\\\\}
acls = [
\\\\{
action = "accept"
src = ["group: employees"]
dst = ["tag: server:22", "tag:server:80", "tag:server:443"]
\\\\},
\\\\{
action = "accept"
src = ["group: admins"]
dst = ["*: *"]
\\\\}
]
\\}) \\}
DNS configuration¶
resource "tailscale_dns_nameservers" "main" \\{ nameservers = ["1.1.1.1", "8.8.8.8"] \\}
resource "tailscale_dns_search_paths" "main" \\{ search_paths = ["company.local", "internal.corp"] \\} ```_
Ansible Playbook¶
```yaml
Ansible playbook for Tailscale deployment¶
- name: Deploy Tailscale hosts: all become: yes vars: tailscale_authkey: "\\{\\{ vault_tailscale_authkey \\}\\}" tailscale_hostname: "\\{\\{ inventory_hostname \\}\\}-tailscale"
tasks: - name: Add Tailscale repository (Ubuntu/Debian) block: - name: Add Tailscale GPG key apt_key: url: https://pkgs.tailscale.com/stable/ubuntu/focal.noarmor.gpg state: present
- name: Add Tailscale repository
apt_repository:
repo: "deb https://pkgs.tailscale.com/stable/ubuntu focal main"
state: present
- name: Update package cache
apt:
update_cache: yes
when: ansible_os_family == "Debian"
- name: Add Tailscale repository (CentOS/RHEL)
yum_repository:
name: tailscale
description: Tailscale repository
baseurl: https://pkgs.tailscale.com/stable/centos/8/
gpgcheck: yes
gpgkey: https://pkgs.tailscale.com/stable/centos/8/repo.gpg
when: ansible_os_family == "RedHat"
- name: Install Tailscale
package:
name: tailscale
state: present
- name: Enable and start tailscaled service
systemd:
name: tailscaled
enabled: yes
state: started
- name: Connect to Tailscale network
command: >
tailscale up
--authkey=\\\\{\\\\{ tailscale_authkey \\\\}\\\\}
--hostname=\\\\{\\\\{ tailscale_hostname \\\\}\\\\}
--accept-routes
\\\\{% if tailscale_advertise_routes is defined %\\\\}
--advertise-routes=\\\\{\\\\{ tailscale_advertise_routes \\\\}\\\\}
\\\\{% endif %\\\\}
\\\\{% if tailscale_exit_node is defined %\\\\}
--advertise-exit-node
\\\\{% endif %\\\\}
register: tailscale_up_result
changed_when: "'Success' in tailscale_up_result.stdout"
- name: Enable IP forwarding (if advertising routes)
sysctl:
name: "\\\\{\\\\{ item \\\\}\\\\}"
value: "1"
state: present
reload: yes
loop:
- net.ipv4.ip_forward
- net.ipv6.conf.all.forwarding
when: tailscale_advertise_routes is defined or tailscale_exit_node is defined
- name: Configure iptables for subnet routing
iptables:
table: nat
chain: POSTROUTING
source: 100.64.0.0/10
out_interface: "\\\\{\\\\{ ansible_default_ipv4.interface \\\\}\\\\}"
jump: MASQUERADE
when: tailscale_advertise_routes is defined or tailscale_exit_node is defined
- name: Save iptables rules
shell: iptables-save > /etc/iptables/rules.v4
when: tailscale_advertise_routes is defined or tailscale_exit_node is defined
```_
Docker Integration¶
```dockerfile
Dockerfile with Tailscale¶
FROM ubuntu:20.04
Install Tailscale¶
RUN apt-get update && apt-get install -y curl gnupg && \ curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/focal.noarmor.gpg|apt-key add - && \ echo "deb https://pkgs.tailscale.com/stable/ubuntu focal main" > /etc/apt/sources.list.d/tailscale.list && \ apt-get update && apt-get install -y tailscale && \ rm -rf /var/lib/apt/lists/*
Copy startup script¶
COPY start-tailscale.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/start-tailscale.sh
Expose Tailscale port¶
EXPOSE 41641/udp
CMD ["/usr/local/bin/start-tailscale.sh"]
_
bash
Docker startup script¶
!/bin/bash¶
start-tailscale.sh¶
Start tailscaled in background¶
tailscaled --state=/var/lib/tailscale/tailscaled.state &
Wait for tailscaled to start¶
sleep 5
Connect to Tailscale network¶
tailscale up --authkey=\(TAILSCALE_AUTHKEY --hostname=\)HOSTNAME
Keep container running¶
tail -f /dev/null
_
yaml
Docker Compose with Tailscale¶
version: '3.8'
services: app-with-tailscale: build: . environment: - TAILSCALE_AUTHKEY=$\\{TAILSCALE_AUTHKEY\\} - HOSTNAME=docker-app volumes: - tailscale-data:/var/lib/tailscale cap_add: - NET_ADMIN devices: - /dev/net/tun sysctls: - net.ipv4.ip_forward=1 - net.ipv6.conf.all.forwarding=1
volumes: tailscale-data: ```_
Ressourcen¶
- [Tailscale Offizielle Website](LINK_5 -%20Schriftliche%20Dokumentation
- Tailscale GitHub Repository
- [WireGuard Protocol](LINK_5 -%20Nachhaltige%20API-Dokumentation