全球主机交流论坛

标题: 一箭三雕,Linux一键重装支持纯IPv6环境AlpineLinux Ubuntu Windows [打印本页]

作者: 天权璇玑    时间: 2023-8-26 21:03
标题: 一箭三雕,Linux一键重装支持纯IPv6环境AlpineLinux Ubuntu Windows
本帖最后由 天权璇玑 于 2023-8-26 21:14 编辑

论坛主贴:

https://sunk.eu.org/thread-1159839-1-1.html

github:

https://github.com/leitbogioro/Tools

图库为 sm.ms,国内用户需挂梯子全局才能查看。

最近更新内容:


今天详细讲解的内容,主要是让 AlpineLinux 彻底支持不同情况下的单栈 IPv6 环境。

众所周知,AlpineLinux 官方是不支持单栈 IPv6 环境下,从网络内核启动,成功配置网络的,官方 PXE 启动 文档也自 2021 年后,就很久没有再更新了,里面仅提及配置 IPv4 部分,乏善可陈。

但自从上篇文章 略施巧计,飞跃 Hetzner 重装 AlpineLinux Ubuntu Windows 险阻 中,我们找到了一个绝妙的方法,通过劫持 init 文件中 configure_ip() 函数静态网络配置注释和判断式下,添加 ip route 命令,强制让不规则 IPv4 添加到临时环境,以实现成功配置网络。

正所谓只要招数管用,一次用是用,十次用也是用,屡试不爽,就看能把它巧妙地运用于哪个地方,大方向对了,中间的一些小困难都是能克服的。

中间排坑的地方就不说明了,直接讲解代码吧:

以下是修改 init 文件前,脚本中对应单栈 IPv6 时的处理方法,elif 前面还有一个对应单栈 IPv4 和双栈的判断式,涉及软 hack IPv4 的,之前文章里讲过,就不贴了:

  1. elif [[ "$IPStackType" == "IPv6Stack" ]]; then
  2.   if [[ "$Network6Config" == "isStatic" ]]; then
  3.     fakeIpv4="172.25.255.72"
  4.     fakeIpMask="255.255.255.0"
  5.     hackIpv6Context="manual configuration"
  6.   elif [[ "$Network6Config" == "isDHCP" ]]; then
  7.     hackIpv6Context="automatic configuration"
  8.   fi
  9.   sed -i '/'"$hackIpv6Context"'/a\\t\tdepmod\n\t\tmodprobe ipv6\n\t\tip link set dev '$interface6' up\n\t\tip -6 addr add '$ip6Addr'/'$actualIp6Prefix' dev '$interface6'\n\t\tip -6 route add '$ip6Gate' dev '$interface6'\n\t\tip -6 route add default via '$ip6Gate' dev '$interface6' onlink\n\t\techo '\''nameserver '$ip6DNS1''\'' > /etc/resolv.conf\n\t\techo '\''nameserver '$ip6DNS2''\'' >> /etc/resolv.conf' /tmp/boot/init
  10. fi
复制代码

然后是写入 grub 引导 menuentry 菜单时的处理事项:

  1. elif [[ "$IPStackType" == "IPv6Stack" ]]; then
  2.   [[ "$Network6Config" == "isStatic" ]] && Add_OPTION="ip=$fakeIpv4:::$fakeIpMask::$interface6:::" || Add_OPTION="ip=dhcp"
  3. fi
  4.   BOOT_OPTION="alpine_repo=$LinuxMirror/$DIST/main/ modloop=$ModLoopUrl $Add_OPTION"
复制代码

好奇怪哦,再看一眼,配置 IPv6 静态的话,我们明明是要写入 IPv6 的相关参数,为什么要给内核启动,静态配置网络参数时,添加“172.25.255.72”、“255.255.255.0”两个写死的,毫不相关的 IPv4 参数呢?下面我连带软 hack IPv6 动态静态的原理,一起好好解释一下吧:

首先我们来看一下,对于处理静态 IPv6 网络(包括公网 IPv6 + fe80::1 内网网关)的方法:

显然,对于这种情况,我们需要劫持并定位的,对应 init 中 configure_ip() 函数中的上下文,根据传参到“hackIpv6Context”变量值,即需要软 hack 匹配的上下文关键词,为“manual configuration”,显然是在其以下,用类似于手动添加 IPv4 各配置的方法,把 IPv6 各配置也写入进去。
作者: 天权璇玑    时间: 2023-8-26 21:05
本帖最后由 天权璇玑 于 2023-8-26 21:06 编辑

sed -i 从“manual configuration”下面若干行追加的命令,显然有些冗长难懂,我把它的结果整理成易读格式:

  1. depmod
  2. modprobe ipv6
  3. ip link set dev eth0 up
  4. ip -6 addr add IPv6 地址/IPv6 掩码后缀 dev eth* 网卡名
  5. ip -6 route add IPv6 网关 dev eth* 网卡名
  6. ip -6 route add default via IPv6 网关 dev eth* 网卡名 onlink
  7. echo 'nameserver 2001:4860:4860::8888' > /etc/resolv.conf
  8. echo 'nameserver 2606:4700:4700::1111' >> /etc/resolv.conf
复制代码

“depmod”和“modprobe ipv6”负责开启 AlpineLinux 网络启动内核的 IPv6 模块及相关依赖,后面的命令就是对于 IPv6 版的添加本机 IPv6 地址、掩码、网关、设置 DNS ,区别无非就是从 ip 变成了 ip -6 ,对规则的或不规则的 IPv6 都生效,这里就不再赘述。

如果机器的 IPv6 是用 dhcp 配置的,通过读取原系统中的网络配置文件,判断出符合这一情况,那么传参到“hackIpv6Context”变量值,即需要软 hack 匹配的上下文关键词,就变成了“automatic configuration”,添加 IPv6 网络详情的步骤和静态情况下完全一致。

下面我们来看在 grub 引导菜单中,配置“ip=...”,这里对于 IPv6 静态或动态的处理就有了更多不同。

  1. [[ "$Network6Config" == "isStatic" ]] && Add_OPTION="ip=$fakeIpv4:::$fakeIpMask::$interface6:::" || Add_OPTION="ip=dhcp"
复制代码

显然,主条件是“Network6Config”(IPv6 的配置方法)是否为“isStatic”(静态),如果为是,则指定了以下方法,如果为否(即 IPv6 为动态配置),则指定“ip=dhcp”。

  1. Add_OPTION="ip=$fakeIpv4:::$fakeIpMask::$interface6:::"
复制代码

“interface6”很好理解,就是负责处理 IPv6 网络连接的网卡名,细心的小伙伴们发现了,“fakeIpv4”和“fakeIpMask”和上面的代码形成了联动,即强制给 AlpineLinux 网络启动内核一个主 IPv4 为 172.25.255.72 ,IPv4 掩码为 255.255.255.0 的参数。

咱们明明是在配置 IPv6 网络的相关参数,为什么要给一个固定的,且“假的”(fake*) IPv4 地址和掩码呢?

答案很简单,因为直至目前的 AlpineLinux edge(3.18 版本),AlpineLinux 都无法原生支持从内核启动读取“ip=”参数,来获得并承认有效的 IPv6 参数配置格式。

之所以给一套假(fakeIpv4, fakeIpMask)的 IPv4 配置(主 IPv4 、IPv4 掩码),是为了确定让 AlpineLinux 的网络内核程序,以“静态”方式去启动网络服务配置网络,虽然这套假的 IPv4 配置,并不能真正地让网络安装内核按其参数去把网络配置好,但别忘了,刚才我们还有一套添加了真实 IPv6 参数,并让网络安装内核去访问 IPv6 网络的方案。

这套假的 IPv4 配置,作用仅限于让 AlpineLinux 以静态配置方式启动并配置网络服务,至于它是什么,无所谓,我选用“172.25.255.72”这个 IPv4 ,也是参考了全网并没有哪个具体环境,真的把它当做一个有效的 IPv4 去配置,而且它也属于互联网 IP 组织规范中,IPv4 内网地址的范围之内(172.16.0.0 - 172.31.255.255),任何人和组织都可以把它当做内网 IP 去配置,不会影响到任何在公网上服务的计算机。

为了尽量避免,因为设置了一个真实存在的公网 IPv4 ,而导致发生一些其他不可预知的后果,我便选择了这个 IPv4 地址,作为“骗过”AlpineLinux 并强制令其进行静态网络配置的临时 IP,力图把设置为该 IP 而引发的不良后果范围降低到最小。

