tailscale 安装了 derp 服务,是 docker 安装的 derp,然后我想做 DERP_VERIFY_CLIENTS 获取不到状态怎么办

40 天前
 wuhao
一台服务器安装了 docker ,docker 安装了 derp 服务
然后为了防止 derp 被人扫去白嫖导致网络不稳定
想开启 DERP_VERIFY_CLIENT = true
开启这个的前提是要服务器安装 tailscale ,然后登陆。
但是我的服务器安装 tailscale 之后,derp 获取不到 tailscale 的状态,我怀疑是因为 derp 是 docker 安装的,是两个系统隔离的,所以获取不到,找了一堆教程,这个地方都没怎么说

有没有大神知道怎么解决吗?最好还是 derp 用 docker 安装。。。
801 次点击
所在节点    宽带症候群
12 条回复
wuhao
40 天前
确实,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 生成
wuhao
40 天前
上面是文心一言回复的。。。不小心发上来不知道咋删除了
wuhao
40 天前
开启 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
fortitudeZDY
40 天前
如果没记错的话,Derp 如果开启 verify ,是和本地的 tailscaled 基于 unix domain socket 通信的,你的日志里也提示了,所以如果你的 ts 不在一个容器就不行了,如果非要这样,可以考虑用 socat 连接下(我猜的)
wuhao
40 天前
@fortitudeZDY 你说的本地说在 docker 的 derp 容器里安装吗,derp 的 docker 很简陋装不进去啊
xubiaosunny
40 天前
映射 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
fortitudeZDY
40 天前
@wuhao 试试楼下等映射,如果你 ts 在另外一个 docker ,你把那个 docker 的 run 目录映射到宿主机
lany
40 天前
分享一下我的配置
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
lany
40 天前
补充一下 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
wuhao
40 天前
@fortitudeZDY 如果一个是主机,一个是主机下面的 docker ,怎么映射呢
wuhao
40 天前
@fortitudeZDY
服务器目录 /var/run/tailscale 挂在到 docker 的容器目录 /var/run/tailscale ,问题解决。感谢感谢
wuhao
40 天前
@xubiaosunny 谢谢,用挂载目录的方式解决啦
@lany 谢谢大神,我用的 bt 宝塔面板的 docker ,一直没找到启动代码在哪里添加的。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1031463

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX