端口扫描工具–nmap

安全方面本不是我的本职工作,不过趁着研究 nmap 的时机在文章前面记录一些安全相关的信息。

一个完整的渗透测试大致可以分为以下六步:

1.信息收集。知己知彼,百战不殆。通过whois查询等方式,了解目标主机状态,如状态、系统版本等;利用工具查寻c段、旁站子站的信息;查寻服务器和端口的有关信息,如内核信息、开放的端口等;使用爬虫这种自动化工具遍历并抓取网站目录,为以后的漏洞寻找做准备;google hack有关的旧漏洞信息,有的时候会很有用。

相关工具:Nmap ,SuperScan。

2.漏洞挖掘。首先要了解常见的Web漏洞,如XSS(跨站脚本攻击)、SQL注入、CSRF(跨站请求伪造)等;其次就是使用相关工具配合上一步得到的信息有针对性地进行漏洞扫描,但要注意,轻易不建议使用Nessus这种重武器,因为动静不小,有可能被发现,这就违背了渗透测试的初衷,也就是“像入侵者一样思考和行动”。

相关工具:Joomscan、AWVS等。

3.漏洞利用。要注意的是,这里的利用一定要把握好度,不能逾越那条线,点到即止,不然就等着律师含吧(滑稽)。各种漏洞自然有不同的利用方法,比如文件上传漏洞可以拿shell,SQL注入可以拿密码等,总之是只要能用的都可以用,手段越猥琐越好。

相关工具:sqlmap、BurpSuite等。

4.权限提升与维持。这和上一点一样,各有各的姿势,但都是建立在有漏洞利用的前提上的,在此不一一介绍。

5.日志清理。 不管干啥,屁股一定要擦干净。通常会留下你踪迹的地方有应用程序日志、系统日志、访问日志、登录日志等,虽说在正规测试中这步可以略去,但我想每个Hacker 都应该去养成这种习惯,因为,你们懂的。。。

相关工具:del.、rm

6.总结报告。将自己所发现的东西记录下来,越详细越好,毕竟这关系着你的报酬。

相关工具:Word等。

转自:https://zhuanlan.zhihu.com/p/32342884

nmap简介

Nmap是一款开源免费的网络发现(Network Discovery)和安全审计(Security Auditing)工具,是世界千万安全专家列为必备的工具之一,在其中的一些影视作品中《黑客帝国2》、《特警判官》中都有亮相。

Nmap包含四项基本功能:

  1. 主机发现(Host Discovery)
  2. 端口扫描(Port Scanning)
  3. 版本侦测(Version Detection)
  4. 操作系统侦测(Operating System Detection)

默认的情况下,我们的查找是查找最有可能开放的1000端口,但是使用快速端口查找(参数 -F )会查找最有可能开放的100个端口,这样也就节约了10倍的时间

NMAP 有很多的脚本和漏洞分析等功能,PS/PU/PA/PY不只是可以用来做主机发现的,主要还是作为获取端口列表用的,如果是要做主机发现,我们可以在基本的扫描(TCP扫描、SYN扫描等)的基础之上加上 sn 参数来进行主机发现,这样就不会对端口进行扫描,提升了扫描的效率。

常用有4种扫描方式:

  1. PING 扫描 (-sP)
  2. UDP 扫描 (-sU)
  3. TCP SYN 扫描 (-sS)
  4. TCP Connect() 扫描 (-sT)

注意,大量的没有针对性的扫描活动,大概率会触发网络流量监控的警报。

PING 扫描 (-sP)

Ping 扫描在网络中最多只会产生两个包。

UDP 扫描 (-sU)

现在你已经知道了有那些系统是在线的,你的扫描就可以聚焦在这些 IP 地址之上。在整个网络上执行大量的没有针对性的扫描活动可不是一个好主意,系统管理员可以使用程序来监控网络流量当有大量异常活动发生的时候就会触发警报。

用户数据报协议(UDP)在发现在线系统的开放端口方面十分有用。

TCP SYN 扫描 (-sS)

TCP SYN 扫描是默认的 NMAP 扫描方式,需要 Root 权限。

TCP SYN 扫描通过执行下面的步骤来进行工作:

  1. 源系统向目标发送一个同步请求,该请求中包含一个端口号。
  2. 如果添加在上一步中的所请求的端口号是开启的,那么目标将通过同步/应答(SYN/ACK)来响应源系统。
  3. 源系统通过重置(RST)来响应目标,从而断开连接。
  4. 目标通过重置/应答(RST/ACK)来响应源系统。

