IPV6被全网访问折腾记!——NAS无IPV4公网、无内网穿透、无VPN,外网访问折腾记实

2022-11-08 14:16:03 509点赞 5624收藏 229评论

一、折腾由来

  上半年,有一朋友拿个赚钱宝要我帮他刷系统,我刷了个OPENWRT,但没过几天就死机了,怎么也进不去,后又帮他刷了个armbian,但也没过几天死机了,后来来回回折腾几次还是没几天就死机进不了系统,最后判断闪存坏了,不能正常使用。如果故事就这样,可能就结束了。

  但是在折腾这段时间他拿到联通的公网IP,也觉得NAS很方便。国庆后就买了个N5105的小电脑,装了个win2019(因为win有桌面对普通人比较友好),我给他装了个可道云、PHP目录列表、µTorrent、jellyfin。

   但是好景不长,11月2号他的公网IP被联通回收了。打电话到客服、投诉…… 能想的手段都用上了,最后得到一个答复:“你换电信宽带吧,电信有公网IP"。

  折腾从这开始了……

导航页导航页

二、VPN访问(已弃用)

  我首先想到的办法是在我家搞个VPN服务器,朋友的服务器用VPN拨号进入我家内网,我再把他的WEB服务代理出来。

  这个方法开机好像不能自动连接VPN,这就导致每次开机还要手动连接VPN,而且朋友也觉得走我家宽带会影响我家的网速。最后放弃了这个方法。   

三、cloudflare(有改进) 

  朋友先想到的方法有frp,还有花生棒。我觉得吧用这些还不如用我家VPN,免费还稳定。

  最后我看到一篇文章:https://post.smzdm.com/p/awxlgpvk/,最后就整了这个方案

1、查看宽带是否支持IPV6

  查看是否支持IPV6:https://ipw.cn/ipv6/这个网址可以查看你电脑有支持IPV6(现在的移动联通电信的宽带都支持IPV6,其它家就不太清楚了)。如果不支持IPV6,首先看你路由器是否支持IPV6,路由器是否开启了IPV6。

没有开启IPV6没有开启IPV6

  

路由器没有开启IPV6路由器没有开启IPV6

开启IPV6,我的小米路由器截图开启IPV6,我的小米路由器截图

开启IPV6,朋友TP路由器截图开启IPV6,朋友TP路由器截图

  IPV6一般有两种模式:一种Native(TP里面叫和宽带拨号上网),这种适合光猫做桥接用路由器拨号的情况。别一种叫NAT6(TP里面叫桥接模式),这种适合用光猫拨号路由器做二级路由的情况。

开通IPV6开通IPV6

2、关路由器防火墙

ping不通自己的IPV6地址,有防火墙ping不通自己的IPV6地址,有防火墙

可以ping通的情况可以ping通的情况

  在https://ipw.cn/ipv6ping/这里ping一下自己的IPV6地址如果显示 PingFailed。就是路由器开通的IPV6防火墙(也有可能是电脑系统禁止了ping,系统默认是不会开启,所以不考虑这种情况)。但是有些路由器是不提供IPV6防火墙开关的,比如我的小米路由器(有部分小米路由器支持关闭IPV6防火墙)、我朋友的TP路由器(也有部分支持)。

  我朋友的路由器也不支持关闭IPV6防火墙,我建设他用光猫拨号再把TP路由器改成桥接模式,最后他修改光猫没有成功。由于当时是晚上,我想就要他明天打电话到联通客服。

  没想到他后面发邮件给TP客服说明IPV6防火墙的问题,第二天客服不但回了邮件还附带发给他一个不带IPV6防火墙的路由器固件,还说这是官方的下个版本固件,到此防火墙的事情解决了。

3、购买域名

  在腾迅云,购买一个CN域名。(因为以前用的是TP路由器,用的是TP的二级域名。用我家VPN时用的是我的二级域名)。购买CN域名要实名认证并上传身份证图片。

注册的域名注册的域名

4、把域名的DNS服务器改成cloudflare的DNS

  今天不知道为什么cloudflare一样不能登录,所以在网络上找了两张图。

查看cloudflare的DNS服务器查看cloudflare的DNS服务器

在腾讯云修改DNS服务器为cloudflare的在腾讯云修改DNS服务器为cloudflare的

5、在cloudflare增加@和*两个AAAA解析

