oynix

于无声处听惊雷,于无色处见繁花

用IPv6远程访问家庭局域网中的Samba服务

搭建好一个ImmortalWrt,只是第一步,相当于打开了一扇门,至于门里的世界有多丰富,那就要看有多少的兴趣和精力了,一般都需要做的一件事,就是实现从公网访问家里的Wrt,满足随时随地访问的需求。

1.前言

如果家宽有公网IP,那这个其实是个很简单的事,简单做个端口映射,但是由于这样和那样的原因,办理公网IP的门槛越来越高,那些已经有了IP的,也出其不意的被收回。

内网穿透中,常见的是通过一个VPS中转,家宽你不是没有公网IP吗,没关系,我VPS有,我能被访问,家宽你和我一直保持着联系,你们谁要有什么事就跟我说,我帮你转告给家宽,大体流程便如此。至于其中的实现细节,又有着多种选择,比如FRP、wireguard等。

2.配置ImmortalWrt

而我则用了另一种方式:通过IPv6。自然前提是需要一个v6的地址,不出意外的话,运营商都会分配一个,配置完Wrt后,网络接口里可以看到2个wan口,一个是v4,另一个便是v6,地址是特别长的一串,和32位的v4地址不同,v6直接顶到128位,多到用不完。

除了v6地址之外,应该还会看到一个PD,叫前缀代理,因为v6地址有保质期,到期了运营商就换个新的给你,但是只给一个前缀,后面的部分留给自己分配,可以随机,也可以和其他参数关联,比如MAC地址等。

这个时候,wrt实际上已经暴露在公网了,随手搜一个能ping v6地址的网站,把wan6的地址复制进去,就会发现全国都是绿色的,表明不仅能通,速度还很快。

内网访问wrt的地址是:http://192.168.2.1,从公网访问就在浏览器地址栏输入v6的地址即可:http://[ipv6],注意,这里的中括号不是格式占位符,而是v6地址确实需要写在中括号里面。

按下回车,会发现并没有出现预想中wrt的登录页面。这是因为不加端口号时,默认访问80端口,而80端口的数据包在经由运营商的某个路由器时,随手就给你扔了,没有为什么,访问80端口就是不行。

80不通,那便换一个,比如我用的是40080,加上端口,访问地址就变成了:

1
http://[ipv6]:40080

我们只是换了一个请求的端口号,但是wrt提供服务的端口号还是80,这时候利用防火墙提供的端口转发功能,将请求40080端口的请求,转发至80端口,这样便可以顺利从外网访问访问到wrt了,具体配置如图所示,

协议限制为IPv6,协议限制为TCP,目标是此设备,wan口和lan口各自加了一个,最终转发到443端口,这里没有显示80端口,是因为我加了TLS证书,可以通过https访问,后面会说。额外还要加了个lan口,是因为这样当设备,比如你的手机或者电脑,连接的是wrt的网络时,访问IPv6地址不会报错。

3. 绑定域名

上面提到过,运营商给的v6地址会不断更新,到了保质期就会更新,人在外面时,如果地址更新了,那就访问不到了。这种情况的解决方案是,将v6的地址绑定到一个域名上。

所以如果没有域名的话,可以搜索免费域名,不管是自费的还是免费的,只要能用就可以,我持有了一个域名,也就是博客的这个,一年10美元左右,也算可以接受。

默认在域名的管理后台,DNS解析里一个地址只能设置一个固定的IP地址,对于不断变化的IP地址,需要DDNS服务来处理,第一个D是dynamic,表示动态的,专门用来解决这种场景下的问题,原来倒也很简单:IP不是在变吗,那么就定时检查,变了就把DNS的记录改成最新的,修改方式就是通过域名服务商提供的API操作,当然,这个需要用token授权。

自然,wrt提供了软件包:luci-i18n-ddns-go-zh-cn 和 dnsmasq-full。完成之后,就可以在服务里面找到DDNS-Go了,它还提供了一个web配置页面,页面很简洁,支持了绝大多数世面上的域名服务提供商,按照提示配置即可。

4. 支持https

