整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

云原生之服务编排Docker Swarm的使用

云原生之服务编排Docker Swarm的使用

、什么是Docker Swarm?

Docker Swarm 是 Docker 官方提供的容器编排和集群管理工具,用于构建和管理多个 Docker 容器节点组成的集群。通过 Docker Swarm,用户可以将多台主机(物理机或虚拟机)组成一个统一的集群,从而实现容器的集中调度、部署和管理。

关键特性包括:

  1. 集群管理: Docker Swarm 允许用户将多个 Docker 主机组合成一个虚拟的单一主机。这样,用户可以通过集群管理工具对整个集群进行统一的管理,而无需关心底层主机的具体情况。
  2. 服务发现: Swarm 提供了内置的服务发现机制,使得容器可以轻松地相互发现并通信。这样,应用程序的不同部分可以方便地与其他部分进行交互,而无需显式指定特定容器的 IP 地址或端口号。
  3. 负载均衡: Swarm 集群能够自动在多个节点上进行负载均衡,确保容器应用程序能够以高可用性和高性能的方式运行。
  4. 滚动更新: Swarm 支持滚动更新容器服务,可以平滑地升级应用程序的不同部分,同时保持应用的可用性。
  5. 安全: Swarm 提供了安全的通信机制和访问控制,确保集群中的通信和数据传输都是受保护的。

总之,Docker Swarm 提供了一种简单但强大的方式来管理容器化应用程序的部署和扩展,在生产环境中被广泛应用于构建容器集群,并为应用程序的高可用性和可扩展性提供支持。

二、Docker Swarm集群搭建

(一)创建多节点集群

1、查看Swarm命令

[root@centos-7 ~]# docker swarm --help

Usage:    docker swarm COMMAND

Manage Swarm

Commands:
  ca          Display and rotate the root CA
  init        Initialize a swarm
  join        Join a swarm as a node and/or manager
  join-token  Manage join tokens
  leave       Leave the swarm
  unlock      Unlock swarm
  unlock-key  Manage the unlock key
  update      Update the swarm

Run 'docker swarm COMMAND --help' for more information on a command.

可以看到其中有一个 init的命令,这就是初始化一个Swarm,我们再看看这个init的参数:

[root@centos-7 ~]# docker swarm init --help

Usage:    docker swarm init [OPTIONS]

Initialize a swarm

Options:
      --advertise-addr string                  Advertised address (format: <ip|interface>[:port])
      --autolock                               Enable manager autolocking (requiring an unlock
                                               key to start a stopped manager)
      --availability string                    Availability of the node
                                               ("active"|"pause"|"drain") (default "active")
      --cert-expiry duration                   Validity period for node certificates
                                               (ns|us|ms|s|m|h) (default 2160h0m0s)
      --data-path-addr string                  Address or interface to use for data path traffic
                                               (format: <ip|interface>)
      --data-path-port uint32                  Port number to use for data path traffic (1024 -
                                               49151). If no value is set or is set to 0, the
                                               default port (4789) is used.
      --default-addr-pool ipNetSlice           default address pool in CIDR format (default [])
      --default-addr-pool-mask-length uint32   default address pool subnet mask length (default 24)
      --dispatcher-heartbeat duration          Dispatcher heartbeat period (ns|us|ms|s|m|h)
                                               (default 5s)
      --external-ca external-ca                Specifications of one or more certificate signing
                                               endpoints
      --force-new-cluster                      Force create a new cluster from current state
      --listen-addr node-addr                  Listen address (format: <ip|interface>[:port])
                                               (default 0.0.0.0:2377)
      --max-snapshots uint                     Number of additional Raft snapshots to retain
      --snapshot-interval uint                 Number of log entries between Raft snapshots
                                               (default 10000)
      --task-history-limit int                 Task history retention limit (default 5)

可以看到它有很多的参数,其中第一个就是将本机的地址添加进去,让自己成为一个Manager节点,这样其它的节点都可以知道这个节点的存在。

2、创建一个Manager节点

在此之前我们应该先知道自己本机的ip,以便于--advertise-addr string 这个参数使用,查看本机ip:

然后就可以初始化Manager节点:

[root@centos-7 ~]# docker swarm init --advertise-addr=192.168.0.108
Swarm initialized: current node (sz7bfcmk637qhqfvzqhdnk3t2) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-0zzpk3xqq2ykb5d5jcd6hqeimckhrg5qu82xs7nw2wwnwyjmzg-9tmof9880m9r92vz5rygaa42e 192.168.0.108:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