可能还会有一些探索欲旺盛的朋友问,要让 AlpineLinux 网络启动内核以静态方式配置网络,不配置这套假的 IPv4 行不行?比如给:

  1. ip=:::::$interface6:::
复制代码

就让其从 IPv6 网卡,启动静态的网络配置是否可行?

我当然不会没考虑过这一点,怎么可能先用反直觉的“fake IPv4”来“骗过” AlpineLinux ,但经过实际测试,发现用:

  1. ip=:::::$interface6:::
复制代码

来配置,发现程序始终不能正确通过“Setting IP”步骤,所以才大费周章,用“假 IPv4”来应付这一难关。

所以,经过以上实验,我们得出了,要通过 ip -6 添加 IPv6 参数、内核启动时,指定假 IPv4 等一系列操作,让 AlpineLinux 网络安装内核能够顺利启动,并配置 IPv6 网络的结论,并且我们在正式为 AlpineLinux 或 Ubuntu 系统中,配置网络环境的时候,给出了适合的 IPv6 配置。

并且由于这套假的 IPv4 参数,仅限定于重启后在内存中加载的,AlpineLinux 网络内核在内存启动时的临时环境,而且由于在添加了 IPv6 相关参数并能够正常访问 IPv6 网络后,AlpineLinux 在执行后续与网络连接相关的命令时,如果发现已配置的 IPv4 部分工作不正常后,会切换到已正常运作的 IPv6 栈部分去进行访问。

再加上刷入到硬盘中的正式系统内,IPv6 部分是按规范进行配置的,所以这套假 IPv4 配置,在原生安装 AlpineLinux 或 dd Ubuntu Windows 后,重启后进行配置时的负面影响,就完全消失了,内存断电重启后数据完全消失,这是人人都知道的公理。

对于 IPv6 dhcp 动态配置下的情景,为什么内核启动参数又变成了“ip=dhcp”呢?

由于我本次测试中的各类环境,IPv6 动态环境仅限于 Vultr 的,Vultr 的 IPv6 only 机型,本质上是有一套完整的 IPv4 IPv6 内网 dhcp 路由 + 阉割了获得公网 IPv4 地址的方式实现的,所以本质上它还是有一套完整的本地 IPv4 dhcp 网络,只不过 IPv4 无法获得公网 IPv4 地址,所以内核启动时,要指定“ip=dhcp”来设置从 IPv4 dhcp 获取地址,手动添加 IPv6 各配置的方法,仍然通过软 hack 实现。

好奇的朋友们可能又会问:反正实现 IPv6 的访问,都是靠 ip -6 手动实现,为什么不将其归类到劫持 AlpineLinux init 文件的函数“configure_ip()”的静态配置方法,即“manual configuration”中。

反而要根据从原系统中读取到的动态配置,单独把它归类到劫持“automatic configuration”方法里呢?

这里面当然是有说道的,下面我们来假设(我试验过)的情形,即 Vultr 环境,服务器支持 IPv4 IPv6 双栈动态配置,且 IPv4 有完整的 dhcp 本地路由,无法获得公网 IP ,且 IPv6 栈支持 dhcp 连接到公网的情况。

通过 grub 内核启动时,指定:

  1. ip=:::::$interface6:::”或“ip=$fakeIpv4:::$fakeIpMask::$interface6:::
复制代码

来配置,这里我放一张测试时遇到的截图。



显然,AlpineLinux 网络内核程序,返回了“Installing packages to root filesystem, ICMPv6 RA: ndisc_router_discovery failed to add default route”的错误,即母机 IPv4 配置命令,覆盖了我们指定的, AlpineLinux 网络安装程序的 IPv4 静态命令,并生成、覆盖了一套仅适用于该 IPv4 dhcp 环境下的配置参数,让我们在内核中指定的“糊弄” IPv4 部分徒劳无功:

如果你有志于探索和我 debugging 时一样的排坑之路,那么几乎 99% 的情形下,会被各种错误所击溃,为了造福于后人,我只能把我通过各种艰难险阻之路探索后的结果,忠实公布于众,然后把我为数不多迷雾图中的艰辛分享给你,希望你在至少参考了我无头苍蝇试错的路上,多多少少能避免重复出现我遇到的低级错误,或者能从我试错的路径之上,寻找到一条更接近康庄大道之路的导航规划。

