SiamCafe.net Blog
Technology
ฝนวาเขาคก | SiamCafe Blog
2026-04-07· อ. บอม — SiamCafe.net· 8,899 คำ

Tailscale Mesh Network ?????????????????????

Tailscale ???????????? mesh VPN ?????????????????????????????? WireGuard protocol ???????????????????????????????????????????????????????????? network ????????????????????????????????????????????? peer-to-peer ?????????????????? ????????????????????????????????? central server ?????????????????????????????????????????? ????????????????????? configure firewall rules ???????????? port forwarding ??????????????? Tailscale ?????????????????? NAT traversal ????????????????????????????????????

?????????????????? production environment Tailscale ????????????????????????????????? Zero-config VPN ????????????????????? manage VPN server, End-to-end encryption ???????????? WireGuard (ChaCha20, Curve25519), MagicDNS ????????? hostname ????????? IP address, ACLs ?????????????????? access ????????????????????????????????????????????? port, SSO integration ??????????????????????????? identity provider (Okta, Azure AD, Google), Subnet routing ????????????????????? private networks ???????????? relay node, Exit nodes ????????????????????? VPN gateway

Tailscale ????????????????????????????????? Remote access ?????????????????? developers ????????????????????? internal services, Multi-cloud connectivity ?????????????????? AWS, GCP, Azure ?????????????????????????????????, Kubernetes cluster access ????????????????????? cluster ???????????????????????????, IoT device management ??????????????????????????????????????? IoT ???????????? network

????????????????????? Tailscale ?????????????????? Production

Setup Tailscale ??????????????????????????????????????? production

# === Tailscale Production Setup ===

# 1. Install on Linux (Ubuntu/Debian)
curl -fsSL https://tailscale.com/install.sh | sh

# Or manual install
curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/jammy.noarmor.gpg | \
  sudo tee /usr/share/keyrings/tailscale-archive-keyring.gpg > /dev/null
curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/jammy.tailscale-keyring.list | \
  sudo tee /etc/apt/sources.list.d/tailscale.list
sudo apt update && sudo apt install -y tailscale

# 2. Authenticate with Auth Key (headless/automation)
# Create auth key in Tailscale Admin Console
# Settings ??? Keys ??? Generate auth key
# Options: Reusable, Ephemeral, Pre-approved, Tagged

sudo tailscale up \
  --authkey=tskey-auth-xxxxx \
  --hostname=prod-web-01 \
  --advertise-tags=tag:production, tag:web \
  --accept-routes \
  --accept-dns

# 3. Docker Installation
cat > docker-compose.yml << 'EOF'
version: '3.8'
services:
  tailscale:
    image: tailscale/tailscale:latest
    hostname: prod-app-01
    environment:
      - TS_AUTHKEY=tskey-auth-xxxxx
      - TS_EXTRA_ARGS=--advertise-tags=tag:production
      - TS_STATE_DIR=/var/lib/tailscale
    volumes:
      - tailscale-state:/var/lib/tailscale
      - /dev/net/tun:/dev/net/tun
    cap_add:
      - net_admin
      - sys_module
    restart: unless-stopped

  app:
    image: myapp:latest
    network_mode: service:tailscale
    depends_on:
      - tailscale

volumes:
  tailscale-state:
EOF

# 4. Kubernetes (Tailscale Operator)
cat > tailscale-operator.yaml << 'EOF'
apiVersion: v1
kind: Secret
metadata:
  name: tailscale-auth
  namespace: tailscale
stringData:
  TS_AUTHKEY: tskey-auth-xxxxx
---
apiVersion: helm.cattle.io/v1
kind: HelmChart
metadata:
  name: tailscale-operator
  namespace: kube-system
spec:
  chart: tailscale-operator
  repo: https://pkgs.tailscale.com/helmcharts
  valuesContent: |-
    oauth:
      clientId: "xxxxx"
      clientSecret: "xxxxx"
EOF

# 5. Verify
tailscale status
tailscale netcheck
tailscale ping prod-db-01

echo "Tailscale production setup complete"

ACL ????????? Access Control

????????????????????? Access Control Lists ?????????????????? production

// === Tailscale ACL Policy ===
// File: policy.hujson (Tailscale ACL format)

