1
wuhao OP 确实,Docker 容器与宿主机之间是隔离的,这意味着容器内部无法直接访问宿主机上安装的服务或获取其状态。对于你提到的 DERP_VERIFY_CLIENTS=true 需要 tailscale 服务支持,并且需要在登陆状态下使用,这就需要容器能够与宿主机上的 tailscale 服务通信。
下面是一些可能的解决方案: 使用 --network=host 参数: 将容器的网络设置为宿主机的网络。这样容器会直接使用宿主机的网络栈,从而可以访问宿主机上的服务。但请注意,这样做会失去 Docker 提供的网络隔离性。 bash docker run --network=host ... 设置端口转发: 如果 tailscale 服务在宿主机上监听某个端口,你可以将这个端口转发到容器内。这样容器就可以通过这个端口与 tailscale 通信。 bash docker run -p <宿主机端口>:<容器端口> ... 然后在容器内配置相应的地址和端口以连接 tailscale 服务。 使用 Docker Compose: 如果你使用 Docker Compose 来管理你的服务,你可以通过配置 extra_hosts 和网络选项来实现与宿主机的通信。 yaml version: '3' services: derp: image: your-derp-image environment: - DERP_VERIFY_CLIENTS=true extra_hosts: - "tailscale-host:<宿主机 IP>" networks: - your-custom-network networks: your-custom-network: driver: bridge 确保 <宿主机 IP> 是正确的,然后你可以在容器内部使用 tailscale-host 这个主机名来访问宿主机上的 tailscale 服务。 使用 Unix Socket: 如果 tailscale 提供了 Unix Socket 接口,并且你可以将这个 Socket 映射到容器内,那么容器可以通过这个 Socket 与 tailscale 通信。但请注意,Docker 官方文档中提到对 Unix Socket 的映射有一些限制和注意事项。 bash docker run -v /path/to/tailscale.sock:/path/in/container/tailscale.sock ... 然后配置你的 derp 服务来使用容器内的这个 Socket 文件。 检查文档和社区: 查看 derp 和 tailscale 的官方文档,看看是否有关于在 Docker 容器中使用的特定指南或建议。同时,也可以搜索相关的社区讨论或问题,看看其他用户是如何解决类似问题的。 考虑不使用 Docker: 如果以上方法都无法满足你的需求,或者你发现这些方法都太过复杂,你可能需要重新考虑是否使用 Docker 来部署你的 derp 服务。在某些情况下,直接在宿主机上运行服务可能会更简单和直接。 请注意,任何修改配置或网络设置的操作都需要小心谨慎,以确保不会破坏现有系统的安全性和稳定性。在进行任何更改之前,最好先备份重要的数据和配置。 文心大模型 3.5 生成 |
2
wuhao OP 上面是文心一言回复的。。。不小心发上来不知道咋删除了
|
3
wuhao OP 开启 DERP_VERIFY_CLIENTS=true 之后,日志就一直报错,服务也没办法使用了
2024/04/10 16:25:00 derp: 172.17.0.1:45904: client 6e6f64656b65793a66316637383761626232613634333437326663653531316632353638653562393738346263353233666333353163306430653266306331366433646633383661 rejected: failed to query local tailscaled status: Failed to connect to local Tailscale daemon for /localapi/v0/status; not running? Error: dial unix /var/run/tailscale/tailscaled.sock: connect: no such file or directory 2024/04/10 16:25:00 derp: 172.17.0.1:45906: client 6e6f64656b65793a66316637383761626232613634333437326663653531316632353638653562393738346263353233666333353163306430653266306331366433646633383661 rejected: failed to query local tailscaled status: Failed to connect to local Tailscale daemon for /localapi/v0/status; not running? Error: dial unix /var/run/tailscale/tailscaled.sock: connect: no such file or directory |
4
fortitudeZDY 212 天前 via iPhone
如果没记错的话,Derp 如果开启 verify ,是和本地的 tailscaled 基于 unix domain socket 通信的,你的日志里也提示了,所以如果你的 ts 不在一个容器就不行了,如果非要这样,可以考虑用 socat 连接下(我猜的)
|
5
wuhao OP @fortitudeZDY 你说的本地说在 docker 的 derp 容器里安装吗,derp 的 docker 很简陋装不进去啊
|
6
xubiaosunny 212 天前
映射 tailscale sock 文件就行。docker run 加上这条参数-v /var/run/tailscale/tailscaled.sock:/var/run/tailscale/tailscaled.sock 。
参考下: https://xubiaosunny.top/post/tailscale_deploy_and_custom_derp_servers_mzl3.html |
7
fortitudeZDY 212 天前 via iPhone 1
@wuhao 试试楼下等映射,如果你 ts 在另外一个 docker ,你把那个 docker 的 run 目录映射到宿主机
|
8
lany 212 天前
分享一下我的配置
version: '3.8' services: derp: image: fredliang/derper container_name: derp volumes: - /var/run/tailscaled.sock:/var/run/tailscaled.sock #把宿主机的 tailscaled.sock 文件映射到 docker 才能借宿主机的 tailscaled DERP_VERIFY_CLIENTS 功能来防止白嫖验证 - /opt/derper/certs:/app/certs #改证书所处目录 environment: - DERP_CERT_MODE=manual - DERP_ADDR=:443 - DERP_DOMAIN=derp.v2ex.com - DERP_VERIFY_CLIENTS=true #开启 tailscaled 客户端白嫖认证 ports: - 3443:443 - 3478:3478/udp restart: always |
9
lany 212 天前
补充一下 tailscale 的配置
version: '3.8' services: tailscale: image: tailscale/tailscale container_name: tailscale volumes: - /opt/tailscale/lib:/var/lib - /dev/net/tun:/dev/net/tun - /var/run/tailscaled.sock:/var/run/tailscaled.sock#把宿主机的 tailscaled.sock 文件映射到 docker ,连通 tailscaled 的 sock 文件 environment: - TS_AUTHKEY=tskey-auth-XXXXXXXXXXXXXXXXXXXXXXXXXX - TS_STATE_DIR=/var/lib/tailscale #如果不配置下次重启 docker 就会重新生成节点,原来的 IP 就不能用了 - TS_SOCKET=/var/run/tailscale/tailscaled.sock - TS_USERSPACE=0 #关闭用户空间网络模式,如果不关闭则需要使用 SOCKS5 或 HTTP 代理,现象为传入连接可以工作,但传出连接不行。见 https://hub.docker.com/r/tailscale/tailscale 描述 # - TS_ROUTES=局域网网段 # - 'TS_EXTRA_ARGS=--accept-routes --advertise-exit-node --reset' cap_add: - NET_ADMIN - NET_RAW restart: always network_mode: host |
10
wuhao OP @fortitudeZDY 如果一个是主机,一个是主机下面的 docker ,怎么映射呢
|
11
wuhao OP @fortitudeZDY
服务器目录 /var/run/tailscale 挂在到 docker 的容器目录 /var/run/tailscale ,问题解决。感谢感谢 |
12
wuhao OP |
13
zhupite2 145 天前
破防了😭
在 CentOS 7 上使用 yum 安装了 tailscale ,使用 docker 安装了 ip_derper ,只要开启 DERP_VERIFY_CLIENTS=true ,就会出现以下错误日志: ip_derper | 2024/06/17 08:20:20 derp: 2.120.134.171:31015: client 6e6f64656b65793a37623030616235343963616436326637623934653231316236613537306236356330373063303634626230386533323462353635336130621239323639633 rejected: failed to query local tailscaled status for nodekey:7b00ab569cad62f7b94e211b6a570b65c070c064bb08e324b5653a0b29663c4c: 400 Bad Request: invalid 'addr' parameter ip_derper | 2024/06/17 08:20:21 derp: 2.120.134.171:31028: client 6e6f64656b65793a37623030616235343963616436326637623934653231316236613537306236356330373063303634626230386533323462353635336130621239323639633 rejected: failed to query local tailscaled status for nodekey:7b00ab569cad62f7b94e211b6a570b65c070c064bb08e324b5653a0b29663c4c: 400 Bad Request: invalid 'addr' parameter docker-compose.yml: version: '3.8' services: ip_derper: image: yangchuansheng/ip_derper container_name: ip_derper restart: unless-stopped environment: - DERP_HTTP_PORT=80 - DERP_ADDR=:12345 - DERP_VERIFY_CLIENTS=true ports: - 12345:12345 - 3478:3478/udp volumes: - /var/run/tailscale:/var/run/tailscale |
14
zhupite2 145 天前 1
对于我遇到的这个 invalid 'addr' parameter 问题,应该是当前发布的 tailscale 并不支持验证 `nodekey:xxx` 这种形式的客户端地址(具体可以在 tailscale 仓库中搜索一下,这里不细说),但就几天前,有一个 PR 支持了这种地址。
目前,我 clone 仓库并自己编译 cmd/tailscale 和 cmd/tailscaled ,测试可行 |