2015年7月

简介

Ubuntu 基于 Debian 发布版和 GNOME 桌面环境,与 Debian 的不同在于它每6个月会发布一个新版本,每2年发布一个 LTS 长期支持版本。 普通的桌面版可以获得发布后 18 个月内的支持,标为 LTS(长期支持)的桌面版可以获得更长时间的支持。自 Ubuntu 12.04 LTS 开始,桌面版和服务器版均可获得为期5年的技术支持。

Ubuntu 的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。Ubuntu 现今具有庞大的社区力量,用户可以方便地从社区获得帮助。

Ubuntu 在 Ubuntu 12.04 的发布页面上使用了“友帮拓”一词作为其官方的中文译名。之前曾一些中文用户使用班图、乌班图、乌斑兔、乌帮图、笨兔等作为非官方译名。

Ubuntu 的 Ubuntu Touch 项目于 2011 年启动,并在 2013 年推出了新产品 Ubuntu Phone OS 和 Ubuntu Tablet,意图统一桌面设备和移动设备的屏幕。但是在2017年4月,Ubuntu 的创立者 Mark Shuttleworth 宣布该项目将会终止。

下载

16.04.2 LTS

桌面版本可以从此下载:http://www.ubuntu.com/download/desktop

  • Intel & AMD/ 兼容 PC 64 位 点此下载
    (MD5: 1400884cec8e40a1a876b2678f81494b)
  • Intel & AMD/ 兼容 PC 32 位 点此下载
    (MD5: e14b5f2177b00dac3edc94b0e806f857)

服务器版本可以从此下载:http://www.ubuntu.com/download/server

  • Intel & AMD/ 兼容 PC 64 位 点此下载
    (MD5: 2bce60d18248df9980612619ff0b34e6)
  • Intel & AMD/ 兼容 PC 32 位 点此下载
    (MD5: c32ba78bf6bdae6627b1e717d33eb7ae)

17.04

桌面版本可以从此下载:http://www.ubuntu.com/download/desktop

  • Intel & AMD/ 兼容 PC 64 位 点此下载
    (MD5: 18cc54af55d7ca931bbb8588e8d9c1bd)
  • Intel & AMD/ 兼容 PC 32 位 点此下载
    (MD5: eb6c4ea889f5ab44f77c9d1cde6a8818)

服务器版本可以从此下载:http://www.ubuntu.com/download/server

  • Intel & AMD/ 兼容 PC 64 位 点此下载
    (MD5: 4672ce371fb3c1170a9e71bc4b2810b9)
  • Intel & AMD/ 兼容 PC 32 位 点此下载
    (MD5: 8e82de7efa4b1bf159b4be325e952eb1)

发行

软件包

Ubuntu 的包管理系统与 Debian 的类似,所有软件分为 main、restricted、universe 和 multiverse 等 4 类。

main 即“基本”组件,其中只包含符合 Ubuntu 的许可证要求并可以从 Ubuntu 团队中获得支持的软件,致力于满足日常使用,位于这个组件中的软件可以确保得到技术支持和及时的安全更新。此组件内的软件是必须符合 Ubuntu版权要求 Ubuntu license requirements 的自由软件,而 Ubuntu 版权要求大致上与 Debian自由软件指导纲要 Debian Free Software Guidelines 相同。

restricted 即“受限”组件,其中包含了非常重要的,但并不具有合适的自由许可证的软件,例如只能以二进制形式获得的显卡驱动程序。由于 Ubuntu 开发者无法获得相应的源代码,restricted 组件能够获得的支持与main组件相比是非常有限的。

universe 即“社区维护”组件,其中包含的软件种类繁多,均为自由软件,但都不为 Ubuntu 团队所支持。

multiverse 即“非自由”组件,其中包括了不符合自由软件要求而且不被 Ubuntu 团队支持的软件包,通常为商业公司编写的软件。

版本更新

Ubuntu 的新版一旦发布,该版本的包库就会被冻结,此后只对该包库提供安全性更新。

安装软件时可以通过运行 apt-get 命令,或使用图形接口的 Synaptic 工具或“软件中心”来完成。与 Windows 不同,Ubuntu 的用户通常不必四处搜索、逐一下载或购买相应的安装程序。Ubuntu 能够使用的软件大多存放在被称为“软件源”的服务器中,用户只要运行相应的 apt-get 指令(或使用 Synaptic 工具进行相关操作),系统就会自动查找、下载和安装软件了。

虽然 Ubuntu 主要采用自由软件,但也接纳部分可以自由散发的私有软件,并将它们放在 multiverse 组件中。Ubuntu 还为第三方软件设立了认证程序。

Ubuntu 每6个月发布一个新版,每个版本都有代号和版本号。版本号源自发布日期,例如第一个版本,4.10,代表是在2004 年 10 月发布的。

Ubuntu 官方认可的分支系统众多,其主要差异在于使用的桌面系统不同,而内部的默认软件也会有所歧异。此外尚有许多基于 Ubuntu 的非官方派生版本,还有基于 Ubuntu 开发的发布版。

所谓的 Ubuntu 系统,指的是默认的 Ubuntu 版本,采用母公司研发的Unity界面。11.04版以及之前支持Gnome桌面环境。

正式派生版本

正式派生版本统一使用和Ubuntu一样的软件包 目前Ubuntu正式支持的派生版本包括:

  • Kubuntu:采用KDE作为默认的桌面环境,以满足偏爱KDE的Ubuntu用户。
  • Edubuntu:为教育量身定做,包含很多教育软件,可以帮助教师方便的搭建网络学习环境,管理电子教室。采用Unity界面。
  • Xubuntu:属于轻量级发行版,使用Xfce4作为默认的桌面环境。
  • Lubuntu:使用LXDE桌面环境的轻量级发行版,从10.04版本开始正式发行。
  • Ubuntu Server Edition:自Ubuntu 5.10版(Breezy Badger)起,与桌面版同步发行,可当作多种软件服务器,如电子邮件服务器、基于LAMP的Web网站服务器、DNS服务器、文件服务器与数据库服务器等。服务器版通常不预装任何桌面环境,与桌面版本相比,占用空间少,运行时对硬件要求较低,最少只需要500MB硬盘空间和64MB内存。
  • Ubuntu Studio:适合于音频,视频和图像设计的版本。使用Xfce4作为默认的桌面环境。
  • Mythbuntu:一套基于Ubuntu的面向媒体中心电脑的发行版,Mythbuntu=MythTV+Ubuntu,MythTV是其中关键的软件包,用于实现媒体中心等功能。它没有包含一些不必要的程序,如OpenOffice, Evolution和完全安装的Gnome。
  • Ubuntu Kylin(优麒麟):语言的默认设置为中文,为中国用户专门定制。
  • Ubuntu GNOME:使用 GNOME 桌面环境的派生版。
  • Ubuntu Budgie : 使用 Budgie 桌面环境的派生版
  • Ubuntu for Android:在 Android 手机上运行的 Ubuntu。
  • Ubuntu Touch:基于 Ubuntu 和 Android 的手机/平板操作系统。
  • Ubuntu TV:用于智能电视的版本。

当前版本

当前最新版本是 17.10 ,代号是 Zesty Zapus ,发布于 2017-04-13。

历史

Ubuntu每6个月发布一个新版,每个版本都有代号和版本号。版本号源自发布日期,例如第一个版本,4.10,代表是在2004年10月发布的。下表列出了以前和计划中的发布:

版本开发代号发布日期最近更新支持情况内核版本
桌面版服务器版
4.10Warty Warthog2004-10-20 2006-04-302.6.8
5.04Hoary Hedgehog2005-04-08 2006-10-312.6.10
5.10Breezy Badger2005-10-13 2007-04-132.6.12
6.06 LTSDapper Drake2006-06-016.06.2发布于2008年1月21日2009-07-142011-06-012.6.15
6.10Edgy Eft2006-10-26 2008-04-252.6.17
7.04Feisty Fawn2007-04-19 2008-10-192.6.20
7.10Gutsy Gibbon2007-10-18 2009-04-182.6.22
8.04 LTSHardy Heron2008-04-248.04.4发布于2010年1月29日2011-05-122013-05-092.6.24
8.10Intrepid Ibex2008-10-30 2010-04-302.6.27
9.04Jaunty Jackalope2009-04-23 2010-10-232.6.28
9.10Karmic Koala2009-10-29 2011-04-302.6.31
10.04 LTSLucid Lynx2010-04-2910.04.4发布于2012年2月16日2013-05-092015-042.6.32
10.10Maverick Meerkat2010-10-10 2012-04-102.6.35
11.04Natty Narwhal2011-04-28 2012-10-282.6.38
11.10Oneiric Ocelot2011-10-13 2013-05-093.0
12.04 LTSPrecise Pangolin2012-04-2612.04.4发布于2014年2月6日2017-043.2
12.10Quantal Quetzal2012-10-18 2014-05-163.5
13.04Raring Ringtail2013-04-25 2014-01-273.8
13.10Saucy Salamander2013-10-17 2014-073.11
14.04 LTSTrusty Tahr2014-04-17 2019-043.13
14.10Utopic Unicorn2014-10-23 2015-073.16
15.04Vivid Vervet2015-04-23 2016-013.19
15.10Wily Werewolf2015-10-22 2016-074.2
16.04Xenial Xerus2016-04-2116.04.2发布于2017年2月17日2021-044.4
16.10Yakkety Yak2016-10-13 2017-074.8
17.04Zesty Zapus2017-04-13 2018-014.10

长期支持版本

长期支持版本(LTS),更新维护的时间比较长,约2年会推出一个LTS版本。最新的长期支持版本为 2016 年 4 月21 日推出的 16.04 LTS。