{
  // Groups
  "groups": {
    "group:engineering": ["user1@company.com", "user2@company.com"],
    "group:devops": ["ops1@company.com", "ops2@company.com"],
    "group:management": ["manager@company.com"],
  },

  // Tag owners
  "tagOwners": {
    "tag:production": ["group:devops"],
    "tag:staging": ["group:devops", "group:engineering"],
    "tag:web": ["group:devops"],
    "tag:database": ["group:devops"],
    "tag:monitoring": ["group:devops"],
  },

  // ACL Rules
  "acls": [
    // DevOps: full access to all tagged servers
    {
      "action": "accept",
      "src": ["group:devops"],
      "dst": ["tag:production:*", "tag:staging:*"],
    },
    
    // Engineers: access staging, limited production
    {
      "action": "accept",
      "src": ["group:engineering"],
      "dst": ["tag:staging:*"],
    },
    {
      "action": "accept",
      "src": ["group:engineering"],
      "dst": ["tag:production:80,443"],  // HTTP/HTTPS only
    },
    
    // Web servers can reach databases
    {
      "action": "accept",
      "src": ["tag:web"],
      "dst": ["tag:database:5432,3306"],
    },
    
    // Monitoring can reach everything on metrics port
    {
      "action": "accept",
      "src": ["tag:monitoring"],
      "dst": ["tag:production:9090,9100,3000"],
    },
    
    // All tagged devices can reach DNS
    {
      "action": "accept",
      "src": ["tag:production", "tag:staging"],
      "dst": ["*:53"],
    },
  ],

  // SSH access rules
  "ssh": [
    {
      "action": "accept",
      "src": ["group:devops"],
      "dst": ["tag:production", "tag:staging"],
      "users": ["root", "ubuntu", "deploy"],
    },
    {
      "action": "accept",
      "src": ["group:engineering"],
      "dst": ["tag:staging"],
      "users": ["ubuntu"],
    },
  ],

  // Auto-approve settings
  "autoApprovers": {
    "routes": {
      "10.0.0.0/8": ["tag:production"],
      "172.16.0.0/12": ["tag:staging"],
    },
    "exitNode": ["tag:production"],
  },
}

Subnet Routing ????????? Exit Nodes

????????????????????? private networks ???????????? Tailscale

# === Subnet Routing & Exit Nodes ===

# 1. Subnet Router (expose private network to Tailscale)
# On the relay node (e.g., a VM in AWS VPC)
sudo tailscale up \
  --authkey=tskey-auth-xxxxx \
  --hostname=aws-subnet-router \
  --advertise-routes=10.0.0.0/16,172.31.0.0/16 \
  --advertise-tags=tag:production \
  --accept-dns

# Enable IP forwarding (required for subnet routing)
echo 'net.ipv4.ip_forward = 1' | sudo tee /etc/sysctl.d/99-tailscale.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
sudo sysctl -p /etc/sysctl.d/99-tailscale.conf

# 2. Exit Node (route all traffic through this node)
sudo tailscale up \
  --authkey=tskey-auth-xxxxx \
  --hostname=exit-node-sg \
  --advertise-exit-node \
  --advertise-tags=tag:production

# On client: use exit node
tailscale up --exit-node=exit-node-sg

# 3. Multi-Cloud Connectivity
cat > multi_cloud_setup.sh << 'BASH'
#!/bin/bash
# Setup Tailscale subnet routers in each cloud

# AWS VPC (10.0.0.0/16)
echo "AWS: Advertise 10.0.0.0/16"
# On AWS EC2 instance:
# tailscale up --advertise-routes=10.0.0.0/16 --hostname=aws-router

# GCP VPC (10.1.0.0/16)  
echo "GCP: Advertise 10.1.0.0/16"
# On GCP VM:
# tailscale up --advertise-routes=10.1.0.0/16 --hostname=gcp-router

# Azure VNet (10.2.0.0/16)
echo "Azure: Advertise 10.2.0.0/16"
# On Azure VM:
# tailscale up --advertise-routes=10.2.0.0/16 --hostname=azure-router

# On-premise (192.168.0.0/16)
echo "On-prem: Advertise 192.168.0.0/16"
# On on-prem server:
# tailscale up --advertise-routes=192.168.0.0/16 --hostname=onprem-router

echo "All clouds connected via Tailscale mesh"
BASH

# 4. High Availability Subnet Router
# Deploy 2 subnet routers for the same subnet
# Tailscale automatically fails over

# Router 1
sudo tailscale up \
  --advertise-routes=10.0.0.0/16 \
  --hostname=aws-router-1

# Router 2 (different AZ)
sudo tailscale up \
  --advertise-routes=10.0.0.0/16 \
  --hostname=aws-router-2

echo "HA subnet routing configured"

Automation ????????? Infrastructure as Code

?????????????????? Tailscale ???????????? Terraform ????????? Ansible

# === Tailscale Infrastructure as Code ===

# 1. Terraform Provider
cat > tailscale.tf << 'EOF'
terraform {
  required_providers {
    tailscale = {
      source  = "tailscale/tailscale"
      version = "~> 0.16"
    }
  }
}

provider "tailscale" {
  api_key = var.tailscale_api_key
  tailnet = var.tailnet_name
}

# Auth Key for production servers
resource "tailscale_tailnet_key" "production" {
  reusable      = true
  ephemeral     = true
  preauthorized = true
  tags          = ["tag:production"]
  expiry        = 7776000  # 90 days
}

