VPS防火墙设置:安全组和系统防火墙两层放行,附端口清单和回滚步骤

倪叶明

作者

更新于

放行一个端口,云厂商的安全组和服务器里的系统防火墙,两边都得放,少一边就是不通。规则改完就生效,新规则自动应用到关联的实例,用安全组也不额外收费。

出海做站,VPS上放着网站、面板和数据库,端口没放对,表现就是页面打不开、SSH连不上、面板登不进。这一层绕不开,早一点弄明白,后面少折腾。猎者出海这篇就把两层分别怎么放行、要开哪些端口、改规则前怎么留退路、不通时按什么顺序查,一次说清楚。

  • 两层是什么:云厂商安全组是虚拟防火墙,管进实例的流量;系统防火墙跑在机器里,管本机端口。
  • 顺序:先到云控制台安全组放行,再在服务器系统防火墙放行同一个端口。
  • 建站端口:先开网站和SSH要用的基础端口,数据库、FTP、面板端口按需,管理端口只给可信IP。
  • 回滚:改SSH端口或防火墙规则前,先确认云控制台有VNC或救援控制台入口。
  • 只放一层就不通:安全组和系统防火墙是串联的,任何一层拒绝,包就到不了服务。

VPS还没买的,海外vps推荐里按用途分了机器;机器到手,先按四步加固清单把基础安全做一遍,防火墙是其中一步。

云厂商安全组和系统防火墙是两层,只放一层为什么不通

安全组是云上的虚拟防火墙,管的是进实例的流量

安全组是云平台那边的虚拟防火墙,看的是进出实例的流量。AWS的安全组文档写,安全组充当EC2实例的虚拟防火墙,控制进出流量,入站规则管进实例的流量,出站规则管离开实例的流量。阿里云的说法类似,安全组用规则为ECS实例提供网络隔离和访问控制。Google Cloud的VPC防火墙规则按端口号、标签或协议,允许或拒绝进出VPC网络里虚拟机实例的流量。

启动实例的时候可以指定一个或多个安全组,不指定就用VPC的默认安全组。所以一台新机器买回来,它身上已经挂了一组规则,只是你可能没去看过。

系统防火墙跑在机器里,管的是本机端口

系统防火墙是装在操作系统里的另一道门。Ubuntu默认的防火墙工具是ufw,全称Uncomplicated Firewall,用来简化iptables配置,默认是禁用状态。CentOS这类系统常用firewalld,firewall-cmd是它的命令行客户端,能管理运行时和永久配置。用宝塔面板的人还有第三种入口:面板里的系统防火墙,能添加、修改、删除端口规则,对指定端口做允许或拒绝。

这一层跟云平台没关系。你在ufw里放行了80,不等于云安全组放行了80;反过来也一样。

两层是串联的:任何一层拒绝,包就到不了服务

一个请求要到你的网站,先经过云平台的安全组,再进到机器里的系统防火墙,最后才到服务本身。中间任何一层不放行,包都到不了后面的服务。表现就是端口不通、连接超时、页面打不开。

这也是只改一层经常没效果的原因。云控制台里加了规则,服务器里的ufw还拦着,不通;服务器里ufw放行了,云安全组没加,也不通。两层都放行,才算把门打开。像小区大门和自家防盗门,哪道没开,人都进不来。

建站到底要开哪些端口:一张按用途分的清单

先把端口分成两类:建站必须的,和按需的。必须的没开,网站和SSH都进不去;按需的开多了,等于多开几扇门。

端口 用途 开放建议
22 SSH远程管理 必须,仅允许可信IP
80 / 443 HTTP / HTTPS 启用网站时开放
3306 MySQL 按需,建议限制来源IP,不暴露公网
20 / 21 + 39000-40000 FTP及被动模式 按需
8888 / 888 面板 / phpMyAdmin 按需,仅管理员IP,建议改非默认端口

开之前先问一句,这个端口要不要给公网。不给公网的,来源就填具体IP,别图省事填个全放行。

宝塔面板的端口文档里有几个细节。3306是MySQL协议端口,不需要从外部连数据库的话可以不放行;8888是phpMyAdmin的端口,不需要在外网用这个软件的话也可以不放行。这类数据库端口,阿里云的建议是在数据库安全组的入站规则里授权来源安全组,不要暴露到公网。8888这类面板端口,实际端口取决于面板配置,只允许管理员IP访问,开面板安装时指定的那个端口。