版本代号命名

Ubuntu 版本的命名规则是根据正式版发布的年月命名,Ubuntu 8.10 也就意味着 2008年10月发布的 Ubuntu,研发人员与用户可从版本号码就知道正式发布的时间。Ubuntu 各版本的代号固定是形容词加上动物名称,而且这2个词的英文首字母一定是相同的。从 Ubuntu 6.06 开始,两个词的首字母按照英文字母表的排列顺序取用。

  • Ubuntu 4.10 - Warty Warthog(多疣的疣猪)
  • Ubuntu 5.04 - Hoary Hedgehog(白发的刺猬)
  • Ubuntu 5.10 - Breezy Badger(活泼的獾)
  • Ubuntu 6.06 - Dapper Drake(整洁的公鸭)
  • Ubuntu 6.10 - Edgy Eft(尖利的小蜥蜴)
  • Ubuntu 7.04 - Feisty Fawn(烦躁不安的鹿)
  • Ubuntu 7.10 - Gutsy Gibbon(胆大的长臂猿)
  • Ubuntu 8.04 - Hardy Heron(坚强的鹭)
  • Ubuntu 8.10 - Intrepid Ibex(无畏的羱羊)
  • Ubuntu 9.04 - Jaunty Jackalope(活泼的鹿角兔)
  • Ubuntu 9.10 - Karmic Koala(幸运的树袋熊)
  • Ubuntu 10.04 - Lucid Lynx(清醒的猞猁)
  • Ubuntu 10.10 - Maverick Meerkat(标新立异的的狐獴)
  • Ubuntu 11.04 - Natty Narwhal(敏捷的独角鲸)
  • Ubuntu 11.10 - Oneiric Ocelot(有梦的虎猫)
  • Ubuntu 12.04 - Precise Pangolin(精准的穿山甲)
  • Ubuntu 12.10 - Quantal Quetzal(量子的格查尔鸟)
  • Ubuntu 13.04 - Raring Ringtail(卯足了劲的环尾猫熊)
  • Ubuntu 13.10 - Saucy Salamander(活泼的蝾螈)
  • Ubuntu 14.04 - Trusty Tahr(可靠的塔尔羊)
  • Ubuntu 14.10 - Utopic Unicorn(乌托邦的独角兽)
  • Ubuntu 15.04 - Vivid Vervet(活泼的长尾黑颚猴)
  • Ubuntu 15.10 - Wily Werewolf(狡诈的狼人)
  • Ubuntu 16.04 - Xenial Xerus(好客的非洲地松鼠)
  • Ubuntu 16.10 - Yakkety Yak(小牦牛)
  • Ubuntu 17.04 - Zesty Zapus(北美跳鼠)

主要程序的版本

核心桌面
版本Linux内核Xorg /X.OrgWaylandPythonPerlGNOMEFirefoxOpenOfficeLibreOfficeGIMPPidginPiTiVi
4.102.6.8(XFree86 4.3)不适用2.3.45.8.42.80.91.1.2不适用2.0.21.0.0不适用
5.042.6.10(6.8.2)不适用2.4.15.8.42.101.0.21.1.3不适用2.2.21.1.4不适用
5.102.6.12(6.8.2)不适用2.4.25.8.72.121.0.72.0不适用2.2.81.5.0不适用
6.062.6.151.0.2 / 7.0.0不适用2.4.25.8.72.141.5.32.0.2不适用2.2.111.5.00.10.0
6.102.6.171.1.1 / 7.1.1不适用2.4.35.8.82.162.0.02.0.4不适用2.2.132.0b30.10.1
7.042.6.201.2.0 / 7.2不适用2.5.1rc15.8.82.182.0.32.2.0不适用2.2.132.0b60.10.2
7.102.6.221.3.0 / 7.2不适用2.5.15.8.82.202.0.62.3.0不适用2.4.0rc32.2.10.10.3
8.042.6.241.4.1 / 7.3不适用2.5.25.8.82.223.0b52.4.0不适用2.4.52.4.10.11.1
8.102.6.271.5.2 / 7.4不适用2.5.25.10.02.243.0.32.4.1不适用2.6.12.5.20.11.1
9.042.6.281.6.0 / 7.4不适用2.6.25.10.02.263.0.83.0.1不适用2.6.62.5.50.11.3
9.102.6.311.6.4 / 7.4不适用2.6.4rc15.10.02.283.5.33.1.1不适用2.6.72.6.20.13.3
10.042.6.32 (DRM from 2.6.33)1.7.6 / 7.5不适用2.6.55.10.12.303.6.33.2.0不适用2.6.82.6.60.13.4
10.102.6.351.9.0 / 7.5不适用2.6.65.10.12.323.6.103.2.1不适用2.6.102.7.30.13.5
11.042.6.381.10.1 / 7.60.12.7.15.10.12.32.14.0不适用3.3.22.6.112.7.110.13.5
11.103.01.10.4 / 7.60.1.02.7.25.12.43.27.0不适用3.4.32.6.112.10.00.15
12.043.2.141.11.4 / 7.60.852.7.35.14.23.411.0不适用3.5.12.6.122.10.10.15
12.103.5.51.13.0 / 7.70.95.02.7.35.14.23.616.0.1不适用3.6.2rc22.8.22.10.60.15
13.043.8.81.13.30.95.03.35.14.23.620.0不适用4.02.8.42.10.70.15.2
13.103.11.01.14.31.1.02.7.55.14.23.824.0不适用4.1.2rc32.8.62.10.70.15.2

注:部分资料来自维基百科。

经常有新接触 Linux 的同学问,“Linux 从哪里下载啊?”这种问题,对于熟手来说要么不屑一提,要么就引来了各种 Linux 发行版之争,让初学者无所适从。

其实,对于新接触 Linux 的人来说,很多人都不知道 “Linux” 原来不是一个!而是有林林总总上千种发行版,甚至你乐意的话,都可以制作发行自己的发行版。而各种不同的发行版也各有特色,还层出不穷的推出新版本。这简直让初学者如置身森林,茫然不知所措~

所以,这里我整理了一份最新、最热的 Linux 发行版的下载链接,可以让初学者能够快速领略到 Linux 的风采。

简单的来说,Linux 是以 Linux 内核 Kernel 为基础,集成了各种开源软件、和/或商业软件的一个操作系统。这个将各个组件整合成一个完整的操作系统过程就称之为“制作发行版”,因此,不同的组织/公司和个人就可以制作各具特色的、可以安装或运行的操作系统的软件包——通常是 ISO 镜像——可以刻录到光盘、写入到 USB 启动盘、或者直接通过 ISO 文件来安装/运行。

一般来说,初接触 Linux,从桌面版开始比较好,几个主流的发行版,都可以尝试一下,如 Ubuntu、Debian、Fedora、CentOS、openSUSE 等;而 Linux 的一个重要领域——服务器领域——可以在你对 Linux 有了初步认识之后,再来学习和了解。当然,往往一个 Linux 发行版会同时发布桌面版和服务器版,其使用习惯也相近,所以熟悉桌面版之后,对使用和维护其相应的服务器版本会更容易一些。

好了,言归正传,您可以从下面挑个顺眼的下载安装试试了,建议你各种都体验下,最后你会选定一个适合你的!

Ubuntu

是当前最流行的 Linux 发行版之一,是 Debian Linux 的主要衍生版本,用户众多,以桌面系统所著称,适于刚刚接触 Linux 的初学者。

对于新手,安装 Ubuntu 可以参考《新手指南: 手把手教你安装 Ubuntu 和 Fedora》。

16.04.2 LTS

桌面版本可以从此下载:http://www.ubuntu.com/download/desktop

  • Intel & AMD/ 兼容 PC 64 位 点此下载
    (MD5: 1400884cec8e40a1a876b2678f81494b)
  • Intel & AMD/ 兼容 PC 32 位 点此下载
    (MD5: e14b5f2177b00dac3edc94b0e806f857)

服务器版本可以从此下载:http://www.ubuntu.com/download/server

  • Intel & AMD/ 兼容 PC 64 位 点此下载
    (MD5: 2bce60d18248df9980612619ff0b34e6)
  • Intel & AMD/ 兼容 PC 32 位 点此下载
    (MD5: c32ba78bf6bdae6627b1e717d33eb7ae)

17.04

桌面版本可以从此下载:http://www.ubuntu.com/download/desktop

  • Intel & AMD/ 兼容 PC 64 位 点此下载
    (MD5: 18cc54af55d7ca931bbb8588e8d9c1bd)
  • Intel & AMD/ 兼容 PC 32 位 点此下载
    (MD5: eb6c4ea889f5ab44f77c9d1cde6a8818)

服务器版本可以从此下载:http://www.ubuntu.com/download/server

  • Intel & AMD/ 兼容 PC 64 位 点此下载
    (MD5: 4672ce371fb3c1170a9e71bc4b2810b9)
  • Intel & AMD/ 兼容 PC 32 位 点此下载
    (MD5: 8e82de7efa4b1bf159b4be325e952eb1)

Fedora

在 Red Hat Linux 终止发布后,由 RedHat 推出的替代品,在新技术方面跟进较快。是 RedHat 系列的典型代表,和 CentOS / RHEL 源出一脉,如果将来使用 CentOS 作为服务器,使用 Fedora 作为个人桌面使用比较习惯。

对于新手,安装 Fedora 可以参考《新手指南: 手把手教你安装 Ubuntu 和 Fedora》。

Fedora 25 Workstation Live

  • Intel & AMD/ 兼容 PC 32,适用于 32-bit 位 PC 点此下载
  • Intel & AMD/ 兼容 PC 64,适用于 64-bit 位 PC 点此下载