顺利的话,经过上面步骤的配置,就可以通过自己设置的域名+端口号访问家里的wrt了,小有成就。但此时访问方式还是http,也就是所有流量都是明文未加密的,刷个包都可以看到,这一步便是将wrt支持https访问。

这个相关的软件包是:luci-i18n-acme-zh-cn,luci-i18n-uhttpd-zh-cn,luci-ssl-openssl,acme-acmesh-dnsapi。

看着有点乱,实际上分工明确,wrt的服务是跑在我们自己的小主机上的,比如我的是R5S,我们从公网访问wrt,实际上就是在访问R5S提供的服务,wrt默认提供的是基于http的不加密的服务,而uhttpd则是提供加密的https的服务,默认使用的是自签证书,当浏览器访问使用字签证书的https时,会报红色的错误,意思就是这个网站虽然加密了,但是证书不是来自权威机构的,小心一点。

ACME则是是一个免费的证书机构提供的服务,Letsencrypt,比起动辄几百上千的国内云服务提供商的证书,这个免费的算是尽到了良心,而且也被浏览器认可,在wrt安装这个服务后,就会免费获取证书,用来替换uhttpd服务使用的证书。

明白这几者之间的关系,配置起来就很清晰了,具体操作可以按照下面参考里的连接,我就是照着一步一步操作的,说的很详尽,基本无难度。

至此,从配置wrt到从公网使用https访问便都已经完成。

5. 公网访问Samba

有了上面的基础,想访问samba就只是多了一步的事情,因为wrt和samba在同一个机器上,只是端口不同,按照增加443端口的格式,再增加一个samba的445端口映射即可。

6. 虚拟内网

随着服务的增多,每当需要从外网访问家里的服务时,都需要增加端口映射,这只是服务都跑在R5S上的情况,如果服务单独跑在家里局域网中的其他机器上,比如哪天需求来了,单独买了一台NAS设备,而不是仅仅在R5S上插个硬盘,这个时候NAS就有了自己的内网IP,以及自己的公网IPv6IP地址,为了访问到这个地址,就要像配置访问wrt的IPv6地址时,给这个地址配置DDNS,以供公网访问,步骤过多。

为了简化流程,我选择了通过wireguard在wrt上搭建一个虚拟内网。

什么是虚拟内网呢,真实内网很好理解,家里有一台路由器,路由器连着几个设备,这几个设备和路由器便组成了一个真实的内网,有着共同的IP段,比如192.168.2.0/24,内网中的设备互相访问时,直接经过交换机即可,不需要路由。而虚拟内网,通俗的说,则是突破了必须连接同一个路由器的局限,wireguard通过一些协议,让位于不同地区和角落的设备,也可以通过内网地址互相访问。

虚拟内网中,需要一个端点endpoint,扮演路由器的角色,虚拟中的设备称为peer,每一个需要加入到虚拟内网中的设备,都需要在端点中加入peer的配置信息,比如内网IP地址,peer成功和端点建立连接时,便加入了虚拟内网,通过内网IP地址即可和其他peer通信。

从这个流程中可以看出,作为端点,需要可以在公网中访问,而拥有IPv6地址的wrt,刚好可以满足这个条件,wrt中自然也是提供了对应的软件包,luci-proto-wireguard,安装好,按照参考里的视频配置即可。

安装wireguard服务后,会在设备上创建一个虚拟网络接口,虚拟内网需要配置自己的网段,比如原本内网的网段是192.168.2.0/24,wrt的地址是192.168.2.1,虚拟内网需要不同的网段,可以是192.168.3.0/24,也可以是10.10.0.0/24,只要不和原本的内网网段冲突即可。

简单说下数据包的流程,可以更清晰的了解虚拟内网。

假设当前设备A的虚拟内网的IP地址为10.10.0.2,端点设备B的内网地址是10.10.0.1,现在2向1发送了一个数据包,wireguard在启动之后,会在设备的路由表中增加一条路由规则,所有发往虚拟内网网段10.10.0.0/24的数据包,全部走虚拟网络接口,数据包就会按照这个规则来到虚拟网络接口。

