jellyfin使用ipv6+DDNS实现外网访问

文章介绍了如何通过配置IPv6和DDNS服务,解决阿里云轻量服务器带宽限制导致的4K视频播放问题。首先,调整路由器和群晖的IPv6设置,然后使用DDNS-go在Docker中进行域名解析,确保即使IPv6地址变化也能通过域名访问。最后,通过群晖的反向代理功能,实现通过域名直接访问运行在Docker上的Jellyfin服务,达到流畅观看4K视频的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

       原本使用frp的方案进行外网访问jellyfin,但是阿里云的轻量服务器的带宽只有5M,只能支持看1080p的视频,看4K有点吃力,为了有更好的观影体验,选择ipv6+DDNS的方式实现外网访问,此方案能跑满群晖的上行带宽且不需要部署额外的软件。

ipv6设置

路由器修改

       宽带一般都会给ipv6,群晖所使用的路由器是红米AX6S,首先进入路由器管理后台:192.168.31.1;选择常用设置-上网设置,在最底下找到ipv6网络设置,开启ipv6,上网方式选择Native,防火墙可以关闭。

路由器
路由器
      设置完成后请查看路由器中是否有IPV6地址,如果有表示开启成功。如果没有IPV6地址,请把需要登录光猫后台,把光猫改成桥接模式,使用路由器进行拨号,再次尝试。
路由器

群晖修改

      进入群晖系统,在控制面版-网络-网络界面-局域网1-编辑-ipv6中查看是否有ipv6地址。如果有则可以使用流量或其他连有ipv6网络的机器测试,在浏览器中输入: [群晖ipv6地址],看是否可以进入群晖界面,如果可以表示可以外网访问了。
ipv6

DDNS设置

      ipv6地址虽然没有NAT,可以直接访问,但是可能会进行变化,用户不可能每次都去请求最新的ipv6地址进行访问,同时ipv6地址也不好记,这时需要使用DDNS技术,将域名解析到地址中,在地址变化时,域名总是指向最新的地址。用户只需要使用域名就可以访问内网设备。

DDNS-go设置

      本文使用DDNS-go进行域名解析,首先在docker中安装ddns-go,在docker文件夹下创建ddns-go的文件夹,之后需要进行文件映射。

ddns
ddns
       下载完毕后进行容器创建,设置网络和映射文件夹就好

ddns
ddns
       默认端口是9876,输入内网ip:9876即可进入管理界面。本人使用的是阿里云的域名,在阿里云的域名列表,右上方选择头像,进入AccessKey管理。

ddns

ali
ali
       创建AccessKey,将AccessKey ID和AccessKey Secret复制到ddns-go的对应位置

ali

ali
       在ddns-go中,开启IPV6,选择通过接口获取,在Domains栏填入你的域名,这个也支持子域名。如果需要IPV4,也可以启用IPV4,与ipv6一样的步骤。点击保存即可。
ddns
       回到阿里云域名管理平台,可以看到新创建了一个AAAA记录。使用带有ipv6网络的机器输入域名,看是否可以进入群晖的管理界面。
ali

反向代理

      群晖的界面可以成功进入,表示DDNS设置成功,但目前域名加jellyfin端口是无法进入jellyfin界面的。由于我的jellfin服务器运行在docker上,而docker对ipv6的支持并不是很好,如果修改docker,需要重新部署jellfin,较为麻烦。好在群晖提供了一个反向代理服务器,可以将内网端口映射出去,实现ipv6访问。
       进入控制面板-登录门户-高级-反向代理服务器

ddns
       新建反向代理服务器规则-来源主机名为上文的域名,端口随意。目的地端口为jellyfin的本地端口。之后使用域名+8097即可访问jellfin。
ddns

后文

       至此全部的操作完成。目前三大运营商的流量都有ipv6地址,使用流量可以访问内网的机器,但是在公司,学校等地往往没有ipv6地址,也就无法访问机器。所以解决目前是使用ipv6和frp两套方案实现外部访问和观影的。关于frp的部署见参考链接。

参考链接

解决群晖外网访问难题!IPV6+DDNS,实现内网设备全远程访问+开启HTTPS访问!
黑群晖FRP内网穿透部署记录

### IPv6 DDNS 实现概述 为了实现基于IPv6的动态域名服务(DDNS),通常需要解决两个主要问题:一是如何获取设备当前分配到的IPv6地址;二是如何通过网络协议更新DNS记录。对于Go语言来说,可以利用其强大的标准库来处理这些需求。 #### 获取本地IPv6地址 在Go程序中可以通过调用`net.InterfaceAddrs()`函数获得本机所有接口上的IP地址列表,并从中筛选出有效的全局唯一IPv6地址[^1]: ```go package main import ( "fmt" "net" ) func getLocalIPv6() string { addrs, err := net.InterfaceAddrs() if err != nil { return "" } for _, a := range addrs { if ipNet, ok := a.(*net.IPNet); ok && !ipNet.IP.IsLoopback() { if ipv6 := ipNet.IP.To16(); ipv6 != nil && ipNet.IP.IsGlobalUnicast() { return ipv6.String() } } } return "" } func main() { fmt.Println(getLocalIPv6()) } ``` 此代码片段展示了如何遍历网卡并找到符合条件的第一个全球唯一的IPv6地址。 #### 更新DNS服务器中的A/AAAA记录 当检测到新的IPv6地址时,则需向指定的DNS服务器发送请求以修改对应的主机名解析条目。这一步骤依赖于所选DNS服务商提供的API接口。下面是一个假设性的例子,展示如何使用HTTP POST方法提交变更请求至某虚拟的服务端点: ```go package main import ( "bytes" "encoding/json" "fmt" "io/ioutil" "log" "net/http" ) type UpdateRequest struct { Domain string `json:"domain"` Token string `json:"token"` IPAddress string `json:"ip_address"` } func updateDnsRecord(domainName, token, ipAddress string) error { reqBody, _ := json.Marshal(UpdateRequest{ Domain: domainName, Token: token, IPAddress: ipAddress, }) resp, err := http.Post( "https://example-dns-service.com/api/v1/update", "application/json; charset=utf-8", bytes.NewBuffer(reqBody), ) if err != nil { return fmt.Errorf("failed to send request: %v", err) } defer resp.Body.Close() bodyText, _ := ioutil.ReadAll(resp.Body) log.Printf("Response from DNS service: %s\n", bodyText) if resp.StatusCode >= 300 || resp.StatusCode < 200 { return fmt.Errorf("bad status code received: %d", resp.StatusCode) } return nil } func main() { ipAddress := "fe80::f66d:2fff:feaa:28ff" // Replace with actual IP address retrieval logic. domainName := "your-domain.example.org." token := "your-auth-token" err := updateDnsRecord(domainName, token, ipAddress) if err != nil { log.Fatal(err) } else { fmt.Println("Successfully updated DNS record.") } } ``` 这段代码说明了怎样构建一个简单的客户端应用程序去通知远程DNS管理平台有关最新发现的IPv6地址的信息。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值