阿里云的安全组文档讲最小权限原则:80和443可以按需对公网开放,SSH、RDP和管理面板端口必须限制为可信IP,避免用0.0.0.0/0或::/0。AWS也强烈建议,给SSH或RDP端口加入站规则时,只授权需要访问实例的特定IP地址或地址范围。

遇到端口不通就把系统防火墙关掉,能通,这种做法只适合临时确认问题,不适合留在生产环境。关掉的是机器里那层门,云安全组还在,但机器本身已经少了一层防护。

第一步:在云控制台安全组放行端口

先动云平台这边的安全组,它是请求进来的第一道门。AWS的控制台路径是:打开EC2控制台,导航窗格选Instances,选实例,Actions、Security、Change security groups,添加或移除后Save。改入站规则在Security Groups页面,选安全组,从Actions或Inbound rules标签选Edit inbound rules,Add rule填类型、协议、端口、来源,Save rules。

阿里云ECS安全组入站规则配置页,vps防火墙设置第一层放行端口
实操截图:在阿里云ECS控制台安全组里添加入站规则,填协议、端口和来源。

阿里云是ECS控制台Security Groups页点Create Security Group,设名称和VPC,选Basic Security Group或Advanced Security Group,配置规则后点OK。已经有的安全组,进去改入站规则。

Ubuntu UFW官方文档命令示例,vps防火墙设置系统防火墙放行端口
官网说明截图:Ubuntu Wiki里ufw放行端口和查看状态的命令写法。

自定义端口要注意:想填端口范围,必须选Custom TCP或Custom UDP,选别的类型填不了范围。

来源怎么填。AWS的选项里有My IP,是本机的公网IPv4地址;有Custom,可以填IPv4/IPv6 CIDR、安全组、前缀列表;有Anywhere-IPv4,就是0.0.0.0/0;有Anywhere-IPv6,就是::/0。SSH和管理面板来源填你自己的IP或者公司固定IP,不要用Anywhere。

安全组是有状态的,只配入站规则就行,出站响应流量系统会自动放行。

新建一个没有规则的基础安全组,默认行为是:允许所有出站流量,允许同安全组内其他ECS实例的入站流量,拒绝其他所有入站流量。所以新安全组不是全通,大部分入站都不通,得自己加规则。

改完规则发现不生效,先看两件事。同优先级的规则里,拒绝规则优先,有拒绝规则挡在前面,允许规则就不生效。还有,控制台里更新规则时不能改来源类型,来源是IPv4 CIDR块,就不能改成IPv6 CIDR块、前缀列表或安全组,要改就重建规则。

阿里云还建议,避免直接修改生产环境的安全组,可以先克隆一个安全组,在测试环境验证后再调整生产规则。这一步多花几分钟,出问题时省下的可不是几分钟。

第二步:在系统防火墙放行同一端口

云安全组放行之后,回到服务器里,把同一个端口在系统防火墙上再放行一次。用什么命令,看你装的是什么系统。

ufw:放行、查看、删除

Ubuntu默认的防火墙工具是ufw,默认是禁用状态。放行一个端口用sudo ufw allow <port>/<optional: protocol>,比如sudo ufw allow 53/tcp。也可以按服务名放行,比如sudo ufw allow ssh。开防火墙用sudo ufw enable,看状态用sudo ufw status verbose。

ufw的规则按顺序匹配,一旦匹配到某条规则,其余规则不再评估。所以具体的规则要放在前面,通用的规则放后面。这个顺序在排查的时候很有用,规则都在,但顺序不对,效果可能跟你想的不一样。

删规则有两种方式。一种是在原始规则前加delete,比如sudo ufw delete deny 80/tcp。另一种是用sudo ufw status numbered看规则的顺序和编号,按编号删。

ufw开启的时候会用一套默认规则,所有入站被拒绝,有一些例外方便家庭用户。enable之后,你之前没放行的端口就是不通的,这是默认行为,不用当成故障。

firewalld:运行时和永久配置别搞混

CentOS这类系统用firewalld。firewall-cmd是它的命令行客户端,管两套配置:运行时和永久。不带--permanent的改动只改运行时,重启或重载就没了;带--permanent的改动写进永久配置,但不会立即生效,要等服务重启、重载或者系统重启。

