由于需要一个稳定运行的日本IP主机跑个性能要求不高的服务。国内云不可信,AWS和Azure太贵,linode和do也不便宜,各类杂牌VPS鱼龙混杂。
正发愁时灵光一现,想起了几年前随手注册后闲置的的永久免费Oracle Cloud账号,正好是日本区的,这不巧了吗?
之所以刚注册时没使用,是因为当初没这个需求且测试过之后发现它的线路并不好。我ping CN2的美国主机都只要170ms,你一个日本主机居然要200多ms?
但既然有了实际用途,Oracle又打算一直搞这个永久免费,那就捡起来用吧。
本以为这是个开机即用的玩意,没想到直接掉进了几个大坑,网上一查发现受害者众多。
在此把过程和心得记录一下。
基础配置
Oracle Cloud的终身免费服务类型不多,能用的主要是一台1核CPU、1G内存、500MB带宽的AMD x64云实例。理论上还可以申请累计4核、24G内存的两台ARM实例,但各区域都处于长期缺货状态,可以忽略。
网络支持IPv4和IPv6,每月10TB流量,十分慷慨。
免费服务的磁盘空间累计可申请200GB。不涉及大量存储的话,单个实例默认的47.6GB引导卷也够用了。删除实例时记得将引导卷一起释放。
创建实例过程中会显示引导卷的估价,不用管它,不会实际扣款的。
创建实例大概5分钟左右,完成后就可以直接用IP登录SSH了。
端口、防火墙
这是我初期碰到的大坑。从安全角度来说,SSH默认端口22肯定是要改的,改之前需要在防火墙放行。
免费服务的功能受限较多,例如不能为实例单独添加安全组,而是只能使用整个子网共用的安全列表。
在安全列表中增加一个自定义的SSH端口,另外添加两条ICMP类型8,即允许在IPv4和v6进行ping。
一般来说,修改端口只需要修改/etc/ssh/sshd_config中的Port,然后重启服务就行了。
这里出现了第一个不常见的坑:无论怎么重启服务,端口仍然是22而不是自定义的那个。
这也没关系,反正是新主机,索性重启操作系统就行。
结果SSH就连不上了,新旧端口都一样。
这种情况也不算罕见,应该是端口修改成功了,但被防火墙拦住了。既然安全列表里开启了端口,说明我忽略了其它防火墙的存在。
这时候如果不想直接重装系统的话,可以用云服务商自己的内置命令行想办法越过防火墙重置端口。
Oracle有Cloud Shell,也支持直接发送脚本命令到主机执行。
很遗憾,两种我都失败了:Cloud Shell按官方说明创建密钥再登录后仍然提示输入密码(为安全起见我只保留密钥登录),而发送的脚本命令不知为何都没有响应。
失败很多次后,这部分技术只能留置,非万不得已不再尝试。
只能选用更简单粗暴的重装系统了,好在这台服务器还没安装任何额外软件。
第二次重装后,发现果然系统内置了iptables,还创建了大量规则。
不想改动太大,于是我直接添加一条放行自定义SSH端口的规则,修改端口,重启。结果出人意料地又卡住无法登录了。
第三次重装再尝试,这次谨慎些,没有改掉SSH的端口,只改防火墙然后重启。但更莫名其妙的事发生了,规则明明在那,却无法访问。
顺便一提我测试端口的方法是用iperf3监听它,然后用客户端连接附带测速。
于是我决定用更简单粗暴的方式:删除iptables规则,放行所有流量,只使用云服务自己提供的安全列表。
这次问题终于解决了。
todo:改用ufw管理规则,防止未知的攻击。无论如何安全还是需要的。
WARP
无论是用作翻墙,还是其它需要隐藏IP的用途,Cloudflare提供的免费WARP代理出口都是最佳选择。
我之前图省事,用了一个国内流行的一键脚本。结果最近一年内Cloudflare多次调整WARP政策,各种免费的Key也失效了,脚本太久没人更新也失效了。
索性一步步按官方客户端教程来:
# Add cloudflare gpg key
curl -fsSL https://pkg.cloudflareclient.com/pubkey.gpg | sudo gpg --yes --dearmor --output /usr/share/keyrings/cloudflare-warp-archive-keyring.gpg
# Add this repo to your apt repositories
echo "deb [signed-by=/usr/share/keyrings/cloudflare-warp-archive-keyring.gpg] https://pkg.cloudflareclient.com/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/cloudflare-client.list
# Install
sudo apt-get update && sudo apt-get install cloudflare-warp
安装的是warp-svc后台服务,以及warp-cli命令行工具。
这时候注意一个新坑:如果直接按教程warp-cli connect,那只能再次喜提一次重装系统。
warp包括6种模式,默认是全局代理。如果让它接管了所有网络流量,那连SSH也无法连接。
所以必须先用改成SOCKS5代理模式,然后再连接。
具体指令如下:
(网上目前大部分教程都是基于旧版的,格式不兼容,甚至ChatGPT给出的也不兼容)
warp-cli registration new
warp-cli mode proxy
warp-cli connect
连接成功后试一下代理的IP:
# 本机IP
curl ifconfig.io
# 代理IP,默认WARP端口40000
curl -x socks5://127.0.0.1:40000 ifconfig.io
然后其它服务(如v2ray等)都可以借这个出口对外访问了。
过去的一些教程以及网上资源经常有提供免费刷流量的WARP+账户,但现在多次升级后所有旧方案都不再可用,但普通免费WARP账户对我而言已经够用,就暂不考虑得寸进尺的方案了。
交换区
作为1核1G的低性能云主机却要同时安装多种服务,至少包含nginx、php、mariadb、redis、warp以及自定义的网络程序等。
尽管为了节约资源我已经放弃了docker,但实际运行一天后仍然出现了内存不足而卡死的情况。
除了还能ping通之外,包括SSH在内的所有服务都卡住了,只能重启。
top了一下发现,swap的容量居然为0!内存捉襟见肘到这地步还没有用上内存交换区,简直是作死。
下面命令由ChatGPT提供:
# Step 1: 检查当前是否有交换区
sudo swapon --show
# Step 2: 创建2G的交换文件
sudo fallocate -l 2G /swapfile
# 如果fallocate不可用,可以用以下命令代替:
# sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
# Step 3: 设置交换文件权限
sudo chmod 600 /swapfile
# Step 4: 格式化为交换区
sudo mkswap /swapfile
# Step 5: 启用交换区
sudo swapon /swapfile
# 验证交换区是否启用
sudo swapon --show
# Step 6: 设置开机自动挂载
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
# 确认配置是否正确
sudo mount -a
完成后效果如下:
虽然交换区性能远不如内存,但至少不会卡死了。
当以上配置均完成并且稳定运行后,可以直接备份引导卷,避免后续误操作。
结论+题外
Oracle的永久免费云主机性能并不强,但比某些不稳定的廉价低配主机还是有优势的。
只是作为独立大厂,每家都有自己独特的配置问题和坑要踩上一踩。Oracle的坑已经不算多了。
另外在搜索一些问题解决方案时,由于这个永久免费作为知名羊毛之一被国人狂薅了多年,导致在解决方案中发现各种国人特色操作。
例如日常使用root用户;不用密钥而只用密码;各种一键脚本、一键安装后台管理系统、极力避免命令行;文件权限问题一律用755甚至777解决;数据库root走天下甚至不限制仅本机访问……
主打一个能让不懂英文不懂linux的小白复制粘贴就能薅到手,极大增加了羊毛党的数量,扔下成千上万台玩玩就撤然后不知何时就变成肉鸡的服务器。
Oracle自己对这样的资源浪费也不爽,因此会扫描你利用率太低的实例并回收,这时又有好多人开始搞定时浪费资源防回收的脚本……我也不知道这种占着茅坑不拉屎还要哼哼几声表示有人在的行为最终是图啥。
不受限的免费资源要么被薅光后大量浪费,要么变成灰产乐园,已经有无数个前车之鉴了。
还是量力而取,实事求是比较好。真需要长期稳定的东西,终究会回到付费+备份这条正路上来。