可以看到已经创建了一个swarm manager节点--advertise-addr参数的值192.168.0.108是自己的ip,相当于将自己加入到swarm中。它也说明了其它worker加入的方式。

3、创建一个worker节点

另外再开启一台虚拟机,将这台机器加入到swarm中成为worker节点:

[root@localhost ~]#  docker swarm join --token SWMTKN-1-0zzpk3xqq2ykb5d5jcd6hqeimckhrg5qu82xs7nw2wwnwyjmzg-9tmof9880m9r92vz5rygaa42e 
192.168.0.108:2377
This node joined a swarm as a worker.

可以看到已经成功了。

4、查看节点状态

注意的是查看节点状态只能在manager节点那台机器上查看,普通节点无法执行查看命令:

[root@centos-7 ~]# docker node ls
ID                            HOSTNAME                STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
sz7bfcmk637qhqfvzqhdnk3t2 *   centos-7                Ready               Active              Leader              19.03.5
89tezea9ltn6mqek7b48gtve7     localhost.localdomain   Ready               Active                                  18.09.7

可以看到有两台机器了。

(二)多节点容器创建

上面我们已经将节点创建好了,现在可以在这些节点上创建容器了,那么就需要看看docker service 的帮助信息:

[root@centos-7 ~]# docker service --help

Usage:    docker service COMMAND

Manage services

Commands:
  create      Create a new service
  inspect     Display detailed information on one or more services
  logs        Fetch the logs of a service or task
  ls          List services
  ps          List the tasks of one or more services
  rm          Remove one or more services
  rollback    Revert changes to a service's configuration
  scale       Scale one or multiple replicated services
  update      Update a service

Run 'docker service COMMAND --help' for more information on a command.

可以看到有create这个命令,可以这样理解,docker server create 相当于docker run 就是创建容器,只不过在swarm中是不同的表现方式。

1、manager节点上创建容器

[root@centos-7 docker]# docker service create --name demo busybox /bin/sh -c "while true; do sleep 3600; done "
image busybox:latest could not be accessed on a registry to record
its digest. Each node will access busybox:latest independently,
possibly leading to different nodes running different
versions of the image.

edqgwqjka7ceyym9tg4gr9uim
overall progress: 1 out of 1 tasks 
1/1: running   
verify: Service converged 



可以查看是否创建成功:

[root@centos-7 docker]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
edqgwqjka7ce        demo                replicated          1/1                 busybox:latest      

可以具体看这个service的内容:

[root@centos-7 docker]# docker service ps demo
ID                  NAME                IMAGE               NODE                    DESIRED STATE       CURRENT STATE           ERROR    PORTS
lshgq4gfi3cv        demo.1              busybox:latest      localhost.localdomain   Running             Running 2 minutes ago   

2、水平扩展

  • 水平扩展

之前接触或scale,它可以帮助我们创建多个service,这里也是可行的:

[root@centos-7 docker]# docker service scale demo=5
demo scaled to 5
overall progress: 5 out of 5 tasks 
1/5: running   
2/5: running   
3/5: running   
4/5: running   
5/5: running   
verify: Service converged 

已经有5个demo服务的容器正在运行了。可以先看看serverice:

[root@centos-7 docker]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
edqgwqjka7ce        demo                replicated          5/5                 busybox:latest      

再看看具体的容器数量:

[root@centos-7 docker]# docker service ps demo
ID                  NAME      IMAGE               NODE                    DESIRED STATE       CURRENT STATE       ERROR   PORTS
lshgq4gfi3cv        demo.1   busybox:latest      localhost.localdomain   Running             Running 3 hours ago                       
vvxl3f5p1w40        demo.2   busybox:latest      centos-7                Running             Running 3 hours ago                       
q5imz8pqygbv        demo.3   busybox:latest      centos-7                Running             Running 3 hours ago                       
ih6e2bhzzru2        demo.4   busybox:latest      localhost.localdomain   Running             Running 3 hours ago                       
l32ziu7ygoqw        demo.5   busybox:latest      centos-7                Running             Running 3 hours ago  

可以看到5个容器在不同的节点上,其中有3个容器在manager节点,有两个在worker节点上。

当然,每一个节点都可以自己查看自己目前运行的容器,比如worker节点查看自己运行容器的数量:

[root@centos-7 docker]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS         PORTS        NAMES
fbf77922d24c        busybox:latest      "/bin/sh -c 'while t…"   3 hours ago         Up 3 hours              demo.5.l32ziu7ygoqwapu4rbazqhyej
51e0e953688f        busybox:latest      "/bin/sh -c 'while t…"   3 hours ago         Up 3 hours              demo.3.q5imz8pqygbv5fw1r2wyt84ps
6f2b6d5f670c        busybox:latest      "/bin/sh -c 'while t…"   3 hours ago         Up 3 hours              demo.2.vvxl3f5p1w40oc82wvm2yq01q

只需要通过docker ps命令即可。

  • 修复

scale在swarm中除了水平扩展外,还有一个作用,那就是修复作用,比如将某一个节点中的容器删除掉,那么很快swarm中发觉并进行修复,数量保持原先的样子。

假如现在删除worker中的一个容器:

[root@localhost ~]# docker rm -f a8c8e6a95978
a8c8e6a95978

我们在manager节点中查看容器情况:

[root@centos-7 docker]# docker service ps demo
ID            NAME        IMAGE               NODE               DESIRED STATE   CURRENT STATE       ERROR      PORTS
lshgq4gfi3cv  demo.1     busybox:latest      localhost.localdomain   Running     Running 3 hours ago                                             
vvxl3f5p1w40  demo.2     busybox:latest      centos-7                Running     Running 3 hours ago                                             
q5imz8pqygbv  demo.3     busybox:latest      centos-7                Running    Running 3 hours ago                                             
zkoywf8h19p1  demo.4     busybox:latest      localhost.localdomain   Running   Starting less than a second ago                                 
ih6e2bhzzru2 \_ demo.4  busybox:latest      localhost.localdomain   Shutdown  Failed 23 seconds ago  "task: non-zero exit (137)"   
l32ziu7ygoqw  demo.5     busybox:latest      centos-7                Running    Running 3 hours ago                                             

可以看到红色就是我们删掉的容器,但是后面它又马上补充了一个,保持了整个系统的稳定性。

三、wordpress部署

(一)单容器启动方式

  如何使用Swarm进行部署wordpress呢?wordpress涉及到数据库容器以及wordpress应用容易,那么这两个容器很有可能是不在一台机器的,也就是使用Swarm中两个容器是分配到不同的节点之上的。

  首先,将之前的service进行移除:

[root@centos-7 docker]# docker service rm demo
demo

1、创建overlay网络

需要将这些service部署在一个overlay网络中,所以需要有个overlay网络。所以现在manager节点上创建这个网络:

[root@centos-7 docker]# docker network create -d overlay demo
xcjljjqcw26b2xukuirgpo6au

可以查看:

[root@centos-7 docker]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
xcjljjqcw26b        demo                overlay             swarm

值得注意的是其他节点上现在并没有这个网络,那么其它节点又是怎么连上这个网络的呢?

2、启动数据库服务

[root@centos-7 docker]# docker service create --name mysql --env MYSQL_ROOT_PASSWORD=root --env MYSQL_DATABASE=wordpress --network demo 
--mount type=volume,source=mysql-data,destination=/var/lib/mysql mysql:5.7.24
eirarnex6suqa4uqzgowncigv
overall progress: 1 out of 1 tasks 
1/1: running   [==================================================>] 
verify: Service converged 

可以看看这个服务的详情以及位于哪一个节点上:

[root@centos-7 docker]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
eirarnex6suq        mysql               replicated          1/1                 mysql:5.7.24        
[root@centos-7 docker]# docker service ps mysql
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE     ERROR      PORTS
c4a4lggjmvuf        mysql.1             mysql:5.7.24        centos-7            Running             Running about a minute ago   

3、启动wordpress服务

接着在manager节点上启动wordpress服务

[root@centos-7 docker]#  docker service create --name wordpress -p 80:80 --env WORDPRESS_DB-PASSWORD=root \
 --env WORDPRESS_DB_HOST=mysql --network demo \
 --mount type=volume,source=wordpress-config,destination=/var/www/html wordpress

上述中 --mount参数将容器中的配置等一系列的文件映射出来了,是方便修改容器中配置文件,修复数据库连接不上的错误,详情查看:

https://www.cnblogs.com/shenjianping/p/12268190.html