Fedora 25 Server

  • Intel & AMD/ 兼容 PC 32 位,适用于 32-bit 位 PC 点此下载
  • Intel & AMD/ 兼容 PC 64 位,适用于 64-bit 位 PC 点此下载

Linux Mint

基于 Ubuntu 的一个衍生版,以高效易用著称。

Cinnamon 桌面

  • Intel & AMD/ 兼容 PC 32 位 1.4GB ISO 镜像,适用于 32-bit 位 PC 点此下载
    (MD5: 6e7f7e03500747c6c3bfece2c9c8394f)
  • Intel & AMD/ 兼容 PC 64 位 1.5GB ISO 镜像,适用于 64-bit 位 PC 点此下载
    (MD5: e71a2aad8b58605e906dbea444dc4983)

MATE 桌面

  • Intel & AMD/ 兼容 PC 32 位 1.4GB ISO 镜像,适用于 32-bit 位 PC 点此下载
    (MD5: ad46900208e69a952b3c4e1bc7f941e5)
  • Intel & AMD/ 兼容 PC 64 位 1.6GB ISO 镜像,适用于 64-bit 位 PC 点此下载
    (MD5: d3c0ef9d0c0c93ab7109fa2ef1db0c28)

Deepin

国内发展最好的 Linux 发行版,主要关注在桌面使用方面,在外观、易用性、本土化应用方面值得称道。

  • Intel & AMD/ 兼容 PC 32 位 4.4GB ISO 镜像,适用于 32-bit 位 PC 点此下载
    (MD5: e9b6145ba9c0d21632936361dbe74a18)
  • Intel & AMD/ 兼容 PC 64 位 4.3GB ISO 镜像,适用于 64-bit 位 PC 点此下载
    (MD5: 036dda2007b0bf325b97ab3e0fe4a85a)

openSUSE

Novell 所开发的 Linux 桌面发行版,继承于 Slackware,有很大技术创新,如 YaST。其企业版 SLES 和 RHEL/CentOS 、Ubuntu 共同占据了 Linux 服务器市场的较大份额。

DVD ISO

  • Intel & AMD/ 兼容 PC 32 位 4.7GB ISO 镜像,适用于 32-bit 位 PC 点此下载
    (MD5: 43869f9b9b944adc1b210649d3730980)
  • Intel & AMD/ 兼容 PC 64 位 4.7GB ISO 镜像,适用于 64-bit 位 PC 点此下载
    (MD5: 350b8cb014a4e342cc9a7cc9df891b99)

CentOS 7

RedHat 的 Linux 企业版 RHEL 的社区重新打包版本,与 RHEL 相比,只是缺少 RedHat 的商业支持而已。主要用于服务器方面。CentOS 7 采用了一些新的技术,因此和 CentOS 6 有较大差异。

DVD ISO

  • Intel & AMD/ 兼容 PC 64 位 4GB ISO 镜像,适用于 64-bit 位 PC ,点此下载(SHA256: c455ee948e872ad2194bdddd39045b83634e8613249182b88f549bb2319d97eb)

Everything ISO

  • Intel & AMD/ 兼容 PC 64 位 8GB ISO 镜像,适用于 64-bit 位 PC ,点此下载
    (SHA256: af4969ebbdc479d330de97c5bfbb37eedc64c369f009cb15a97f9553ba441c88)

CentOS 6

由于 CentOS 7 采用了一系列 systemd 相关的技术,因此还有相当多的产品环境的 Linux 服务器依旧使用 CentOS 6。

  • Intel & AMD/ 兼容 PC 64 位 ISO 镜像,适用于 64-bit 位 PC ,DVD 1DVD 2
    (SHA256:1dda55622614a8b43b448a72f87d6cb7f79de1eff49ee8c5881a7d9db28d4e35 ,0aba869427b4ce04e100d72744daf7fea1f7be2e4be56b658095bd9e99e04e6d)
  • Intel & AMD/ 兼容 PC 32 位 ISO 镜像,适用于 32-bit 位 PC ,DVD 1DVD 2
    (MD5:720d185fdf063383a4471657076b72fc162d3c3c3bca2e5e5ae13a25b3046519 ,0c1a498a469214f276b4390a9ac2111fe8eb89084f7921d2eced659ada09e1a9)

LFS

Linux From Scratch,简称 LFS,不同于其它的 Linux 发行版,它是一种给使用者指导建议,由使用者自行从头开始自己构建的发行版。

Systemd 版本(简体中文翻译版本):

LCTT 对 LFS 7.7 systemd 版本进行了翻译,并且 LFS 官方网站收录了相应链接:

简介

Deepin,原名Hiweed Linux及Linux Deepin,于2014年4月改名Deepin。它是一个基于 DEB 包管理的一个独立操作系统。Deepin 在中国大陆区域常被称为“深度 Linux”。

Deepin的前身是Hiweed Linux项目,Hiweed Linux项目曾经因为一些原因短暂的暂停开发,在重启Hiweed Linux项目的时候深度社区(Deepin.org)与Hiweed Linux项目宣布合作,同时宣布Hiweed Linux更名为Linux Deepin,成为深度社区下的一个子模块,后来不断发展而从深度社区独立出来,成为今天的项目。

Deepin团队基于HTML5技术开发了的全新深度桌面环境,以及音乐播放器,视频播放器,软件中心等一系列特色软件。

官方网站: http://www.linuxdeepin.com/

下载

  • Intel & AMD/ 兼容 PC 32 位 4.4GB ISO 镜像,适用于 32-bit 位 PC 点此下载 (MD5: e9b6145ba9c0d21632936361dbe74a18)
  • Intel & AMD/ 兼容 PC 64 位 4.3GB ISO 镜像,适用于 64-bit 位 PC 点此下载 (MD5: 036dda2007b0bf325b97ab3e0fe4a85a)

发行

Deepin 新版本发布周期由原本一年两次(6 与 12 月)改为一年一次。

如果有相关开发和测试工作尚未完成,保证质量起见,则往往延迟新版本的发布日期。在每一个新版本发布之后的 2~3 个月之内,也会发布一个小版本。

当前版本

桌面

新版桌面保留了原有桌面的各种人性化功能的同时,还在桌面右键中新增了”热区设置“功能,从此用户可快速直观的修改热区。新版Dock将通知区合二为一,位置改为屏幕下方居中,新版Dock更为精致实用。

启动器

新版启动器新增了收藏界面,方便用户快速打开常用程序。同时在启动器右键增加“卸载软件 ”功能,从此用户卸载软件更为简便。

还为启动器新增中文拼音搜索,中文用户搜索软件更为方便。

控制中心

深度桌面环境2.0中的系统设置现已更名为“控制中心”。

全新的控制中心使用了更为清晰明了的分类方式,并且针对广大用户的意见进行修改。该版本开始提供强大的的主题管理、新增Grub管理器管理、增强了多屏显示功能、改善网络功能。

登录管理器

登录管理器依然基于Lightdm开发,采用了最新的HTML5技术,登录管理器默认背景以动态星空动画,新版登录管理器还支持用户在锁屏状态下管理后台播放的媒体。

深度主题2.0

设计师团队为深度桌面环境2.0设计了全新的深度主题。深度主题黑色为主色调,坚持简洁和拟物为风格,让深度桌面环境2.0更为眩目多彩!

深度安装器

安装器中文该版本开始,Deepin系统默认搭载Deepin团队开发的深度安装器,用户只需要简单的设置用户信息和选择安装位置,即可快速完成Deepin 2014的安装。并且深度安装器支持传统BIOS和UEFI。

注意:Deepin 2014 已经去除DeepinWin(Wubi)安装模式。

历史

Deepin Desktop Environment 2.0È

版本发布日期备注
9.122009年12月30日更名为 Linux Deepin 后首次发布
10.062010年6月
10.122010年12月31日
11.062011年7月4日引入深度软件中心
11.122011年12月30日正式改用 Gnome-Shell 作为默认界面
11.12.12012年2月29日修正11.12的错误,新增加3D切换插件等功能
12.062012年7月17日引入深度音乐与深度影音
12.122013年6月19日由于引入新桌面工作量大,原订于2012年发布却历经多次延期
12.12.12013年8月7日修正恼人的网络问题及速度提升
20132013年11月28日12.12系列版本,正式更改发布周期为一年一版,同时携带了深度游戏中心
20142014年7月6日Deepin Desktop Environment 2.0
2014.12014年08月28日
2014.22014年12月31日
2014.32015年4月28日

截图

注:部分内容来自维基百科

回首我使用 Windows 的那些日子,CCleaner 是我用来释放空间、删除垃圾文件和加速 Windows 的最喜爱的工具。我知道,当从 Windows 切换到 Linux 时,我并不是唯一期望 CCleaner 拥有 Linux 版本的人。假如你正在寻找 Linux 下 CCleaner 的替代品,我将在下面列举 4 个这样的应用,它们可以用来清理 Ubuntu 或基于 Ubuntu 的 Linux 发行版本。但在我们看这个清单之前,先让我们考虑一下 Linux 是否需要系统清理工具这个问题。

Linux 需要像 CCleaner 那样的系统清理工具吗?

为了得到答案,让我们看看 CCleaner 做了什么。正如 How-To Geek 的这篇文章中所提到的那样:

CCleaner 有两个主要的功能。一是:它扫描并删除无用的文件,释放磁盘空间。二是:它擦除隐私的数据,例如你的浏览记录和在各种软件中最近打开的文件列表。