所以加了--permanent没--reload,规则看着写进去了,实际没生效。这是firewalld最常见的卡点之一。

--reload会重载防火墙规则并保留状态信息,当前的永久配置变成新的运行时配置。之前只做运行时、没写进永久配置的改动,会在reload的时候丢掉。--complete-reload会完全重载防火墙,连netfilter内核模块都重载,很可能终止活动连接,因为状态信息丢了,这个只在严重防火墙问题时用。

firewalld官方推荐的做法是:配置的时候只做运行时改动,测试满意了,再保存到磁盘。

放行端口用firewall-cmd --add-port,先运行时测试,通了再加--permanent存盘,最后--reload。顺序反过来,容易自己把自己关在外面。

第三步:用宝塔面板的人,在面板里怎么放行

装了宝塔面板的,系统防火墙可以在面板里点,不用敲命令。登录面板,点左侧导航栏的【安全】→【系统防火墙】,点【添加端口规则】。协议选TCP、UDP或TCP/UDP,默认TCP;端口填单个,或者填范围,支持逗号分隔;来源可以选所有IP、指定IP、指定域名;策略选允许或拒绝;备注填不填都行;点【提交】。

来源选指定IP的时候,可以填单个IP,也可以填IP段比如192.168.1.0/24,还支持IP范围。指定域名是企业版专享。

面板里的规则跟系统防火墙是通的。CentOS 7+用firewalld,面板会读取所有规则,包括命令行添加的;Debian/Ubuntu用ufw,面板的规则会同步到系统。但云安全组不在面板的管理范围里,还得去云控制台单独放行。宝塔的文档原话是「务必在腾讯云、阿里云等控制台放行对应端口,否则防火墙规则可能失效。」

面板里可以导出规则,下载成.txt文件,用来备份或迁移。误删了关键端口规则,可以导入恢复,也可以手动把常用端口重新加一遍,策略设为允许。

端口规则的状态显示「外网不通」,有四个可能:服务没监听外网IP;云服务商安全组没放行;规则没生效,可以删掉重加;不影响访问的时候可以忽略。放行之后还是不通,先跑netstat -tunlp | grep 端口号,看服务有没有在监听;再确认云安全组放行了同一个端口;最后把规则删掉重新加一次,确保生效。

宝塔面板里建站点到开SSL的四步,是在端口通了之后才往下走的。

改SSH端口或防火墙规则前,先留好回滚路

改SSH端口或者动防火墙规则,最容易出的问题是把自己关在外面。稳妥的做法是:先在新端口上放行,安全组和系统防火墙都放,确认能连上,再关旧端口。改之前确认云控制台有VNC或救援控制台入口,同时保持一个已经登录的SSH会话不要断。

AWS安全组连接跟踪文档说明,vps防火墙设置改规则前留回滚路
官网说明截图:AWS文档说明改安全组规则时已跟踪连接不会立即中断。

为什么已登录的会话能撑住。AWS的安全组文档说,改安全组规则时,已经跟踪的连接不会立即中断,安全组会继续放行数据包,直到现有连接超时。窄规则允许的SSH连接是被跟踪的,把规则改成不再允许当前客户端地址的新连接,现有SSH连接不会中断。但如果规则是全放行的未跟踪流量,另一方向又有对应允许所有响应流量的规则,移除或修改规则会立即中断。

超时时间有具体数字。TCP已建立连接的空闲超时,最小60秒,最大432000秒,Nitro v6实例类型默认350秒,其他实例类型默认432000秒。UDP超时默认30秒,UDP流超时默认180秒。非TCP、UDP、ICMP的协议,实例向另一台主机发流量,对方在600秒内发回同类型流量,安全组会接受。

连不上时的回查路径:从云控制台的VNC或救援控制台进去,先恢复访问,再查新端口为什么没通。

SSH怎么连、第一次上手要填什么,SSH上手步骤里有完整操作。端口还没连顺的,先把SSH走通,再动端口。

端口放行不生效的四个误区和排查顺序

误区一:只放行一层就以为通了。云控制台加了规则,机器里的ufw还拦着,不通;机器里放行了,云安全组没加,也不通。

误区二:firewall-cmd加了--permanent没reload,以为没生效。--permanent的更改不会立即生效,只在服务重启、重载或系统重启后才生效。加完--permanent要--reload,规则才会进运行时。