4、测试

现在可以进行访问本机的80端口进行测试了

(二)Docker Stack部署

这种部署方式就是使用docker-compose.yml文件来进行部署应用,而上面那种方式就是每次手动单启容器。

  • 查看docker stack的命令
[root@centos-7 wordpress-stack]# docker stack --help

Usage:    docker stack [OPTIONS] COMMAND

Manage Docker stacks

Options:
      --orchestrator string   Orchestrator to use (swarm|kubernetes|all)

Commands:
  deploy      Deploy a new stack or update an existing stack
  ls          List stacks
  ps          List the tasks in the stack
  rm          Remove one or more stacks
  services    List the services in the stack

Run 'docker stack COMMAND --help' for more information on a command.

可以看到docker stack 的命令不是很多,第一个就是部署服务,一个docker-compose.yml就是一个服务,当然这个文件里面可能包含多个service。下面以实例来说明:

  • docker-compose.yml文件
version: '3'

services:

  web:
    image: wordpress
    ports:
      - 8080:80
    environment:
      WORDPRESS_DB_HOST: mysql
      WORDPRESS_DB_PASSWORD: root
    networks:
      - my-network
    depends_on:
      - mysql
    deploy:
      mode: replicated
      replicas: 3      #开启3个web服务
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
      update_config:
        parallelism: 1
        delay: 10s

  mysql:
    image: mysql:5.7.24
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: wordpress
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - my-network
    deploy:
      mode: global  #只能有一个mysql的服务
      placement:
        constraints:
          - node.role==manager #服务只能部署在manager节点上

volumes:
  mysql-data:

networks:
  my-network:
    driver: overlay   #注意这里可能服务在不同的主机上,需要使用overlay网络
  • 部署wordpress stack
[root@centos-7 wordpress-stack]# docker stack deploy wordpress --compose-file=docker-compose.yml
Creating network wordpress_my-network
Creating service wordpress_web
Creating service wordpress_mysql
  • 查看stack
[root@centos-7 wordpress-stack]# docker stack ls
NAME                SERVICES            ORCHESTRATOR
wordpress           2                   Swarm
  • 查看stack中的服务
[root@centos-7 wordpress-stack]# docker stack ps wordpress
  • 移除stack
[root@centos-7 wordpress-stack]# docker stack rm wordpress
Removing service wordpress_mysql
Removing service wordpress_web
Removing network wordpress_my-network

总结

Docker Swarm 是 Docker 官方提供的容器编排和集群管理工具,用于构建和管理多个 Docker 容器节点组成的集群。它提供集群管理、服务发现、负载均衡、滚动更新和安全等关键特性,使得用户能够轻松地部署、扩展和管理容器化应用程序,从而实现高可用性、高性能和高效率的运行环境。下一篇文章我将介绍 K8s相关的内容,希望大家关注更新!我会分享更多云原生相关的内容

月26日晚,crytek突然发文,官宣《孤岛危机4》项目正式启动。这款烧机软件终于迭代更新了!如今的4代的发售,能否还能像多年前的初代一样,引发业界的轰动与玩家议论硬件的热潮?

我依稀记得,2012年第一次玩《孤岛危机2》的时候,其画面和cg给我带来的巨大冲击,一切都那么栩栩如生,仿佛这就是画面的极致,已经再难提升。至于游戏的剧情,那实在是很次要的事情。与朋友聊天交流,都会因为自家的电脑能够带动这款游戏,而收获羡慕的目光。当时进入游戏的logo和EA的标志,也给我留下了深刻的印象,只是在这之后就没有见到了。

这只大眼睛,其实就是大名鼎鼎的cry engine(简称“CE”),由crytek开发。创立于97年的crytek,从诞生伊始就致力于游戏引擎的研发,目标十分明确:“要做出一款无缝切换室内外场景,光影和互动都十分顶级的引擎。”

在1999年的E3展会上,crytek展示了一款名叫“恐龙岛”的demo,用于展现他们新研发引擎强大的渲染能力,也借此寻求合作伙伴。凭借着其他引擎望尘莫及的远景渲染和水面反射,这款demo在当时的E3展上的表现惊艳一众产商。提供给他们展位的英伟达直接和他们签约合作,并提供技术支持。Crytek这开局可谓是顺风顺水,入行两年,就抱上英伟达的大腿了。

“恐龙岛”demo画面

