Internal DNS
Access team services by name. Simple and easy to remember.
Access services with easy names like api.internal:8080.
Using Internal DNS
Automatic Setup
Internal DNS is automatically configured when you connect. No extra steps needed.
Accessing Services
Once connected, access team services by name:
# Database
psql -h database.internal -U postgres
# API server
curl http://api.internal:8080/health
# Web app
open http://frontend.internal:3000
# SSH (if exposed)
ssh [email protected]
DNS Name Patterns
Simple Names
Each service gets a service.internal name:
database.internalapi.internalfrontend.internal
Team-Qualified Names
For disambiguation, you can also use team-qualified names:
api.acme-dev.internal
database.acme-dev.internal
Useful if you're connected to multiple teams (future feature).
Name Requirements
Service names must be valid DNS labels:
- 3-30 characters
- Lowercase letters, numbers, hyphens
- Start with a letter
- No spaces or special characters
Pick descriptive names like postgres-main or redis-cache. Other team members will thank you.
Viewing Team Services
See all services and their DNS names in the team dashboard at /team/your-team/services.
Troubleshooting
DNS not resolving
- Check the app is connected (green indicator)
- Try flushing DNS cache:
- macOS:
sudo dscacheutil -flushcache - Windows:
ipconfig /flushdns - Linux:
sudo systemd-resolve --flush-caches
- macOS:
Comparison with Tailscale MagicDNS
| Feature | VendTunnel | Tailscale MagicDNS |
|---|---|---|
| Name format | service.internal |
device.tailnet.ts.net |
| Setup | Automatic | Enable in admin |
| Custom names | You choose service name | Device hostname |
| External DNS | Forwarded to 8.8.8.8 | Forwarded to ISP |
Benefits
Easier to Remember
database.internal is easier to remember and type.
Stable Names
If someone rejoins with a different IP, their service name stays the same. Update configs automatically.
Self-Documenting
Looking at curl http://auth-service.internal/login tells you exactly what it does.
Config Portability
Application configs using internal DNS names work regardless of IP assignments.
Example: Docker Compose
Use internal DNS in your docker-compose.yml:
services:
web:
image: myapp
environment:
DATABASE_URL: postgres://user:[email protected]:5432/mydb
REDIS_URL: redis://cache.internal:6379
API_URL: http://api.internal:8080
When connected to the team network, these all resolve correctly.