虚拟网络接口是由wireguard服务创建,经过其的所有数据会经由wireguard服务,wireguard在收到发到10.10.0.1的数据包后,会将其使用配置的密钥加密,发到端点的IP地址,数据包会从公网网络出口,在R5S上是eth0,在我的电脑上是en0,数据包来到端点的公网网络接口,经过处理,根据数据包特征,会转发至wireguard创建的虚拟网络接口,同理,经过虚拟网络接口的数据包,都会被wireguard服务处理,解析出目标虚拟内网的IP后,发现是发给10.10.0.1的,也就是自己,接着会交给应用层处理,如果是其他虚拟内网设备,则根据配置,发送至其他peer的公网IP地址。

端点如何获取其他peer的公网IP呢,在peer运行wireguard服务后,会根据配置的端点公网IP地址,成功握手请求,之后每间隔一段时间,都会发送握手请求,保持自身在端点处的存活状态,端点在收到握手请求后,会记录peer的公网IP和其wireguard的服务所监听的端口,如果有数据需要发给该peer,则会发到其的公网IP和端口。

如此一来,虚拟内网中的peer表面上访问的是内网IP10.10.0.1,经过wireguard转发后,最终会发给目标peer的公网IP。

如果像我这样,把虚拟内网的端点endpoint建立在家中的wrt上,需要注意公网接口的上传流量。

举个例子来说,当设备A在wrt的真实内网,使用192.168.0.0/24的网段发送网络请求时,比如下载一个1GB的文件,1GB的流量从公网接口eth0进来,然后经过eth1发给路由器,最终到达设备A。但如果设备A通过虚拟内网连到wrt,然后下载1GB的文件时,1GB的流量同样由公网接口eth0进来,然后会来到wireguard虚拟网络接口,经过处理后,再次由公网接口eth0出去,最终发给设备A,这样一来,wrt的eth0会增加1GB的下载流量,同时还会增加1GB的上传流量。

众所周知,家宽的上传流量异常高时,会被运营商限速,理由就是它认为你在跑PCDN,它给你限速容易,你想再解开的难度和曲折度,限速犹如从md5后的值,反推原来的数据。

从利益角度看,运营商是不喜欢你上传的,所以即便是上传流量和PCDN也不是全等关系,但只要上传流量稍微多了点,就会以政策禁止PCDN的由头来限制上传带宽,通俗原因便是,跨省结算、跨运营商结算需要花钱,下载的流量是运营商在接收数据,而上传的流量是你的网络运营商帮你往其他网络发送数据,是存在花钱的可能,所以能禁自然要禁,毕竟可以省钱。

7. 关于VPS

上面提到过,访问家庭内网时,也可以使用VPS。在一次互动促销时,我买了一个位于美国的小VPS,也尝试过通过这个机器访问家里的wrt,想通过在VPS上搭建一个wireguard虚拟内网,其他所有设备包括wrt都通过peer的形式,连到VPS上,这样便可互相访问了,但其中的过程过于曲折了,折腾了一番,最后便放弃了。

原因在于运营商无法只连到VPS所在的网络,所以想连接到VPS就要借助代理,不管是wrt还是我的电脑,只要是向连VPS,就要通过代理,在wrt上和电脑上,还可以勉强跑通,毕竟可以同时运行clash和wireguard,但手机上不行,因为不能同时跑clash和wireguard两个VPN软件,无法解决的冲突问题。

最后想说的是,如果想通过VPS的形式,最好还是买个国内的VPS,可以省去不少麻烦。

参考

  • 【不良林】Wrt配置IPv6公网https访问
  • 【不良林】使用wireguard搭建虚拟内网

附录

相关命令

  • nc -vz:测试连通性
  • netstat -nr:查看路由表
  • tcpdump -ni any port 22:抓端口22的包,不区分网络接口
  • tracerout:和ping一样,但可以看到哪一跳卡住
  • iptables -A INPUT 1.2.3.4 -j DROP:增加防火墙拦截这个IP的请求规则
  • iptables -D INPTU 1.2.3.4 -j DROP:删除上面添加的规则
------------- (完) -------------
  • 本文作者: oynix
  • 本文链接: https://oynix.com/2025/11/c944ffa68903/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

欢迎关注我的其它发布渠道