在得到英伟达提供的技术和资金支持后,我们的老朋友育碧也找到了他们,表示想要将E3演示demo“恐龙岛”做成一个完整的游戏。在这款游戏中,cry engine正式登场,这款游戏也就是日后大名鼎鼎的《孤岛惊魂(farcry)》。初代《孤岛惊魂》的光影和水面效果,是名副其实的业界顶尖。在有着优秀大场景的同时,FPS中的粒子效果、枪械细节也得以兼顾。《孤岛惊魂》作为《孤岛危机》的精神前作,在遥远的2004年,理所当然地成为了一代硬件杀手。

在crytek的官网就能看到,最早的游戏就是《孤岛惊魂》

同样是在2004年,EA向crytek抛出了橄榄枝,美国的大款和法国的穷鬼你选谁?Crytek爽快干脆地加入了EA,准备干一票大的:他们会将当前所有的引擎技术投入到下一款作品中,为此他们需要开创一个崭新的IP,于是直接将《孤岛惊魂》卖给了育碧。而自己则在EA的支持下,投入到了《孤岛危机》这个全新系列的开发中。

需要注意的是,EA并非是将crytek收购,二者是合作关系(不然crytek已经倒闭了(* ̄▽ ̄)):EA为crytek提供资金支持,但要求他们的作品交由EA发行。直到今天,crytek仍然是独立工作室,不过在全球各地开分部的工作室确实也很少见。

一般的第一方游戏工作室都会考虑到游戏登陆多平台的可能性,在主机性能有限的前提下,会刻意地控制图形技术的使用,以保证不同平台的体验趋于平衡。但crytek这帮技术宅并没有这么想,他们只是想做出来一款划时代的游戏。很多的图形技术玩家们都是第一次听说:容积云、动态软光影、实时环境贴图、视差贴图、光束效果,这些名词带来超越时代画面的同时,也意味着2007年,市面上根本没有家用pc能够在特效全开的情况下流畅运行这款游戏。至于ps和xbox平台?想都别想!他们根本就没做主机版。

《孤岛危机》游戏画面

《生化奇兵》游戏画面

《光环3》游戏画面

《半条命2》游戏画面

《孤岛危机》是一款划时代的游戏,不仅有着当时最好的画面,也有着优良的物理效果,细节方面,载具有着部位伤害、叶片经过时会产生物理碰撞。这样优秀的物理互动和DICE的寒霜倒是有异曲同工之妙。但EA自家招牌的寒霜引擎直到次年的《战地:叛逆连队》中才正式亮相。

“寒霜引擎”的初登场:《战地:叛逆连队》

优秀的游戏并不意味着优秀的销量,如此高的运行门槛让众多玩家望而却步。加上当时的互联网刚刚普及,游戏的数字版还未流行,2007年成为了盗版游戏泛滥的一年,而《孤岛危机》则“荣膺”当年“盗版最多游戏”的桂冠。游戏的销量并不好,首发半个月才卖出8万套。然而是金子总会发光,在这样的环境下,凭借着自身过硬的素质以及新硬件的迭代更新,游戏的销量在三年后也达到了300万份,这些都是后话了。

2021年推出的《孤岛危机》重制版

作为crytek真正意义上的第一款游戏,《孤岛危机》无疑是成功的,虽然因为盗版问题,市场损失不小,但还是大赚一笔,更是凭着当时“最强游戏画面”的名头打响了IP、甚至公司的知名度。

在2008年到2011年这段时间里,除了将自家的cry engine升级到3.0版本、继续招牌《孤岛危机》的续作开发外,crytek还在全球各地陆陆续续开设了六家工作室。与此同时,已经有十余家上市公司在使用他们的引擎。相较于2.0,CE3.0少了很多黑科技,更注重对上一代引擎的优化。《孤岛危机2》也确实展现了他们努力的结果:只要你电脑带得动,那么从头到尾都不会卡。

2011年的《孤岛危机2》让我们看到了crytek的改变——为了兼顾大部分的pc玩家和主机平台,相较于一代,物理效果反而有所下降,游戏的过程更加线性,场景从海岛换成了纽约的钢铁森林,有了更多的COD式的大场面演出。这种取舍可以理解,毕竟是要吃饭的嘛,开了这么多工作室,最后如果还像一代那样曲高和寡,那就要喝西北风了。