所以,概括起来,它在系统范围内清理在你的浏览器或媒体播放器中的临时文件。你或许知道 Windows 有在系统中保存垃圾文件的喜好,那 Linux 呢?它是如何处理临时文件的呢?

与 Windows 不同, Linux 自动地清理所有的临时文件(在 /tmp 中存储)。在 Linux 中没有注册表,这进一步减轻了头痛。在最坏情况下,你可能会有一些损坏的不再需要的软件包,以及丢失一些网络浏览历史记录, cookies ,缓存等。

这意味着 Linux 不必需要系统清理工具了吗?

  • 假如你可以运行某些命令来清理偶尔使用的软件包,手动删除浏览历史记录等,那么答案是:不需要;
  • 假如你不想不断地从一个地方跳到另一个地方来运行命令,并想用一个工具来删除所有可通过一次或多次点击所选择的东西,那么答案是:需要。

假如你的答案是“需要”,就让我们继续看看一些类似于 CCleaner 的工具,用它们清理你的 Ubuntu 系统。

Ubuntu 下 CCleaner 的替代品

请注意,我使用的系统是 Ubuntu,因为下面讨论的一些工具只存在于基于 Ubuntu 的 Linux 发行版本中,而另外一些在所有的 Linux 发行版本中都可使用。

1. BleachBit

BleachBit 针对 Linux 的系统清理工具

BleachBit 是一个跨平台的应用程序,在 Windows 和 Linux 平台下都可使用。它有一个很长的支持清理的程序的列表,这样可以让你选择性的清理缓存,cookies 和日志文件。让我们快速浏览它的特点:

  • 简洁的图形界面确认框,你可以预览或删除
  • 支持多平台: Linux 和 Windows
  • 免费且开源
  • 粉碎文件以隐藏它们的内容并防止数据恢复
  • 重写空闲的磁盘空间来隐藏先前删除的文件内容
  • 也拥有命令行界面

默认情况下,在 Ubuntu 14.04 and 15.04 中都可以获取到 BleachBit,你可以在终端中使用下面的命令来安装:

sudo apt-get install bleachbit

对于所有主流的 Linux 发行版本, BleachBit 提供有二进制程序,你可以从下面的链接中下载到 BleachBit:

2. Sweeper

Sweeper 针对 Ubuntu 的系统清理工具

Sweeper 是一个系统清理工具,它是KDE SC utilities 模块的一部分。它的主要特点有:

  • 移除与网络相关的痕迹: cookies, 历史,缓存等
  • 移除图形缩略图缓存
  • 清理应用和文件的历史记录

默认情况下,Sweeper 在 Ubuntu 的软件仓库中可以得到。可以在终端中使用下面的命令来安装 Sweeper:

sudo apt-get install sweeper

3. Ubuntu Tweak

清理 Ubuntu 系统的 Ubuntu Tweak 工具

正如它的名称所说的那样,Ubuntu Tweak 是一个调整工具,而不仅仅是一个清理应用。除了调整诸如 compiz 设置,面板的配置,开机启动程序的控制,电源管理等,Ubuntu Tweak 还提供一个清理选项,它可以让你:

  • 清理浏览器缓存
  • 清理 Ubuntu 软件中心缓存
  • 清理缩略图缓存
  • 清理 apt 仓库缓存
  • 清理旧的内核文件
  • 清理软件包配置

你可以从下面的链接中得到 Ubuntu Tweak 的 .deb 安装文件:

4. GCleaner (beta)

GCleaner 类似 CCleaner 的工具

作为 elementary OS Freya 的第三方应用, GCleaner 旨在成为 GNU 世界的 CCleaner,其界面与 CCleaner 非常相似。它的一些主要特点有:

  • 清理浏览器历史记录
  • 清理应用缓存
  • 清理软件包及其配置
  • 清理最近使用的文件历史记录
  • 清空垃圾箱

在书写本文时, GCleaner 仍处于开发阶段,你可以查看这个项目的网站,并得到源代码来编译和使用 GCleaner。

你的选择呢?

我已经向你列举了一些可能选项,我让你选择决定使用哪个工具来清理 Ubuntu 14.04。但我可以肯定的是,若你之前一直在寻找一个类似 CCleaner 的应用,以上列举的 4 个工具之一成为了你最后的选择。


via: http://itsfoss.com/ccleaner-alternatives-ubuntu-linux/

作者:Abhishek 译者:FSSlc 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

我们一直以常规的方式完成一个任务,直到我们知道有更好的处理方法。作为 Linux 技巧和绝招系列 的后续,我会在这里介绍能在各个方面给你帮助的 4 个小技巧。开始吧!

有用的 Linux 小技巧

4 个有用的 Linux 小技巧

1. 假设你要创建一个类似于下面很长的/复杂的目录树。实现这最有效的方法是什么呢?

类似下面要实现的目录树结构。

$ cd /home/$USER/Desktop
$ mkdir tecmint
$ mkdir tecmint/etc
$ mkdir tecmint/lib
$ mkdir tecmint/usr
$ mkdir tecmint/bin
$ mkdir tecmint/tmp
$ mkdir tecmint/opt
$ mkdir tecmint/var
$ mkdir tecmint/etc/x1
$ mkdir tecmint/usr/x2
$ mkdir tecmint/usr/x3
$ mkdir tecmint/tmp/Y1
$ mkdir tecmint/tmp/Y2
$ mkdir tecmint/tmp/Y3
$ mkdir tecmint/tmp/Y3/z

上述情况可以简单地通过运行下面一行命令来实现。

$ mkdir -p /home/$USER/Desktop/tecmint/{etc/x1,lib,usr/{x2,x3},bin,tmp/{Y1,Y2,Y3/z},opt,var}

你可以用 tree 命令验证。如果没有安装你可以使用 apt 或 yum 安装 ‘tree’ 软件包。

$ tree tecmint

检查目录结构

检查目录结构

我们可以用上面的方式创建任意复杂的目录树结构。注意这仅仅是一个普通的命令,但是用 ‘{}’ 来创建层级目录。需要的时候如果在 shell 脚本中使用是非常有用的。

2. 在桌面(/home/$USER/Desktop)创建一个文件(例如 test)并填入以下内容。

ABC
DEF
GHI
JKL
MNO
PQR
STU
VWX
Y
Z

这种情况一个普通用户会怎么做呢?

a. 他首先会创建文件,最好使用 touch 命令,例如:

$ touch /home/$USER/Desktop/test

b. 他会用一个文本编辑器打开文件,这可能是 nano、vim 或其它编辑器。

$ nano /home/$USER/Desktop/test

c. 然后他会将上面的内容输入到文件中,保存并退出。

忽略他/她使用的时间,他至少需要 3 步来执行上面的情况。

一个经验丰富的 Linux 用户会怎么做呢?他会在终端中输入下面的文本然后就完成所有任务。他不需要单独执行每一步。

cat << EOF > /home/$USER/Desktop/test
ABC
DEF
GHI
JKL
MNO
PQR
STU
VWX
Y
Z
EOF

你可以用 ‘cat’ 命令检查是否成功创建了文件和内容。

$ cat /home/avi/Desktop/test

检查文件内容

3. 我们经常在 Linux 中处理归档文件(尤其是 TAR 包)。很多情况下我们会在某些位置,而不是在 Downloads 目录中使用 TAR 包。这种情况下我们怎么做呢?

在这种情况下我们通常会做两件事。

a. 复制/移动 tar 包到目标位置并解压,例如:

$ cp firefox-37.0.2.tar.bz2 /opt/
或
$ mv firefox-37.0.2.tar.bz2 /opt/

b. cd 到 /opt/ 目录。

$ cd /opt/

c. 解压 tar 包。

# tar -jxvf firefox-37.0.2.tar.bz2 

我们也可以采用另外一种方式。

我们也可以在 Tar 包所在位置解压并复制/移动解压后的文件到所需的目标位置,例如:

$ tar -jxvf firefox-37.0.2.tar.bz2 
$ cp -R firefox/  /opt/
或
$ mv firefox/ /opt/

不管哪种方式都需要两步才能完成任务。专业的人可以只用一步就完成这个任务:

$ tar -jxvf firefox-37.0.2.tar.bz2 -C /opt/

-C 选项提取文件到指定目录(这里是 /opt/)。

这并不是关于选项(-C)的问题,而是习惯的问题。养成使用带 -C 选项 tar 命令的习惯。这会使你的工作更加轻松。从现在开始不要再移动归档文件或复制/移动解压后的文件了,在 Downloads 文件夹保存 tar 包并解压到你想要的任何地方吧。

4. 常规方式我们怎样杀掉一个进程?

最普遍的方法,我们首先用 ps -A 命令列出所有进程,然后通过管道输入到 grep 来查找进程/服务(假如 apache2),如下:

$ ps -A | grep -i apache2

输出样例

 1006 ?        00:00:00 apache2
 2702 ?        00:00:00 apache2
 2703 ?        00:00:00 apache2
 2704 ?        00:00:00 apache2
 2705 ?        00:00:00 apache2
 2706 ?        00:00:00 apache2
 2707 ?        00:00:00 apache2

上面的输出显示了所有正在运行 apache2 的进程以及它们的 PID,然后你可以使用这些 PID 在下面命令的帮助下杀掉 apache2。

# kill 1006 2702 2703 2704 2705 2706 2707

然后交叉检查是否还有名称中包含 ‘apache2’ 的进程/服务在运行,如下:

$ ps -A | grep -i apache2

实际上我们可以使用类似 pgrep 和 pkill 的工具以一种更容易理解的方式实现。你可以使用 pgrep 找到和一个进程相关的信息。假如你要找和 apache2 相关的进程信息,你只需要运行:

$ pgrep apache2

输出样例

15396
15400
15401
15402
15403
15404
15405

你也可以通过运行下面命令列出进程名称以及 pid。

$ pgrep -l apache2

输出样例

15396 apache2
15400 apache2
15401 apache2
15402 apache2
15403 apache2
15404 apache2
15405 apache2

用 pkill 杀掉进程非常简单。你只需要输入想要杀死的资源名称。我写了一篇关于 pkill 的博文,你可以参考: http://www.tecmint.com/how-to-kill-a-process-in-linux/

用 pkill 杀死一个进程(例如 apache2),你只需要输入以下命令:

# pkill apache2

你可以通过运行下面命令验证是否杀掉了 apache2。

$ pgrep -l apache2

它没有输出任何东西并返回到窗口意味着没有名称中包含 apache2 的进程在运行。

这就是我要说的所有东西。上面讨论的点肯定远远不够,但也肯定对你有所帮助。我们不仅仅是介绍教程使你学到一些新的东西,更重要的是想告诉你 ‘在同样的情况下如何变得更有效率’。在下面的评论框中告诉我们你的反馈吧。保持联系,继续评论。


via: http://www.tecmint.com/mkdir-tar-and-kill-commands-in-linux/

作者:Avishek Kumar 译者:ictlyh 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

初识 ZMap

ZMap被设计用来针对整个IPv4地址空间或其中的大部分实施综合扫描的工具。ZMap是研究者手中的利器,但在运行ZMap时,请注意,您很有可能正在以每秒140万个包的速度扫描整个IPv4地址空间 。我们建议用户即使在实施小范围扫描之前,也联系一下本地网络的管理员并参考我们列举的最佳扫描体验

默认情况下,ZMap会对于指定端口实施尽可能大速率的TCP SYN扫描。较为保守的情况下,对10,000个随机的地址的80端口以10Mbps的速度扫描,如下所示:

$ zmap --bandwidth=10M --target-port=80 --max-targets=10000 --output-file=results.csv 

或者更加简洁地写成:

$ zmap -B 10M -p 80 -n 10000 -o results.csv

ZMap也可用于扫描特定子网或CIDR地址块。例如,仅扫描10.0.0.0/8和192.168.0.0/16的80端口,运行指令如下:

zmap -p 80 -o results.csv 10.0.0.0/8 192.168.0.0/16

如果扫描进行的顺利,ZMap会每秒输出类似以下内容的状态更新:

0% (1h51m left); send: 28777 562 Kp/s (560 Kp/s avg); recv: 1192 248 p/s (231 p/s avg); hits: 0.04%
0% (1h51m left); send: 34320 554 Kp/s (559 Kp/s avg); recv: 1442 249 p/s (234 p/s avg); hits: 0.04%
0% (1h50m left); send: 39676 535 Kp/s (555 Kp/s avg); recv: 1663 220 p/s (232 p/s avg); hits: 0.04%
0% (1h50m left); send: 45372 570 Kp/s (557 Kp/s avg); recv: 1890 226 p/s (232 p/s avg); hits: 0.04%

这些更新信息提供了扫描的即时状态并表示成:

完成进度% (剩余时间); send: 发出包的数量 即时速率 (平均发送速率); recv: 接收包的数量 接收率 (平均接收率); hits: 命中率

如果您不知道您所在网络能支持的扫描速率,您可能要尝试不同的扫描速率和带宽限制直到扫描效果开始下降,借此找出当前网络能够支持的最快速度。

默认情况下,ZMap会输出不同IP地址的列表(例如,根据SYN ACK数据包的情况),像下面这样。其输出结果还有几种附加的格式(如,JSON和Redis),可以用作生成程序可解析的扫描统计。 同样,可以指定附加的输出字段并使用输出过滤来过滤输出的结果。

115.237.116.119
23.9.117.80
207.118.204.141
217.120.143.111
50.195.22.82

我们强烈建议您使用黑名单文件,以排除预留的/未分配的IP地址空间(如,RFC1918 规定的私有地址、组播地址),以及网络中需要排除在您扫描之外的地址。默认情况下,ZMap将采用位于 /etc/zmap/blacklist.conf的这个简单的黑名单文件中所包含的预留和未分配地址。如果您需要某些特定设置,比如每次运行ZMap时的最大带宽或黑名单文件,您可以在文件/etc/zmap/zmap.conf中指定或使用自定义配置文件

如果您正试图解决扫描的相关问题,有几个选项可以帮助您调试。首先,您可以通过添加--dryrun实施预扫,以此来分析包可能会发送到网络的何处。此外,还可以通过设置'--verbosity=n`来更改日志详细程度

最佳扫描体验

我们为针对互联网进行扫描的研究者提供了一些建议,以此来引导养成良好的互联网合作氛围。

  • 密切协同本地的网络管理员,以减少风险和调查
  • 确认扫描不会使本地网络或上游供应商瘫痪
  • 在发起扫描的源地址的网页和DNS条目中申明你的扫描是善意的
  • 明确解释你的扫描中所有连接的目的和范围
  • 提供一个简单的退出扫描的方法并及时响应请求
  • 实施扫描时,不使用比研究对象需求更大的扫描范围或更快的扫描频率
  • 如果可以,将扫描流量分布到不同的时间或源地址上

即使不声明,使用扫描的研究者也应该避免利用漏洞或访问受保护的资源,并遵守其辖区内任何特殊的法律规定。

命令行参数

通用选项

这些选项是实施简单扫描时最常用的选项。我们注意到某些选项取决于所使用的探测模块输出模块(如,在实施ICMP Echo扫描时是不需要使用目的端口的)。

-p, --target-port=port

要扫描的目标TCP端口号(例如,443)

-o, --output-file=name

将结果写入该文件,使用-代表输出到标准输出。

-b, --blacklist-file=path

文件中被排除的子网使用CIDR表示法(如192.168.0.0/16),一个一行。建议您使用此方法排除RFC 1918地址、组播地址、IANA预留空间等IANA专用地址。在conf/blacklist.example中提供了一个以此为目的示例黑名单文件。

扫描选项

-n, --max-targets=n