误区三:以为改规则会立刻踢掉现有连接。已经跟踪的连接不会立即中断,安全组会继续放行直到连接超时。改规则的时候,你手上那个已登录的SSH会话可能还活着,但不代表新连接能进来。

误区四:连接跟踪打满后新连接被丢包。每个实例有最大连接数,达到上限之后,发送或接收的数据包会被丢弃,因为新连接建立不了。表现就是服务本身正常,但新请求进不来。

排查顺序按这个走:先看服务有没有在监听,用netstat -tunlp | grep 端口号;再看系统防火墙规则在不在,ufw用status verbose,firewalld看运行时和永久配置是不是都加了;然后看云安全组有没有放行同一个端口;最后看来源IP有没有写错,填的是不是自己当前的公网IP。

网站速度慢和端口不通是两件事。速度慢的四层排查顺序可以对照着查,但别把慢当成防火墙问题。

改规则之前,把当前规则导出一份,这是最小的备份。站点文件、数据库、面板配置的备份是另一层,VPS备份要备什么列了该备的项。

AI能帮你把两层放行清单和回滚预案整理出来

云厂商的安全组文档和系统防火墙文档各讲各的,一边是控制台菜单,一边是命令行,对照着看容易漏。AI能帮上三步。

第一步,按你的云厂商和系统整理分步清单。告诉它你用的是AWS还是阿里云,系统是Ubuntu、CentOS还是宝塔面板,它把安全组放行和系统防火墙放行拆成一步一步,标出每步在哪个后台点什么。

第二步,按用途给端口分类。把你要跑的服务告诉它,它对照端口表,分出哪些必须开、哪些按需、哪些要限制来源IP。

第三步,起草回滚预案。改SSH端口或者动防火墙规则之前,让它按保留旧端口、先放行新端口、用VNC救援的顺序列一份清单,连不上时照着做。报错现象也能整理,比如外网不通、404、连接超时,让它按排查顺序列成检查表。

下面三条提示词是本文给的示例,不是官方模板,可以直接复制改改就用。

「我在阿里云ECS上装了宝塔面板,系统是Ubuntu,请按官方文档给我一份分步清单:先在安全组放行哪些端口,再在ufw放行哪些端口,每步写清在哪个后台点什么。」

「我要把SSH端口从22改成2222,请给我一份回滚预案:改之前先做什么、改之后怎么验证、连不上时用VNC怎么恢复,只按官方文档的规则写。」

「我的宝塔面板端口规则状态显示外网不通,请按官方排查顺序列出检查项:服务是否监听、安全组是否放行、规则是否生效,每项给出对应的检查命令。」

AI给的是清单和草稿,下面三个动作得你自己做。一,在云厂商控制台的安全组页面,亲手添加或修改入站规则,填协议、端口、来源,点保存。二,在服务器上执行系统防火墙命令,ufw allow或者firewall-cmd --add-port,或者进宝塔面板【安全】→【系统防火墙】点【添加端口规则】提交。三,改完看端口规则列表的状态,正常、未使用还是外网不通,据此决定保留还是删除重加。

把两份官方文档对照成一张清单,这种整理资料、对照官方文档的活,可以交给猎者出海的AI Agent,点保存和敲命令还是得自己来。

VPS买完到网站跑起来还有几步,买完VPS按四步把网站跑起来,先把端口这关过了。

常见问题

宝塔面板默认端口是多少,怎么改?

现在安装会生成随机端口,没有固定值,以装完显示的面板地址为准。改端口用bt 8,改完两层都放行新端口。

宝塔面板提示「请使用正确的入口登录」怎么办?

这是安全入口校验失败,跟端口放行没关系。用/etc/init.d/bt default查看面板入口,用完整地址重新登录。

无权限执行bt命令怎么办?

先切换到root用户,执行sudo -i,切换成功后再执行bt命令。

安全组要额外收费吗?

不额外收费。

关了系统防火墙是不是就通了?

不一定。云安全组没放行,关掉系统防火墙照样不通。而且关防火墙只适合临时确认问题,不适合留在生产环境。

端口不通的时候,回到三层看:服务在不在监听,系统防火墙放行了没有,云安全组放行了没有。按顺序过一遍,能定位到卡在哪一层。

发表评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注