选择AAAA类型,代理状态为代理选择AAAA类型,代理状态为代理

  因为今天不能登录cloudflare借用其它用户图片。增加两个AAAA解析记录,一个@,一个*,都解析到自己服务器的IPV6地址。@解析的是 XXXX.cn,前面有没有xx.的。*是解析所有子域名,比如www.XXXX.cn、xxx.XXXX.cn。

6.写脚本自动更新域名的IP

根据cloudflare的API文档编写PHP脚本。

<?PHP

//define('URI','https://api.cloudflare.com/client/v4/zones/');

//define('ZONEID','22222222333333');   //Zone ID

//define('DNSRECORDS','dns_records');

define('URI','https://api.cloudflare.com/client/v4/zones/22222222333333/dns_records');

/////22222222333333 改为成自己的Zone ID


$fl_key='XXXXX2222222XXXXXXX22222';   //API Tokens,改成自己的API Tokens


function crul_url($url,$accessToken =false,$data=[],$quest='GET'){

    $data = json_encode($data);

    $ch = curl_init(); //初始化CURL句柄 

    $headers[]="Accept:application/json";

    if($accessToken){

        $headers[]  =  "Authorization: Bearer ". $accessToken;

    }

    curl_setopt($ch, CURLOPT_URL, $url); //设置请求的URL

    curl_setopt ($ch, CURLOPT_HTTPHEADER, $headers);

    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); //设为TRUE把curl_exec()结果转化为字串,而不是直接输出 

    curl_setopt($ch, CURLOPT_CUSTOMREQUEST,$quest); //设置请求方式

    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);//设置提交的字符串

    $output = curl_exec($ch);

    curl_close($ch);

    return $output;

}


function updaterecord($fl_key,$fl_dome_id,$ip,$type=false,$name=false,$ttl=false){

    $updatedata['content']=$ip;

    if($name) $updatedata['name']=$name;

    if($type) $updatedata['type']=$type;

    if($ttl)  $updatedata['$ttl']=$ttl;

    $url=URI.'/'.$fl_dome_id;

    $str=crul_url($url,$fl_key,$updatedata,'PATCH');

    $return=json_decode($str,true);

    if($return && $return['success']){

        return true;

    }else{

        return false;

    }

}


function getipv4(){

    $str=crul_url('http://ipv4.lookup.test-ipv6.com/ip/?asn=1&testdomain=test-ipv6.com&testname=test_asn4');

    $arr=json_decode($str,true);

    return $arr['ip'];

}

function getipv6(){

    $str=crul_url('http://ipv6.lookup.test-ipv6.com/ip/?asn=1&testdomain=test-ipv6.com&testname=test_asn6');

    $arr=json_decode($str,true);

    return $arr['ip'];

}


function echoerr($str=''){

    echo($str);

    exit();

}



$ipv4=false;

$ipv6=getipv6();

if(!$ipv6) echoerr('错误:获取不到IPV6地址。');


$strs=crul_url(URI,$fl_key);


$records=json_decode($strs,true);

if(!$records || !$records['success']){

     echoerr('错误:获取不到域名解析记录。');

}

foreach ($records['result'] as $result){

    if($result['type']=='AAAA'){  //只更新IPV6域名

        $type='AAAA';

        $ip=$ipv6;

        if($ip==$result['content']){

            echo('不用更新此域名'.$result['name']."rn");

        }elseif(updaterecord($fl_key,$result['id'],$ip,$type)){

            echo('更新'.$result['name'].'成功'."rn");

        };

    }

}

?>

   

Zone IDZone ID

申请API Tokens申请API Tokens

申请API Tokens申请API Tokens


7、到此外网的IPV4和IPV6都可访问服务器的WEB服务。

  可道云、PHP目录列表、µTorrent、jellyfin这几个服务都用ngix反向代理到子目录。cloudflare支持端口  HTTP:80,8080,8880,2052,2082,2086,2095,HTTPS:443,2053,2083,2087,2096,8443,因为国内环境80和443端口都被封,所以无法启用HTTPS(如果有哪位大神HTTPS启用成功了,我向他请教一下)。其实应该就是反向代理服务。

可正常访问网站,可正常访问网站,


其它服务全反向代理到子目录其它服务全反向代理到子目录

五、IPV6优化:设置IPV6客户端不经过cloudflare代理

这个设置很简单,在导航页判断客户端是否支持IPV6,如果支持就跳转到不经过代理的域名。

添加一个v6的AAAA记录,把代理状态关闭添加一个v6的AAAA记录,把代理状态关闭