限制探测目标的数量。后面跟的可以是一个数字(例如'-n 1000),或可扫描地址空间的百分比(例如,-n 0.1%`,不包括黑名单)

-N, --max-results=n

收到多少结果后退出

-t, --max-runtime=secs

限制发送报文的时间

-r, --rate=pps

设置发包速率,以包/秒为单位

-B, --bandwidth=bps

以比特/秒设置传输速率(支持使用后缀G,M或K(如-B 10M就是速度10 mbps)的。设置会覆盖--rate

-c, --cooldown-time=secs

发送完成后等待多久继续接收回包(默认值= 8)

-e, --seed=n

地址排序种子。如果要用多个ZMap以相同的顺序扫描地址,那么就可以使用这个参数。

--shards=n

将扫描分片/区,使其可多个ZMap中执行(默认值= 1)。启用分片时,--seed参数是必需的。

--shard=n

选择扫描的分片(默认值= 0)。n的范围在[0,N),其中N为碎片的总数。启用分片时,--seed参数是必需的。

-T, --sender-threads=n

用于发送数据包的线程数(默认值= 1)

-P, --probes=n

发送到每个IP的探测数(默认值= 1)

-d, --dryrun

用标准输出打印出每个包,而不是将其发送(用于调试)

网络选项

-s, --source-port=port|range

发送数据包的源端口

-S, --source-ip=ip|range

发送数据包的源地址。可以仅仅是一个IP,也可以是一个范围(如,10.0.0.1-10.0.0.9)

-G, --gateway-mac=addr

数据包发送到的网关MAC地址(用以防止自动检测不工作的情况)

-i, --interface=name

使用的网络接口

探测选项

ZMap允许用户指定并添加自己所需要的探测模块。 探测模块的职责就是生成要发送的探测包,并处理主机回复的响应包。

--list-probe-modules

列出可用探测模块(如tcp\_synscan)

-M, --probe-module=name

选择探测模块(默认值= tcp\_synscan)

--probe-args=args

向模块传递参数

--list-output-fields

列出可用的输出模块

输出选项

ZMap允许用户指定和编写他们自己的输出模块。输出模块负责处理由探测模块返回的字段,并将它们输出给用户。用户可以指定输出的字段,并过滤相应字段。

--list-output-modules

列出可用输出模块(如tcp\_synscan)

-O, --output-module=name

选择输出模块(默认值为csv)

--output-args=args

传递给输出模块的参数

-f, --output-fields=fields

输出的字段列表,以逗号分割

--output-filter

指定输出过滤器探测模块定义字段进行过滤

附加选项

-C, --config=filename

加载配置文件,可以指定其他路径。

-q, --quiet

不必每秒刷新输出

-g, --summary

在扫描结束后打印配置和结果汇总信息

-v, --verbosity=n

日志详细程度(0-5,默认值= 3)

-h, --help

打印帮助并退出

-V, --version

打印版本并退出

附加信息

TCP SYN 扫描

在执行TCP SYN扫描时,ZMap需要指定一个目标端口,也支持指定发起扫描的源端口范围。

-p, --target-port=port

扫描的TCP端口(例如 443)

-s, --source-port=port|range

发送扫描数据包的源端口(例如 40000-50000)

警示! ZMap基于Linux内核使用RST包来应答SYN/ACK包响应,以关闭扫描器打开的连接。ZMap是在Ethernet层完成包的发送的,这样做是为了减少跟踪打开的TCP连接和路由寻路带来的内核开销。因此,如果您有跟踪连接建立的防火墙规则,如类似于-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT的netfilter规则,将阻止SYN/ACK包到达内核。这不会妨碍到ZMap记录应答,但它会阻止RST包被送回,最终被扫描主机的连接会一直打开,直到超时后断开。我们强烈建议您在执行ZMap时,选择一组主机上未使用且防火墙允许访问的端口,加在-s后(如 -s '50000-60000' )。

ICMP Echo 请求扫描

虽然在默认情况下ZMap执行的是TCP SYN扫描,但它也支持使用ICMP echo请求扫描。在这种扫描方式下ICMP echo请求包被发送到每个主机,并以收到ICMP应答包作为答复。实施ICMP扫描可以通过选择icmp\_echoscan扫描模块来执行,如下:

$ zmap --probe-module=icmp_echoscan

UDP 数据报扫描

ZMap还额外支持UDP探测,它会发出任意UDP数据报给每个主机,并接收UDP或ICMP不可达的应答。ZMap可以通过使用--probe-args命令行选项来设置四种不同的UDP载荷。这些是:可在命令行设置可打印的ASCII 码的‘text’载荷和十六进制载荷的‘hex’,外部文件中包含载荷的‘file’,和通过动态字段生成的载荷的‘template’。为了得到UDP响应,请使用-f参数确保您指定的“data”字段处于输出范围。

下面的例子将发送两个字节'ST',即PCAnwywhere的'status'请求,到UDP端口5632。

$ zmap -M udp -p 5632 --probe-args=text:ST -N 100 -f saddr,data -o -

下面的例子将发送字节“0X02”,即SQL Server的'client broadcast'请求,到UDP端口1434。

$ zmap -M udp -p 1434 --probe-args=hex:02 -N 100 -f saddr,data -o -

下面的例子将发送一个NetBIOS状态请求到UDP端口137。使用一个ZMap自带的载荷文件。

$ zmap -M udp -p 1434 --probe-args=file:netbios_137.pkt -N 100 -f saddr,data -o -

下面的例子将发送SIP的'OPTIONS'请求到UDP端口5060。使用附ZMap自带的模板文件。

$ zmap -M udp -p 1434 --probe-args=file:sip_options.tpl -N 100 -f saddr,data -o -

UDP载荷模板仍处于实验阶段。当您在更多的使用一个以上的发送线程(-T)时可能会遇到崩溃和一个明显的相比静态载荷性能降低的表现。模板仅仅是一个由一个或多个使用${}将字段说明封装成序列构成的载荷文件。某些协议,特别是SIP,需要载荷来反射包中的源和目的包。其他协议,如portmapper和DNS,每个请求包含的字段应该是随机的,或降低被Zamp扫描的多宿主系统的风险。

以下的载荷模板将发送SIP OPTIONS请求到每一个目的地:

OPTIONS sip:${RAND_ALPHA=8}@${DADDR} SIP/2.0
Via: SIP/2.0/UDP ${SADDR}:${SPORT};branch=${RAND_ALPHA=6}.${RAND_DIGIT=10};rport;alias
From: sip:${RAND_ALPHA=8}@${SADDR}:${SPORT};tag=${RAND_DIGIT=8}
To: sip:${RAND_ALPHA=8}@${DADDR}
Call-ID: ${RAND_DIGIT=10}@${SADDR}
CSeq: 1 OPTIONS
Contact: sip:${RAND_ALPHA=8}@${SADDR}:${SPORT}
Content-Length: 0
Max-Forwards: 20
User-Agent: ${RAND_ALPHA=8}
Accept: text/plain

就像在上面的例子中展示的那样,注意每行行末以
结尾,请求以

结尾,大多数SIP实现都可以正确处理它。一个可以工作的例子放在ZMap的examples/udp-payloads目录下 (sip\_options.tpl).

当前实现了下面的模板字段:

  • SADDR: 源IP地址的点分十进制格式
  • SADDR\_N: 源IP地址的网络字节序格式
  • DADDR: 目的IP地址的点分十进制格式
  • DADDR\_N: 目的IP地址的网络字节序格式
  • SPORT: 源端口的ascii格式
  • SPORT\_N: 源端口的网络字节序格式
  • DPORT: 目的端口的ascii格式
  • DPORT\_N: 目的端口的网络字节序格式
  • RAND\_BYTE: 随机字节(0-255),长度由=(length) 参数决定
  • RAND\_DIGIT: 随机数字0-9,长度由=(length) 参数决定
  • RAND\_ALPHA: 随机大写字母A-Z,长度由=(length) 参数决定
  • RAND\_ALPHANUM: 随机大写字母A-Z和随机数字0-9,长度由=(length) 参数决定

配置文件

ZMap支持使用配置文件来代替在命令行上指定所有要求的选项。配置中可以通过每行指定一个长名称的选项和对应的值来创建:

interface "eth1"
source-ip 1.1.1.4-1.1.1.8
gateway-mac b4:23:f9:28:fa:2d # upstream gateway
cooldown-time 300 # seconds
blacklist-file /etc/zmap/blacklist.conf
output-file ~/zmap-output
quiet
summary

然后ZMap就可以按照配置文件并指定一些必要的附加参数运行了:

$ zmap --config=~/.zmap.conf --target-port=443

详细

ZMap可以在屏幕上生成多种类型的输出。默认情况下,Zmap将每隔1秒打印出相似的基本进度信息。可以通过设置--quiet来禁用。

0:01 12%; send: 10000 done (15.1 Kp/s avg); recv: 144 143 p/s (141 p/s avg); hits: 1.44%

ZMap同样也可以根据扫描配置打印如下消息,可以通过'--verbosity`参数加以控制。

Aug 11 16:16:12.813 [INFO] zmap: started
Aug 11 16:16:12.817 [DEBUG] zmap: no interface provided. will use eth0
Aug 11 16:17:03.971 [DEBUG] cyclic: primitive root: 3489180582
Aug 11 16:17:03.971 [DEBUG] cyclic: starting point: 46588
Aug 11 16:17:03.975 [DEBUG] blacklist: 3717595507 addresses allowed to be scanned
Aug 11 16:17:03.975 [DEBUG] send: will send from 1 address on 28233 source ports
Aug 11 16:17:03.975 [DEBUG] send: using bandwidth 10000000 bits/s, rate set to 14880 pkt/s
Aug 11 16:17:03.985 [DEBUG] recv: thread started

ZMap还支持在扫描之后打印出一个的可grep的汇总信息,类似于下面这样,可以通过调用--summary来实现。

cnf target-port             443
cnf source-port-range-begin         32768
cnf source-port-range-end           61000
cnf source-addr-range-begin         1.1.1.4
cnf source-addr-range-end           1.1.1.8
cnf maximum-packets             4294967295
cnf maximum-runtime             0
cnf permutation-seed            0
cnf cooldown-period             300
cnf send-interface              eth1
cnf rate                    45000
env nprocessors             16
exc send-start-time             Fri Jan 18 01:47:35 2013
exc send-end-time               Sat Jan 19 00:47:07 2013
exc recv-start-time             Fri Jan 18 01:47:35 2013
exc recv-end-time               Sat Jan 19 00:52:07 2013
exc sent                    3722335150
exc blacklisted             572632145
exc first-scanned               1318129262
exc hit-rate                0.874102
exc synack-received-unique          32537000
exc synack-received-total           36689941
exc synack-cooldown-received-unique     193
exc synack-cooldown-received-total      1543
exc rst-received-unique         141901021
exc rst-received-total          166779002
adv source-port-secret          37952
adv permutation-gen             4215763218

结果输出

ZMap可以通过输出模块生成不同格式的结果。默认情况下,ZMap只支持csv的输出,但是可以通过编译支持redisjson 。可以使用输出过滤来过滤这些发送到输出模块上的结果。输出模块输出的字段由用户指定。默认情况如果没有指定输出文件,ZMap将以csv格式返回结果,而不会生成特定结果。也可以编写自己的输出模块;请参阅编写输出模块

-o, --output-file=p

输出写入文件地址

-O, --output-module=p

调用自定义输出模块

-f, --output-fields=p

以逗号分隔的输出的字段列表

--output-filter=filter

对给定的探测指定字段输出过滤

--list-output-modules

列出可用输出模块

--list-output-fields

列出给定的探测的可用输出字段

输出字段

除了IP地址之外,ZMap有很多字段。这些字段可以通过在给定探测模块上运行--list-output-fields来查看。

$ zmap --probe-module="tcp_synscan" --list-output-fields
saddr           string: 应答包中的源IP地址
saddr-raw          int: 网络字节格式的源IP地址
daddr           string: 应答包中的目的IP地址
daddr-raw          int: 网络字节格式的目的IP地址
ipid               int: 应答包中的IP识别号
ttl                int: 应答包中的ttl(存活时间)值
sport              int: TCP 源端口
dport              int: TCP 目的端口
seqnum             int: TCP 序列号
acknum             int: TCP Ack号
window             int: TCP 窗口
classification  string: 包类型
success            int: 是应答包成功
repeat             int: 是否是来自主机的重复响应
cooldown           int: 是否是在冷却时间内收到的响应
timestamp-str   string: 响应抵达时的时间戳使用ISO8601格式
timestamp-ts       int: 响应抵达时的时间戳使用UNIX纪元开始的秒数
timestamp-us       int: 时间戳的微秒部分(例如 从'timestamp-ts'的几微秒)

可以通过使用--output-fields=fields-f来选择选择输出字段,任意组合的输出字段可以被指定为逗号分隔的列表。例如:

$ zmap -p 80 -f "response,saddr,daddr,sport,seq,ack,in_cooldown,is_repeat,timestamp" -o output.csv

过滤输出

在传到输出模块之前,探测模块生成的结果可以先过滤。过滤是针对探测模块的输出字段的。过滤使用类似于SQL的简单过滤语法写成,通过ZMap的--output-filter选项来指定。输出过滤通常用于过滤掉重复的结果,或仅传输成功的响应到输出模块。

过滤表达式的形式为<字段名> <操作符> <值><值>的类型必须是一个字符串或一串无符号整数并且匹配<字段名>类型。对于整数比较有效的操作符是= !=, <, >, <=, >=。字符串比较的操作是=,!=。--list-output-fields可以打印那些可供探测模块选择的字段和类型,然后退出。

复合型的过滤操作,可以通过使用&&(逻辑与)和||(逻辑或)这样的运算符来组合出特殊的过滤操作。

示例

书写一则过滤仅显示成功的、不重复的应答

--output-filter="success = 1 && repeat = 0"

过滤出RST分类并且TTL大于10的包,或者SYNACK分类的包

--output-filter="(classification = rst && ttl > 10) || classification = synack"

CSV

csv模块将会生成以逗号分隔各个要求输出的字段的文件。例如,以下的指令将生成名为output.csv的CSV文件。

$ zmap -p 80 -f "response,saddr,daddr,sport,seq,ack,in_cooldown,is_repeat,timestamp" -o output.csv

#响应, 源地址, 目的地址, 源端口, 目的端口, 序列号, 应答, 是否是冷却模式, 是否重复, 时间戳
response, saddr, daddr, sport, dport, seq, ack, in_cooldown, is_repeat, timestamp
synack, 159.174.153.144, 10.0.0.9, 80, 40555, 3050964427, 3515084203, 0, 0,2013-08-15 18:55:47.681
rst, 141.209.175.1, 10.0.0.9, 80, 40136, 0, 3272553764, 0, 0,2013-08-15 18:55:47.683
rst, 72.36.213.231, 10.0.0.9, 80, 56642, 0, 2037447916, 0, 0,2013-08-15 18:55:47.691
rst, 148.8.49.150, 10.0.0.9, 80, 41672, 0, 1135824975, 0, 0,2013-08-15 18:55:47.692
rst, 50.165.166.206, 10.0.0.9, 80, 38858, 0, 535206863, 0, 0,2013-08-15 18:55:47.694
rst, 65.55.203.135, 10.0.0.9, 80, 50008, 0, 4071709905, 0, 0,2013-08-15 18:55:47.700
synack, 50.57.166.186, 10.0.0.9, 80, 60650, 2813653162, 993314545, 0, 0,2013-08-15 18:55:47.704
synack, 152.75.208.114, 10.0.0.9, 80, 52498, 460383682, 4040786862, 0, 0,2013-08-15 18:55:47.707
synack, 23.72.138.74, 10.0.0.9, 80, 33480, 810393698, 486476355, 0, 0,2013-08-15 18:55:47.710

Redis

Redis的输出模块允许地址被添加到一个Redis的队列,而不是保存到文件,允许ZMap将它与之后的处理工具结合使用。

注意! ZMap默认不会编译Redis功能。如果你从源码构建ZMap,可以在CMake的时候加上-DWITH_REDIS=ON来增加Redis支持。

JSON

JSON输出模块用起来类似于CSV模块,只是以JSON格式写入到文件。JSON文件能轻松地导入到其它可以读取JSON的程序中。

注意!,ZMap默认不会编译JSON功能。如果你从源码构建ZMap,可以在CMake的时候加上-DWITH_JSON=ON来增加JSON支持。

黑名单和白名单

ZMap同时支持对网络前缀做黑名单和白名单。如果ZMap不加黑名单和白名单参数,他将会扫描所有的IPv4地址(包括本地的,保留的以及组播地址)。如果指定了黑名单文件,那么在黑名单中的网络前缀将不再扫描;如果指定了白名单文件,只有那些网络前缀在白名单内的才会扫描。白名单和黑名单文件可以协同使用;黑名单优先于白名单(例如:如果您在白名单中指定了10.0.0.0/8并在黑名单中指定了10.1.0.0/16,那么10.1.0.0/16将不会扫描)。白名单和黑名单文件可以在命令行中指定,如下所示:

-b, --blacklist-file=path

文件用于记录黑名单子网,以CIDR(无类域间路由)的表示法,例如192.168.0.0/16

-w, --whitelist-file=path

文件用于记录限制扫描的子网,以CIDR的表示法,例如192.168.0.0/16

黑名单文件的每行都需要以CIDR的表示格式书写,一行单一的网络前缀。允许使用#加以备注。例如:

# IANA(英特网编号管理局)记录的用于特殊目的的IPv4地址
# http://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml
# 更新于2013-05-22

0.0.0.0/8           # RFC1122: 网络中的所有主机
10.0.0.0/8          # RFC1918: 私有地址
100.64.0.0/10       # RFC6598: 共享地址空间
127.0.0.0/8         # RFC1122: 回环地址
169.254.0.0/16      # RFC3927: 本地链路地址
172.16.0.0/12       # RFC1918: 私有地址
192.0.0.0/24        # RFC6890: IETF协议预留
192.0.2.0/24        # RFC5737: 测试地址1
192.88.99.0/24      # RFC3068: IPv6转换到IPv4的任播
192.168.0.0/16      # RFC1918: 私有地址
192.18.0.0/15       # RFC2544: 检测地址
198.51.100.0/24     # RFC5737: 测试地址2
203.0.113.0/24      # RFC5737: 测试地址3
240.0.0.0/4         # RFC1112: 预留地址
255.255.255.255/32  # RFC0919: 限制广播地址

# IANA记录的用于组播的地址空间
# http://www.iana.org/assignments/multicast-addresses/multicast-addresses.xhtml
# 更新于2013-06-25

224.0.0.0/4         # RFC5771: 组播/预留地址ed

如果您只是想扫描因特网中随机的一部分地址,使用抽样检出,来代替使用白名单和黑名单。

注意!ZMap默认设置使用/etc/zmap/blacklist.conf作为黑名单文件,其中包含有本地的地址空间和预留的IP空间。通过编辑/etc/zmap/zmap.conf可以改变默认的配置。

速度限制与抽样

默认情况下,ZMap将以您当前网卡所能支持的最快速度扫描。以我们对于常用硬件的经验,这通常是理论上Gbit以太网速度的95-98%,这可能比您的上游提供商可处理的速度还要快。ZMap是不会自动的根据您的上游提供商来调整发送速率的。您可能需要手动的调整发送速率来减少丢包和错误结果。

-r, --rate=pps

设置最大发送速率以包/秒为单位

-B, --bandwidth=bps

设置发送速率以比特/秒(支持G,M和K后缀)。这会覆盖--rate参数。

ZMap同样支持对IPv4地址空间进行指定最大目标数和/或最长运行时间的随机采样。由于每次对主机的扫描是通过随机排序生成的,限制扫描的主机个数为N就会随机抽选N个主机。命令选项如下:

-n, --max-targets=n

探测目标上限数量

-N, --max-results=n

结果上限数量(累积收到这么多结果后退出)

-t, --max-runtime=s

发送数据包时间长度上限(以秒为单位)

-s, --seed=n

种子用以选择地址的排列方式。使用不同ZMap执行扫描操作时将种子设成相同的值可以保证相同的扫描顺序。

举个例子,如果您想要多次扫描同样的一百万个互联网主机,您可以设定排序种子和扫描主机的上限数量,大致如下所示:

zmap -p 443 -s 3 -n 1000000 -o results

为了确定哪一百万主机将要被扫描,您可以执行预扫,只打印数据包而非发送,并非真的实施扫描。

zmap -p 443 -s 3 -n 1000000 --dryrun | grep daddr
    | awk -F'daddr: ' '{print $2}' | sed 's/ |.*//;' 

发送多个数据包

ZMap支持向每个主机发送多个探测。增加这个数量既增加了扫描时间又增加了到达的主机数量。然而,我们发现,增加的扫描时间(每个额外扫描的增加近100%)远远大于到达的主机数量(每个额外扫描的增加近1%)。

-P, --probes=n

向每个IP发出的独立探测个数(默认值=1)

示例应用

ZMap专为向大量主机发起连接并寻找那些正确响应而设计。然而,我们意识到许多用户需要执行一些后续处理,如执行应用程序级别的握手。例如,用户在80端口实施TCP SYN扫描也许想要实施一个简单的GET请求,还有用户扫描443端口可能希望完成TLS握手。

Banner获取

我们收录了一个示例程序,banner-grab,伴随ZMap使用可以让用户从监听状态的TCP服务器上接收到消息。Banner-grab连接到提供的服务器上,发送一个可选的消息,然后打印出收到的第一个消息。这个工具可以用来获取banner,例如HTTP服务的回复的具体指令,telnet登陆提示,或SSH服务的字符串。

下面的例子寻找了1000个监听80端口的服务器,并向每个发送一个简单的GET请求,存储他们的64位编码响应至http-banners.out

$ zmap -p 80 -N 1000 -B 10M -o - | ./banner-grab-tcp -p 80 -c 500 -d ./http-req > out

如果想知道更多使用banner-grab的细节,可以参考examples/banner-grab中的README文件。

注意! ZMap和banner-grab(如例子中)同时运行可能会比较显著的影响对方的表现和精度。确保不让ZMap占满banner-grab-tcp的并发连接,不然banner-grab将会落后于标准输入的读入,导致阻塞ZMap的输出写入。我们推荐使用较慢扫描速率的ZMap,同时提升banner-grab-tcp的并发性至3000以内(注意 并发连接>1000需要您使用ulimit -SHn 100000ulimit -HHn 100000来增加每个进程的最大文件描述符数量)。当然,这些参数取决于您服务器的性能、连接成功率(hit-rate);我们鼓励开发者在运行大型扫描之前先进行小样本的试验。

建立套接字

我们也收录了另一种形式的banner-grab,就是forge-socket, 重复利用服务器发出的SYN-ACK,连接并最终取得banner。在banner-grab-tcp中,ZMap向每个服务器发送一个SYN,并监听服务器发回的带有SYN+ACK的应答。运行ZMap主机的内核接受应答后发送RST,这样就没有与该包关联活动连接。程序banner-grab必须在这之后创建一个新的TCP连接到从服务器获取数据。

在forge-socket中,我们利用内核中同名的模块,使我们可以创建任意参数的TCP连接。可以通过抑制内核的RST包,并重用SYN+ACK的参数取代该包而创建套接字,通过这个套接字收发数据和我们平时使用的连接套接字并没有什么不同。

要使用forge-socket,您需要forge-socket内核模块,从github上可以获得。您需要git clone [email protected]:ewust/forge_socket.git至ZMap源码根目录,然后cd进入forge\_socket目录,运行make。以root身份运行insmod forge_socket.ko 来安装该内核模块。

您也需要告知内核不要发送RST包。一个简单的在全系统禁用RST包的方法是使用iptables。以root身份运行iptables -A OUTPUT -p tcp -m tcp --tcp-flgas RST,RST RST,RST -j DROP即可,当然您也可以加上一项--dport X将禁用局限于所扫描的端口(X)上。扫描完成后移除这项设置,以root身份运行iptables -D OUTPUT -p tcp -m tcp --tcp-flags RST,RST RST,RST -j DROP即可。

现在应该可以建立forge-socket的ZMap示例程序了。运行需要使用extended\_fileZMap输出模块

$ zmap -p 80 -N 1000 -B 10M -O extended_file -o - | \
    ./forge-socket -c 500 -d ./http-req > ./http-banners.out

详细内容可以参考examples/forge-socket目录下的README。


编写探测和输出模块

ZMap可以通过探测模块来扩展支持不同类型的扫描,通过输出模块增加不同类型的输出结果。注册过的探测和输出模块可以在命令行中列出:

--list-probe-modules

列出安装过的探测模块

--list-output-modules

列出安装过的输出模块

输出模块

ZMap的输出和输出后处理可以通过实现和注册扫描器的输出模块来扩展。输出模块在接收每一个应答包时都会收到一个回调。然而默认提供的模块仅提供简单的输出,这些模块同样支持更多的输出后处理(例如:重复跟踪或输出AS号码来代替IP地址)。

通过定义一个新的output\_module结构来创建输出模块,并在output\_modules.c中注册:

typedef struct output_module {
    const char          *name;           // 在命令行如何引用输出模块
    unsigned            update_interval; // 以秒为单位的更新间隔

    output_init_cb      init;            // 在扫描器初始化的时候调用
    output_update_cb    start;           // 在扫描器开始的时候调用
    output_update_cb    update;          // 每次更新间隔调用,秒为单位
    output_update_cb    close;           // 扫描终止后调用

    output_packet_cb    process_ip;      // 接收到应答时调用

    const char          *helptext;       // 会在--list-output-modules时打印在屏幕上

} output_module_t;

输出模块必须有名称,通过名称可以在命令行调用,并且通常会实现success_ip和常见的other_ip回调。process\_ip的回调由每个收到并经由probe module过滤的应答包调用。应答是否被认定为成功并不确定(比如,它可以是一个TCP的RST)。这些回调必须定义匹配output_packet_cb定义的函数:

int (*output_packet_cb) (

    ipaddr_n_t    saddr,         // 网络字节格式的发起扫描主机IP地址
    ipaddr_n_t    daddr,         // 网络字节格式的目的IP地址

    const char*   response_type, // 发送模块的数据包分类

    int           is_repeat,     // {0: 主机的第一个应答, 1: 后续的应答}
    int           in_cooldown,   // {0: 非冷却状态, 1: 扫描器处于冷却中}

    const u_char* packet,        // 指向IP包的iphdr结构体的指针
    size_t        packet_len     // 包的长度,以字节为单位
);

输出模块还可以通过注册回调,执行在扫描初始化的时候(诸如打开输出文件的任务)、在扫描开始阶段(诸如记录黑名单的任务)、在扫描的常规间隔(诸如状态更新的任务)、在关闭的时候(诸如关掉所有打开的文件描述符)。提供的这些回调可以完整的访问扫描配置和当前状态:

int (*output_update_cb)(struct state_conf*, struct state_send*, struct state_recv*);

这些定义在output\_modules.h中。在src/outputmodules/modulecsv.c中有可用示例。

探测模块

数据包由探测模块构造,它可以创建各种包和不同类型的响应。ZMap默认拥有两个扫描模块:tcp_synscanicmp_echoscan。默认情况下,ZMap使用tcp_synscan来发送TCP SYN包并对每个主机的响应分类,如打开时(收到SYN+ACK)或关闭时(收到RST)。ZMap允许开发者编写自己的ZMap探测模块,使用如下的API:

任何类型的扫描都必须通过开发和注册send_module_t结构中的回调来实现:

typedef struct probe_module {
    const char               *name;             // 如何在命令行调用扫描
    size_t                   packet_length;     // 探测包有多长(必须是静态的)

    const char               *pcap_filter;      // 对收到的响应实施PCAP过滤
    size_t                   pcap_snaplen;      // libpcap 捕获的最大字节数 
    uint8_t                  port_args;         // 设为1,如果ZMap需要用户指定--target-port

    probe_global_init_cb     global_initialize; // 在扫描初始化会时被调用一次
    probe_thread_init_cb     thread_initialize; // 每个包缓存区的线程中被调用一次
    probe_make_packet_cb     make_packet;       // 每个主机更新包的时候被调用一次
    probe_validate_packet_cb validate_packet;   // 每收到一个包被调用一次,
                                                // 如果包无效返回0,
                                                // 非零则有效。

    probe_print_packet_cb    print_packet;      // 如果在预扫模式下被每个包都调用
    probe_classify_packet_cb process_packet;    // 由区分响应的接收器调用
    probe_close_cb           close;             // 扫描终止后被调用

    fielddef_t               *fields            // 该模块指定的字段的定义
    int                      numfields          // 字段的数量

} probe_module_t;

在扫描操作初始化时会调用一次global_initialize,可以用来实施一些必要的全局配置和初始化操作。然而,global_initialize并不能访问包缓冲区,那里是线程特定的。代替的,thread_initialize在每个发送线程初始化的时候被调用,提供对于缓冲区的访问,可以用来构建探测包和全局的源和目的值。此回调应用于构建主机不可知的包结构,甚至只有特定值(如:目的主机和校验和),需要随着每个主机更新。例如,以太网头部信息在交换时不会变更(减去校验和是由NIC硬件计算的)因此可以事先定义以减少扫描时间开销。

调用回调参数make\_packet是为了让被扫描的主机允许探测模块更新主机指定的值,同时提供IP地址、一个非透明的验证字符串和探测数目(如下所示)。探测模块负责在探测中放置尽可能多的验证字符串,即便当服务器返回的应答为空时,探测模块也能验证它的当前状态。例如,针对TCP SYN扫描,tcp\_synscan探测模块会使用TCP源端口和序列号的格式存储验证字符串。响应包(SYN+ACK)将包含目的端口和确认号的预期值。

int make_packet(
    void        *packetbuf,  // 包的缓冲区
    ipaddr_n_t  src_ip,      // 网络字节格式源IP
    ipaddr_n_t  dst_ip,      // 网络字节格式目的IP
    uint32_t    *validation, // 探测中的有效字符串
    int         probe_num    // 如果向每个主机发送多重探测,
                             // 该值为我们对于该主机
                             // 正在发送的探测数目
);

扫描模块也应该定义pcap_filtervalidate_packetprocess_packet。只有符合PCAP过滤器的包才会被扫描。举个例子,在一个TCP SYN扫描的情况下,我们只想要调查TCP SYN / ACK或RST TCP数据包,并利用类似tcp && tcp[13] & 4 != 0 || tcp[13] == 18的过滤方法。validate_packet函数将会被每个满足PCAP过滤条件的包调用。如果验证返回的值非零,将会调用process_packet函数,并使用fields定义的字段和包中的数据填充字段集。举个例子,如下代码为TCP synscan探测模块处理了一个数据包。

void synscan_process_packet(const u_char *packet, uint32_t len, fieldset_t *fs)
{
    struct iphdr *ip_hdr = (struct iphdr *)&packet[sizeof(struct ethhdr)];
    struct tcphdr *tcp = (struct tcphdr*)((char *)ip_hdr 
            + (sizeof(struct iphdr)));

    fs_add_uint64(fs, "sport", (uint64_t) ntohs(tcp->source)); 
    fs_add_uint64(fs, "dport", (uint64_t) ntohs(tcp->dest));
    fs_add_uint64(fs, "seqnum", (uint64_t) ntohl(tcp->seq));
    fs_add_uint64(fs, "acknum", (uint64_t) ntohl(tcp->ack_seq));
    fs_add_uint64(fs, "window", (uint64_t) ntohs(tcp->window));

    if (tcp->rst) { // RST packet
        fs_add_string(fs, "classification", (char*) "rst", 0);
        fs_add_uint64(fs, "success", 0);
    } else { // SYNACK packet
        fs_add_string(fs, "classification", (char*) "synack", 0);
        fs_add_uint64(fs, "success", 1);
    }
}

via: https://zmap.io/documentation.html

译者:martin2011qi 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出