声明:本文命令用斜体进行表示,ip用代码块进行表示请知悉。
概述:
ipv6技术在工信部的推崇下使得运营商不得不进行ipv6的搭建,由于我近日重新办理了宽带资费使得可以向宽带运营商提起工单以用于获得ipv4公网与ipv6的权利,所以我获得了ipv6的使用资格,特制作该篇文章,以用于向公众展现ipv6的应用方法。
那么ipv6技术到底是如何实现的呢?
首先,先看看ipv6的ip长什么样
如此如此,这般这般,所以ipv6由128字节组成,且ipv6为16进制,使得ipv6共有32个字符组成,4个为一组,一共有8组,由此可见,ipv6不建议手动配置,还是得自动下发啊。
2408:8266:207:46:2276:93ff:fe47:f3db
这是一个ipv6的全球单播地址,就是终端使用的ipv6地址,这个是他的缩写,rfc允许对每一段开头的0进行缩写,使得我们可以对于开头为0的字符进行简写,所以这个ip的全写应该是
2408:8266:0207:0046:2276:93ff:fe47:f3db
fe80::34fd:d3ff:feaf:7e19
在前面提过rfc允许缩写,对于全为0的分段可以用::代替,但是一个ip里面只能有一组,所以这个ip的全写是“
fe80:0000:0000:0000:34fd:d3ff:feaf:7e19
”,rfc规定像fe80这类的地址是本地链路地址不能用于互联网通信,具体部分,去看看这些文章吧
网络编程懒人入门(十一):一文读懂什么是IPv6-网络编程/专项技术区 - 即时通讯开发者社区!
ipv6教程
我个人呢,比较喜欢看wakin老师的课,也喜欢去im平台学习网络技术。
那么当我们获取到了例如2406这样的全球单播地址ip后该怎么样搭建网站呢?
首先,我们需要先对域名的ipv6解析功能进行设置,这里需要将域名指向ipv6地址
例如这里我将ipv6.10086.fund的域名指向了
2408:8266:207:46:34fd:d3ff:feaf:7e19
记录类型为aaaa,即4a而这个4a有点意思,他指的是帐号(Account)管理、授权(Authorization)管理、认证(Authentication)管理和安全审计(Audit)的安全。(给你几哈,其实并不是哈,域名解析的aaaa指的就是将域名指向一个ipv6地址,对应的,域名指向ipv4地址就是a记录,所以aaaa记录就是将域名指向ipv6)。
待ipv6生效以后,我们就可以使用域名访问ipv6了,
使用ping6 命令就可以对ipv6的网站进行icmp协议的连接,注意这个ping 使用的是icmp协议,并不是tcp/udp。所以ping不通并不等于上不了网,这部分会在下面的ip6tables 中进行说明。但是吧,tcping 这个命令是在tcp上面运行的,且这个命令是以向服务端的某个端口握手成功为基础进行的连接,有点类似于syn攻击,不交换数据仅握手。
当我们已将域名指向ip以后,剩下的就在服务端上面进行配置了,先看看nginx配置吧
我开头说个这个是ipv4&&ipv6双栈技术,就意味着这个允许ipv4与ipv6的同时访问,目前来看会优先使用ipv6的连接方式,这极大提高了效率。
首先第二行 listen 23350 就是监听端口号为23350的ipv4端口,ssl指的是使用tls协议加密。 http2指的是允许使用新一代(其实还有quic的http3,我没部署,因为我被整自闭了)的http2技术进行高效连接。
第三行的 [::] 指的是监听本地的ipv6地址,:443 指的是监听443端口 ipv6only=on 就是开启ipv6监听模式,且 ipv6only=on 命令仅用配置一次即可,但是用于监听端口的listen 80 或者[::] 是需要在每一个server 里面配置的,具体部分,可参考我往期文章
nginx配置文件详解 made by qwe
到此,配置就结束了,但事情往往没有那么简单,你或许可以在同一路由器里面看到的的确确可以用终端使用ipv6的方式访问ipv6.10086.fund,当然能这么做的也只有我本人而已。
ipv6确实可以是你的内网终端设备或获取到ipv6的全球单播地址,但这并不意味着,你的全球单播地址是直接通向运营商的bras宽带接入服务器的。
在ipv4中我们深知如果想要一台内网设备的某个端口可以对外提供服务,我们就需要使用例如端口转发或者upnp的方式才能实现对外的被动连接功能,注意这里的被动连接是指的由外部设备主动向内部服务器发起访问。
即外部ip连接到pppoe拨号设备后,由拨号设备根据转发表将数据发向内部设备,所形成的被动连接,连接是由外部设备发起的,而主动连接是由内部设备发起的,深知这一点才行。
而对于ipv6来说,目前主流的方式分为dhcpv6与slaac,不过这2种实际上我也不太会懂,不过幸运的是openwrt的ipv6可以轻易的把我整的鬼冒火,使得我有充分的时间去为了openwrt的奇怪的翻译,以及一些莫名其妙的选项配置而去努力学习ipv6的技术,感谢openwrt的开源精神,相信经过openwrt折磨以后我在使用routeos我一定有充分的动力去针对那些奇奇怪怪的配置而去学习一些没什么用的技术。
不过吧既然热爱就要去奋斗,选都选了,你看文章都快写完了,劝退显然是不合适的,要有科研精神,在这一个以短视频的方式用于消费碎片化时间的年代,为了一项可能未来就不会流行的技术而去努力研究是的人属实的是一名工程师应该有的精神不是吗?
还是继续吧,想什么呢,看都看了,不看完,是不是浪费你的时间呢?
由于我这边的pppoe拨号时ipv6的配置为dhcp模式,使得如果要向外部提供服务,我就必须的征求路由器的同意,也就是就算你是ipv6全球单播地址,你照样需要对ip6tables 进行配置,就如同ipv4的iptables 要配置一样的,ipv6也需要通过ip6tables 的放行才能通过,好在经过我的不断探索,我终于知道怎么配置了,不过作为一名优秀的接入网工程师不会iptables也是很正常的,不过我同时也是一名优秀的linux工程师,不会iptables 有点说不过去。
首先我们先要知道这个ip到底是怎么到达对面的。
此时我们使用traceroute 命令可以看出,最后一跳是我们的全球单播地址指向的正是服务器的ip
那倒数第二跳呢?
他指向的是我pppoe拨号设备的外部ip,也就是说我的路由器是为ipv6提供了中转服务,那么,对于一个路由器来说必定会涉及到iptables 中的防火墙参数,就如同ipv4的端口转发一样,是需要配置参数的。
不过遗憾的是本人不太会iptables的配置,幸运的是我至少还会根据前辈们的文章还修改参数,最后我还是得出了配置方法。
ip6tables -A OUTPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
ip6tables -A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
ip6tables -A FORWARD -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
-p 的意思是协议, --dport 的意思是端口号,这里我对443端口进行了出入的放行与转发,ACCEPT 的意思是接受这条规则,iptables具体内容可以参考这篇文章
iptables详解(1):iptables概念-朱双印博客
上面有提到关于icmp的细节,在防火墙中应对icmp进行放行后,在外部才能ping通,但ping通不意味着可以上网。
到此,这篇文章就快结束了,在这篇文章里面简要讲解了ipv6的ip结构,nginx监听ipv6的方法与ipv6的防火墙放行方法,当然防火墙部分可能说的不是很详细,希望你们能够努力学习,使得网站尽快支持ipv6。