如果被扫描的端口是关闭的,那么将执行下面的步骤:

  1. 源系统发送一个同步(SYN)请求到目标,该请求中包含一个端口号。
  2. 目标通过重置(RST)响应源系统,因为该端口是关闭的。

如果目标处于防火墙之后,那么 ICMP 传输或响应会被防火墙禁止:

  1. 源系统发送一个同步(SYN)请求到目标,该请求中包含一个端口号。
  2. 没有任何响应,因为请求被防火墙过滤了。

TCP Connect() 扫描 (-sT)

TCP Connect() 扫描不需要Root 权限。在这种扫描中会执行一个完整的“三次握手”。

TCP Connect 扫描通过执行下面的步骤来工作:

  1. 源系统发送一个同步(SYN)请求到目标,该请求中包含一个端口号。
  2. 如果端口是开启的,那么目标将通过同步/应答(SYN/ACK)来响应源系统。
  3. 源系统通过应答(ACK)来响应目标从而完成会话创建。
  4. 然后,源系统向目标发送一个重置(RST)包来关闭会话。
  5. 目标可以通过同步/应答(SYN/ACK)来响应源系统。

其它情况与 tcp syn 一致。

时间优化

时间优化的参数是(-T0~5),最快的扫描速度为-T5,最慢的扫描速度为-T0,

实现的原理:通过设置各个端口的扫描周期,从而来控制整个扫描的时间,比如说T0各个端口的扫描周期大约为5分钟,而T5各个端口的扫描周期为5ms

扫描的周期过快,会很容易被防火墙和IDS发现并记录,因为防火墙大多数会将端口周期过段识别为扫描从而屏蔽掉,如果不对其进行设置的话,默认值为T4

nmap用法

nmap参数:

nmap [Scan Type(s)] [Options] {target specification}

scan type(s) 用于指定扫描类型
options 用于指定选项
target specification 用于指定扫描目标

-s 指定扫描类型
如下:
-sP (ping扫描) *存活主机探测
-sS (TCP SYN扫描 隐身扫描)  *默认扫描方式
-sT (tcp 扫描) * syn 不能用时就tcp扫描
-sU (UDP 扫描)
-sA  (ACK扫描) *三次握手 用于探测出防火墙过滤端口 实际渗透中没多大用

-sV   (版本探测)
-A    进攻性方式扫描
-O (启用操作系统检测)
-v    详细
选项说明
-P0  [指定端口] (无ping扫描)
-PU  [指定端口] (udp ping扫描)
-PS [指定端口] (TCP SYN ping 扫描)
-PA  [指定端口] (tcp ack ping扫描) 
-PI   使用真正的pingICMP echo请求来扫描目标主机是否正在运行

-iL 指定扫描主机列表
-iR 随机选择目标

--exclude 排除扫描目标
--excludefile 排除文件中目标列表

-n (不用域名解析)
-R (为所有目标解析域名)

-sn,表示只单独进行主机发现过程;
-Pn表示直接跳过主机发现而进行端口扫描等高级操作(如果已经确知目标主机已经开启,可用该选项)

-T  时间优化(每隔多久发一次包 ) -T5 最快 -T0 最慢
-F  快速扫描,仅扫描TOP 100的端口
-e  指定网络接口
-M 设置tcp扫描线程

nmap output

输出结果:

-oS  保存扫描结果输出
-oN  把扫描结果重定向到一个可读的文件logfilename中
-oM  每个结果一行输出
-oA  同上
--append-output 附在原来的结果前面

nmap status

nmap端口状态:

open(开放的)
closed(关闭的)
filtered(被过滤的)不确定开放还是关闭
unfiltered (未被过滤的)
openfiltered (开放或者被过滤的)
closedfiltered (关闭或者未被过滤的)

nmap应用场景

轻量级扫描:

nmap -sP 192.168.0.0/24   判断哪些主机存活
nmap -sT 192.168.0.3   开放了哪些端口
nmap -sS 192.168.0.127 开放了哪些端口(隐蔽扫描)
nmap -sU 192.168.0.127 开放了哪些端口(UDP)
nmap -sS -O 192.168.0.127 操作系统识别
nmap -sT -p 80 -oG – 192.168.1.* | grep open    列出开放了指定端口的主机列表
nmap -sV -p 80 thief.one  列出服务器类型(列出操作系统,开发端口,服务器类型,网站脚本类型等)
nmap -O 172.16.0.15

