有句古话叫做:“常在河边走,哪有不湿鞋”,也句话叫做“夜路走多了总会遇见鬼”,我推及一下得出结论:常常和Linux主机打交道,总会遇到灵异问题。
(图源 :pixabay)
话说大概是十多个月以前,我历尽千辛万苦终于申请下来一个Oracle云主机的账户,之所以不辞辛劳地弄这个账户,是因为Oracle云主机账户有些终身免费的福利——比如两台低配云主机(VPS)。
不过有个词叫做得不到才是最好的,得到后反而就不知道珍惜,所以我创建了两个云主机账户后,就把它们丢在一边,几乎忘得一干二净。
前些天为了一堆VPS费用而发愁,我突然想起来,我还有两个免费的Oracle云主机呢,何不将其利用起来,不就相当于省一笔费用嘛?
哎,其实Amazon和Linode 和Oracle免费云主机对标的最便宜的云主机也不过才5美元每月,我竟然为了十美元每月的免费主机折腰,真是贫穷惹的祸呀!
努力学习
不发感慨了,继续说这事。既然想到启用这两台Oracle云主机,那么必然要好好做些初始设置,比如开启防火墙,修改SSH默认端口等等。
但一用之下才发现,Oracle的云主机控制面板简直是太难用了,和Linode以及Amazon的比起来,简直是天差地别!真不知道Oracle云服务是怎么活到现在呢,替他们着急。
就说这个防火墙吧,它们面板里竟然分出了三个层级,分别为:
- 防火墙(Network firewalls)
- 安全列表(Security Lists)
- 网络安全组(Network Security Groups)
其中第一个只面向付费用户,我倒是想升级成付费用户,但是支付信息死活添加不成功(我信用卡没问题),所以我就算想用也用不了。
至于安全列表(Security Lists)和网络安全组(NSG:Network Security Groups),我研究了一下,安全列表只能作用于整个虚拟云网络(VCN:Virtual Cloud Network),影响其内的所有实例;而网络安全组(Network Security Groups)是可以作用在单独的实例的。而一个实例最终受三者的共同控制(防火墙、安全列表、网络安全组)。
虽然这些概念让我极度头大,但是最终总算搞明白这些名称是啥意义,以及Security Lists和NSG的区别。
还有就是Oracle面板中,这些相关的设置要好好的深度探索一下才能找到对应位置,不过好在我最终也都搞明白大致位置在哪里了。嗯,最后也算搞明白如何设置了。
实践操作
通过以上的学习,我得出结论,安全起见,对于Oracle的云主机,我应该:
- 设置最简单的Security Lists(允许出站;入站只允许SSH,用于最初访问主机)
- 通过NSG进行更复杂的设置,比如允许额外的SSH端口,或者80端口(Web)
开始操作
这是Oracle系统自带的默认Security Lists,适合云主机刚创建完成使用,暂时不用修改

创建了一个新的NSG,允许主机的对应端口

将NSG关联到对应的云主机实例上

当然,服务器上对应的服务也要监听相应的端口。因为OS选的是Ubuntu 24.04,所以之前在《走近科学》系列文章中学到的本领可以使用啦,主要就是这篇:《Ubuntu 24.04 LTS 中SSH端口设置的灵异事件》。
所以,我现在觉得一切都搞定了:合理的Security Lists以及NSG,主机上也开启了对应的服务监听相应的端口。现在只需去连接就可以啦。
遇到诡异问题
结果出乎意料,Putty连接到对应端口,完全没有任何响应,这就很不合理!
我在主机,各种测试服务有没有开启,端口有没有被监听,结果一切正常;又把Security Lists和NSG相关文档看了好几遍,也觉得虽然有些复杂,但也不可能理解有误,那是哪出了问题呢?我百思不得其解!
于是我在猪圈群里和大佬们请教,别看猪圈群平时大佬们都是炫富聊美女,关键时候问些技术问题还真有人回答。大佬们给出各种可能出问题的方向,我都一一确认并无问题。
直到某大佬问我,会不会被你的主机防火墙策略阻止了?擦,开什么玩笑,我根本没有在云主机上开防火墙好不好?(一般我喜欢用ufw)看了一下ufw和firewalld,发现要么没启用,要么没安装,你看,我就说嘛,没开防火墙。
不过当我尝试列出iptables相关rules时,(我以为应该是空的),却得到我意料之外的结果。
sudo iptables --list --line-numbers
结果如下:

啥,怎么这么多内容,不过当我看到这条规则时:
3 ACCEPT all -- anywhere anywhere
我觉得虽然规则一大堆,但是这不是接受任何来源任何端口任何目标的连接嘛,那就相当于防火墙是完全开放的呀?我问了几个经常折腾iptables的猪圈大佬,它们也认为是这样。
我又放心,问了一下ChatGPT:

它回复说这条规则完全没用且放行全部流量,所以任何访问都不会被本机 iptables防火墙阻止,并好心给我一堆建议,要帮我解决iptables中的规则漏洞(内容太多,我就不贴了)
总之,从各个方面得出的结论:本机的iptables不会阻止我的网络连接(注:这是一个错误结论)。既然和这个无关,我又尝试找其它方面的问题,不过找来找去却没有发现任何问题,那么这事就太诡异了!
问题解决
折腾到大半夜,头晕眼花,恶心欲吐,我决定不能再闭门造车了,也不能把求助范围局限在猪圈,必须上网查查看。于是Google查了一下,倒是找到一堆相关内容。
结果发现大家说的问题的方法,出了涉及到Security Lists和NSG外,竟然大家遇到的问题和解决的方法都和防火墙——也就是Oracle云主机的默认iptables相关。
比如其中一人得出的结论;
The connectivity issue was due to Oracle's default use of iptables on all Oracle-provided images.
解决方案各有千秋:要么在iptables中添加相应的规则允许对应的端口(或者删除REJECT ALL规则);要么用ufw等管理;要么直接把主机自带的默认规则都干掉。
不过也有人说,删除默认规则会导致实例无法访问😱),Oracle的相关文档中则这样说(看起来问题不大):

我首先尝试添加一条规则允许对应端口:
sudo iptables -I INPUT 6 -m state --state NEW -p tcp --dport 50000 -j ACCEPTsudo netfilter-persistent save
这条命令在 INPUT 链的第 6 位插入一条规则:允许来自外部的 新的 TCP 连接 访问本机的 50000 端口(即放行入站 TCP: 50000 )。发现之后果然可以使用putty之类的工具,访问对应的端口啦。至此问题解决。
深入探究
不过再回到之前那条规则3:
3 ACCEPT all -- anywhere anywhere
这条规则为啥就没起作用呢?如果它起作用了,那么我就不用添加额外的允许规则呀?毕竟iptables大佬和ChatGPT也说这个应该生效呢。
我查了一下,竟然也有好多人有和我相同的疑问,于是又深入地探究了一下。
最后还是Google AI给出的结论让我多多少少明白了一点点

简单来讲,就是在防火墙的实践中,我们一般都是使用默认的DROP策略,而ACCEPT策略和我们想想的略微有些不同(包括iptables大佬和ChatGPT也懵了)。
嗯,我觉得我大概是明白了这种差异,至于采取哪种方式解决呢?我觉得把默认策略都删除也挺好的,反正上层还有Security Lists和NSG呢,怕啥,哈哈。
相关链接
- Ubuntu 24.04 LTS 中SSH端口设置的灵异事件
- Oracle Cloud Infrastructure Documentation: Best Practices for Your Compute Instances
- Oracle Cloud Infrastructure Documentation: Network Firewall
- Oracle Cloud Infrastructure Documentation: Security Rules
- Oracle Cloud Infrastructure Documentation: Network Security Groups
- Opening port 80 on Oracle Cloud Infrastructure Compute node [closed]
- How to Open Ports 80 and 443 on an Oracle Cloud Instance
- https://linux.die.net/man/8/iptables