# Auth Key for staging
resource "tailscale_tailnet_key" "staging" {
  reusable      = true
  ephemeral     = true
  preauthorized = true
  tags          = ["tag:staging"]
  expiry        = 2592000  # 30 days
}

# ACL Policy
resource "tailscale_acl" "policy" {
  acl = jsonencode({
    groups = {
      "group:devops"      = var.devops_users
      "group:engineering"  = var.engineering_users
    }
    acls = [
      {
        action = "accept"
        src    = ["group:devops"]
        dst    = ["tag:production:*"]
      },
      {
        action = "accept"
        src    = ["group:engineering"]
        dst    = ["tag:staging:*"]
      },
    ]
  })
}

# DNS settings
resource "tailscale_dns_nameservers" "default" {
  nameservers = ["8.8.8.8", "1.1.1.1"]
}

resource "tailscale_dns_preferences" "default" {
  magic_dns = true
}

output "production_auth_key" {
  value     = tailscale_tailnet_key.production.key
  sensitive = true
}
EOF

# 2. Ansible Playbook
cat > ansible/tailscale.yml << 'EOF'
---
- name: Deploy Tailscale
  hosts: all
  become: true
  vars:
    tailscale_authkey: "{{ lookup('env', 'TAILSCALE_AUTHKEY') }}"
  
  tasks:
    - name: Install Tailscale
      shell: curl -fsSL https://tailscale.com/install.sh | sh
      args:
        creates: /usr/bin/tailscale
    
    - name: Enable and start tailscaled
      systemd:
        name: tailscaled
        state: started
        enabled: true
    
    - name: Configure Tailscale
      command: >
        tailscale up
        --authkey={{ tailscale_authkey }}
        --hostname={{ inventory_hostname }}
        --advertise-tags={{ tailscale_tags | default('tag:production') }}
        --accept-routes
        --accept-dns
      register: ts_result
      changed_when: "'Success' in ts_result.stdout"
    
    - name: Verify connection
      command: tailscale status
      register: ts_status
    
    - name: Show status
      debug:
        msg: "{{ ts_status.stdout_lines[:5] }}"
EOF

echo "IaC configured"

Monitoring ????????? Troubleshooting

??????????????????????????????????????????????????? Tailscale network

#!/usr/bin/env python3
# tailscale_monitor.py ??? Tailscale Network Monitor
import json
import logging
from typing import Dict, List

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger("monitor")

class TailscaleMonitor:
    def __init__(self):
        pass
    
    def network_health(self):
        return {
            "tailnet": "company.tailnet.ts.net",
            "nodes": {
                "total": 45,
                "online": 42,
                "offline": 3,
                "ephemeral": 12,
            },
            "connectivity": {
                "direct_connections": 38,
                "relayed_connections": 4,
                "direct_pct": 90.5,
                "avg_latency_ms": 12,
            },
            "subnet_routes": [
                {"route": "10.0.0.0/16", "router": "aws-router-1", "status": "active"},
                {"route": "10.0.0.0/16", "router": "aws-router-2", "status": "standby"},
                {"route": "10.1.0.0/16", "router": "gcp-router-1", "status": "active"},
                {"route": "192.168.0.0/16", "router": "onprem-router", "status": "active"},
            ],
            "exit_nodes": [
                {"name": "exit-sg", "location": "Singapore", "status": "active"},
                {"name": "exit-us", "location": "US West", "status": "active"},
            ],
        }
    
    def troubleshooting_commands(self):
        return {
            "check_status": "tailscale status --json",
            "network_check": "tailscale netcheck",
            "ping_node": "tailscale ping ",
            "check_routes": "tailscale status --peers",
            "debug_log": "tailscale debug log",
            "check_derp": "tailscale netcheck --verbose",
            "ip_info": "tailscale ip -4",
            "dns_check": "tailscale dns status",
            "bugreport": "tailscale bugreport",
        }
    
    def common_issues(self):
        return {
            "connection_relayed": {
                "symptom": "Connection ???????????? DERP relay ????????? direct",
                "causes": ["Strict NAT/firewall", "UDP blocked", "Symmetric NAT"],
                "fixes": [
                    "???????????? UDP port 41641 outbound",
                    "???????????? firewall ???????????????????????? UDP",
                    "????????? tailscale netcheck ?????? NAT type",
                ],
            },
            "subnet_route_not_working": {
                "symptom": "????????????????????? subnet route ??????????????????",
                "causes": ["IP forwarding ??????????????????????????????", "Route ?????????????????? approve", "Firewall ?????? router"],
                "fixes": [
                    "sysctl net.ipv4.ip_forward=1",
                    "Approve route ?????? Admin Console",
                    "???????????? iptables/nftables ?????? router node",
                ],
            },
            "dns_resolution_failed": {
                "symptom": "MagicDNS ????????? resolve hostname",
                "fixes": [
                    "tailscale up --accept-dns",
                    "???????????? /etc/resolv.conf ?????? 100.100.100.100",
                    "Restart tailscaled",
                ],
            },
        }

