我已经运行了 Tailscale —— 一个 LXC 配置为子网路由器,将其余容器暴露在 tailnet 上。这样我就能远程访问它们了。但我仍然需要记住 IP 地址。
我想要 https://proxmox.home.lab:8006。我想要输入名称,而不是数字。
Tailscale App Connectors 成了答案。到达这个结果花费了比应该更长的时间,所以这里是真正有效的做法。
你最终会得到什么
一个 LXC 承担三项工作:子网路由器、应用连接器和 DNS 服务器。tailnet 上的任何设备都能将 <service>.home.lab 解析到正确的容器 IP,并自动路由流量。App Connectors 适用于 所有 Tailscale 方案 —— 请查看定价页面确认,因为方案会变化。
本指南假设你已经有一个 Tailscale LXC 作为子网路由器。如果没有,这个视频 演示了如何设置 —— 然后回到第 2 步,在其上添加应用连接器角色。
有三个值贯穿整个配置。 如果其中任何一个在步骤间不一致,就会出现无声的故障:
| 值 | 必须匹配的位置 |
|---|---|
标签名称(例如 tag:app-connector) |
ACL tagOwners、ACL nodeAttrs、ACL autoApprovers、tailscale up 命令 |
域名后缀(例如 home.lab) |
ACL domains 列表、dnsmasq 条目、Tailscale Apps 页面、split DNS 限制 |
LAN 子网(例如 192.168.1.0/24) |
ACL autoApprovers、tailscale up 命令、dnsmasq IP |
第 1 步:更新 Tailscale ACL 策略
前往 Tailscale 管理控制台 → Access Controls。你会看到一个 huJSON 编辑器,显示你当前的策略。不要替换它 —— 将这些部分作为顶级键合并进去。如果你已经有 grants 块,请在其中添加新规则,而不是创建第二个。
{
"tagOwners": {
"tag:app-connector": []
},
"grants": [
{ "src": ["*"], "dst": ["*"], "ip": ["*"] }
],
"autoApprovers": {
"routes": {
"0.0.0.0/0": ["tag:app-connector"],
"::/0": ["tag:app-connector"]
}
},
"nodeAttrs": [
{
"target": ["*"],
"app": {
"tailscale.com/app-connectors": [
{
"name": "[CHOOSE_NAME_FOR_THE_APP_CONNECTOR]",
"connectors": ["tag:app-connector"],
"domains": [
// whatever domains you need to expose
"proxmox.home.lab",
"homeassistant.home.lab"
]
}
]
}
}
]
}
Enter fullscreen mode Exit fullscreen mode
注意: nodeAttrs 中的 target 必须是 ["*"]。我首先尝试了 ["tag:app-connector"],但它不起作用。Tailscale 抛出错误:tailscale.com/app-connectors: can only be specified with target "*"。应用定义内部的 connectors 字段是你控制哪个节点执行工作的地方。target 控制哪些节点接收此配置,对于应用连接器,它必须是所有人。
第 2 步:将 LXC 配置为应用连接器
在安装 dnsmasq 之前,检查 systemd-resolved 是否正在占用端口 53 —— 如果是,dnsmasq 将无法启动:
systemctl is-active systemd-resolved
Enter fullscreen mode Exit fullscreen mode
如果处于活动状态,请禁用其存根监听器:
sed -i 's/#DNSStubListener=yes/DNSStubListener=no/' /etc/systemd/resolved.conf
systemctl restart systemd-resolved
Enter fullscreen mode Exit fullscreen mode
现在 SSH 到你的 Tailscale LXC 并通告其新角色:
tailscale up \
--advertise-connector \
--advertise-tags=tag:app-connector \
--advertise-routes=192.168.1.0/24
Enter fullscreen mode Exit fullscreen mode
将 192.168.1.0/24 替换为你的实际 LAN 子网。
注意: 该节点必须通过 --advertise-connector 明确选择加入。我花时间在管理控制台中寻找将节点指定为连接器的按钮 —— 但没有。节点通过 CLI 通告自己的角色。在你运行此命令之前,Apps UI 中不会显示任何可选择的内容。
验证是否成功: 前往管理控制台 → Machines。你的 LXC 现在应该在其旁边显示应用连接器徽章。
第 3 步:安装并配置 dnsmasq
应用连接器处理路由 —— 但它们不将域名解析为 IP。你需要一个本地 DNS 服务器来完成此操作。同一个 LXC 上的 dnsmasq 是最简单的选择。
apt update && apt install -y dnsmasq
Enter fullscreen mode Exit fullscreen mode
编辑 /etc/dnsmasq.conf 并追加:
# Without this, dnsmasq rejects queries from the Tailscale interface.
# The systemd unit passes --local-service which restricts to local subnets;
# adding interface=tailscale0 overrides that behaviour.
interface=tailscale0
bind-interfaces
# One line per container — use your actual LAN IPs
address=/proxmox.home.lab/192.168.1.2
address=/homeassistant.home.lab/192.168.1.3
Enter fullscreen mode Exit fullscreen mode
已经在使用 dnsmasq 进行 DHCP 或其他用途? 只需将
interface=tailscale0行添加到你现有的interface=行旁边,而不是替换它们。
启动并验证:
systemctl enable --now dnsmasq
systemctl status dnsmasq # should be active, no "limited to local subnets"
dig @127.0.0.1 proxmox.home.lab
# ANSWER SECTION should show your container's IP
Enter fullscreen mode Exit fullscreen mode
注意: 首次启动后,状态可能会显示 DNS service limited to local subnets。这来自 systemd unit 文件中内置的 --local-service —— 没有配置文件选项可以覆盖它。修复方法是 interface=tailscale0,它告诉 dnsmasq 接受 Tailscale 接口上的查询。重启后,警告消失。
第 4 步:在管理控制台中注册应用
管理控制台 → Apps → Add an app:
- Name: 任何描述性的名称
- Type: Custom
- Domains: 你的
home.lab域名,用逗号分隔(与第 1 步中的相同) - Connector tag:
tag:app-connector - Save
你会注意到域名同时出现在 ACL nodeAttrs 和这里。它们服务于不同的目的:ACL 控制路由策略(哪个节点处理哪些流量),而 Apps UI 注册 Tailscale 用于 DNS-over-HTTPS 转发的连接器关联。两者都需要相同的域名。
第 5 步:添加 Split DNS 名称服务器
管理控制台 → DNS → Add nameserver:
- Nameserver: 你的 LXC 的 tailnet IPv4 地址 ——
100.x.y.z那个(在 LXC 上运行tailscale ip -4) - 勾选 Restrict to domain
- Domain:
home.lab - Save
还要确保同一页面上的 Magic DNS 已开启。Split DNS 没有它就无法工作。
这告诉 Tailscale:对于 home.lab 下的任何内容,请询问这个特定的名称服务器。其余一切使用正常 DNS。
第 6 步:配置客户端
Linux:
tailscale set --accept-routes=true --accept-dns=true
Enter fullscreen mode Exit fullscreen mode
macOS 使用 GUI 应用:
Tailscale 菜单栏 → Preferences → 启用 Use Tailscale DNS。完成。
仅 macOS CLI(无 GUI 应用):
注意: macOS 上的 Tailscale CLI 无法管理系统 DNS。tailscale set --accept-dns=true 会静默接受该标志但不执行任何操作 —— CLI 没有机制在没有 GUI 应用的情况下安装所需的 Network Extension。tailscale debug resolve your-domain.home.lab 将返回 no such host,即使 netmap 显示路由已正确配置。
解决方法 —— 将你的 Wi-Fi DNS 手动指向 LXC:
sudo networksetup -setdnsservers Wi-Fi <LXC tailnet IPv4>
Enter fullscreen mode Exit fullscreen mode
要恢复:
sudo networksetup -setdnsservers Wi-Fi "Empty"
Enter fullscreen mode Exit fullscreen mode
访问你的服务
https://proxmox.home.lab:8006
http://homeassistant.home.lab:8123
Enter fullscreen mode Exit fullscreen mode
应用连接器不处理端口 —— 浏览器默认使用 80。对于不在 80 或 443 上运行的任何内容,请包含端口。如果你想完全删除端口,请在你的服务前面放置一个反向代理(Caddy 或 nginx)。
另一个注意事项:Chrome 的 DNS-over-HTTPS
这是跨平台的,不仅仅是 macOS。Chrome 有自己的 DoH,完全绕过系统 DNS。如果 dig 正确解析但 Chrome 说 "page can't be reached",这就是原因。
禁用它:Settings → Privacy and security → Security → Use secure DNS → off。
添加新容器
三个地方,都使用完全相同的域名:
-
dnsmasq 配置 —— 添加
address=/newservice.home.lab/<LAN IP>然后systemctl restart dnsmasq -
ACL nodeAttrs —— 将
"newservice.home.lab"添加到domains列表,保存 - 管理控制台 → Apps —— 编辑你的 homelab 应用,添加域名
故障排除
| 症状 | 修复 |
|---|---|
can only be specified with target "*" |
将 nodeAttrs 中的 "target": ["tag:app-connector"] 更改为 "target": ["*"] |
| dnsmasq 显示 "limited to local subnets" | 将 interface=tailscale0 + bind-interfaces 添加到 /etc/dnsmasq.conf,然后重启 |
| dnsmasq 无法启动 | 端口 53 冲突 —— 禁用 systemd-resolved 存根:sed -i 's/#DNSStubListener=yes/DNSStubListener=no/' /etc/systemd/resolved.conf && systemctl restart systemd-resolved |
dig @<LXC IP> service.home.lab 有效但系统 DNS 不起作用 |
macOS CLI 无法管理 split DNS —— 使用 GUI 应用或 sudo networksetup -setdnsservers Wi-Fi <LXC tailnet IPv4>
|
Chrome: "page can't be reached" 尽管 dig 已解析 |
禁用 Chrome 安全 DNS:Settings → Privacy and security → Security → Use secure DNS → off |
| 浏览器:任何浏览器的 "page can't be reached" | 缺少端口 —— 尝试 https://service.home.lab:<port>
|
| LXC 在管理控制台中未显示为应用连接器 | 在 LXC 上运行 tailscale up --advertise-connector --advertise-tags=tag:app-connector |
0 Comments
Log in to join the conversation.No comments yet. Be the first to share your thoughts.