【Linux网络编程】之配置阿里云安全组
配置阿里云安全组
阿里云安全组的概念
安全组是一种虚拟的防火墙,主要用于控制云服务器实例的入站(Inbound)和出站(Outbound)流量。通过配置安全组规则,你可以设置哪些流量可以访问你的云服务器,哪些流量不能访问你的云服务器。
安全组的作用:
- 控制网络访问:你可以在安全组中配置规则,允许或拒绝指定的 IP 地址、端口、协议的流量。
- 细粒度控制:可以根据需求设置多个安全组规则,以精确控制不同服务和客户端的访问权限。
- 集中管理:安全组适用于一个或多个 ECS 实例,简化了多个服务器的访问控制管理。
阿里云安全组常见配置:
- 入方向规则:控制从外部网络进入服务器的流量。
- 出方向规则:控制从服务器到外部网络的流量。
配置安全组规则
入方向
现在我们的服务器程序部署到云服务器上了还不够,我们需要开放一些端口以及设置允许哪些IP地址的客户端访问我们的服务器:
-
打开阿里云官网:
-
登录后点产品,点云服务器ECS:
-
点击管理控制台:
-
进入控制台后,点击左边栏的实例,然后选择你想设置安全组的云服务器实例,点箭头所指的超链接:
-
点安全组:
-
进入安全组页面后,点击管理规则:
-
进入该页面后,就可以设置入方向和出方向的规则了:
基本概念补充
协议类型 :安全组中协议类型 用来定义允许或拒绝的通信协议。阿里云中安全组中常见通信协议:
- TCP:传输控制协议,最常用于互联网通信,保证数据传输的可靠性。比如 HTTP(80端口)、HTTPS(443端口)、SSH(22端口)等都使用 TCP 协议。
- UDP:用户数据报协议,属于无连接协议,不保证数据包的到达顺序和可靠性。适用于实时应用,比如视频流、VoIP、DNS 查询等。
- ICMP :互联网控制消息协议,通常用于网络设备间的错误报告和网络诊断,常见的如
ping
命令。 - GRE :GRE 协议 是一种通用的隧道协议,用于将不同类型的网络层协议封装在 IP 数据包中,从而可以在现有的 IP 网络上传输。这使得 GRE 成为虚拟专用网络(VPN)和多种协议间数据传输的重要工具。
![](https://i-blog.csdnimg.cn/img_convert/81ed465facb6b7f5239e231f1b4be1b3.png)
也可以设置为允许全部协议的流量访问。
端口范围 :安全组中的端口范围 是用来控制哪些端口可以被外部(公网)或其他网络访问,从而限制或允许对云服务器中应用程序和服务的访问。换句话说,端口范围指定了云服务器对外开放的端口,只有通过安全组规则允许的端口才可以被外部访问。
授权策略:有允许或拒绝规则。我们既可设置允许规则,也可设置拒绝规则,是为了提供更精细的访问控制。
-
设置明确的 拒绝规则,先拦截掉不需要的、危险的流量。
-
然后设置 允许规则,为信任的用户或服务提供访问权限。
优先级 :规则是具有优先级的,通常拒绝 规则的优先级要高于允许规则的优先级。当一个请求到来,它既符合"所有IP均可访问"的允许规则,也符合"特定IP不能访问"的拒绝规则,如果拒绝规则的优先级高,会去优先匹配拒绝规则,不让它访问。
![](https://i-blog.csdnimg.cn/img_convert/16dae7256803ae71ef9c35bfc07053db.png)
ICMP协议安全组配置
这个协议是网络层的协议,ICMP 协议主要用于 网络诊断 和 错误报告,它是 TCP/IP 协议族的一部分,常用于:
- 发送控制消息,如错误报告(例如主机不可达、时间超时等)。
- 用于网络诊断工具,如 ping 命令和 traceroute,用于测试网络连接是否正常。
此时我们没有删除入方向的ICMP协议的,去ping
我们的云服务器的公网IP,是可以ping
通的:
![](https://i-blog.csdnimg.cn/img_convert/4f9503328557841a6d6f84bbc6dcb5da.png)
这是因为我们配置了ICMP
协议入方向的安全组规则:
![](https://i-blog.csdnimg.cn/img_convert/5e3ec95f94b0d03b35787d33ef20a5c8.png)
ICMP
工作在网络层,而端口号是传输层的概念,所以它不需要配置端口号。
我们配置一个拒绝我们目前所连网络的公网IP的ICMP入方向的安全组(如果你不知道路由器的公网IP,直接源IP设置为所有):
-
在安全组配置页面,点击手动添加:
-
填写相关的信息后点确认,这个源IP是你当前所连网络的路由器的公网IP,后面的
/
跟着的子网掩码的位数,登录路由器管理界面可以查看到,这里我们乱填了一个子网掩码的位数,这个好像不影响,只要格式正确,公网IP对就行(): -
不知道自己所连网络的公网IP,直接源IP(请求方的IP地址,目的IP不用管)填所有的IPv4的地址:
-
此时用我们的windows电脑(已连网络)
ping
我们的公网IP,发现不能ping
通:
![](https://i-blog.csdnimg.cn/img_convert/7369222a1137a37dba450caa2f08792c.png)
-
删除或者修改刚刚的安全组拒绝规则中的源IP地址,又可以
ping
通: -
删除后,再次
ping
我们的云服务器,可以ping
通:
UDP协议安全组配置
学会了UDP
协议入方向的安全组配置,TCP
就很相似了:
-
点手动添加,设置好相应的参数后保存即可,目的端口我们可以开放所有的端口,但这样不安全,一般只开放一部分端口:
-
设置好安全组配置规则后,仍然不够,还需要设置Linux云服务器主机系统中的防火墙,如果我们服务器程序使用的端口本机防火墙(如果有防火墙服务)没有开放对应的端口,即使云服务器安全组设置了规则,外界仍然是无法访问的:
-
此时只开放了
8080
端口,我们刚刚安全组规则中是开放了所有UDP
的端口,我们运行服务器程序,端口号设置为8080
,再让windows
中的使用UDP协议的client
去访问,看能否访问成功: -
使用以下指令,添加
udp/8080
端口:bashsudo firewall-cmd --zone=public --add-port=8000/udp --permanent#8000端口(udp协议) sudo firewall-cmd --zone=public --add-port=8000/tcp --permanent#8000端口(tcp协议) sudo firewall-cmd --reload#重新加载防火墙,使其生效 sudo firewall-cmd --zone=public --list-ports#查看是否生效
-
客户端再次访问服务器程序(可以正常访问了):
出方向
云服务器的出方向默认允许所有访问,一般不用我们手动配置,如果你有特殊需求也可以配置:
![](https://i-blog.csdnimg.cn/img_convert/30ec6d2fc5851667ca5f2fe847c09796.png)
配置云服务器主机的防火墙
什么是防火墙
在Linux中,防火墙是一种网络安全机制,用于控制网络流量的进出。它通过一组规则(称为防火墙规则)来决定哪些网络流量可以进入或离开系统,哪些流量应被拒绝或限制。防火墙的核心目的是防止恶意攻击、网络入侵,以及控制系统的网络通信。
Linux中防火墙的管理工具
iptables
:这是传统的防火墙工具,用于定义和管理网络流量的规则。它基于IP数据包的头信息(源IP、目的IP、协议、端口)来进行控制和过滤。
firewalld
:这是一个更现代化的防火墙管理工具,通常用于 CentOS 7+ 、RHEL 7+ 和 Fedora 等操作系统。它提供了更简化的管理方式,基于区域(zone)和服务(service)来定义规则。
防火墙的作用
流量过滤:通过指定规则允许或拒绝网络流量。规则可能基于IP地址、协议或端口号。
地址转换:对进入或离开网络的数据包进行地址转换(如 NAT,Network Address Translation)。
状态检测:跟踪每个数据包的状态,判断该数据包是否属于已建立的连接,或者是否需要建立新的连接。
防火墙的主要应用之一就是:阻止不必要的端口开放,通过控制流量进出特定端口来防止未授权访问。
常用命令介绍(firewalld)
-
安装
firewalld
。bashsudo apt update sudo apt install firewalld
-
启动和启用
firewalld
服务。bash# 启动 firewalld 服务 sudo systemctl start firewalld # 设置 firewalld 开机自启动 sudo systemctl enable firewalld
-
检查
firewalld
服务的状态:bashsudo systemctl status firewalld
如果安装成功,可以看到类似以下输出:
-
验证 firewalld 是否正在运行:
bashsudo firewall-cmd --state
输出应该为:
-
停止防火墙:
bashsudo systemctl stop firewalld
停止后,防火墙不再运行:
-
启用防火墙:
csudo systemctl start firewalld
启用后防火墙的状态又重新变成
running
: -
禁用防火墙服务开机自启:
bashsudo systemctl disable firewalld
-
开放端口:
-
临时开放端口(重启后失效):
bashsudo firewall-cmd --zone=public --add-port=8080/tcp
-
持久化开放端口(重启后也有效):
bashsudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
-
-
关闭端口:
-
临时关闭端口(重启后失效):
bashsudo firewall-cmd --zone=public --remove-port=8080/tcp#对外临时开放8080端口,tcp协议
-
持久化关闭端口(重启后仍然有效)
bashsudo firewall-cmd --zone=public --remove-port=8080/tcp --permanent
-
-
重新加载防火墙配置(更改防火墙配置后,需要重新加载才能生效):
bashsudo firewall-cmd --reload
-
查看当前区域所有开放的端口:
bashsudo firewall-cmd --zone=public --list-ports
配置防火墙并不是必要步骤,如果你不需要防护墙,将其禁用后,操作系统将不会对任何流量在主机级别做防护,所以端口都开放,只要安全组规则配置正确,外界就可以访问。
如果启用了防火墙,则需要开放对应的端口。
为什么安全组和防火墙的配置缺一不可
安全组 :作为云平台层的防火墙,主要用于控制 虚拟机与外部网络 的通信。它是云平台的边界防护,帮助你防止外部未经授权的访问。
主机防火墙 :操作系统内的防火墙是 主机级别的防护 ,它可以进一步限制和控制 内网流量 、特定进程的访问、以及防止被攻破的情况下对内部服务的未经授权访问。即使安全组开放了某个端口,操作系统层的防火墙仍然能限制哪些进程可以访问该端口或允许哪些内部网络访问。
配置防火墙后,可以让我们的服务器更加安全。