现设置一个v6.xxxx.cn为IPV6的专用域名,再在导航页最前面加入下列代码。

<!!!script!!!>

function _jqjsp(data) {

     var v6url='http://v6.xxxx.cn:8880'; //修改为自己的IPV6专用域名地址

     if(data && data.type && data.type=='ipv6' && window.location.href.substr(0,v6url.length)!=v6url){

         window.location.href=v6url;

     }

 }

<!!!/script!!!>

<!!!script src="http://ipv6.lookup.test-ipv6.com/ip/?callback=_jqjsp&asn=1&testdomain=test-ipv6.com&testname=test_asn6"!!!><!!!/script!!!>


上面的代码要把三个一起的感叹号(!!!)全删除,下面载张图。

修改后的导航页源码修改后的导航页源码

这样只要支持IPV6的客户访问就会跳到v6.xxxx.cn:8880。

六、IPV4优化:把域名DNS转入到腾讯云,域名解析到cloudflare的IP

  https://zhuanlan.zhihu.com/p/570911722  cloudflare自选指定IP节点教程  找出cloudflare延时最低的IPV4节点。把域名的A记录解析到这个IP,可以分别找出电信联通移动 ping值最低掉包最少的节点,记住IP。比如电信最稳定IP为:172.67.209.188,联通最稳定IP为:162.159.160.222

把域名DNS转入腾讯云,但是cloudflare里面的解析和修改不用更改。

把域名DNS转回腾讯云把域名DNS转回腾讯云

把域名@和*的A记录解析到前面获取的cloudflareIP上把域名@和*的A记录解析到前面获取的cloudflareIP上

可以分别设置电信联通移动解析的IP,这样就可优化不同营运商访问到最佳的cloudflare节点。

在这要注意把cloudflare上的v6.xxxx.cn的AAAA解析记录删除,还要把导航页在第五段的跳转脚本删除。

七:IPV6优化2:把域名的AAAA记录解析到服务器的IPV6地址

把@和*的AAAA记录全解析到服务器的IPV6地址

把@和*的AAAA记录全解析到服务器的IPV6地址把@和*的AAAA记录全解析到服务器的IPV6地址

写脚本自动更新所有域名的AAAA记录。

代码不知道为什么发到文章就不能保存,先截张图。

自动更新解析代码自动更新解析代码

ID和Token获取方法见官方文档:https://docs.dnspod.cn/account/dnspod-token/


<?

define('URI','https://dnsapi.cn/');

$satcdata=[

    'login_token'=>'ID,Token',   //比如 ID 为:13490,ToKen为:6b5976c68aba5b14a0558b77c17c3932。即完整的 Token 为:13490,6b5976c68aba5b14a0558b77c17c3932 。

    'format'=>'json',

    'lang'=>'cn',

    'error_on_empty'=>'no',

    'domain'=>'XXXX.cn'

];


function recordlist($data){

    $url=URI.'Record.List';

    $return=json_decode(curl_dnspod($url,$data),true);

    return $return;

}


function recordModify($data){

$url=URI.'Record.Modify';

$return=json_decode(curl_dnspod($url,$data),true);

return $return;

}


function curl_dnspod($url,$data=[]){

$ch = curl_init ();

curl_setopt ( $ch, CURLOPT_URL, $url );

curl_setopt ( $ch, CURLOPT_POST, 1 );

curl_setopt ( $ch, CURLOPT_HEADER, 0 );

curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );

curl_setopt ( $ch, CURLOPT_POSTFIELDS, $data );

$return = curl_exec ( $ch );

curl_close ( $ch );

return $return;

}


function recordlupdate($data,$ip){

    $data['record_type']='AAAA';  //只查询AAAA记录的IPV6解析

    $recordlist=recordlist($data);

    if($recordlist && $recordlist['status'] && $recordlist['status']['code']=="1" && $recordlist['records']){

        foreach ($recordlist['records'] as $record){

            if($ip==$record['value']){

                echo('不用更新此域名'.$record['name'].'.'.$data['domain']."rn");

            }else{

                $redata=$data;

                $redata['record_id']=$record['id'];

                $redata['sub_domain']=$record['name'];

                $redata['record_line_id']=$record['line_id'];

                $redata['value'] = $ip;

                $retrun=recordModify($redata);

                if($recordlist && $recordlist['status'] && $recordlist['status']['code']=="1"){

                    echo('更新域名成功:'.$record['name'].'.'.$data['domain']."rn");

                }else{

                    echo('更新域名失败:'.$retrun['status']['message'].':'.$record['name'].'.'.$data['domain']."rn");

                }

            }

        }

    }elseif($recordlist && $recordlist['status']){

        echo('查询域名失败:'.$retrun['status']['message'].':'.$data['domain']."rn");

    }

}