这一转变十分成功,《孤岛危机2》交出的成绩十分优秀,仅仅用时3个月就达到了第一代3年的销量,当然,续作也继续蝉联了当年“盗版最多游戏”的“殊荣”。Crytek凭着这些钱将自己的分部扩张到了9个,并同时进行了3款游戏的开发。

《孤岛危机2》还推出了“限量版”,包含了一些独特的游戏道具

2013年,前文提到的三款游戏同时发售,分别是《战脸》《罗马之子》和《孤岛危机3》,款式虽多,却没有爆款。《战脸》不温不火,《罗马之子》由于预算问题,从原来的体感操作变成了QTE,而《孤岛危机3》也未达到EA的预期。游戏的场景和框架几乎没有改变,只是多了弓箭、黑客这些细枝末节的系统。放眼望去,能让人眼前一亮的,还是那超越时代的画面。但比起07年时一代给玩家的震撼,2013年的《孤岛危机3》确实没有那种打开新世界大门的感觉了。

自上而下,《战脸》《罗马之子》和《孤岛危机3》

2013年可以说是crytek的转折点。一系列的扩张和三部作品平平无奇的成绩让crytek入不敷出,在2014年就出现了拖欠员工工资的情况,之后更是陷入了裁员、关闭分部、卖版权这样的窘境,一度濒临破产的边缘。关键时期还是靠亚马逊注资拉了一把,但就在这之后,crytek也传出过拖欠员工工资的情况。如今只剩下了总部和两个分部。在褪下最强游戏画面的光环后,crytek的境遇似乎有些凄惨。当初引以为傲的引擎画面,在这些年也被re、寒霜这些后起之秀迎头赶上,crytek似乎已经逐渐“堕入凡尘”。

Cry engine曾经的优势面对后来者已经荡然无存

13年之后,crytek基本上没有什么大动作,除了在2016年的VR投资热中出了两款VR游戏,最近唯一为玩家所知的便是《猎杀:对决》,以及《孤岛危机》的新引擎重置,其实也就是换成了高p画面,玩法并没有任何的创新。

《猎杀:对决》

正因这漫长的“蛰伏期”,最近官宣的《孤岛危机4》立刻引起玩家们的关注,上一部系列新作不知不觉已经快要十年了。在画质趋同的如今,各大游戏引擎成熟。crytek已经失去了过去最大的倚仗,也不可能再像过去一样,最高画质在pc上俯瞰众生,游戏必将登陆全平台。如果要在画面上再次实现飞跃,VR也许是唯一的途径。无论如何,游戏最终还是需要依靠自身的游戏性才能撑起一片天,crytek现在需要的也许并不是程序员,而是一位优秀的游戏设计师。

由于现在不断提倡网络安全甚至已经成为一个国家的政策性要求,出台网络安全法,推出网络安全等级保护制度,可见安全的重要性。而网站作为中小型企业对外提供服务的一个入口,重要性就不容小觑,另外目前网络上出现了很多安全方面的工具,网站漏扫的门槛越来越低,随便一个开源的工具就可以对站点进行漏扫,若发现漏洞进而利用就可能导致比较重大的安全事故。所以针对中小型站点的安全保卫战就需要提上日程,增加一些措施手段保障站点的安全性,WAF就是一种比较合适的加固方案。

什么是WAF

Web应用程序防火墙,Web Application Firewall,简称WAF。是一种提供保护Web站点免受恶意攻击和数据泄露作用的产品,它通常位于Web应用程序和网络之间,监控和过滤HTTP流量,以便检测和阻止潜在的攻击。WAF主要有以下三种载体或者说方式提供服务

  • 硬件WAF,厂家提供专用的物理设备部署在网络中,对网站的流量进行过滤防护。
  • 软件WAF,以软件的形式安装在自有的服务器上面,对网站的流量进行过滤防护。
  • 云WAF,云厂商提供的服务,一般web也是基于云的方式部署的,作为云服务提供商额外提供的服务,也有是跟CDN服务结合的。

硬件WAF一般不适合中小型站点,投入成本较高,云WAF比较多跟云的场景结合现阶段也是成本比较高的选择,软件WAF的方式现在市面上有基础免费版和按需增值版供选择,比较适合中小型站点,可以选择基础免费版提高站点的安全门槛而不是在网络世界里裸奔,后续视业务的发展情况按需调整为更安全能力更强的收费版。

软件WAF简介