你们也别笑我笨,因为我本非计算机科班出身,仅靠兴趣和毅力坚持到如今。

在内核启动中指定“ip=dhcp”后,由于机器本身 IPv4 网络部分的配置被上游 dhcp 服务器正确配置了,且 init 文件里指定了正确的 IPv6 网络参数,所以临时环境 AlpineLinux 中,IPv6 栈也是能顺利访问的,后期无论是安装 AlpineLinux 到系统,或是 dd Ubuntu 或 Windows ,后续过程自然也是一气呵成,不会有任何阻碍了。

百闻不如一见,打一万句嘴炮,不如久经考验的实测,下面直接放图吧,怀疑我是为了节目效果,故意 PS 的,请大大方方地,在本帖中点上一个“反对”即可,我没这个精力,也不需要去和这类声音对线。相信我的考据、结论的人,自然会保持一份信赖,用我的脚本实现他们需要的功能和目的,然后以真诚去印证我的承诺和结论。

实验机型 idc.wiki 虽然为纯 IPv6 机型,但由于内存仅为 512MB ,无法满足从内存中完整加载整个被配置好的 AlpineLinux 并写入硬盘的要求,故测试前提仅从 AlpineLinux 网络安装内核启动时的 IPv6 网络栈配置情况(注释了原脚本中,正式部署 AlpineLinux 的 chmod a+x $sysroot/etc/local.d/${AlpineInitFileName}; ln -s /etc/init.d/local $sysroot/etc/runlevels/default 部分),不涉及正式安装完整版 AlpineLinux 后从原生系统启动并查看其网络配置部分,但安装 Ubuntu 依然可以成功,且可以展示安装后的效果。

为保持变量结果统一,原系统均为各 VPS 自带的原系统 Debian 12 ,从其他自带模板,如 Debian 11-, AlmaLinux, RockyLinux, CentOS 等也经过测试,脚本均能正确地、自动读取出原系统中是 IPv6 动态或静态配置,然后指定 AlpineLinux 网络安装内核以适应的参数,在单栈 IPv6 网络下正确配置。
作者: 天权璇玑    时间: 2023-8-26 21:07
环境:idc.wiki ,512MB 内存,单栈不规则 IPv6 静态 static。

idc.wiki Web 后台网络配置详情:



idc.wiki 脚本安装 alpine 界面:



idc.wiki 脚本安装 alpine init:



idc.wiki 脚本安装 alpine grub:



idc.wiki 脚本安装 alpine VNC:



idc.wiki 脚本安装 Ubuntu 界面:



idc.wiki 脚本装完 Ubuntu:



对于部分环境 dd 安装 Ubuntu 需要说明一下,可能由于原环境为 Cloud init ,对脚本自行执行从 Cloud init 配置文件启动配置时产生影响,此时除了“网络配置”外,自定义端口、预置组件等自定义都是不生效的,所以一旦发现安装 Ubuntu 时,且定义端口并非默认的“22”,安装成功后连接自定义端口失败,请尝试采从 22 端口连接,默认密码:

  1. LeitboGi0ro
复制代码

不会变,安装后可自行修改 ssh 端口、密码,或设置密钥(key)连接。

环境:Server-Factory ,2GB 内存,单栈 IPv6 静态 static。

server-factory Web 后台网络配置详情:



server-factory 脚本安装 alpine 界面:



server-factory 脚本安装 alpine init:



server-factory 脚本安装 alpine grub:



server-factory 脚本安装 alpine VNC:



server-factory 脚本装完 alpine:



server-factory 脚本安装 Ubuntu 界面:



server-factory 脚本安装 Ubuntu VNC:



server-factory 脚本装完 Ubuntu:



环境:Digital Ocean, 1GB 内存,双栈 IP 静态配置网络,通过“ bash InstallNET.sh -debian 12 --networkstack "ipv6" ”重装成仅配置 IPv6 静态网络,IPv4 栈无法访问,以模拟纯 IPv6 栈情况。

Digital Ocean Web 后台网络配置详情:



Digital Ocean 脚本安装 alpine 界面:



Digital Ocean 脚本安装 alpine init:



Digital Ocean 脚本安装 alpine grub:



Digital Ocean 脚本安装 alpine VNC:



Digital Ocean 脚本装完 alpine:



Digital Ocean 脚本安装 Ubuntu 界面:



Digital Ocean 脚本安装 Ubuntu VNC:



Digital Ocean 脚本装完 Ubuntu:



环境:Vultr, 1GB 内存,IPv4 IPv6 双栈 dhcp 配置,且特意设置成 IPv4 栈无法路由到公网 IP ,且仅 IPv6 能。

Vultr 创建实例时,关闭获得 IPv4:



Vultr Web 后台网络配置详情:



Vultr 脚本安装 alpine 界面:



Vultr 脚本安装 alpine init:



Vultr 脚本安装 alpine grub:



Vultr 脚本安装 alpine VNC:



Vultr 脚本装完 alpine:



Vultr 脚本安装 Ubuntu 界面:



Vultr 脚本安装 Ubuntu VNC:



Vultr 脚本装完 Ubuntu:



后记


作者: ____________Cc    时间: 2023-8-26 21:10
沙发 前排??                                                         
作者: 三丫的    时间: 2023-8-26 21:21
鸡鸡多啊
作者: greencloudvps    时间: 2023-8-26 21:44
不错,在用




DMIT CN2GIA购买 || DMIT TG交流群


作者: netviyin    时间: 2023-8-26 22:19
提示: 作者被禁止或删除 内容自动屏蔽
作者: 天权璇玑    时间: 2023-8-26 22:23
netviyin 发表于 2023-8-26 22:19
好文。啥也看不懂。就看到这句:

5k 哥又买号进论坛了?上次你被管理以“各大论坛不欢迎之跳梁小丑”被封的时候,也是喷我脚本乱发包,拜托喷我的时候能不能换一套说辞?
作者: netviyin    时间: 2023-8-26 22:25
提示: 作者被禁止或删除 内容自动屏蔽
作者: b66667777    时间: 2023-8-26 22:25
5k重生 ?  
作者: goldharp    时间: 2023-8-26 22:34
不错,在用
作者: yanzhiling2002    时间: 2023-8-26 23:07
少见的高质量帖子,感谢大佬开源
作者: wuguou6    时间: 2023-8-28 08:10
如何支持独立服务器安装debian 11 xfs格式系统呢
作者: bbx188    时间: 2023-8-28 08:34
这人的一键脚本能用。但是这个人不怎么讨喜,工具他做了,付出也付出了,可是让人感激不起来
太鸡婆了,做个DD脚本搞得好像写论文一样,搞那么长的篇幅去介绍他的实现原理,真正的使用方法都淹没在他的论文里面了,看得人头晕。
而且疑心病很重,小白问一个使用问题,可能对于他来说是很弱智的问题,你多问了两句,他就以为你在怀疑他,质疑他,
然后甩出来一句,代码是开源的,你随意去鉴定,可以找公证人,一人5000USDT对赌。感觉特别可笑!!!
作者: 天权璇玑    时间: 2023-8-28 23:36
bbx188 发表于 2023-8-28 08:34
这人的一键脚本能用。但是这个人不怎么讨喜,工具他做了,付出也付出了,可是让人感激不起来
太鸡婆了,做 ...

群里骂不过来论坛找我对线是吧,不爱用别用,疑心病重自己去写,言论自由,我爱发什么发什么,不想看别看,你管得着?
作者: netviyin    时间: 2023-8-29 01:24
提示: 作者被禁止或删除 内容自动屏蔽
作者: 燕十三丶    时间: 2023-8-29 01:47
用心了 写这么多 来个一键自动获取判断填写脚本就更好了
作者: bbx188    时间: 2023-8-29 08:44
netviyin 发表于 2023-8-29 01:24

写个说明文都扯一w字的。能骂得过谁呢

我的评论已经很明确了,他很鸡婆,很啰嗦。
小白咨询个小问题,他啰里啰嗦一堆,你多说一句,他就来一句,你如果质疑,就如何如何。
按照他的思维方式,他的脚本已经天下独一份。

作者: bbx188    时间: 2023-8-29 08:45
天权璇玑 发表于 2023-8-28 23:36
群里骂不过来论坛找我对线是吧,不爱用别用,疑心病重自己去写,言论自由,我爱发什么发什么,不想看别看 ...