function getipv6(){

    $str=curl_dnspod('http://ipv6.lookup.test-ipv6.com/ip/?asn=1&testdomain=test-ipv6.com&testname=test_asn6');

    $str=trim($str);

    $arr=json_decode($str,true);

    if($arr['ip']){

        return $arr['ip'];

    }else{

        return false;

    }

}

$ipv6=getipv6();

if($ipv6){

    recordlupdate($satcdata,$ip);

}else{

    echo("没有获取到IPV6地址。rn");

}

代码终于发出来了。

现在可以实现IPV6直接访问服务器,IPV4用cloudflare反向代理访问,还可根据营运商访问不同的cloudflare节点,实现快速稳定访问服务器。

作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~

展开 收起
229评论

  • 精彩
  • 最新
  • ipv6实在搞不定 win我都是去掉v6 linux 都防火墙禁掉…… 这东西尤其是联通的上来就是公网ip 不会玩 不会玩啊

    校验提示文案

    提交
    朋友是有公网ip才折腾nas,谁知刚搞好就变内网了。这才有这篇IPV6的文章。

    校验提示文案

    提交
    还有2条回复
    收起所有回复
  • 有服务器没必要这么麻烦。直接一个搭建一个nps,速度快,又不占用资源

    校验提示文案

    提交
    内网穿透用nps也不错,问题是腾讯云的服务器网速限得太厉害了。。。。。 [大囧]

    校验提示文案

    提交
    收起所有回复
  • 先收藏了,哪天有空再弄弄。现在用的威联通自带的,2M这样速度,日常同步文件还行,看视频看不了

    校验提示文案

    提交
    需要转码看1080没问题

    校验提示文案

    提交
    我们宽带上传带宽也才3M。 [邪恶]

    校验提示文案

    提交
    还有8条回复
    收起所有回复
  • 请问nas ipv6经过代理之后,无公网ip的电脑可以访问么?速度怎么样啊

    校验提示文案

    提交
    只需要目的端有公网就能访问到了,发起端无所谓

    校验提示文案

    提交
    IPV6的可以直接访问,IPV4的经过cloudflare代理。

    校验提示文案

    提交
    还有7条回复
    收起所有回复
  • 关ipv6防火墙是什么神仙操作啊 [皱眉] 这点真心不建议,不过成品路由这方面设置能力弱确实也是个坑。

    校验提示文案

    提交
    其实把路由的IPV6的防火墙关掉也没多大关系,系统本身就有防火墙,还有营运商也会关掉常用端口。

    校验提示文案

    提交
    我是怎么设置都不行,所以路由端的ipv6防火墙直接关了,然后把防火墙去到每个终端就好,而且ipv6地址都不是固定的,也会刷新,路由每天重启,被那啥风险相对不高。

    校验提示文案

    提交
    收起所有回复
  • 唯一的问题是在家宽上提供web服务会被封宽带 [皱眉]

    校验提示文案

    提交
    我们这没事,只是封一些常用端口。

    校验提示文案

    提交
    还是vpn 整个30000以后的端口靠谱

    校验提示文案

    提交
    收起所有回复
  • 各种都折腾了,IPV6直接DOCKER里弄个插件绑定域名就可以了,防火墙开启,IPV4的,用了PGY的旁路由,主要是公司电脑用,P2P的机率有一半。

    校验提示文案

    提交
    蒲公英只能做VPN组网吧?

    校验提示文案

    提交
    收起所有回复
  • 把红米ax6000刷了openwrt,然后开zerotier,实现了异地组网,两台设备都有ipv6,相当于直连了,体验还行。主要是可以用内网地址直接访问了,挂载的硬盘在外网也能直接打开了。

    校验提示文案

    提交
    都有IPV6,不用zerotier可直接用DDNS

    校验提示文案

    提交
    收起所有回复
  • 看上去就是对ipv6做了一个ddns? 感谢分享,但老实说这个方案复杂度还是挺高的,如果是爱快的软路由系统,只用处理域名申请和NAS反向代理这一块,路由器端设置非常之简单

    校验提示文案

    提交
    原理其实挺简单的。利用腾讯云的相同域名IPV4和IPV6可以同时解析,IPV6优先。这样把IPV6解析到自己服务器,IPV4根据营运商分别解析到cloudflare不同接点。主要是腾讯云和cloudflare都要解析到服务器IPV6地址,要用两DDNS同时更新IP。我就是用文章里面两脚本分别更新的。

    校验提示文案

    提交
    可以买那些便宜的域名么,.xyz那些

    校验提示文案

    提交
    还有2条回复
    收起所有回复
  • 域名指向的是cf的地址吧,如果***

    校验提示文案

    提交
    ipv4是的,ipv6是自己服务器

    校验提示文案

    提交
    这个倒是好办法,赞一个

    校验提示文案

    提交
    收起所有回复
  • 广州联通宽带就别想了,不给分发ipv6前缀,无法使用ipv6

    校验提示文案

    提交
    那还叫ipv6吗?

    校验提示文案

    提交
    同广州,可以用ipv6,且光猫无v6防火墙

    校验提示文案

    提交
    还有8条回复
    收起所有回复
  • 楼主教程很详细。目前在用纯v6DDNS远程比较简单,要v4的话,套个支持v4v6的cdn转发应该就能双栈访问了,不过cf免费的延迟有点大 [傻笑]

    校验提示文案

    提交
    可以找个延时少的ip。

    校验提示文案

    提交
    收起所有回复
  • 问题是IPV4也不能直接访问IPV6吧?

    校验提示文案

    提交
    看三和四,用cloudflare

    校验提示文案

    提交
    感谢,教程写的挺好。看着我又心痒痒了,看来又要一番折腾了。

    校验提示文案

    提交
    还有1条回复
    收起所有回复
  • emmm 为啥要cn域名。。

    校验提示文案

    提交
    续费便宜,其他域名续费太贵了,如果没想过续费那可以用别的域名。还有注册一下自己名字拼音cn域名也很不错。

    校验提示文案

    提交
    同名字拼音cn域名,之前查了一下,已经10多年了。 [亲亲] 虽然今年做了博客,但是基本不打理,有点浪费。 [装大款]

    校验提示文案

    提交
    还有3条回复
    收起所有回复
  • 如果,单纯自己用,teamviewer是最方便的

    校验提示文案

    提交
    应用场景不一样

    校验提示文案

    提交
    收起所有回复
  • 有公网 关防火墙真的很危险

    校验提示文案

    提交
    只是关路由器的防火墙,还有电脑的防火墙

    校验提示文案

    提交
    收起所有回复
  • 其实dynv6有免费的可以解析ipv6的域名,还附赠ddns,我没试过,你可以去试试,要是能跳过这整篇文章请不要过来打我 [阴险]

    校验提示文案

    提交
    这个不能实现只有IPV6公网时,IPV6和IPV4同时访问

    校验提示文案

    提交
    同时访问?有v6了为何还要再v4。如果是一些服务只能用v4访问,我都是用socat转换搞定。

    校验提示文案

    提交
    收起所有回复
  • 给黑群晖设置了ddns绑定了域名,小米路由器AX3600拨号,开了IPV6,关了移动光猫防火墙。正常获取到V6地址,内网ping通,外网下安卓手机均正常访问,就是苹果手机全都不行,照不出问题。

    校验提示文案

    提交
    用电脑外网访问下看看。小米路由器有IPV6防火墙,有些型号还不能关。

    校验提示文案

    提交
    但是安卓手机就可以访问,速度很快。

    校验提示文案

    提交
    还有3条回复
    收起所有回复
  • ipv4网络怎么访问呢?

    校验提示文案

    提交
    看三和四段,用cloudflare代理

    校验提示文案

    提交
    好麻烦。试了一下,没搞好 [小怒]

    校验提示文案

    提交
    还有4条回复
    收起所有回复
  • 真是够折腾的 要我可能就去跟联通交涉了 技术不灵只能撕逼去 哈哈哈

    校验提示文案

    提交
    和联通交涉不成功,叫退网办电信,头太铁了。

    校验提示文案

    提交
    联通投诉不好用 直接往上级单位投诉 工信部好使

    校验提示文案

    提交
    还有1条回复
    收起所有回复
提示信息

取消
确认
评论举报

相关文章推荐

更多精彩文章
更多精彩文章
最新文章 热门文章
5.6K
扫一下,分享更方便,购买更轻松