调研了市面上面的产品,从出品方的角度有专业公司和个人在运营的产品,主要有以下几种:

    • 南墙WAF
      • 一款工业级免费、高性能、高扩展,支持AI和语义引擎的Web应用和API安全防护产品。
      • 安装简单,提供主机板和docker(容器)安装方式,均通一键脚本方式。
    • 雷池WAF
      • 基于智能语义分析的下一代WAF应用防火墙。
      • 安装简单,提供一键安装脚本。
    • 宝塔WAF
      • 超高自由度的自定义拦截规则和可灵活配置各种限制访问,有效防CC攻击、防恶意采集、防刷接口等常见攻击和黑客渗透测试行为,为您的业务网站保驾护航。
      • 安装简单,提供一键安装脚本。
    • aihttps
      • 首款基于机器学习、自主对抗未知攻击的高性能WEB应用防火墙( SSL WAF),源码完整并且兼容ModSecurity正则规则。
      • 安装步骤简单,需按官网文档要求,暂未提供脚本。
    • httpwaf
      • httpwaf是一款永久免费的web应用防火墙,重点对抗未知攻击。
      • 安装方式直接下载二进制文件运行(对系统环境有要求)

安装实践

主要对前三种软件南墙、雷池、宝塔WAF进行实际安装体验,整个体验过程主要基于事前、事中、事后三个逻辑环节进行。

  • 安装前准备阶段

安装前相关文档获取,三款软件官网均具备完善的文档介绍,产品均在持续迭代更新版本,还提供了沟通交流反馈的渠道如微信群,宝塔和雷池还提供了demo站提前体验。

    • 宝塔waf,文档地址,https://www.kancloud.cn/kern123/cloudwaf/3198565 ,演示demo,https://btwaf-demo.bt.cn:8379/c0edce7a,安装版本v4.6
    • 雷池waf,文档地址,https://docs.waf-ce.chaitin.cn/,演示demo,https://demo.waf-ce.chaitin.cn:9443/dashboard,最新版本,[6.2.0] - 2024-06-27
    • 南墙waf,文档地址,https://waf.uusec.com/#/?id=main,安装版本,4.5.0
  • 实际安装

三款软件均提供一键安装脚本,都是通过容器的方式运行,需要具备容器运行环境和80、443端口未被其他程序占用。安装简单官方文档介绍翔实就不做过多介绍。

  • 事后安装体验

从后台功能点的角度

相同点:三款软件均提供了站点整体的运行情况如访问量、拦截量、QPS等运行数据和针对站点进行防护策略的配置;都有免费版和其他收费版本的差异。免费版的差异点:

        • 宝塔WAF提供了端口转发和网站加速,满足一些端口转发和站点静态资源加速的需求,另外目前公测阶段免费版还提供了攻击大屏的功能,较直观的展示目前的的攻击拦截情况。还有个不错的功能就是支持直接禁止境外ip访问。
        • 南墙WAF,提供API既是可以自行编写防护规则。

从实际防护效果角度

1、简单手动模拟构建异常攻击请求,均能被拦截,如下面这些请求,

模拟 SQL 注入攻击: https://站点地址/?id=1+and+1=2+union+select+1

模拟 XSS 攻击: https://站点地址/?id=

模拟路径穿越攻击: https://站点地址/?id=../../../../etc/passwd

模拟代码注入攻击: https://站点地址/?id=phpinfo();system('id')

2、利用BlazeHTTP工具进行评测

针对同一个站点,依次经过雷池、宝塔、南墙WAF进行防护后,利用BlazeHTTP工具进行扫描的结果如下,从结果上来看雷池准确率最高,宝塔最低。

总结

    • 三款软件均有在持续迭代更新,使用过程若有bug或者问题应该都会有渠道反馈解决。从背景上来说雷池和南墙出品方都是专业的安全公司相对宝塔来说公司基因上面会更有优势。
    • 若要说些优缺点的话,从简要体验结果来看
      • 南墙,优点,后端web支撑负载均衡,支持自定义API这个有点技术门槛就是了。缺点,修改密码的时候动态口令一定需要开启,安卓用户使用 FreeOTP 不好安装。
      • 宝塔,优点,支持端口转发,支持一键禁用境外ip访问,可以支持查看访问日志。
      • 雷池,优点,防护效果最好,运行环境可以支持80、443已被占用的情形,功能强但是不少都是需要收费版才支持。