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

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

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

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

  •  
  •   BOGU · 46 天前 · 1868 次点击
    这是一个创建于 46 天前的主题,其中的信息可能已经有所发展或是发生改变。
    条件:
    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  
       46 天前
    容器网络配置应该选择 bridge 模式,不是 host 模式
    FawkesV
        2
    FawkesV  
       46 天前
    反向代理
    FawkesV
        3
    FawkesV  
       46 天前
    @FawkesV #2 忽略 理解错了 应该不得行
    z7356995
        4
    z7356995  
       46 天前 via Android
    我是这样部署的,因为 443 和 80 端口被封,所以 nas 里其实不同服务是通过端口来区分的,群晖里外网不同的端口进来可以只向不同的服务,开放一下不同的端口进好了,我是用 ddns-go 用 cloudflare 来自动 ipv6 地址的 ddns,, 一些程序如 transmisson 不支技 ipv6 就用群晖代理转发
    z7356995
        5
    z7356995  
       46 天前 via Android
    只要一个域名就好,这样不要配制那么多证书
    coderZoe
        6
    coderZoe  
       46 天前
    这样不好吧,把 docker 容器也配公网 ip 是不是不安全?最好还是主机对外暴露一个 nginx 端口,nginx 通过域名转发到主机相应的服务上。
    YamatoRyou
        7
    YamatoRyou  
       46 天前
    大致流程 (并不详尽):

    宿主机部分 (通过以下步骤创建的接口默认不含 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  
       46 天前
    我自己的方案:

    软路由 openwrt 拨号,用 lucky 插件 ddns 更新 ipv6 域名绑定。 以及子域名反向代理。 以及端口转发等
    TimPeake
        9
    TimPeake  
       46 天前
    我曾经也想这样。但是想想太复杂了 还是端口区分吧
    idrunk
        10
    idrunk  
       46 天前
    直接配置解析就行了,不过被禁的典型端口搞不定的,除非在客户端配置转发,如果你的服务是面向自己在外使用的,可以带端口使用
    idrunk
        11
    idrunk  
       46 天前
    哦,你是想用域名路由到指定服务,那可以用 nginx 等重定向请求到对应的容器啊
    tsanie
        12
    tsanie  
       46 天前
    我的方案是 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  
       46 天前
    其实 ipv6 地址用一个就够了,靠 nginx 之类的反代通过子域名区分再转发到容器监听的端口上。

    主域名绑定 ddns ,子域名再 CNAME 到主域名上就行,这样对外只需要一个 ipv6 地址。
    Kaiyuan
        14
    Kaiyuan  
       46 天前 via iPhone
    脚本用前缀加容器 MAC 组合成 IP ,然后改 DNS ,我在路由器上是这样子做的,给设备加域名。
    Yadomin
        15
    Yadomin  
       46 天前 via Android   ❤️ 1
    跑一个 traefik 做反代就完了
    JensenQian
        16
    JensenQian  
       46 天前
    直接搞个 wireguard 连回去完事了
    Blabber9125
        17
    Blabber9125  
       46 天前
    容器怎么获取到的 ipv6 呢,是 macvlan 吗
    WizardLeo
        18
    WizardLeo  
       46 天前
    不一定要容器 ipv6 访问的情况,使用宿主机 ipv6+反向代理实现 ipv6 连接宿主机再用内网 ipv4 转发到容器。
    必须直连 ipv6 的情况(比如 bt 的 p2p 端口),直接用反掩码在防火墙里固定后 64 位地址,一般来说是不会变的。
    axiauk
        19
    axiauk  
       46 天前
    最好的方法是将需要的服务从 docker 更换成 VB 或者 KVM 虚拟机
    keengrass
        20
    keengrass  
       46 天前
    用 lucky 就可以搞定你的需求,我也是这么做的。
    vicv
        21
    vicv  
       46 天前 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  
       45 天前
    建议最外边是 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  
       45 天前
    @tsvico #22 全 docker 环境可以将 nginx 换成 traefik
    Biiddd
        24
    Biiddd  
       45 天前
    直接对外一个 v6, 全部用反代
    epiloguess
        25
    epiloguess  
       45 天前
    traefik 是正解,根据容器标签自动代理
    TossPig
        26
    TossPig  
       44 天前
    我的方案,一台叫 tsnet 的 debian 虚拟机,上部署 caddy ,反代内网的所有 web 服务
    tsnet 上跑 ddns-go,读取网卡的第一个 ipv6 地址
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5523 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 06:36 · PVG 14:36 · LAX 22:36 · JFK 01:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.