monitor = TailscaleMonitor()
health = monitor.network_health()
print("Tailscale Network Health:")
print(f"  Nodes: {health['nodes']['online']}/{health['nodes']['total']} online")
print(f"  Direct: {health['connectivity']['direct_pct']}%, Latency: {health['connectivity']['avg_latency_ms']}ms")
print(f"  Subnet Routes: {len(health['subnet_routes'])}")

issues = monitor.common_issues()
print("\nCommon Issues:")
for name, info in issues.items():
    print(f"  {name}: {info['symptom']}")

FAQ ??????????????????????????????????????????

Q: Tailscale ????????? WireGuard ???????????????????????????????????????????

A: WireGuard ???????????? VPN protocol ??????????????????????????????????????????????????? ????????????????????? configure ????????? ???????????? key exchange, endpoint addresses, firewall rules, routing tables ???????????????????????? nodes ????????????????????? 5-10 ????????? Tailscale ????????????????????? WireGuard ?????????????????????????????????????????? NAT traversal ??????????????????????????? (????????????????????? port forward), Coordination server ?????????????????? key exchange, MagicDNS ????????? hostname ??????????????????, ACLs ?????????????????? access, SSO integration, Web admin console ????????????????????? Tailscale coordination server ???????????? SaaS (????????????????????? self-host ????????? Headscale), ??????????????????????????? personal use 100 devices, Business plan ??????????????? $6/user/month WireGuard ?????????????????????????????? ???????????? self-host ?????????????????????, ?????? nodes ????????????, ???????????? customize deep

Q: Tailscale ??????????????????????????????????????? production ??????????

A: ????????????????????? Tailscale ????????? WireGuard protocol ????????? proven ???????????? security (ChaCha20-Poly1305, Curve25519) Data plane traffic ???????????? peer-to-peer ????????????????????? Tailscale servers (?????????????????? DERP relay ??????????????? direct connection ?????????????????? ??????????????????????????? encrypted) Control plane ????????? Tailscale coordination server ?????????????????? key distribution ?????????????????? production ????????? ???????????? MFA ??????????????????????????? users, ????????? SSO (Okta/Azure AD), ???????????? ACLs ????????? least privilege, ????????? ephemeral keys ?????????????????? automated nodes, Enable Tailscale SSH ????????? SSH keys, Review audit logs ?????? Admin Console, ???????????? key expiry ????????????????????? 90 ?????????

Q: Headscale ????????????????????? ??????????????????????????? Tailscale ??????????

A: Headscale ???????????? open source self-hosted implementation ????????? Tailscale coordination server ????????? Tailscale clients ????????????????????? ????????? host control plane ????????? ??????????????? Self-hosted ????????????????????? ????????????????????? Tailscale SaaS, ????????? (open source), Data sovereignty ???????????????????????????????????? infrastructure ?????????????????? ????????????????????? ???????????? maintain ?????????, ??????????????? web admin UI ??????????????????????????? Tailscale (?????? Headscale-UI community), ??????????????? some features (Tailscale SSH, Funnel), ??????????????? support/SLA ????????? Headscale ??????????????? ???????????? self-host ????????????????????? (compliance), ?????????????????????????????????????????? Tailscale Business ????????? Tailscale ??????????????? ????????????????????????????????????????????????, ????????????????????? enterprise features, ?????? budget

Q: Tailscale ?????????????????? high availability ??????????

A: Tailscale mesh network ?????? HA ??????????????? ????????? node ???????????????????????? traffic route ?????? path ??????????????????????????????????????? ?????????????????? subnet routes deploy 2+ subnet routers ?????????????????? route ???????????????????????? Tailscale failover ??????????????????????????? (????????????????????? configure) ?????????????????? exit nodes deploy ???????????? exit nodes clients ??????????????? node ??????????????????????????????????????????????????? failover Tailscale coordination server ????????????????????? Tailscale Inc. ?????? HA (99.9%+ uptime) ????????? coordination server ????????? existing connections ????????????????????????????????? ???????????????????????????????????? add/remove nodes ???????????????????????? ?????????????????? critical production ??????????????? fallback connectivity (???????????? IPsec VPN) ????????????????????????????????? Tailscale

📖 บทความที่เกี่ยวข้อง

aws penetration testing servicesอ่านบทความ → AWS Step Functions Post-mortem Analysisอ่านบทความ → các sàn giao dịch crypto uy tínอ่านบทความ → Data Lakehouse Code Review Best Practiceอ่านบทความ → if else javascript คืออ่านบทความ →

📚 ดูบทความทั้งหมด →