V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要把任何和邀请码有关的内容发到 NAS 节点。

邀请码相关的内容请使用 /go/in 节点。

如果没有发送到 /go/in,那么会被移动到 /go/pointless 同时账号会被降权。如果持续触发这样的移动,会导致账号被禁用。
BOGU
V2EX  ›  NAS

NAS 的 Docker 上部署了多个服务,如何通过 DDNS 将 IPv6 解析到子域名中?

  •  
  •   BOGU · 6 天前 · 1486 次点击
    条件:
    1 、外网可以访问到内网的 IPv6 地址,防火墙已开启;
    2 、每个 Docker 的容器可以获取到 ipv6 公网地址;



    问题:
    如何自动获取每一个容器的 IPv6 公网地址,并将其正确解析到对应的子域名中?


    示例:
    容器名:emby ,240e::1 ,emby.XXX.XXX > 240e::1
    容器名:immich ,240e::2 ,immich.XXX.XXX > 240e::2
    26 条回复    2024-11-10 19:12:55 +08:00
    lengrongec
        1
    lengrongec  
       6 天前
    容器网络配置应该选择 bridge 模式,不是 host 模式
    FawkesV
        2
    FawkesV  
       6 天前
    反向代理
    FawkesV
        3
    FawkesV  
       6 天前
    @FawkesV #2 忽略 理解错了 应该不得行
    z7356995
        4
    z7356995  
       6 天前 via Android
    我是这样部署的,因为 443 和 80 端口被封,所以 nas 里其实不同服务是通过端口来区分的,群晖里外网不同的端口进来可以只向不同的服务,开放一下不同的端口进好了,我是用 ddns-go 用 cloudflare 来自动 ipv6 地址的 ddns,, 一些程序如 transmisson 不支技 ipv6 就用群晖代理转发
    z7356995
        5
    z7356995  
       6 天前 via Android
    只要一个域名就好,这样不要配制那么多证书
    coderZoe
        6
    coderZoe  
       6 天前
    这样不好吧,把 docker 容器也配公网 ip 是不是不安全?最好还是主机对外暴露一个 nginx 端口,nginx 通过域名转发到主机相应的服务上。
    YamatoRyou
        7
    YamatoRyou  
       6 天前
    大致流程 (并不详尽):

    宿主机部分 (通过以下步骤创建的接口默认不含 IPv4 地址):
    - 创建一个网络接口, 父接口为宿主机的物理网卡;
    ```
    ip link add <接口名称> link <父接口名称> type macvlan mode bridge
    ```
    - 启动刚才创建的接口
    ```
    ip link set <接口名称> up
    ```
    - 添加路由条目, 主要用于宿主机本身与 Docker 容器的通信, 不影响来自其它机器的访问
    ```
    ip -6 route add <地址块> dev <接口名称>
    ```

    Docker 部分 (通过以下步骤创建的网络默认不含 IPv4 地址):
    - 创建一个 macvlan 驱动的网络, 并为该网络分配一个合适大小的地址块;
    ```
    docker network create \
    -d macvlan \
    --ipv6 \
    --subnet=<地址块> \
    --gateway=<位于地址块中的网关, 我的习惯是取该块中第 1 个地址> \
    -o parent=<父接口> \
    -o macvlanmode=bridge \
    <网络名称>
    ```
    - 有需求的容器连接到该网络, 并为每个容器分配一个在上述地址块范围内的地址;
    docker network connect --ip6=<IPv6 地址, 必须位于地址块范围内, 我的习惯是最后 32 位随机生成> <网络名称> <容器名称>

    用 docker inspect <容器名称> 获取容器的 IPv6 地址, 最后传递到 DDNS 相关脚本.

    ----
    其它:
    我自己的实例为网络分配了长度为 /96 的块.
    在宿主机创建的接口于下次重启机器后消失.
    edk24
        8
    edk24  
       6 天前
    我自己的方案:

    软路由 openwrt 拨号,用 lucky 插件 ddns 更新 ipv6 域名绑定。 以及子域名反向代理。 以及端口转发等
    TimPeake
        9
    TimPeake  
       6 天前
    我曾经也想这样。但是想想太复杂了 还是端口区分吧
    idrunk
        10
    idrunk  
       6 天前
    直接配置解析就行了,不过被禁的典型端口搞不定的,除非在客户端配置转发,如果你的服务是面向自己在外使用的,可以带端口使用
    idrunk
        11
    idrunk  
       6 天前
    哦,你是想用域名路由到指定服务,那可以用 nginx 等重定向请求到对应的容器啊
    tsanie
        12
    tsanie  
       5 天前
    我的方案是 docker 容器不获取 ipv6 ,群晖 ddns ,然后利用群晖自带 nginx 的反向代理,给不同 hostname 设置 proxy_pass 到不同容器服务开放的端口。

    群晖 web 上操作反向代理有点啰嗦,可以在文件存储上写好.conf ,然后 ln 到/usr/local/etc/nginx/sites-enabled/,最后 synosystemctl reload nginx 一下就 ok 了

    顺便 include /usr/syno/etc/www/certificate/system_default/cert.conf;还可以使用系统默认的证书配置,很方便。
    f165af34d4830eeb
        13
    f165af34d4830eeb  
       5 天前
    其实 ipv6 地址用一个就够了,靠 nginx 之类的反代通过子域名区分再转发到容器监听的端口上。

    主域名绑定 ddns ,子域名再 CNAME 到主域名上就行,这样对外只需要一个 ipv6 地址。
    Kaiyuan
        14
    Kaiyuan  
       5 天前 via iPhone
    脚本用前缀加容器 MAC 组合成 IP ,然后改 DNS ,我在路由器上是这样子做的,给设备加域名。
    Yadomin
        15
    Yadomin  
       5 天前 via Android   ❤️ 1
    跑一个 traefik 做反代就完了
    JensenQian
        16
    JensenQian  
       5 天前
    直接搞个 wireguard 连回去完事了
    Blabber9125
        17
    Blabber9125  
       5 天前
    容器怎么获取到的 ipv6 呢,是 macvlan 吗
    WizardLeo
        18
    WizardLeo  
       5 天前
    不一定要容器 ipv6 访问的情况,使用宿主机 ipv6+反向代理实现 ipv6 连接宿主机再用内网 ipv4 转发到容器。
    必须直连 ipv6 的情况(比如 bt 的 p2p 端口),直接用反掩码在防火墙里固定后 64 位地址,一般来说是不会变的。
    axiauk
        19
    axiauk  
       5 天前
    最好的方法是将需要的服务从 docker 更换成 VB 或者 KVM 虚拟机
    keengrass
        20
    keengrass  
       5 天前
    用 lucky 就可以搞定你的需求,我也是这么做的。
    vicv
        21
    vicv  
       5 天前 via iPhone
    你的网络连接方案和我的是一样的。我的做法是另外起一个容器运行 ddns ,这个 ddns 容器直接使用 emby 容器的网络命名空间就可以了,这样 ddns 容中的网络就是 emby 容器中的网络,其实这就是 K8s 里面的 Sidecar 容器模式。在 docker-compose 中可通过 network_mode 配置 ddns 容器连接到 emby 容器。贴上我的 docker-compose 文件作为参考:
    services:
    emby:
    container_name: emby
    image: lovechen/embyserver:latest
    cap_add:
    - NET_ADMIN
    - SYS_ADMIN
    - SYS_MODULE
    networks:
    dmacvlan:
    ipv4_address: 192.168.2.2
    priority: 1000
    dbridge:
    ipv4_address: 172.16.2.2
    priority: 100
    volumes:
    - ./emby/config:/config
    - ./acme/ssl:/ssl
    - /volume/media:/Media
    devices:
    - /dev/dri:/dev/dri
    environment:
    - TZ=Asia/Shanghai
    - UID=0
    - GID=0
    - GIDLIST=0
    - NVIDIA_VISIBLE_DEVICES=all
    restart: always

    emby-ddns:
    container_name: emby-ddns
    image: jeessy/ddns-go:latest
    network_mode: "service:emby"
    volumes:
    - ./emby/.ddns_go_config.yaml:/root/.ddns_go_config.yaml
    environment:
    - TZ=Asia/Shanghai
    depends_on:
    emby:
    condition: service_started
    restart: always

    networks:
    dmacvlan:
    name: dmacvlan
    enable_ipv6: true
    driver: macvlan
    driver_opts:
    parent: ovs_eth0
    ipam:
    config:
    - subnet: 192.168.2.0/24
    gateway: 192.168.2.1
    - subnet: fc00:21:2::/64
    gateway: fc00:21:2::1

    dbridge:
    name: dbridge
    ipam:
    driver: default
    config:
    - subnet: 172.16.2.0/24
    gateway: 172.16.2.1
    tsvico
        22
    tsvico  
       5 天前
    建议最外边是 NAS 的 ipv6 ,指向 nginx

    然后泛域名解析 *.XXX.XXX 到 nginx

    在 nginx 中添加 emby.XXX.XXX 指向 emby 的 docker 内部地址,例如 http://emby:9063

    添加 immich.XXX.XXX 指向 immich 的内部地址 http://immich:3000
    tsvico
        23
    tsvico  
       5 天前
    @tsvico #22 全 docker 环境可以将 nginx 换成 traefik
    Biiddd
        24
    Biiddd  
       5 天前
    直接对外一个 v6, 全部用反代
    epiloguess
        25
    epiloguess  
       5 天前
    traefik 是正解,根据容器标签自动代理
    TossPig
        26
    TossPig  
       4 天前
    我的方案,一台叫 tsnet 的 debian 虚拟机,上部署 caddy ,反代内网的所有 web 服务
    tsnet 上跑 ddns-go,读取网卡的第一个 ipv6 地址
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1854 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 16:40 · PVG 00:40 · LAX 08:40 · JFK 11:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.