# -sP (ping扫描) *存活主机探测
# -sS (TCP SYN扫描 隐身扫描)  *默认扫描方式
# -sT (tcp 扫描) * syn 不能用时就tcp扫描
# -sU (UDP 扫描)
# -sA  (ACK扫描) *三次握手 用于探测出防火墙过滤端口 实际渗透中没多大用

# -Pn, 跳过ping扫描并假设主机已启动、
# -v, 详细
nmap -v -Pn -O 172.16.0.15 

# 识别主机名
nmap -sL 172.16.0.0/24

# 扫描最常见的100个端口
nmap -T4 -F 172.16.0.14 快速扫描
nmap -T4 -A 172.16.0.0/24  操作系统检查和版本检查

# -A选项用于使用进攻性(Aggressive)方式扫描;-T4指定扫描过程使用的时序(Timing),总有6个级别(0-5),级别越高,扫描速度越快,但也容易被防火墙或IDS检测并屏蔽掉,在网络通讯状况良好的情况推荐使用T4;-v表示显示冗余(verbosity)信息,在扫描过程中显示扫描的细节,从而让用户了解当前的扫描状态。

nmap –sS –sU –T4 –top-ports 300 192.168.1.100

参数-sS表示使用TCP SYN方式扫描TCP端口;-sU表示扫描UDP端口;-T4表示时间级别配置4级;--top-ports 300表示扫描最有可能开放的300个端口(TCP和UDP分别有300个端口)。

nmap –T4 –A –v targethost
# 对某台主机进行完整全面的扫描,那么可以使用nmap内置的-A选项。使用了改选项,nmap对目标主机进行主机发现、端口扫描、应用程序与版本侦测、操作系统侦测及调用默认NSE脚本扫描。

批量扫描:

nmap -sT -sV -O -P0 --open -n -oN result.txt -p80-89,8080-8099,8000-8009,7001-7009,9000-9099,21,443,873,2601,2604,3128,4440,6082,6379,8888,3389,9200,11211,27017,28017,389,8443,4848,8649,995,9440,9871,2222,2082,3311,18100,9956,1433,3306,1900,49705,50030,7778,5432,7080,5900,50070,5000,5560,10000 -iL ip.txt

批量扫描:

nmap -sT -sV -p80-89,8080-8099,8000-8009,7001-7009,9000-9099,21,443,873,2601,2604,3128,4440,6082,6379,8888,3389,9200,11211,27017,28017,389,8443,4848,8649,995,9440,9871,2222,2082,3311,18100,9956,1433,3306,1900,49705,50030,7778,5432,7080,5900,50070,5000,5560,10000 --open --max-hostgroup 10 --max-parallelism 10 --max-rtt-timeout 1000ms --host-timeout 800s --max-scan-delay 2000ms -iL ~/Desktop/ip.txt -oN ~/Desktop/result/result.txt

nmap api

nmap支持很多语言的扩展,本文简单介绍下python中如何使用nmap。

python-nmap

安装:pip install python-nmap 作用:利用python调用nmap接口,实现端口扫描。 使用:

>>> import nmap
>>> nm = nmap.PortScanner()
>>> nm.scan('127.0.0.1', '22-443')
>>> nm.command_line()

更多使用方法,参考:python-nmap : nmap from python

参考资料


yum 查询包版本与rpm包下载

查询版本号

某些场景下我们需要安装某些软件的特定版本,这个时候就需要在yum仓库中查询包版本号。例如查询 cri-tools 这个软件的版本如下:

yum -v list cri-tools --show-duplicates
yum --showduplicates list cri-tools

列出的版本信息具体内容是:

package_name.architecture  version_number–build_number  repository

下载rpm

在知道rpm包版本好后,我们希望将其下载下来,以供内网环境安装。用如下方法下载:

yum install --downloadonly --downloaddir=/tmp/ [package-name]-[version].[architecture]

# 例如:
yum install --downloadonly --downloaddir=/tmp/ cri-tools-1.0.0_beta.1-0

对于kubernetes的rpm

说来也是气人,kubernetes的repo文件比较奇葩:https://kubernetes.io/docs/setup/independent/install-kubeadm/#k8s-install-1

对于上边的命令行,都要附上这样一个特殊的命令:

--disableexcludes=kubernetes

例如:

yum install --downloadonly --downloaddir=/tmp/ xxx --disableexcludes=kubernetes

参考资料


部署 kubernetes 的一些问题收集

这篇文章记录在部署 kubernetes 1.10 过程中遇到的一些问题。

