V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wuhao
V2EX  ›  宽带症候群

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

  •  
  •   wuhao · 225 天前 · 1675 次点击
    这是一个创建于 225 天前的主题,其中的信息可能已经有所发展或是发生改变。
    一台服务器安装了 docker ,docker 安装了 derp 服务
    然后为了防止 derp 被人扫去白嫖导致网络不稳定
    想开启 DERP_VERIFY_CLIENT = true
    开启这个的前提是要服务器安装 tailscale ,然后登陆。
    但是我的服务器安装 tailscale 之后,derp 获取不到 tailscale 的状态,我怀疑是因为 derp 是 docker 安装的,是两个系统隔离的,所以获取不到,找了一堆教程,这个地方都没怎么说

    有没有大神知道怎么解决吗?最好还是 derp 用 docker 安装。。。
    14 条回复    2024-06-18 01:01:54 +08:00
    wuhao
        1
    wuhao  
    OP
       225 天前
    确实,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
        2
    wuhao  
    OP
       225 天前
    上面是文心一言回复的。。。不小心发上来不知道咋删除了
    wuhao
        3
    wuhao  
    OP
       225 天前
    开启 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
        4
    fortitudeZDY  
       224 天前 via iPhone
    如果没记错的话,Derp 如果开启 verify ,是和本地的 tailscaled 基于 unix domain socket 通信的,你的日志里也提示了,所以如果你的 ts 不在一个容器就不行了,如果非要这样,可以考虑用 socat 连接下(我猜的)
    wuhao
        5
    wuhao  
    OP
       224 天前
    @fortitudeZDY 你说的本地说在 docker 的 derp 容器里安装吗,derp 的 docker 很简陋装不进去啊
    xubiaosunny
        6
    xubiaosunny  
       224 天前
    映射 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
        7
    fortitudeZDY  
       224 天前 via iPhone   ❤️ 1
    @wuhao 试试楼下等映射,如果你 ts 在另外一个 docker ,你把那个 docker 的 run 目录映射到宿主机
    lany
        8
    lany  
       224 天前
    分享一下我的配置
    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
        9
    lany  
       224 天前
    补充一下 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
        10
    wuhao  
    OP
       224 天前
    @fortitudeZDY 如果一个是主机,一个是主机下面的 docker ,怎么映射呢
    wuhao
        11
    wuhao  
    OP
       224 天前
    @fortitudeZDY
    服务器目录 /var/run/tailscale 挂在到 docker 的容器目录 /var/run/tailscale ,问题解决。感谢感谢
    wuhao
        12
    wuhao  
    OP
       224 天前
    @xubiaosunny 谢谢,用挂载目录的方式解决啦
    @lany 谢谢大神,我用的 bt 宝塔面板的 docker ,一直没找到启动代码在哪里添加的。。
    zhupite2
        13
    zhupite2  
       157 天前
    破防了😭
    在 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
    zhupite2
        14
    zhupite2  
       156 天前   ❤️ 1
    对于我遇到的这个 invalid 'addr' parameter 问题,应该是当前发布的 tailscale 并不支持验证 `nodekey:xxx` 这种形式的客户端地址(具体可以在 tailscale 仓库中搜索一下,这里不细说),但就几天前,有一个 PR 支持了这种地址。
    目前,我 clone 仓库并自己编译 cmd/tailscale 和 cmd/tailscaled ,测试可行
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1588 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 16:58 · PVG 00:58 · LAX 08:58 · JFK 11:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.