没错,这个论坛又不是你开的,我也是想发就发啊,对不对,我只是表明我的看法,不犯法吧
作者: netviyin    时间: 2023-8-29 17:53
提示: 作者被禁止或删除 内容自动屏蔽
作者: bbx188    时间: 2023-8-29 18:54
netviyin 发表于 2023-8-29 17:53
这个天 权 b贱得很。好坏话都分不清,建议和怼都分不清。

跟5k一个鬼样。天天蹦达,技术又没人家好。

是的,这人人品不行,又喜欢装,跟5k感觉一路货色。
他这脚本,就是东边借鉴一点,西部抄一点,然后捏吧捏吧,就开始吹,他的脚本天下无敌。
他那个思路是借鉴bin456789大佬的,最开始装逼的时候被大佬嘲讽了!,然后就假惺惺的编辑文章加上那个感谢别人的话,太虚伪了!!!

我就刚刚说我不喜欢这个人,他就在秋水大佬的群里骂我,我刚刚从秋水大佬的群里退出来了,免得造成不好影响。
作者: 李某某    时间: 2023-8-29 19:00
加油,支持你
作者: netviyin    时间: 2023-8-29 19:03
提示: 作者被禁止或删除 内容自动屏蔽
作者: bbx188    时间: 2023-8-29 19:09
本帖最后由 bbx188 于 2023-8-29 19:13 编辑
netviyin 发表于 2023-8-29 19:03
他大概认为他加了个声明,即便是后来加的。也不算”抄“吧
所以每次写1w字掩盖


这人还是挺牛逼的,这叫唾面自干!!!
自己打自己的脸







我能说这人是不要脸嘛?
作者: netviyin    时间: 2023-8-29 19:12
提示: 作者被禁止或删除 内容自动屏蔽
作者: bbx188    时间: 2023-8-29 19:14
netviyin 发表于 2023-8-29 19:12
难为他了

估计天天熬夜弄这个东西,一看没别人家的一半好,内心不甘

他确实投入了不少心血,你看他那像搞学术研究一样,写那么多论文,也是辛苦!!!
作者: netviyin    时间: 2023-8-29 19:18
提示: 作者被禁止或删除 内容自动屏蔽
作者: 圣如下花    时间: 2023-8-29 19:31
功能太多,太复杂,但比较适合比较特殊的机器用,另外同样的系统比moeclub脚本装完占用大一些(特别是debian)
提一个建议,能不能加一个自动用cloud内核替换系统内核的选项?还有那个ssh登录时的系统信息显示,国内机器获取public ip容易卡住
作者: bbx188    时间: 2023-8-29 19:38
netviyin 发表于 2023-8-29 19:18
写很多字,这不是重点
毕竟不是谁字多谁理大

https://sunk.eu.org/thread-1201346-1-1.html
作者: BackDoor    时间: 2023-8-29 19:44
提示: 作者被禁止或删除 内容自动屏蔽
作者: 提皮tp    时间: 2023-8-29 21:41
哪买的两个小号,搁这一唱一和的
作者: 天权璇玑    时间: 2023-8-29 22:18
圣如下花 发表于 2023-8-29 19:31
功能太多,太复杂,但比较适合比较特殊的机器用,另外同样的系统比moeclub脚本装完占用大一些(特别是debian ...

1. 更换内核的成本小于收益,得不偿失,一个能正常运作的系统,能跑就不要动,我无法承担安装时因使用云内核造成的启动失败,建议安装完成后自行替换。
2. MOTD预计在下次更新时改为默认不附带,加参数才附带。
作者: 天权璇玑    时间: 2023-8-29 22:26
圣如下花 发表于 2023-8-29 19:31
功能太多,太复杂,但比较适合比较特殊的机器用,另外同样的系统比moeclub脚本装完占用大一些(特别是debian ...

隔壁这个帖子里提到从换安装后就启动云内核的方法和风险,我之前的所有测试都是基于原版内核来展开的,无法评估云内核带来的结果:https://www.nodeseek.com/post-18700-1#7
作者: qianxu    时间: 2023-8-29 23:02
玩原神玩的
作者: 圣如下花    时间: 2023-8-30 06:54
天权璇玑 发表于 2023-8-29 22:18
1. 更换内核的成本小于收益,得不偿失,一个能正常运作的系统,能跑就不要动,我无法承担安装时因使用云 ...

那个软件叫什么名字?我想把它卸载掉




欢迎光临 全球主机交流论坛 (https://sunk.eu.org/) Powered by Discuz! X3.4