安装遇到的很多问题都是版本问题,故而常常会看到这张图:

cri-tools 版本问题

在增加 kubernetes 节点时,冒出这个错误。

configmaps "kubelet-config-1.11" is forbidden: cannot get configmaps in the namespace "kube-system"

[ERROR CRI]: unable to check if the container runtime at "/var/run/dockershim.sock" is running: fork/exec /usr/bin/crictl -r /var/run/dockershim.sock info: no such file or directory

解决办法:

卸载 cri-tools

apt-get remove cri-tools
yum remove cri-tools

参考:kubeadm init/join CRI preflight check fails unnecessarily#814


使用 kubeadm 部署 kubernetes HA

这篇文章记录在测试环境中部署 kubernetes 1.10 的 HA的过程。

Master 节点高可用的思路

非常感谢这个博主得文章,得以一览 k8s HA 的思路——《关于Kubernetes Master高可用的一些策略

先看下 kubernetes 的架构:

为了实现没有单点故障的目标,在 kubernetes 内部,需要为以下几个组件建立高可用方案:

  • etcd 集群的数据中心,用于存放集群的配置以及状态信息,非常重要,如果数据丢失那么集群将无法恢复;因此高可用集群部署首先就是 etcd 是高可用集群。

    如果你有3个节点,那么最多允许1个节点失效;当你有5个节点时,就可以允许有2个节点失效。

    同时,增加节点还可以让etcd集群具有更好的读性能。因为etcd的节点都是实时同步的,每个节点上都存储了所有的信息,所以增加节点可以从整体上提升读的吞吐量。

  • kube-apiserver 集群核心,集群API接口、集群各个组件通信的中枢。由于 apiserver 是无状态的,每个master节点的apiserver都是active的,并处理来自Load Balance分配过来的流量;

  • kube-controller-manager 集群状态管理器 (内部自选举)。当集群状态与期望不同时,kcm会努力让集群恢复期望状态。默认kubeadm安装情况下–leader-elect参数已经设置为true,保证master集群中只有一个kube-controller-manager处于活跃状态;

  • kube-scheduler 集群Pod的调度中心(内部自选举);默认 kubeadm 安装情况下 –leader-elect 参数已经设置为 true,保证 master 集群中只有一个 kube-scheduler 处于活跃状态;

  • kube-dns

etcd 的高可用,在前篇的文章里我已经有介绍 ——《etcd ha》。本文介绍其他几个组件的高可用。

准备

本文的操作系统环境为 CentOS Linux release 7.3.1611 (Core)

目前已在 10.19.0.55-57 上装好 etcd,并部署好 vip 10.19.0.230,接下来的目的是在55-57上安装 k8s master 作为ha。

为了保证未来安装时环境保持一致,使用 rpm 包安装 kubeadm kubectl kubelet 组件。

kubeadm-1.10.2-0.x86_64.rpm  
kubectl-1.10.2-0.x86_64.rpm  
kubelet-1.10.2-0.x86_64.rpm  
kubernetes-cni-0.6.0-0.x86_64.rpm
yum install *

安装第一台master

