分享 · 2021年3月12日 0 579  

Scaleway stardust纯ipv6服务器体验

Scaleway stardust ipv6only “玩具”体验

不知道是因为晚上太兴奋了还是因为胃不太舒服,总之今晚是彻底的失眠了,躺在床上辗转反侧也睡不着,干脆折腾一下昨天开的一台Scaleway的stardust 星尘服务器。

纯ipv6的服务器用起来还是有一些麻烦的,因为默认情况下服务器没有ipv4地址,也就没办法访问ipv4的资源,比如github就没有提供ipv6的支持,不过我们也有办法让v6only的服务器访问到v4的资源,下面分别用了DNS64和Cloudflare的WARP的方式来访问v4的资源,前者可能局限于http资源而后者能够让v6only的服务器通过nat的方式访问到网络上的资源,就像我们平时上网一样。

大概是因为没有ipv4,省下了一笔钱,这个机器虽然一个月只用0.38欧元,但是配置相当给力。性能和稳定性比LXC开出来的euserv免费机器(容器)好上太多了。

性能不错

CPU和磁盘性能也很给力

从上图可以看到,作为每个月三块钱左右的机器,scaleway的stardust其实已经远远不止于“玩具”了,甚至比很多大厂的正价机器性能都要好。

让机器访问ipv4资源

使用DNS64与NAT64

DNS64是与NAT64搭配使用的,原理很简单,修改你的DNS到DNS64提供者的DNS,当你发出向解析到IPv4的域名的请求后,DNS会将IPv4地址按照一定格式嵌入IPv6地址中;这个返回IPv6地址会指向NAT64的服务器,NAT64网关会按照它包含的信息获取IPv4的数据并转发给你,这样一来你就能够直接访问IPv4的网站了。

欧洲有不少组织提供了dns64+nat64的服务,比如这个网站上就提供了一些,我们可以找一个离自己的服务器近一点的nat64地址然后修改resolv.conf中的nameserver为nat64的地址即可,之后再尝试下载github的资源,发现现在可以成功下载了,速度还挺快的,能有百兆以上。

使用DNS64/NAT64虽然很方便,但是还是有一定的局限性,那就是必须是http请求(也许我的理解有错,欢迎指出),而且离不开域名。

使用WARP访问

上面的方案虽然简单,但是也有一定的局限性,除了上述方案我们还可以使用Cloudflare提供的WARP代理服务来为我们的服务器赋予访问ipv4资源的能力。WARP实际上是基于Wireguard的,所以我们需要先安装Wireguard,下面参考了Debian Linux VPS 服务器 WireGuard 安装教程

注意WARP虽然基于wireguard,但是它没办法完全隐藏你的真实ip(就是这么设计的),如果你访问使用了cloudflare的网站,对方是可以看到你的源ip的。 相关讨论可以看reddit上这个帖子, 访问使用了cloudflare的网站时,源ip会被放入头部的 X-Forwarded-For 属性中。

安装Wireguard

  • 添加 back­ports 源

    Backport的含义是”向后移植”,就是将软件新版本的某些功能移植到旧版本上来,这就称为backport。

    Debian向来以稳定性著称,所以就存在一个问题,官方源分发的软件版本比软件本身的版本总是要慢不少,所以就有了 backports 源。 backports 主要从 testing 源,部分安全更新从unstable源重新编译包,使这些包不依赖于新版本的库就可以在 debian 的 stable 发行版上面运行。所以 backports 是 stable 和 testing 的一个折衷。

    echo "deb http://deb.debian.org/debian $(lsb_release -sc)-backports main" | sudo tee /etc/apt/sources.list.d/backports.list
    sudo apt update
    
  • 安装依赖组件与wireguard配置工具
    sudo apt install net-tools iproute2 openresolv dnsutils -y
    sudo apt install wireguard-tools --no-install-recommends
    
  • 安装wireguard

    uname -a查看内核版本,5.6以上的内核中自带了wireguard(经过测试Ubuntu20.04也可以直接安装,不需要更新内核了),不过debian10的默认内核是4.19的,所以我们还需要更新内核(或者使用wireguard-go)。

    可以直接使用下面的命令安装backports库中的内核。

    sudo apt -t $(lsb_release -sc)-backports install linux-image-$(dpkg --print-architecture) linux-headers-$(dpkg --print-architecture) --install-recommends -y
    

使用wcgf

wgcf 是 Cloud­flare WARP 的非官方 CLI 工具,它可以模拟 WARP 客户端注册账号,并生成通用的 Wire­Guard 配置文件。

curl -fsSL git.io/wgcf.sh | sudo bash
#如果卡在下载,再检查一下resolv.conf是否被修改,git.io没有ipv6,所以我们要先使用DNS64
#注册,生成账户信息,保存在 wgcf-account.toml 中
wgcf register
#生成wireguard配置文件 保存在wgcf-profile.conf中
wgcf generate

注册

生成配置文件

之后修改配置文件 wgcf-profile.conf ,将engage.cloudflareclient.com解析成ip,并把它替换成解析得到的ipv6 如 [2606:4700:d0::a29f:c001]:2408 ,这样可以让我们的服务器之后用ipv6去连接。然后注释掉 AllowedIPs = ::/0 相当于只让ipv4的流量走wireguard,另外可以选择把配置文件中的DNS从v4的1.1.1.1修改成v6的dns,避免WARP出问题时DNS也跟着挂掉。

上述方案适用于我们只希望让wireguard接管ipv4的请求,但是我们也可以让wireguard同时接管ipv6的请求,方法如下:

我希望让vps访问外部资源的时候走wireguard使用warp,但是同时又不影响之前的ipv6的使用,即我依旧可以通过原来的ipv6连接到服务器上,因为wg-quick是另外创建了一张路由表并引入,并不会影响主路由表,所以我们可以使用iptables的命令,让从ipv6进来的数据继续依照主路由表走,修改 wgcf-profile.conf 在 [Interface] 中加入下面两行(分别在启动和关闭时执行iptables命令 方括号不需要

PostUp = ip -6 rule add from 【ifconfig 中看见的 inet6对应的ipv6(global的)】 lookup main
PostDown = ip -6 rule delete from 【ifconfig 中看见的 inet6对应的ipv6(global的)】 lookup main
#如果需要docker里面的应用也不走warp,需要额外把bridge的ip加进去

使用Wireguard

配置文件修改好之后就可以使用这个配置文件启动Wireguard了,cp wgcf-profile.conf /etc/wireguard/wgcf.conf将配置文件复制到wireguard的文件夹下。wg-quick up wgcf开启虚拟网卡(名字和配置文件对应)

之后再使用ifconfig就可以看到名为wgcf的网卡了,之后所有的ipv4流量都会走这个网卡,我们可以尝试ping一下1.1.1.1。

!!!另外请注意,我安装了wireguard之后出现了开机ssh不启动的问题…原因未知,解决方法可以看后面(连不上ssh的时候可以从面板里面的console进去,所以千万记得开启密码登录以及设置root密码)。 也可以采取下面的第二种方法启动wg-quick

后续补充: 当我使用 systemctl disable [email protected] 停用sytemd来启动wireguard后,貌似恢复了正常,不再出现开机无法启动ssh的问题了

之后为了重启后能够自动启动,我们可以使用systemd来管理。

第一种方法可能会导致sshd无法正常通过systemd启动,所以我改成在系统启动完成后再调用wg-quick

# 方法一
wg-quick down wgcf
systemctl start [email protected]
systemctl enable [email protected]
# 改进后的方法
crontab -e #加入下面这行
@reboot systemctl start [email protected]

另外,有时候开机启动后依旧会没网,再重启一次wg-quick一般能恢复。

另外可以通过编辑 /etc/gai.conf 文件,末尾加上precedence ::ffff:0:0/96 100来优先使用ipv4访问。

WARP的速度可以说是相当的快了…在它的加持下Scaleway的机器使用起来也更方便了。

注意ASN变成了Cloudflare

使用对象储存

scaleway还提供免费的对象储存,75G的免费储存空间以及每个月75G的流量,对于小型网站戳戳有余,无论是放一下备份或者是图片/资源都挺合适的,另外貌似对象储存和实例在一个区域的话,是没有流量费的(应该是),如果能内网联通还不算流量费用的话,配合Stardust的100M(突发G口)不限流量,还是很强的。

我们的目的是在stardust上挂载对象储存,我们需要用到s3fs这个工具

S3FS是google开发的一款支持将对象存储中的bucket以文件形式导出的文件系统接口,兼容POSIX语义。 S3fs是基于FUSE开发文件系统,允许Linux和Mac Os X挂载S3的存储桶在本地文件系统,S3fs能够保持对象原来的格式。

通过s3fs我们可以将对象储存挂载到本地的文件系统中,参考官方文档How to use Object Storage with s3fs

生成API KEY

首先前往网页控制台生成API KEY,在 Project dashboard -> Credentials 中点击 Generate new API KEY ,secret key只显示一次,所以记得保存好。

挂载对象储存

官网给出的文档中,s3fs是编译安装的,不过我发现debian10的源中也有s3fs,所以直接使用apt安装了 apt install s3fs

# 创建一个文件夹作为挂载点
mkdir /mnt/storage
# 替换 ACCESS_KEY 是创建密钥后能看见的那部分 SECRET_KEY就是只显示一次的部分
echo <ACCESS_KEY>:<SECRET_KEY> > $HOME/.passwd-s3fs
chmod 600 $HOME/.passwd-s3fs
# 挂载已经有的对象储存储存桶 (去面板创建一个,记得选择同一地区) 详情查看官方文档
# $SCW-BUCKET-NAME 替换为对象储存的名称
# $FOLDER-TO-MOUNT 就是我们要挂载的目录 /mnt/storage
# endpoint 设置为我们的地区 nl-ams s3.fr-par.scw.cloud 也替换成阿姆斯特丹的 s3.nl-ams.scw.cloud
s3fs $SCW-BUCKET-NAME $FOLDER-TO-MOUNT -o allow_other -o passwd_file=$HOME/.passwd-s3fs -o use_path_request_style -o endpoint=fr-par -o parallel_count=15 -o multipart_size=128 -o nocopyapi -o url=https://s3.fr-par.scw.cloud

之后使用 df -h 查看本地文件系统就可以看见这个对象储存了(256T哈哈)。

使用命令挂载,重启后就没了,所以我们要把挂载参数写到fstab中使其持久化,编辑/etc/fstab

加入下面这一行 [bucket_name] 替换成你的对象储存名字。

s3fs#[bucket_name] /mount-point fuse _netdev,allow_other,use_path_request_style,url=https://s3.fr-par.scw.cloud/ 0 0 记得根据区域修改url(荷兰修改成 s3.nl-ams.scw.cloud)。

等待十几秒(不等待直接输入居然会挂载失败,原因未知…)之后使用 mount -a 验证一下能否成功挂载,设置好fstab之后重启也能自动挂载了。之后我们就能像操作服务器上的磁盘一样操作这个文件系统了,不过对象储存有下面几点需要注意:

  • Random writes or appends to files require rewriting the entire file 修改文件需要完全重写整个文件
  • Metadata operations such as listing directories have poor performance due to network latency 对于元信息的操作可能比较有限
  • Eventual consistency can temporarily yield stale data 最终一致性设计可能临时导致过期数据
  • No atomic renames of files or directories 不会自动重命名文件(夹)
  • No coordination between multiple clients mounting the same bucket 多个客户操作同一个储存桶的时候没有协调
  • No hard links 不能使用硬链接,当然符号链接还是可以的

测试了一下对象储存的速度,我先dd生成了一个1G的文件,再用rsync(便于显示进度)移动到 /mnt/storage 中,可以看见,速度相当可观,之后我又传了一个大文件,跑了1GB多一点之后速度被限制到了100M (stardust标称速度)

速度很可观

因为online的线路基本是最普通的国际线路,所以国内的下载速度极慢。但是对于备份以及套cloudflare建站的同学来说这个是相当有用的,一下子机器的储存就有了80多G。到这里这机器已经不能算一个玩具了(就算还是玩具也是个大玩具)。

关于流量计费

scaleway提供每个月75G的对象储存免费流量,并且scaleway的对象储存是没有请求费用的(某些对象储存光是请求都要收费),我看了看对象储存的统计面板,应该是只计算出站流量,我删除了本地的文件再从对象储存中复制一份文件到本地磁盘中。

下载了几GB的文件后发现并没有计入流量,看来可以放心使用了。

结语

我个人认为Scaleway的Stardust机器是远强于玩具的,机器虽然便宜,但是性能十分给力,并且在WARP优秀的网络加持下,机器本身虽然只有公网V6,但是也可以愉快的访问V4的资源,总之还是很值得尝试的。这篇文章的主要内容都来源于参考中的两个博客,个人原创的内容不多,不过之后我也会继续开发v6only机器的玩法并不断完善本文。

本文初次写完的时候,已经是四点三十分了,学校里面的鸟儿都睡醒了,然而我还是毫无睡意…实在是无语。

后续补充: 这机器在挂载了scaleway赠送的75G对象储存之后可玩性更高了,并且同一区域的流量应该是不计费的,而星尘的流量也是无限的,虽然直连速度真的不咋地,但是配合Cloudflare的CDN还是可以一战的。

出现的问题

开机ssh不启动

我遇到了一个奇怪的问题,不知道是否和内核有关,总之systemd貌似出了点问题,重启后可能连不上ssh,从scaleway的console(vnc)连进去看发现ssh没有启动,使用systemctl start sshd,会卡住不动,也没有任何报错,允许sshd -t 可能能看到 missing /var/run/sshd之类的提示,但是就算创建了这个文件依旧无法启动,但是使用service 或者直接输入 /etc/init.d/ssh start 都可以正常启动ssh server,这个问题我折腾了一晚上也没找出原因——没有报错的问题真的是最难处理的,压根就不知道哪里出了问题。

解决方式可以参考这篇文章,既然service之类的可以用,那我就不使用systemctl来启动sshd了,我用了类似于方法2的解决方案(不过也不全不相同),crontab -e,加入下面这行 @reboot /etc/init.d/ssh start,开机就可以启动ssh了,不过问题的根源我还是没找到,也许是systemd和内核的bug吧。

个人发现在使用systemd开机启动wg-quick的时候会有这个问题,在crontab中加入 @reboot systemctl start [email protected] 在启动完成后再开启wg-quick貌似就没有这个问题了。

参考

  • https://p3terx.com/archives/debian-linux-vps-server-wireguard-installation-tutorial.html

  • https://p3terx.com/archives/use-cloudflare-warp-to-add-extra-ipv4-or-ipv6-network-support-to-vps-servers-for-free.html

  • https://hiram.wang/cloudflare-wrap-vps/