安装过程与先前安装 k8s集群相似——《kubernetes 安装入门(centos)》

  1. 修改 kubeadm.conf

    $ vi /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
    # 修改 "cgroup-driver"值 由systemd变为cgroupfs
    # 原因是 cgroup-driver参数要与docker的一致,否则就会出问题
    Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=cgroupfs"
    
    # 第九行增加swap-on=false
    Environment="KUBELET_EXTRA_ARGS=--fail-swap-on=false"
    
  2. 启动Docker与kubelet服务

    systemctl enable kubelet && systemctl start kubelet
    
  3. 使用 config.yaml 进行初始化配置

    apiVersion: kubeadm.k8s.io/v1alpha1
    kind: MasterConfiguration
    etcd:
      endpoints:
      - https://10.19.0.55:2379
      - https://10.19.0.56:2379
      - https://10.19.0.57:2379
      caFile: /app/allblue/etcd/ssl/ca.pem
      certFile: /app/allblue/etcd/ssl/server.pem
      keyFile: /app/allblue/etcd/ssl/server-key.pem
      dataDir: /app/allblue/etcddata
    networking:
      podSubnet: 10.244.0.0/16
    kubernetesVersion: 1.10.0
    api:
      advertiseAddress: "10.19.0.230"
    token: "b99a00.a144ef80536d4344"
    tokenTTL: "0s"
    apiServerCertSANs:
    - 10.19.0.55
    - 10.19.0.56
    - 10.19.0.57
    - 10.19.0.230
    featureGates:
      CoreDNS: true
    imageRepository: "10.18.1.230:80/k8s.gcr.io"
    

    使用上述的配置文件,如下安装第一台master:

    kubeadm init --config cfg/config.yaml --ignore-preflight-errors Swap
    
    echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/bash_profile
    echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/bashrc
    

    由于是测试环境,机器内存较为紧张,将swap关闭容易导致系统宕机,故而不按照官方推荐的关闭 swap。

    另外,在这里我们提前将安装需要的经镜像存储在本地Harbor镜像仓库中,也可以使用下面的脚本提前下载到本地:

    images=(kube-proxy-amd64:v1.10.0
    kube-scheduler-amd64:v1.10.0
    kube-controller-manager-amd64:v1.10.0
    kube-apiserver-amd64:v1.10.0
    etcd-amd64:3.1.12 pause-amd64:3.1
    kubernetes-dashboard-amd64:v1.8.3
    k8s-dns-sidecar-amd64:1.14.8
    k8s-dns-kube-dns-amd64:1.14.8
    k8s-dns-dnsmasq-nanny-amd64:1.14.8
    flannel:v0.9.1-amd64
    heapster-amd64:v1.4.2)
    for imageName in ${images[@]} ; do
      docker pull 10.18.1.230:80/k8s.gcr.io/$imageName
      docker tag 10.18.1.230:80/k8s.gcr.io/$imageName k8s.gcr.io/$imageName
      docker rmi 10.18.1.230:80/k8s.gcr.io/$imageName
    done
    
    docker tag k8s.gcr.io/flannel:v0.9.1-amd64 flannel:v0.9.1-amd64
    
  4. 安装flannel网络

    mkdir -p /etc/cni/net.d/
    cat <<EOF> /etc/cni/net.d/10-flannel.conf
    {
    "name": "cbr0",
    "type": "flannel",
    "delegate": {
    "isDefaultGateway": true
    }
    }
    EOF
    
    mkdir /usr/share/oci-umount/oci-umount.d -p
    mkdir -p /run/flannel/
    
    cat <<EOF> /run/flannel/subnet.env
    FLANNEL_NETWORK=10.244.0.0/16
    FLANNEL_SUBNET=10.244.1.0/24
    FLANNEL_MTU=1450
    FLANNEL_IPMASQ=true
    EOF
    
    kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml
    
  5. 复制 master 1 证书到另外两台机器:

    cp -r /etc/kubernetes/pki .
    

安装剩余master

  1. 将master 1 中的证书导入到本地:

    mkdir -p /etc/kubernetes/
    cp -r pki /etc/kubernetes/
    
    
  2. 其它步骤参考第一台配置即可。

  3. 检测系统可用性。

    echo "kubectl get node"
    kubectl get node
    echo ""
    echo "kubectl get cs"
    kubectl get cs
    echo ""
    echo "kubectl get po --all-namespaces"
    kubectl get po --all-namespaces
    

添加节点

在master节点查看节点添加命令。

kubeadm token create --print-join-command

扩展kube-dns

为了避免故障,要将 kube-dns的replicas值设为2或者更多,并用anti-affinity将他们部署在不同的Node节点上。

安装ingress

我使用了traefik 作为 ingress 的实现,官网 https://docs.traefik.io/,以下按照 user-guide 进行安装:

    # 创建角色和rbac绑定
    $ kubectl apply -f https://raw.githubusercontent.com/containous/traefik/master/examples/k8s/traefik-rbac.yaml
    
    # ServiceAccount, DaemonSet(直接绑定主机端口),service
    $ kubectl apply -f https://raw.githubusercontent.com/containous/traefik/master/examples/k8s/traefik-ds.yaml

需要注意的是,官方最近修改的 traefik-ds.yaml 修改了两个地方,并不能正常使用,可以参考左侧进行修改。

安装helm

参考文章《kubernetes helm 入门》

安装dashboard

参考文章《kubernetes 安装入门(centos)》

运行测试

运行几个ns,几个busybox,几个nginx,nslook试试dns问题。

# ns

apiVersion: v1
kind: Namespace
metadata:
  name: demo1
  labels:
    nsname: demo1
---
apiVersion: v1
kind: Namespace
metadata:
  name: demo2
  labels:
    nsname: demo2

busybox和nginx

apiVersion: apps/v1
kind: Deployment
metadata:
  name: busybox-deployment
  namespace: demo2
spec:
  selector:
    matchLabels:
      app: busybox
  replicas: 1
  template:
    metadata:
      labels:
        app: busybox
    spec:
      containers:
      - name: busybox
        image: busybox:1.28.4
        command: [ "/bin/sh" ]
        tty: true
      dnsConfig:
        options:
          - name: single-request-reopen
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-test
  namespace: demo2
spec:
  selector:
    matchLabels:
      app: nginx-test
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx-test
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
        ports:
        - containerPort: 80
      restartPolicy: Always
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: busybox-deployment
  namespace: demo1
spec:
  selector:
    matchLabels:
      app: busybox
  replicas: 1
  template:
    metadata:
      labels:
        app: busybox
    spec:
      containers:
      - name: busybox
        image: busybox:1.28.4
        command: [ "/bin/sh" ]
        tty: true
      dnsConfig:
        options:
          - name: single-request-reopen
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-test
  namespace: demo1
spec:
  selector:
    matchLabels:
      app: nginx-test
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx-test
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
        ports:
        - containerPort: 80
      restartPolicy: Always

service:

kind: Service
apiVersion: v1
metadata:
  labels:
    app: nginx-test
  name: nginx-test
  namespace: demo2
spec:
  type: NodePort
  ports:
  - port: 8080
    targetPort: 80
    nodePort: 32004
  selector:
    app: nginx-test
---
kind: Service
apiVersion: v1
metadata:
  labels:
    app: nginx-test
  name: nginx-test
  namespace: demo1
spec:
  type: NodePort
  ports:
  - port: 8080
    targetPort: 80
    nodePort: 32003
  selector:
    app: nginx-test

参考资料


alpha、beta、rc 各版本区别

传统软件工程上来说,对成形软件的测试有着三个阶段:alpha、beta 和gamma,用来标识测试的阶段与范围。alpha 指的是内测,即现在说的 CB,即开发团队内部测试的版本或者有限用户的体验测试版本。beta 指的是公测,即针对所有用户公开的测试版本。而做过一些修改,成为正式发布的候选版本时(现在叫做 RC - Release Candidate),叫做 gamma。

对于互联网产品来说,一般会喜欢将“beta”期做久一点,比如上面有人说的http://weibo.com,还有http://google.com及网络游戏等。这样做的原因可能有所谓“降低被喷的风险”的作用,但是实际上根本原因还是互联网产品其本身特点,因为几乎所有互联网产品都要基于用户参与,如果用户量、交互量未达到产品预期目标,就是在“beta”阶段。这是合乎软件生命周期基本规律的。

——转自知乎https://www.zhihu.com/question/20028437

开发期Pre-alpha

有时候软体会在Alpha或Beta版本前先释出Pre-alpha版本。一般而言相对于Alpha或Beta版本,Pre-alpha版本是一个功能不完整的版本。

alpha版:内部测试版。α是希腊字母的第一个,表示最早的版本,一般用户不要下载这个版本,这个版本包含很多BUG,功能也不全,主要是给开发人员和 测试人员测试和找BUG用的。

beta版:公开测试版。β是希腊字母的第二个,顾名思义,这个版本比alpha版发布得晚一些,主要是给“部落”用户和忠实用户测试用的,该版本任然存 在很多BUG,但是相对alpha版要稳定一些。这个阶段版本的软件还会不断增加新功能。如果你是发烧友,可以下载这个版本。

rc版:全写:Release Candidate(候选版本),该版本又较beta版更进一步了,该版本功能不再增加,和最终发布版功能一样。这个版本有点像最终发行版之前的一个类似 预览版,这个的发布就标明离最终发行版不远了。

多数开源软件会推出两个RC版本,最后的RC2则成为正式版本。闭源软件较少公开使用,微软在Windows 7 上用了此名称。苹果把在这阶段的产品称为“Golden Master”(简称GM),而最后的GM即成为正式版本。

stable版:稳定版。在开源软件中,都有stable版,这个就是开源软件的最终发行版。在符合需求规格的硬件与操作系统中运行不会造成严重的不相容或是硬件冲突,已受过某定量的测试无误。

RTM版:全称为Release to Manufacture。意思是:发放给生产商。改版程序已经固定,就差工厂包装、光盘印图案等工作了。

OEM版:厂商定制版。

EVAL版:评估版。就是有30或者60天等使用期限的版本。

RTL版:Retail.(零售版),这个版本就是真正发售的版本,有漂亮的包装、光盘、说明书等东西和高昂的价格。

参考资料