Debian GNU/Linux

我不生产代码,我只是代码的搬运工

1. 前言

1.1. 导读

简介

  1. 需要说明的是:和其他大全指南教程不一样,本文旨在以实践的方式介绍 Linux 基础、Linux 服务架构以及 Linux 实用技巧等内容。
  2. 本文中每个章节中的重要知识点都会提供相关的参考资料,可供读者扩展读。
  3. 本文可以作为 Linux 的操作参考工具书,当然,我们假定读者对于类 Unix/Linux 系列的操作系统已经有一些了解。
  4. 作者承诺本册子会持续更新与完善,奉行“血不流干,死不休编”的宗旨,如果你认为作者有哪些地方需要改进,可直接发邮件到 zrg1390556487@gmail.com。

内容结构

  • 第一部分,Linux 入门。包括获取和安装 Linux 系统,Linux 系统的初步配置,Linux 文件、目录及磁盘操作。
  • 第二部分,Linux 账号管理与 ACL 权限控制。该篇对于 Linux 系统管理员比较实用,主要介绍 Linux 帐号管理及 ACL 权限控制,Linux 定时任务,Linux 网络,一些常见服务软件的架设。
  • 第三部分,Linux 系统管理,包括系统日志,软件安装,基础系统配置与备份策略等等。
  • 第四部分,Linux 服务管理,常见服务环境简单介绍及部署应用。
  • 第五部分,Linux 集群与虚拟化。

编写规范

  • 章节编码级别限制为最大 6 级,但一般使用到 3 级。
  • 每个章节的内容都会从实际操作开始,然后进一步由浅入深的拓展相应内容。
  • 每个章节除了部分实际操作章节外,都会有“参考资料”章节。

阅读提示

  • 本文所有内容以笔记的形式编写,非权威指南类型,仅供参考。
  • 如果你只要结果,阅读时,标记为扩展阅读的章节可跳过
  • 本文将会省去一些有关 Linux 的常识性介绍,比如 Unix/Linux 发展史等,更多的是以过往的经验来介绍使用 Linux 的方法或建议,并且试图对一些 Linux 常见、实用的实践操作进行更详尽的说明,便于后来者学习。

1.2. 读者对象

Linux 系统管理员
如果你是 Linux 环境下的系统管理员,那么本册子也许能为你提供一定的帮助。
Linux 爱好者
如果你是 Linux 爱好者,本册子将告诉你部分问题的解决办法及原因。

1.3. 作者心路旅程

  1. 初识 Linux。记得第一次接触 Linux 是在大二上学期的 Linux 基础课,但是,我并没有喜欢上这门课或是这个系统,因为关于 Linux 的一切,对我来说都是陌生的,我在想我既然已经对 Windows 操作系统,又何必去瞎折腾呢,况且 Windows 可以完成 Linux 上的所有事情(后来,我发现我错了);另一方面,可能是由于授课老师的坚毅个性,让我不想再去学习它,尽管当时我自己是多么幼稚,多么可笑。
  2. 进一步学习 Linux。后来,当我在听说 Linux 用来当服务器使用很好的时候,我开始尝试使用它来完成一些工作的时候,开始我有点喜欢 Linux 操作系统,不断的尝试(学习)使用 Linux,发现使用 Linux 来完成编程开发越来越完美了。能使用 Linux 搭建一些服务,使我的工作更加方便,并将一些网站之类的放在上面。尽管工作的大部分时间都在用 Windows 操作系统,但是对 Linux 系列的折腾从未停止过。
  3. 现在好了,今年(2018年)1月换了一份工作,公司使用的技术基本都是 Linux 上构建的,除了正常必要性开发,使用 Windows,使用 Linux 的时间将占据工作时间的 1/3。
  4. 今年5月(2019年),来深圳工作了,团队比较开放,现在我的大部分开发工作都在 Linux 下完成。
  5. 时间如梭,现在已经是 2021 年 3 月了,最近快速在一台个人主机上安装了 CentOS 系统,然后按照我写的这个教程,进行一波快速配置,发现该教程并不太好用。计划重新调整一下内容结构,把一些理论性内容放到“扩展阅读:*”章节,让它更具实用性。

2. Linux 入门

2.1. Linux 简介与安装

2.1.1. 入门第一步,理解 Linux

  1. 首先,以 Linux 的思维方式系统性思考问题。
  2. Linux 是一个面向文件的操作系统。所有的应用、管理是基于文件的。
  3. Linux 是一个以命令行为主要的管理方式的 OS。
  4. Linux 的日志非常完善,也至关重要。
  5. Linux 是一个以配置文件为管理基础的 OS。
  6. Linux 的所有应用、管理和配置,都有很多程序来辅助完成。
2.1.1.1. 扩展阅读:Linux 内容划分

Linux 可划分为以下四部分

  • Linux 内核
  • GNU 工具
  • 图形化桌面环境
  • 应用软件

Linux 内核主要负责一下四种功能:

  1. 系统内存管理
    • 内核不仅管理服务器上的可用物理内存,还可以创建和管理虚拟内存。
    • 内核通过硬盘上的存储空间来实现虚拟内存,这块区域称为交换空间(swap space)。内核不断地交换空间和实际的物理内存之间反复交换虚拟内存中的内容。这使得系统以为它拥有比物理内存更多的可用内存。
    • 内存存储单元按组划分成很多块,这些块称作页面(page)。内核将每个内存页面放在物理内存或交换空间。然后,内核会维护一个内存页面表,指明哪些页面位于物理内存内,哪些页面被换到了磁盘上。
    • 内核会记录哪些内存页面正在使用中,并自动把一段时间未访问的内存页面复制到交换空间区域(称为换出,swapping out)——即使还有可用内存。
  2. 软件程序管理
    • Linux 操作系统将运行中的程序称为进程。内核控制着 Linux 系统如何管理运行在系统上的所有进程。
    • 内核创建了第一个进程(称为 init 进程)来启动系统上所有其他进程。Linux 操作系统的 init 系统采用了运行级。Linux 操作系统有 5个启动运行级。
      • 运行级为 1 时,只启动基本的系统进程以及一个控制台终端进程,我们称之为单用户模式。单用户模式通常用来在系统有问题时进行紧急的文件系统维护。显然,这种模式下,仅有一个人(通常是系统管理员)能登录到系统上操作数据。
      • 运行级为 3 时,大多数应用软件,比如网络支持程序,都会启动。
      • 运行级为 5 时,系统会启动 X Window 系统,允许用户通过图形化桌面窗口登录系统。
      • Linux 系统可以通过调整启动运行级来控制整个系统的功能。
  3. 硬件设备管理
    • 内核的另一职责是管理硬件设备。任何 Linux 系统需要与之通信的设备,都需要在内核代码中加入驱动程序代码。在 Linux 内核中有两种方法用于插入设备驱动程序代码:

      • 编译进内核的设备驱动代码
      • 可插入内核的设备驱动模块
      以前,插入设备驱动代码的唯一途径是重新编译内核。随着 Linux 内核支持的硬件设备越来越多,这个过程变得越来越低效。
      后来,开发人员提出了内核模块的概念。它允许将驱动代码插入到运行中的内核而无需重新编译内核。Linux 系统将硬件设备当成特殊的文件,称为设备文件。
      
      • 设备文件有3种分类
        • 字符型设备文件:指处理数据时每次只能处理一个字符的设备。大多数类型的调制解调器和终端都是作为字符型设备文件创建的。
        • 块设备文件:指处理数据时每次能处理大块大数据的设备,比如硬盘。
        • 网络设备文件:指采用数据包发送和接受数据的设备,包括各种网卡和一个特殊的回环设备。这个回环设备允许 Linux 系统使用常见的网络编程协议同自身通讯。
    • Linux 为系统上的每个设备都创建一种称为节点的特殊文件。与设备的所有通信都通过设备节点完成。每个节点都有唯一的数值对供 Linux 内核标识它。数值对包括一个主设备号和一个次设备号。类似的设备被划分到同样的主设备号下。次设备号用于标识主设备组下的某个特定设备。
  4. 文件系统管理
    Linux 内核支持通过不同类型的文件系统从硬盘中读写数据。内核必须在编译时就加入对所有可能用到的文件系统的支持。下表是 Linux 系统用来读写数据的标准文件系统

    Table 1: 文件系统类型
    文件系统 描述
    ext Linux 扩展文件系统,最早的 Linux 文件系统
    ext2 第二扩展文件系统,在ext的基础上提供更多的功能
    ext3 第三扩展文件系统,支持日志功能
    ext4 第四扩展文件系统,支持高级日志功能
    hpfs OS/2高性能文件系统
    jfs IBM日志文件系统
    iso9660 ISO 9660文件系统(CD-ROM)
    mimix MINIX文件系统
    msdos 微软的FAT16
    ncp Netware文件系统
    nfs 网络文件系统
    ntfs 支持Microsoft NT文件系统
    proc 访问系统信息
    ReiserFS 高级Linux文件系统,能提供更好的性能和硬盘恢复功能
    smb 支持网络访问的Samba SMB文件系统
    sysv 较早期的Unix文件系统
    ufs BSD文件系统
    umsdos 建立在msdos上的类Unix文件系统
    vfat Windows95文件系统(FAT32)
    XFS 高性能64位日志文件系统

    Linux 内核采用虚拟文件系统(Virtual File System,VFS)作为和每个文件系统交互的接口。

GNU工具

  1. 核心 GNU 工具:coreutils(coreutilities)软件包 GNU coreutils 软件包由三部分构成:
    • 用以处理文件的工具
    • 用以操作文本的工具
    • 用以管理进程的工具
  2. shell

    Table 2: Linux 中常见的shell
    shell 描述
    bash bash shell 是 Bourne shell 的一个免费版本,它是最早的 Unix shell,bash还有一个特点,可以通过help命令来查看帮助。包含的功能几乎可以涵盖shell所具有的功能,所以一般的shell脚本都会指定它为执行路径。
    ash 一种运行在内存受限环境中简单的轻量级shell,但与bash shell完全兼容。
    korn 一种与 Bourne shell,但支持如关联数组和浮点运算等一些高级的编程特性。
    tcsh 一种将C语言中的一些元素引入到shell脚本中的shell。
    zsh 一种结合了bash、tcsh和korn的特性,同时提供高级编程特性、共享历史文件和主题化提示符的高级shell。

Linux 桌面环境

  1. X Window
  2. KDE 桌面(K Desktop Environment,K 桌面系统)
  3. GNOME 桌面(the GNU Network Object Model Environment,GNU 网络对象模型桌面)
  4. Unity 桌面
  5. 其他桌面

    Table 3: 其他桌面
    桌面 描述
    Fluxbox  
    Xfce  
    JWM  
    Fvwm  
    fvwm95  

Linux 发行版 不同的 Linux 发行版通常归类为3种:

  1. 完整的核心 Linux 发行版

    Table 4: 完整的核心 Linux 发行版
    Slackware 最早的 Linux 发行版之一
    Red Hat 商业发行版
    Fedora Red Hat 分离出的家用发行版
    Gentoo 为高级 Linux 用户设计的发行版,仅包含 Linux 源代码
    openSuse 商用和家用的发行版
    Debian Linux 专家和商用 Linux 产品中流行的发行版
  2. 特定用途的发行版

    Table 5: 特定用途的发行版
    CentOS 一款基于 Red Hat 企业版 Linux 源代码构建的免费发行版
    Ubuntu 一款用于学校和家庭的免费发行版
    PCLinuxOS 一款用于学校和办公的免费发行版
    Mint 一款用于家庭娱乐的免费发行版
    dyne:bolic 一款用于音频和MIDI应用的免费发型版
    Puppy Linux 一款适用于老旧PC的小型免费发行版
  3. LiveCD 测试发行版。

    Table 6: LiveCD 测试发行版。
    Knoppix 最早的 LiveCD Linux
    PCLinuxOS 一款成熟的 LiveCD
    Ubuntu 为多种语言设计的世界级 Linux 项目
    Slax 基于 Slackware Linux
    Pubby Linux 为老旧 PC 设计的一款全功能 Linux

2.1.2. Linux 安装

  1. 安装准备
    • 首先,准备一个U盘,用来刻录系统(刻录命令:dd,用法格式:sudo dd if=xxx.iso of=/dev/sdb),到 https://www.debian.org/ 下载 iso 镜像,注意有最小版和完整版。
    • Windows 下的刻录软件推荐使用 UltraISO(对于新手,建议在 Windows 下完成刻录)。
  2. 插入U盘,开机,开始选择安装。
  3. 详细安装步骤,可参考 Debian 快速安装指导
  4. 安装完成后,查看 Linux 版本

    // 查看 Linux 内核版本
    $ cat /proc/version
    $ uname -a
    
    查看 Linux 系统版本
    $ lsb_release -a //这个命令适用于所有的Linux发行版,包括Redhat、SuSE、Debian…等发行版。
    $ cat /etc/redhat-release //这种方法只适合Redhat系的Linux
    $ cat /etc/issue //使用所有Linux版本
    
2.1.2.1. 扩展阅读:主机规划与磁盘分区(Disk Partition)
待补充
2.1.2.2. 扩展阅读:磁盘格式
  1. 自动挂载
    配置文件 /etc/fstab 用来定义需要自动挂载的文件系统,fstab 中每一行代表一个挂在配置,格式如下:

    Table 7: 自动挂载
    /dev/sda3 /mnt ext4 defaults 0 0
    需要挂载的设备 挂载点 文件系统 挂在选项 dump、fsck相关选项
2.1.2.3. 扩展阅读:文件系统
// 将 /dev/sda7 硬盘格式化为 ext3 格式。
$ mkfs -t ext3 -c /dev/sda7
2.1.2.4. 扩展阅读:磁盘配额(Disk Quota)应用实践
2.1.2.5. 扩展阅读:软件磁盘阵列(Software RAID)
2.1.2.6. 扩展阅读:逻辑卷管理器(Logical Volume Manager)

2.1.3. Linux 安装后的常见配置

2.1.3.1. su & sudo
// 先给 sudoers 文件加上写权限
$ sudo chmod +w /etc/sudoers
// 编辑,然后配置如下,根据个人喜好自行设定
$ vim /etc/sudoers
# Default timeout
Defaults        env_reset
Defaults        timestamp_timeout=60
# ...
root    ALL=(ALL:ALL) ALL
zrg     ALL=(ALL:ALL) ALL
# Allow user nopasswd
zrg     ALL=(ALL:ALL)NOPASSWD: ALL
# Allow zrg_test user to execute reboot command
zrg_test ALL=/sbin/shutdown -r now
# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

Linux 系统当中的身份变换,可能有以下几个原因:

  • 使用一般账号:系统平日操作的好习惯
  • 用较低权限启动系统服务
  • 软件本身的限制

su 是最简单的身份切换命令

  • -:单纯使用 - 如『 su - 』代表使用 login-shell 的变量文件读取方式来登陆系统;若使用者名称没有加上去,则代表切换为 root 的身份。
  • -l:与 - 类似,但后面需要加欲切换的使用者账号!也是 login-shell 的方式。
  • -m:-m 与 -p 是一样的,表示『使用目前的环境配置,而不读取新使用者的配置文件』
  • -c:仅进行一次命令,所以 -c 后面可以加上命令喔!
2.1.3.2. 配置 Wifi
  1. 查看无线(wireless)网卡(LAN)驱动(driver)

    $ sudo lsmod | grep iw
    
  2. 安装(Installing)无线网卡驱动

    $ sudo apt-get install firmware-iwlwifi wireless-tools
    
  3. 向内核(kernel)中加载/移除模块(modules)

    $  modprobe iwl4965
    
  4. 重启系统

    $ reboot
    
  5. 配置无线网络

    //查看无线网口(nerwork port)
    $ sudo iwconfig
    //开启无线网口
    $ sudo ifconfig wlan0 up
    //扫描(scaning)无线网络
    $ sudo iwlist wlan0 scan
    //连接无线网络
    $ sudo iwconfig wlan0 ESSID "wifi-name" KEY "password" open
    //执行上面的命令(command)后,发现并不能成功!!!
    //于是,通过如下命令继续配置
    //格式:wpa_passphrase <ssid> [passphrase]
    $ sudo wpa_passphrase "wifi-name" "passowrd">/etc/wpa_supplicant.conf
    $ sudo wpa_passphrase -B -i wlan0 -Dwext -c /etc/wpa_supplicant.conf
    //查看wlan0无线网口
    $ sudo iwconfig wlan0
    //执行命令获取到IP地址,成功连上WiFi
    $ sudo dhclient wlan0
    
  6. 开机自动连接WiFi配置

    $ sudo vim /etc/network/interfaces.d/wlan0
    
    auto wlan0
    allow-hotplug wlan0
    iface wlan0 inet dhcp
     wpa-conf /etc/wpa_supplicant.conf 
    
2.1.3.3. 配置软件安装源(source)
  • 以配置163源举例说明

    1. 访问域名:mirrors.163.com,找到镜像名为debian的目录,点击debian使用帮助。
    2. 根据最新的debian版本进行选择jessie,wheezy,squeeze。从最新版本到最低版本选择源
    3. 复制安装源文本到 /etc/apt/source.list 中。
    
    # mirrors.163.com
    deb http://mirrors.163.com/debian/ jessie main non-free contrib
    deb http://mirrors.163.com/debian/ jessie-updates main non-free contrib
    deb http://mirrors.163.com/debian/ jessie-backports main non-free contrib
    deb-src http://mirrors.163.com/debian/ jessie main non-free contrib
    deb-src http://mirrors.163.com/debian/ jessie-updates main non-free contrib
    deb-src http://mirrors.163.com/debian/ jessie-backports main non-free contrib
    deb http://mirrors.163.com/debian-security/ jessie/updates main non-free contrib
    deb-src http://mirrors.163.com/debian-security/ jessie/updates main non-free contrib
    
  • 其他安装源
2.1.3.4. 中文支持及中文输入法的配置
  1. 中文环境配置

    // 查看并设置环境变量
    $ echo $LANG
    $ export LANG=en_US.UTF-8
    // 没有安装 locales,先安装 locales
    $ sudo aptitude install locales
    
    // 配置中文编码
    $ sudo dpkg-reconfigure locales
    //选择编码(encode),space选择
    en_US.UTF-8
    zh_CN.GB2312
    zh_CN.GB18030
    zh_CN.GBK
    zh_CN.UTF-8
    
    // 文件配置
    $ sudo vim /etc/default/locate
    
    # LANG="zh_CN.UTF-8"
    # LANGUAGE="zh_CN:zh"
    LANG="en_US.UTF-8"
    LANGUAGE="en_US:en"
    
  2. 安装中文输入法

    ibus 或 UIM 或 SCIM 或 Fcitx
    
  3. 问题处理:Debian/Ubuntu 安装 Fcitx 及 Fcitx 输入中文不显示候选词框的解决办法

    // 安装 fcitx 组件(module)
    $ sudo apt-get install fcitx-tools fcitx-config* fcitx-data fcitx-frontend* fcitx-libs fcitx-module* fcitx-ui* presage
    
    // 安装 fcitx 输入法
    $ sudo apt install fcitx-pinyin
    $ sudo apt install fcitx-googlepinyin
    $ sudo apt install fcitx-table //五笔
    
    // 设置并运行
    $ export LANG=zh_CN.utf8
    $ export LC_CTYPE=zh_CN.utf8
    $ export LC_ALL=zh_CN.utf8
    $ export XMODIFIERS=@im=fcitx
    $ fcitx &
    ui 动态库的支持:
    $ sudo apt install fcitx-frontend-gtk2 fcitx-frontend-gtk3 fcitx-ui-classic
    
    重启可用
    
2.1.3.5. 日期时间设置
  1. 设置时区

    $ tzselect
    
    $ vim .profile
    
    TZ=’Asia/Shanghai’;
    export TZ
    
    $ source .profile
    
  2. 设置时间

    经过时区设置,一般情况下,时间已经切换为想要的时间了。以下是设置时间的命令:
    // hwclock 用于查看硬件时间。设置硬件时间:
    $ sudo hwclock -set -date='07/17/2017 20:00'
    // 设置硬件时间与系统时钟同步。
    $ sudo hwclock --hctosys(hc 代表硬件时间,sys 代表系统时间)
    $ sudo hwclock -systohc
    
    扩展知识点:
    1. Linux 时钟分为系统时钟(System Clock)和硬件时钟(Real Time Clock,简称 RTC)。
    2. 系统时钟指当前 Linux Kernel 中的时钟。
    3. 硬件时钟指主板上由电池供电的时钟,可在 BIOS 中进行设置。	
    
2.1.3.6. Linux 上挂载 NTFS 格式文件系统
  • 方案A:使用linux-ntfs

    // 1. 获取安装
    $ wget http://prdownloads.sourceforge.net/linux-ntfs/kernel-module-ntfs-2.6.18-92.el5-2.1.27-0.rr.10.11.x86_64.rpm
    $ sudo rpm -ivh kernel-module-ntfs-2.6.18-92.el5-2.1.27-0.rr.10.11.x86_64.rpm
    
    // 2. 检查 ntfs 模块是否被加载进系统
    $ /sbin/modprobe ntfs
    [没有输出则代表存在;否则(otherwise)将会有错误信息(error message)报出(report)]
    $ cat /proc/filesystems
    [ntfs应该出现在列表中]
    
    // 3. 查看NTFS系统的编号
    /sbin/fdisk -l |grep NTFS 
    
    // 4. 创建目录
    $ sudo mkdir -p /mnt/win_ntfs
    $ sudo mount -t ntfs /dev/sda1 /mnt/win_ntfs
    
  • 方案B:使用fuse和ntfs-3g

    // 1. 获取
    $ wget http://downloads.sourceforge.net/project/fuse/fuse-2.X/2.7.4/fuse-2.7.4.tar.gz?use_mirror=ncu
    $ wget http://www.ntfs-3g.org/ntfs-3g-2009.4.4.tgz
    
    // 2. 编译安装
    $ tar -zxf fuse-2.7.4.tar.gz
    $ ./configure --prefix=/usr/local/fuse-2.7.4
    $ sudo make 
    $ sudo make install
    $ tar -zxf ntfs-3g-2009.4.4.tgz
    $ ./configure --prefix=/usr/local/ntfs-3
    $ sudo make 
    $ sudo make install 
    
    // 3. 检查fuse模块是否被加载进系统
    $ /sbin/modprobe fuse
    [没有输出则代表存在;否则将会有错误信息报出]
    $ cat /proc/filesystems
    [fuse应该出现在列表中]
    
    // 4. 查看NTFS系统的编号 
    $ sudo fdisk -l |grep NTFS 
    
    // 5. 挂载
    $ mount ntfs-3g /dev/sda1 /mnt/win_ntfs
    
  • 方案C:自动挂载 NTFS 格式硬盘

    // 1. 安装 ntfs-3g
    $ sudo apt-get install ntfs-3g
    
    // 2. 编辑 /etc/fstab
    // 先查看磁盘 UUID
    $ sudo /sbin/blkid /dev/sda1
    $ sudo vim /etc/fstab
    
    /dev/sdb1 /mnt/ntfs/ ntfs nls-utf8,umask-0222,uid-1000,gid-1000,ro 0 0    
    # Notice:
    # If /dev/sdb1 path will change due to system configuration, I recommend that you use the UUID (Universally Unique Identifier) of the partition. To find the UUID of /dev/sdb1, enter:
    # 翻译:/dev/sdb1 路径会随着系统配置而改变,建议使用 UUID (通用唯一标识符)
    # Note down the UUID value and update /etc/fstab as follows:
    # 翻译:记录下 UUID,更新 /etc/fstab 文件。
    # syntax
    # UUID="YOUR-UID-HERE" /mnt/ntfs/ ntfs nls-utf8,umask-0222,uid-1000,gid-1000,ro 0 0
    UUID="c2dbc0c5-a8fc-439e-aa93-51b0a61372e8" /mnt/ntfs/ ntfs nls-utf8,umask-0222,uid-1000,gid-1000,ro 0 0
    # Owning entire file system
    UUID="c2dbc0c5-a8fc-439e-aa93-51b0a61372e8" /mnt/ntfs/ ntfs uid-1000,gid-1000 0 0
    
    // 3. 创建目录
    $ sudo mkdir -p /mnt/ntfs
    
    // 4. 测试(Test)可用性
    $ sudo mount -a
    $ df -h
    $ cd /mnt/ntfs
    $ ls -l
    
    // 5. 卸载NTFS分区
    $ sudo umount /mnt/ntfs
    // or
    $ sudo umount /dev/sda1
    
    // 6. 注意错误信息:“Read-only file system”提示
    $ sudo  mv 05Music/ /mnt/sda/sda2/
    /bin/mv: inter-device move failed: '05Music/' to '/mnt/sda/sda2/05Music'; unable to remove target: Read-only file system
    解决办法:参照第2步
    
  • 参考资料 How To Debian/Ubuntu Linux Auto Mount Windows NTFS File System NTFS-3G fstab (简体中文) NTFS-3G (简体中文)
2.1.3.7. boot 加载选项修改
// 注释不需要的加载项!
$ sudo chmod +w /boot/grub/grub.cfg
$ sudo vim /boot/grub/grub.cfg
2.1.3.8. 使用 ssh 远程连接常见配置
2.1.3.8.1. 配置 SSH 持久连接 Server
  • Server 端

    $ sudo vim /etc/ssh/sshd_config
    
    #server每隔60秒发送一次请求给client,然后client响应,从而保持连接
    ClientAliveInterval 60  
    #server发出请求后,客户端没有响应得次数达到3,就自动断开连接,正常情况下,client不会不响应。
    ClientAliveCountMax 3
    
  • Client 端

    $ sudo vim /etc/ssh/ssh_config
    
    #server每隔60秒发送一次请求给client,然后client响应,从而保持连接
    ServerAliveInterval 60  
    #server发出请求后,客户端没有响应得次数达到3,就自动断开连接,正常情况下,client不会不响应。
    ServerAliveCountMax 3
    
2.1.3.8.2. 如何使用 OpenSSL 生成密钥对?
// 生成私钥
$ openssl genrsa -out rsa_private_key.pem 1024
参数:genrsa 生成密钥   -out 输出到文件  rsa_private_key.pem 文件名  1024 长度
// 从私钥中提取公钥
$ openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
参数: rsa 提取公钥  -in 从文件中读入  rsa_private_key.pem 文件名   -pubout  输出   -out 到文件  rsa_public_key.pem  文件名
2.1.3.8.3. 修改 SSH 默认端口号
// 首先,修改配置文件:
$ vim /etc/ssh/sshd_config
Port 22 Port 6666   

注意事项

  • 这里添加6666端口,测试成功连接后,再去除22端口配置。这样可以避免修改不成功无法正常登录。
  • 所修改的端口需要事先查明未被其他服务占用,以免造成不可估计的后果!
2.1.3.8.4. 通过密钥登录服务器
  1. 第一步,生成密钥对

    $ ssh-keygen
    
    Generating public/private rsa key pair.
    Enter file in which to save the key (/home/zrg/.ssh/id_rsa):
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /home/zrg/.ssh/id_rsa.
    Your public key has been saved in /home/zrg/.ssh/id_rsa.pub.
    The key fingerprint is:
    SHA256:OEEJVicOORWU5awcPz7oYPtldQwQXdwuPFyUcVY0umU zrg@DESKTOP-5IIDIKQ
    The key's randomart image is:
    +---[RSA 2048]----+
    |    +*B==o o.oo=*|
    |   .o+o= .. . =o.|
    |     .+ o .o + E |
    |     . *   o= =  |
    |      = S . o+   |
    |       + o .     |
    |    o . =        |
    |   . + o .       |
    |    ..o          |
    +----[SHA256]-----+
    
    // 如果客户端要访问多台服务器时,可进行如下操作:
    // 第一种方式:手动指定
    $ ssh user@host -i ~/.ssh/id_rsa
    
    // 第二种方式:配置客户端,/etc/ssh/ssh_config
    
    IdentityFile ~/.ssh/id_rsa
    IdentityFile ~/.ssh/github_id_rsa
    
    // 第三种方式:使用 SSH Agent
    
    # Default github user
    Host login-zrg
    HostName github.com
    User zrg
    IdentityFile ~/.ssh/id_rsa
    
    # jsf user
    Host login-jsf
    HostName github.com
    User jsf
    IdentityFile ~/.ssh/id_rsa_jsf
    
  2. 第二步,在服务器上配置上公钥

    // 将生成的公钥存入服务器的 ~/.ssh/authorized_keys 文件中,多个换行。
    $ cat ~/.ssh/id_rsa.pub >> authorized_keys
    $ chmod 600 ~/.ssh/authorized_keys
    $ chmod 700 ~/.ssh
    
  3. 第三步,配置ssh,打开密钥登录功能

    $ vim /etc/ssh/sshd_config
    
    # 允许用户使用密钥登录
    RSAAuthentication yes
    PubkeyAuthentication yes
    # 允许 root 用户通过 SSH 登录
    PermitRootLogin yes
    # 当完成全部设置,以密钥方式登录成功后,可以禁用密码登录
    PasswordAuthentication no
    
  4. 第四步,重启ssh服务

    // 配置完成后,重启 sshd 服务
    $ systemctl restart sshd.service     
    
2.1.3.8.5. 扩展阅读:SSH & OpenSSH & SSL & OpenSSL 的关系
  • SSL(Secure Sockets Layer),是网络通信提供安全及数据完整性的一种安全协议,它涉及所有TC/IP应用程序。SSL协议使用通讯双方的客户证书以及CA根证书,允许客户/服务器应用以一种不能被偷听的方式通讯,在通讯双方间建立起了一条安全的、可信任的通讯通道。它具备以下基本特征:信息保密性、信息完整性、相互鉴定。 主要用于提高应用程序之间数据的安全系数。
  • OpenSSL,对SSL的实现。
  • SSH(Secure Shell),意为“安全外壳协议”,是一种可以为远程登录提供安全保障的协议。使用SSH,可以把所有传输的数据进行加密,“中间人”攻击方式就不可能实现,能防止DNS欺骗和IP欺骗。
  • OpenSSH,对SSH的实现。依赖于OpenSSL,没有OpenSSL的话OpenSSH就编译不过去,也运行不了。
    • HTTPS(Hypertext Transfer Protocol Secure,超文本传输安全协议),是一种透过计算器网上进行安全通信的传输协议。HTTPS经由HTTP进行通信,但利用SSL/TLS来加密数据包。HTTPS开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。
2.1.3.8.6. 扩展阅读:其他远程连接工具
VNC、XDMCP 和 RDP
2.1.3.9. 使用 scp 命令上传下载文件
scp 命令
scp命令用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的。可能会稍微影响一下速度。当你服务器硬盘变为只读read only system时,用scp可以帮你把文件移出来。另外,scp还非常不占资源,不会提高多少系统负荷,在这一点上,rsync就远远不及它了。虽然 rsync比scp会快一点,但当小文件众多的情况下,rsync会导致硬盘I/O非常高,而scp基本不影响系统正常使用。
(no term)

语法

scp(选项)(参数)
选项:
-1:使用ssh协议版本1;
-2:使用ssh协议版本2;
-4:使用ipv4;
-6:使用ipv6;
-B:以批处理模式运行;
-C:使用压缩;
-F:指定ssh配置文件;
-l:指定宽带限制;
-o:指定使用的ssh选项;
-P:指定远程主机的端口号;
-p:保留文件的最后修改时间,最后访问时间和权限模式;
-q:不显示复制进度;
-r:以递归方式复制。

参数:
- 源文件:指定要复制的源文件。
- 目标文件:目标文件。格式为user@host:filename(文件名为目标文件的名称)。
(no term)

从服务器上下载文件

$ scp username@servername:/path/filename /var/www/
// 示例:从 192.168.0.101 上的 /var/www/test.txt 的文件下载到 /var/www/ 目录中
$ scp root@192.168.0.101:/var/www/test.txt
(no term)

从服务器下载整个目录

$ scp -r username@servername:/var/www/remote_dir/ /var/www/local_dir
例如:scp -r root@192.168.0.101:/var/www/test  /var/www/test
(no term)

上传本地文件到服务器

$ scp /path/filename username@servername:/path   
例如把本机 /var/www/ 目录下的 test.php 文件上传到 192.168.0.101 这台服务器上的 /var/www/ 目录中
$ scp /var/www/test.php  root@192.168.0.101:/var/www/
(no term)

上传目录到服务器

$ scp  -r local_dir username@servername:remote_dir
例如:scp -r test  root@192.168.0.101:/var/www/ 把当前目录下的test目录上传到服务器的 /var/www/ 目录
2.1.3.10. 改变 Home 目录下的目录中文名称为英文
  • 方法1

    $ vim ~/.config/user-dirs.dirs
    
    XDG_DESKTOP_DIR="$HOME/Desktop"
    XDG_DOWNLOAD_DIR="$HOME/Download"
    XDG_TEMPLATES_DIR="$HOME/Template"
    XDG_PUBLICSHARE_DIR="$HOME/Public"
    XDG_DOCUMENTS_DIR="$HOME/Document"
    XDG_MUSIC_DIR="$HOME/Music"
    XDG_PICTURES_DIR="$HOME/Picture"
    XDG_VIDEOS_DIR="$HOME/Video"
    
  • 方法2

    $ export LANG=en_US
    xdg-user-dirs-gtk-update
    

2.2. Linux 目录结构

cs2.png

2.3. Linux 命令

2.3.1. Linux 常用命令

// 获取帮助的命令
info, help, man, type
// 日期时间
date, hwclock, cal, uptime
// 输出、查看命令
echo, cat, head, tail, less, more
// 查看硬件信息
lspci, lsusb, lsmod
// 关机、重启、注销
shutdown, reboot, poweroff, init, logout
// 归档、压缩
zip, unzip, gzip, tar
// 查找
find,locate,which,where,wc
// 查询用户
w、who、last、lastlog
// 用户交流
write、mesg、wall
// 用户邮箱
mail

2.3.2. Linux 常见网络命令

网络参数设定命令:ifconfig,ifup,ifdown,route,ip,iwlist,iwconfig,dhclient
网络检错与观察指令:wall(发送广播信息),ping,traceroute(追踪数据包到主机间的路径),netstat,host,nslookup
连接指令:telnet,ftp,lftp,sftp
文字浏览器:links
下载器:wget,axel
封包撷取:tcpdump,wireshark,nc,netcat,write
邮件发送:mail
2.3.2.1. netstat 命令
# 查看主机对外开放端口
$ netstat -ntlp
# 查看本机监听的端口
$ netstat -tlun
# 查看本机所有的网络连接
$ netstat -ano
# 查看本机路由表
$ netstat -rn
2.3.2.2. nc 命令
  1. 介绍

    netcat是网络工具中的瑞士军刀,它能通过TCP和UDP在网络中读写数据。通过与其他工具结合和重定向。
    netcat所做的就是在两台电脑之间建立链接并返回两个数据流。你能建立一个服务器,传输文件,与朋友聊天,传输流媒体或者用它作为其它协议的独立客户端。
    
  2. 安装

    // Redhat/CentOS/Fedora
    $ yum install nc
    // Debian/Ubuntu
    $ sudo apt-get install netcat
    
  3. 常见使用

    端口扫描经常被系统管理员和黑客用来发现在一些机器上开放的端口,帮助他们识别系统中的漏洞。
    $ nc -z -v -n 172.31.100.7 21-25
    可以运行在TCP或者UDP模式,默认是TCP,-u参数调整为udp.
    z 参数告诉netcat使用0 IO,连接成功后立即关闭连接, 不进行数据交换(谢谢@jxing 指点)
    v 参数指使用冗余选项(译者注:即详细输出)
    n 参数告诉netcat 不要使用DNS反向查询IP地址的域名
    
    Banner是一个文本,Banner是一个你连接的服务发送给你的文本信息。
    一旦你发现开放的端口,你可以容易的使用netcat 连接服务抓取他们的banner。
    $ nc -v 172.31.100.7 21
    
    • 聊天工具

      // Server
      $ nc -l 1234
      // Client
      $ nc 172.168.100.7 1234
      
    • 文件传输

      // Server > Client
      $ nc -l 1234 > file.txt
      $ nc 172.168.100.7 1234 <file.txt
      
    • 目录传输

      // Server > Client
      $ tar -cvf - dir_name | nc -l 1234
      $ nc -n 172.168.100.7 1234 | tar -xvf -
      这里在A服务器上,我们创建一个tar归档包并且通过-在控制台重定向它,然后使用管道,重定向给netcat,netcat可以通过网络发送它。
      在客户端我们下载该压缩包通过netcat 管道然后打开文件。
      如果想要节省带宽传输压缩包,我们可以使用bzip2或者其他工具压缩。
      // Server
      $ tar -cvf – dir_name| bzip2 -z | nc -l 1234
      // Client
      $ nc -n 172.31.100.7 1234 | bzip2 -d |tar -xvf -
      
    • 加密网络传输数据

      // Server
      $ nc localhost 1234 | mcrypt –flush –bare -F -q -d -m ecb > file.txt
      // Client
      $ mcrypt –flush –bare -F -q -m ecb < file.txt | nc -l 1234
      
    • 流视频

      // Server
      $ cat video.avi | nc -l 1234
      从一个视频文件中读入并重定向输出到netcat客户端
      // Client
      $ nc 172.31.100.7 1234 | mplayer -vo x11 -cache 3000 -
      从socket中读入数据并重定向到mplayer。
      
    • 克隆一个设备

      已经安装配置一台Linux机器并且需要重复同样的操作对其他的机器,而你不想在重复配置一遍。
      假如你的系统在磁盘/dev/sda上:
      // Server
      $ dd if=/dev/sda | nc -l 1234
      // Client
      $ nc -n 172.31.100.7 1567 | dd of=/dev/sda
      dd是一个从磁盘读取原始数据的工具,我通过netcat服务器重定向它的输出流到其他机器并且写入到磁盘中,它会随着分区表拷贝所有的信息。
      但是如果我们已经做过分区并且只需要克隆root分区,我们可以根据我们系统root分区的位置,更改sda 为sda1,sda2.等等。
      
  4. 参考资料

    https://blog.csdn.net/zhangxiao93/article/details/52705642
    

2.3.3. Linux 文件权限(Permission)

2.3.3.1. 理解
  1. 使用文件权限符

    $ ls -lh
    

    drwxr-xr-x 3 zrg zrg 4.0K Apr 21 16:24 练手项目 -rw-r–r– 1 zrg zrg 2.5M Apr 21 11:51 练手项目.rar

    Table 8: 解释
    d rwxr-xr-x 3 zrg zrg 4.0K Apr 21 16:24 练手项目
    文件类型。 文件权限。 对于普通文件:链接数 用户名 组名 文件大小,单位:字节 最后修改日期时间 文件名
    d 目录文件 从左往右分别代表所有者权限、组用户权限和其他用户权限 对于目录文件:第一级子目录数          
    - 普通文件 r 可读            
    l 链接文件 w 可写            
    c 字符型设备文件 x 可执行            
    b 块设备文件 - 无执行权限            
    n 网络设备文件              
    s 套接字文件              
  2. 默认文件权限
    umask 命令用来设置所创建文件和目录的默认权限。
2.3.3.2. 共享文件(Share File)

Linux 为每个文件和目录存储了3个额外的信息位。

  • 设置用户ID(SUID)
  • 设置组ID(GID)
  • 粘着位:进程结束后文件还驻留(粘着)在内存中。
Table 9: chmod SUID、SGID和粘着位的八进制值
二进制值 八进制值 描述
000 0 所有位都清零
001 1 粘着位置位
010 2 SGID位置位
011 3 SGID位和粘着位都置位
100 4 SUID位置位
101 5 SUID位和粘着位都置位
110 6 SUID位和SGID都置位
111 7 所有位都置位

创建一个共享目录

$ mkdir testdir
$ chgrp shared testdir
$ chmod g+s testdir
$ umask 002
$ cd testdir
$ touch testfile

2.3.4. Linux 文件搜索

2.3.4.1. find 命令

find 命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则 find 命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。

  • 根据文件名查找

    格式:find [搜索范围][匹配条件]
    
    // 默认在当前目录下搜索
    $ find -name "MyCProgram.c"
    // 忽略大小写
    $ find -iname "MyCProgram.c"
    // 查找以my开头,后面包含三个字符的文件
    $ find -name my??? 
    
    // 深度查找
    // 在 root 目录及其子目录下查找 passwd 文件。
    $ sudo find / -maxdepth 2 -name passwd
    // 在第二层子目录和第四层子目录之间查找 passwd 文件。
    $ sudo find / -mindepth 3 -maxdepth 5 -name passwd
    
    // 找到 home 目录及子目录下所有的空文件(0字节文件) 
    $ find ~/ -empty
    // 列出你 home 目录里的空文件。
    $ find ~/ -maxdepth 1 -empty
    // 列出 home目录下的非隐藏空文件。
    $ find ~/ -maxdepth 1 -empty -not -name ".*"
    
    // 相反匹配
    // 显示所有的名字不是 MyCProgram.c 的文件或者目录。
    $ find -maxdepth 1 -not -iname "MyCProgram.c"
    
    // 在查找到的文件上执行命令
    // 在查找到名为“MyCProgram.c”的文件上计算 MD5 验证和。
    $ find -iname "MyCProgram.c" -exec md5sum {} \;
    // 在 /etc 目录下查找 inittab 文件并显示其详细属性
    $ sudo find /etc -name initab -exec ls -l {} \;
    // 注意:{} 将会被当前文件名取代。
    -exec/-ok <command> {} \; 对搜索结果执行操作,使用 -ok 会询问是否确认。
    
  • 文件大小查找

    格式:+n 大于;-n 小于;n 等于
    // 在 root 目录下查找大于100MB的文件
    $ sudo find / -size +204800
    // 注意:在 Linux 里面,1 数据块 = 512 byte = 0.5 KB,100 MB = 102400 KB = 204800 数据块
    
    // 在 /etc 目录下查找大于 80MB 小于 100MB 的文件
    $ sudo find /etc -size +163840 -a size -204800
    -a 表示两个条件同时满足
    -o 表示两个条件满足一个即可
    
    // 列出当前目录及子目录下的 5个最大的文件。这会需要一点时间,取决于命令需要处理的文件数量。
    $ find . -type f -exec ls -s {} \; | sort -n -r | head -5
    // 查找 5个最小的文件
    $ find . -type f -exec ls -s {} \; | sort -n  | head -5
    // 上面的命令中,很可能你看到的只是空文件(0字节文件)。因此,你可以使用下面的命令列出最小的文件,而不是 0字节文件。
    $ find . -not -empty -type f -exec ls -s {} \; | sort -n  | head -5
    
    //查找并删除大于 100M 的 *.zip 文件。
    $ find / -type f -name *.zip -size +100M -exec rm -i {} \;
    // 注意:{} 和 \ 之间是有空格的!
    
  • 根据文件变动情况查找

    // 在/etc目录下查找5分钟内被修改过属性的文件和目录
    $ sudo /etc -cmin -5
    -amin 访问时间 access
    -cmin 文件属性 change
    -mmin 文件内容 modify
    
    // 显示所有的在 ordinary_file 之后创建修改的文件。
    $ ls -lrt
    $ find -newer ordinary_file
    
  • 根据文件类型查找

    // f 文件,d 目录,l 软链接,s socket文件
    // 查找所有的一般文件
    $ find ./ -type f
    
    // 查找所有的隐藏文件和目录
    $ find ./ -type f -name ".*"
    $ find ./ -type d -name ".*"
    
  • 根据文件权限、所属关系查找

    $ find /home -user zrg
    $ find /home -group zrg
    
    // 查到当前目录下对同组用户具有读权限的文件
    $ find ./ -perm -g=r -type f -exec ls -l {} \;
    // 找到对组用户具有只读权限的文件。
    $find ./ -perm g=r -type f -exec ls -l {} \;  
    // 找到对组用户具有只读权限的文件(使用八进制权限形式)。
    $ find ./ -perm 040 -type f -exec ls -l {} \;
    
  • 使用 inode 编号查找

    // 任何一个文件都有一个独一无二的 inode 编号,借此我们可以区分文件。
    // 使用选项 -i,可以看到文件的 inode 编号,借此可以区分这两个文件。
    $ ls -i1 test*
    16187429 test-file-name
    16187430 test-file-name
    // 使用 inode 编号来删除那些具有特殊符号的文件名。
    $ find -inum 16187430 -exec rm {} \;
    
2.3.4.2. locate 命令

该命令建立了一个文件资料库,查找文件时直接在资料库中查找。类似 Windows 下的 Everything 工具。

// 安装:
$ sudo apt install mlocate
// 使用
$ locate init
// 注意:locate 命令不会查找 /tmp 目录下内容。
// 更新文件资料库:
$ updatedb

2.3.5. Linux 文本处理

grep,sed,awk
2.3.5.1. grep
语法格式:grep -iv [指定字符串][文件]
-i 不区分大小写
-o 正则匹配指定内容
-v 排除指定字符串
// 查找指定字符串的行并显示
$ grep 123 test.txt
// 查找匹配到的内容
$ grep -o 'engine\[\0-9a-z]*\]'
// 打印没有匹配到的行
$ grep -v ^# config.txt
2.3.5.2. sed


一款几乎包括所有 UNIX 体系的轻量级流编辑器,主要用来进行数据的提取、替换、删除、新增。

// 查看文件的第2行
$ sed -n '2p' test.txt
// 删除从第2行到第4行的数据
$ sed '2,4d' test.txt
// 在第2行追加hello
$ sed '2a hello' test.txt
// 在第2行前插入两行数据
$ sed '2i hello \
wold' test.txt
// 数据替换
$ sed '2c No such person' test.txt

字符串替换

// g 表示全文替换
$ sed 's/oldStr/newStr/g' fileName
// 将某个目录下的所有文件中的某个字符进行替换成新字符串,格式如下:
$ sed -i 's/oldStr/newStr/g' `grep oldStr -rl /path`
2.3.5.3. awk


对文件内容进行统计,适合处理格式化数据,比如表格

// 打印第一切片和第四切片内容
$ awk '{print $1,$4}' netstat.txt
// 打印以逗号为分隔符分隔,并打印第二列
$ awk -F "," '{print $2}' test.txt
$ awk '$1=="tcp" && $2==1 {print $0}' netstat.txt
$ grep 'partial\[true\]' test.log |grep -o 'engine\[[0-9a-z]*\]' | awk '{enginearr[$1]++}END{for(i in enginearr)print i "\t" enginearr[i]}'

2.3.6. Linux 压缩(Compression)和打包(Packaging)

tar.png

另外还有不常见的,但时有遇到:
.tar.xz
$ tar xpvf file.tar.xz
.tgz
$ tar zxf  name.tgz

//解压到指定目录
$ unzip name.zip -d ./dir

2.3.7. 扩展阅读:关机和重启及系统运行级别

  1. 关机/重启命令

    $ sudo shutdown -r now
    // 其他重启命令
    halt, poweroff, init 0
    $ sudo reboot
    $ sudo init 6
    // 注销命令
    logout
    
  2. 系统运行级别

    Table 10: 系统运行级别
    级别 描述
    0 关机,不允许设置为初始化默认值
    1 单用户模式
    2 不完全多用户,不含NFS服务
    3 完全多用户
    4 未分配
    5 图形界面
    6 重启,不允许设置为初始化默认值
    $ cat /etc/initable
    // 查看系统运行级别
    $ sudo runlevel
    

2.3.8. 扩展阅读:解决问题 & 获取帮助

2.3.8.1. man 命令

查看在线帮助手册(an interface to the on-line reference manuals),如果不记得命令名怎么办?可以使用关键字搜索手册页。

$ man -k terminal
Table 11: Linux 手册页惯用的节名
描述
Name 显示命令和一段简短的描述
Synopsis 命令的语法
Configuration 命令配置信息
Description 命令的一般性描述
Options 命令选项描述
Exit Status 命令的推出状态指示
Return Value 命令的返回值
Errors 命令的错误信息
Environment 描述所使用的环境变量
Files 命令用到的文件
Versions 命令的版本信息
Conforming To 命令所遵从的标准
Notes 其他有帮助的资料
Bugs 提供提交Bug的途径
Example 展示命令的用法
Authors 命令开发人员的信息
Copyright 命令源代码的版权状况
See Also 与该命令类似的其他命令
Table 12: Linux 手册页的内容区域
区域号 所涵盖的内容
1 可执行程序或shell命令
2 系统调用
3 库调用
4 特殊文件
5 文件格式与约定
6 游戏
7 概览、约定及杂项
8 超级用户和系统管理员命令
9 内核例程
2.3.8.2. 解决问题思路
  1. 出现问题,先保护现场。(问题一种是已正确运行的系统出问题,另一种是新的操作或配置造成了问题)
  2. 当怀疑有黑客入侵或病毒的情况,马上做日志备份。
  3. 检查相关日志。
  4. 对于新的操作或配置造成的问题,最好是养成定期备份重要文件的习惯。
  5. 使用网络
  6. 使用搜索命令:find,locate,whereis,…

2.3.9. 扩展阅读:通过历史记录简化操作

!! 重复前一个命令
!字符 重复前一个以“字符”开头的命令
!num 按照历史记录的序号执行命令
!?abc 重复之前包含 abc 的命令
!-n 重复 n 个命令之前的那个命令

3. Linux 账号管理与 ACL 权限控制

3.1. Linux 用户管理

3.1.1. Linux User & Group

// 新增一个用户
$ sudo useradd test
// 新建一个用户,指定默认值或默认行为
$ sudo useradd -u 666 -G root,bin -c "test user" -d /home/test -s /bin/bash test
// 删除用户
// 注意:默认情况下,userdel命令只会删除/etc/passwd文件中的用户信息,而不会删除系统中属于该账户的任何文件。
$ userdel -r test
// 加上 -r 参数,userdel 会删除用户的 HOME 目录以及邮件目录,但必须在删除之前检查清楚(比如是否存放了其他用户或其他程序的重要文件)。
// 修改用户信息
Table 13: 用户账户修改工具
命令 描述
usermod 修改用户账户的字段,指定主要组以及附加组的所属关系
passwd 修改已有用户的密码
chpasswd 从文件中读取登录名密码对,并更新密码
chage 修改密码的过期时间
chfn 修改用户账户的备注信息
chsh 修改用户账户的默认登录shell
// 修改用户密码
  • -S 查询用户密码的状态,仅root用户可用。
  • -l 暂时锁定用户。仅root用户可用。
  • -u 解锁用户。仅root用户可用。
  • –stdin 通过管道符输出的数据作为用户的密码。
// 显示用户最近登录信息
last,lastlog
// 列出目前/过去登入系统的用户信息
last, lastb
// 创建、修改和删除组
$ sudo groupadd shared
$ sudo groupmod -n sharing shared
$ sudo groupdel shared
// 加入组和从组里删除
$ sudo gpasswd -a test tests
$ sudo gpasswd -d test tests   

3.1.2. 扩展阅读:user/group 文件

  1. /etc/passwd

    $ cat /etc/passwd
    
    root:x:0:0:root:/root:/bin/bash
    daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
    bin:x:2:2:bin:/bin:/usr/sbin/nologin
    # ...
    zrg:x:1000:1000:zrg,,,:/home/zrg:/bin/bash
    

    /etc/passwd 字段信息

    • 登录用户名
    • 用户密码
    • UID
    • Group ID
    • 描述
    • HOME目录位置
    • 默认shell

    特别说明

    • /etc/passwd 文件中的密码字段都被设置成了x,多数 Linux 系统都将用户密码保存在 /etc/shadow 文件中,只有特定的程序(比如登录程序)才能访问这个文件。
    • 一般情况下,不建议直接手动在 /etc/passwd 文件里进行用户管理(比如添加、修改或删除用户账户)。用标准的 Linux 用户管理工具去执行这些操作就会安全许多。
  2. /etc/shadow
    /etc/shadow 字段信息
    • 与/etc/passwd文件对应的登录名
    • 加密后的密码
    • 自上次修改密码后过去的天数密码(自1970年1月1日开始计算)
    • 多少天后才能更改密码
    • 多少天后必须更改密码
    • 密码过期前提前多少天提醒用户更改密码
    • 密码过期后多少天禁用用户帐目
    • 用户账户被禁用的日期(用自1970年1月1日到当天的天数表示)
    • 预留字段给将来使用
  3. /etc/default/useradd

    // See below, the subsection "Changing the default values".
    $ sudo useradd -D
    or
    $ sudo less /etc/default/useradd
    
    GROUP=100 //用户默认组,新用户被添加到GID为100的公共组
    HOME=/home //HOME目录位置
    INACTIVE=-1 //密码过期宽限天数,密码过期后不会被禁用
    EXPIRE= //密码失效时间,未被设置过期日期,密码失效与 /etc/login.defs 默认文件相关。
    SHELL=/bin/sh //将sh作为默认shell
    SKEL=/etc/skel //模板目录,会将/etc/skel目录下的内容复制到用户的HOME目录下
    CREATE_MAIL_SPOOL=no //是否为该用户账户在mail目录下创建一个用于接收邮件的文件
    
  4. /etc/group
    字段信息
    • 组名
    • 组密码
    • GID
    • 属于该组的用户列表,当一个用户在/etc/passwd文件中指定某个组作为默认组时,用户账户不会作为该组成员再出现在/etc/group文件中。
  5. /etc/gshadow

    • /etc/group 的加密资讯文件,比如用户组(Group)管理密码就是存放在这个文件。
    • /etc/gshadow 和/etc/group 是互补的两个文件;对于大型服务器,针对很多用户和组,定制一些关系结构比较复杂的权限模型,设置用户组密码是极有必要的。比如我们不想让一些非用户组成员永久拥有用户组的权限和特性,这时我们可以通过密码验证的方式来让某些用户临时拥有一些用户组特性,这时就要用到用户组密码。

    字段信息

    $ sudo less /etc/gshadow
    组名:用户组的名称,由字母或数字构成。
    口令:用户组密码,这个段可以是空的或!,如果是空的或有!,表示没有密码。
    组管理者:这个字段也可为空,如果有多个用户组管理者,用,号分割。
    组内用户列表:如果有多个成员,用,号分割 ;
    
  6. 其他文件

    Home 目录
    超级用户:/root/
    普通用户:/home/zrg/
    
    用户邮箱目录
    /var/spool/mail/zrg/
    
    在创建用户时,默认复制该目录下的文件到用户的家目录。
    /etc/skel
    

3.2. Linux 权限规划(Authority Division): ACL 权限控制

  1. 什么是 ACL?
    ACL 是 Access Control List 的缩写,主要的目的是在提供传统的 owner,group,others 的 read,write,execute 权限之外的细部权限配置。
    ACL 主要可以针对哪些方面来控制权限呢?它主要可以针对以下几个项目:
    • 使用者 (user):可以针对使用者来配置权限;
    • 群组 (group):针对群组为对象来配置其权限;
    • 默认属性 (mask):还可以针对在该目录下在创建新文件/目录时,规范新数据的默认权限;
  2. 如何开启 ACL?
    查看 /dev/sdb1 分区 ACL 权限是否开启。

    $ sudo dumpe2fs -h /dev/sdb1
    //找到"Default mount options",查看是否有临时开启分区 ACL 权限
    

    重新挂载根分区,并挂载加入 acl 权限。

    $ sudo mount -o remount,acl /
    

    永久开启分区 ACL 权限

    $ sudo vim /etc/fstab
    
    UUID=e50dea0a-bcb6-4921-8762-dd96782846dd / ext4 defaults,acl 0 1     
    

    注意:目前多数 Linux 系统 defaults 默认已经支持 acl 开启了,所以只需要添加 defaults 选项就可以了。重新挂载文件系统或重启系统,使修改生效。

    $ sudo mount -o remount /
    
  3. 设定 ACL 权限
    • 使用 setfacl 命令设定 ACL 权限
      示例:构建听课权限组,为特定用户设定 ACL 权限

      # useradd wang
      # useradd li
      # useradd zhao
      # groupadd coursegroup
      # mkdir /project
      # chown root:coursegroup /project/
      # chmod 770 /project
      # setfacl -m u:zhao:rwx /project
      
    • 使用 getfacl 命令获取 ACL 设定信息

      格式: getfacl filename
      # getfacl abc.txt
      
    • 针对有效权限(effective permission) mask 的设定

      有效权限: 使用者或群组所配置的权限必须要存在于 mask 的权限配置范围内才会生效。
      配置规范:『 m:[rwx] 』,例如针对某个文件规范为仅有 rx :
      # setfacl -m m:rx /project/testfile
      
    • 针对默认权限和递归(针对目录/子目录下的所有文件)权限的设定

      配置规范:『 d:[ug]:使用者列表:[rwx] 』
      # setfacl -m d:u:zhao:rx -R /project
      

4. Linux 系统管理

4.1. Linux 启动管理

4.2. Linux 计划任务(例行性工作排程)

4.2.1. crontab

  1. crontab 能做什么

    你肯定希望:
         每一天早上 8:00 钟,让电脑连接上音响,并播放音乐来唤你起床;
         而中午 12:00 希望 Linux 可以发一封信到你的邮件信箱,提醒你可以去吃午餐了;
         另外,在每年你爱人生日的前一天,先发封信提醒你,以免忘记这么重要的一天。
    
    开发者:
         每天凌晨3点,定时备份数据库;
         每天晚上12点,开始执行自动对账任务。
    
  2. crontab 简介
    • crontab命令被用来提交和管理用户的需要周期性执行的任务,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。
    • 选项

      -e:编辑该用户的计时器设置;
      -l:列出该用户的计时器设置;
      -r:删除该用户的计时器设置;
      -u<用户名称>:指定要设定计时器的用户名称。
      
    • crond 服务

      /sbin/service crond start    //启动服务
      /sbin/service crond stop     //关闭服务
      /sbin/service crond restart  //重启服务
      /sbin/service crond reload   //重新载入配置
      
  3. crontab 基本格式

    Table 14: 格式
    \ * * * * * commond
    代表意思 分(minute) 时(hour) 日(day) 月(month) 周(week)  
    范 围 (0-59) (0-23) (1-31) (1-12) (0-6)  
    • “ * ”代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
    • “ , ”表示分割,可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”。
    • “ - ”表示一个段,可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”。
    • “ /n ”表示每 n 的单位执行一次,可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。
    设置时,命令后面加上 >/dev/null 2>&1  ,标准错误重定向到标准输出
    
  4. 知识扩展
    Linux下的任务调度分为两类:系统任务调度和用户任务调度。


    系统任务调度
    系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。
    `/etc/crontab` 文件包括下面几行:

    SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=root       #如果出现错误,或者有数据输出,数据作为邮件发给这个帐号
    HOME=/            #使用者运行的路径,这里是根目录
    # run-parts
    51 * * * * root run-parts /etc/cron.hourly
    24 7 * * * root run-parts /etc/cron.daily
    22 4 * * 0 root run-parts /etc/cron.weekly
    42 4 1 * * root run-parts /etc/cron.monthly
    
    前四行是用来配置crond任务运行的环境变量;
    第一行SHELL变量指定了系统要使用哪个shell,这里是bash;
    第二行PATH变量指定了系统执行命令的路径;
    第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户;
    第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。
    "run-parts"这个参数,后面可以写要运行的某个脚本。
    

    用户任务调度
    用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab文件都被保存在/var/spool/cron目录中。其文件名与用户名一致,使用者权限文件如下:

    /etc/cron.deny     该文件中所列用户不允许使用crontab命令
    /etc/cron.allow    该文件中所列用户允许使用crontab命令
    /var/spool/cron/   所有用户crontab文件存放的目录,以用户名命名
    

    每个用户可以建立自己的调度 crontab(在 /var/spool/cron 目录下)。cron 服务每分钟不仅要读一次 /var/spool/cron 内的所有文件,还需要读一次 /etc/crontab,因此我们配置这个文件也能运用 cron 服务做一些事情。用 crontab 配置是针对某个用户的,而编辑 /etc/crontab 是针对系统的任务。

  5. 举例说明
    • 两个周定时备份一次 /var/ftp 目录下的内容

      * * 14 * * cd /back/ftp-back/ && rsync -avzc /var/ftp ./
      
    • 定时插入数据

      */2 * * * * /bin/bash /home/zrg/.crontab/crontab.sh
      
    • 定时备份 mysql 数据

      #!/bin/sh
      filename=`date +%Y%m%d%H%M%S`
      mysqldump -u root -proot testdb>/home/zrg/crontab/$filename.sql
      
      $ crontab -e
      0 2 * * *  /bin/bash /home/zrg/crontab/cron.sh
      
      $rccron reload
      
    • 其他简单示例

      // 每天 21:43 执行重启smb 
      43 21 * * * /etc/init.d/smb restart
      
      // 每周一的 17:00 重启smb
      0 17 * * 1 /etc/init.d/smb restart
      
      // 每周日,周二,周三的 17:00和 17:10 执行
      0,10 17 * * 0,2,3 /etc/init.d/smb restart
      
      // 毎月1日从 17:00到17:10 毎隔1分钟 执行
      0-10 17 1 * * /etc/init.d/smb restart
      
      // 每10分钟执行重启smb
      */10 * * * * /etc/init.d/smb restart
      
      // 每0,10,20,30,40,50分重启smb
      0,10,20,30,40,50 * * * * /etc/init.d/smb restart
      
      // 8:02,11:02,14:02,17:02,20:02 执行
      2 8-20/3 * * * /etc/init.d/smb restart
      

4.2.2. 扩展阅读:唤醒式的工作任务

  1. anacron 是什么?
  2. anacron 与 crontab

    Table 15: anacron vs crontab
    crontab anacron
    适合服务器 适合桌面/笔记本电脑
    它是守护进程 非守护进程
    关机时不会执行计划任务 如果计划任务到期,机器是关机的,那么它会在机器下次开机后执行计划任务
    可以让你以分钟级运行计划任务 只能让你以天为基础来运行计划任务
    普通用户和 root 用户都可以使用 只有 root 用户可以使用(使用特定的配置启动普通任务)
  3. anacron 与 /etc/anacrontab

4.3. Linux 程序管理和 SELinux 初探

4.3.1. 进程与程序

4.3.2. 任务管理

4.3.3. 进程管理

  1. 常见进程管理命令
    • top
    • list the processes running on the system

      // 查看
      $ ps -ef
      
    • send a signal to one or more processes (usually to "kill" a process)
    • an alternate way of listing your own processes
    • put a process in the background
    • put a process in the forground

4.3.4. 特殊文件与进程

4.3.4.1. Linux 文件特殊权限
  1. SetUID
    • SetUID 介绍
      • 只有可执行的二进制程序才能设定 SUID 权限;
      • 用户拥有该程序的可执行权限;
      • 在执行该程序时,获得该程序文件所属用户的身份;
      • SetUID 只在该程序执行过程中有效.
    • 设定和取消 SetUID

      // 查看 passwd 命令的 SetUID
      $ ll /usr/bin/passwd
      

      -rwsr-xr-x 1 root root 59640 3月 23 03:05 /usr/bin/passwd*

      // 设定
      $ sudo chmod 4755 abc.txt
      or
      $ sudo chmod u+s abc.txt
      
      // 取消
      $ sudo chmod 755 abc.txt
      $ sudo chmod u-s abc.txt
      
    • 注意事项
      • 关键目录应严格控制写权限.如"/","/usr"
      • 对系统中默认应该具有 SetUID 权限的文件的统一列表,定期检查.
  2. SetGID
    • SetGID 介绍
      • 只有可执行的二进制程序才能设定 SUID 权限;
      • 用户拥有该程序的可执行权限;
      • 在执行该程序时,获得该程序文件所属组的身份;
      • SetGID 只在该程序执行过程中有效.
    • 设定 SetGID

      $ sudo chmod 2755 abc.txt
      $ sudo chmod g+s abc.txt
      
    • SetGID 针对目录的作用
      • 普通用户必须对此目录拥有r和x权限,才能进入次目录;
      • 普通用户在此目录中的有效组会变成次目录的属组;
      • 若普通用户对此目录拥有w权限,新建的文件默认属组是这个目录的属组.
  3. Stiky BIT
    • Stiky BIT 粘着位
      • 粘着位只对目录有效
      • 普通用户对该目录有w和x权限
      • 如果没有粘着位,普通用户可以删除此目录下所有文件, 一旦赋予了粘着位,除了root用户可以删除所有文件,普通用户只能删除自己建立的文件
    • 设定 Stiky BIT

      $ ll /tmp
      

      drwxrwxrwt 20 root root 12288 7月 6 18:02 ./

      $ sudo chmod 1755 /tmp
      $ sudo chmod o+t /tmp
      
      $ sudo chmod 777 /tmp
      $ sudo chmod o-t /tmp
      
  4. chattr
    • 命令格式

      chattr [+-=] 选项 file/directory
      + 新增权限
      - 删除权限
      = 等于某权限
      
      // 查看文件chattr属性
      格式: lsattr 选项 file/directory
      $ lsattr abc.txt
      
    • 选项
      i
      对文件: 不允许进行删除或改名, 也不能添加或修改数据; 对目录: 只能修改目录下文件的数据, 但不允许建立和删除文件.
      a
      对文件: 只能在文件中添加数据, 但不能删除或修改数据; 对目录: 只允许创建或修改文件, 但不允许删除文件.

4.3.5. SELinux

4.3.5.1. 什么是SELinux
4.3.5.2. SELinux的运行模式
4.3.5.3. SELinux策略内的规则管理

4.4. Linux 日志管理

4.5. Linux 基础系统配置与备份策略

4.6. Linux 内核编译与管理

4.7. Linux 防火墙

4.7.1. 概念

  • 众所周知,企业内网和外部公网相比,外部的公网环境更加恶劣,罪恶丛生。防火墙就是通过制定一些有顺序的规则,并管制进入到我们网域内的主机资料封包的一种机制。
  • 在公网与企业内网之间充当保护屏障的防火墙虽然有软件或硬件之分,但主要功能都是依据策略对穿越防火墙自身的流量进行过滤。防火墙策略可以基于流量的源地址、端口号、协议、应用等信息来定制,然后防火墙使用预先定制的策略规则监控出入的流量,若流量与某一条策略规则相匹配,则执行相应的处理,反之则丢弃。这样一来,就可以保证仅有合法的流量在企业内网和外部公网之间流动了。
  • 防火墙分为硬件防火墙和软件防火墙。硬件防火墙是由厂商设计好的,其作业系统主要提供封包资料的过滤机制为主,并将其他不必要的功能拿掉。软件防火墙本身就是在保护系统网络安全的一种软件(称为机制),例如 Netfilter, TCP Wrappers 都可以称为软件防火墙。
  • 目前在 RHEL-7 系统中,firewalld 防火墙取代了 iptables 防火墙。其实,iptables 与 firewalld 都不是真正的防火墙,它们都只是用来定义防火墙策略的防火墙管理工具而已,或者说,它们只是一种服务。与 Linux 内核集成的 IP 信息包过滤系统。防火墙在做数据包过滤决定时,有一套遵循和组成的规则,这些规则存储在专用的数据包过滤表中,而这些表集成在 Linux 内核中。
  • iptables 服务会把配置好的防火墙策略交由内核层面的 netfilter 网络过滤器来处理,而 firewalld 服务则是把配置好的防火墙策略交由内核层面的 nftables 包过滤框架来处理。换句话说,当前在 Linux 系统中其实存在多个防火墙管理工具,旨在方便运维人员管理 Linux 系统中的防火墙策略,我们只需要配置妥当其中的一个就足够了。虽然这些工具各有优劣,但它们在防火墙策略的配置思路上是保持一致的。
  • iptables 组件是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。
  • Netfilter 组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。

4.7.2. 防火墙类别

按照防火墙管理的范围,将防火墙分为网域型与单一主机型的控管。在单一主机型的控管方面,主要的防火墙有封包过滤型的 Netfilter 与依照服务软件程式作为分析的 TCP Wrappers 两种。对于区域性防火墙而言,由于此类防火墙都是当作路由器角色,因此防火墙主要有封包过滤的 Netfilter 与利用代理服务器(proxy server)进行存取代理的方式。

4.7.2.1. Netfilter

所谓的封包过滤,即分析进入主机的网络封包,将封包的表头信息提出来进行分析,已决定放行或禁止访问的机制。
在 Linux 上面我们使用核心内建的 Netfilter 这个机制,而 Netfilter 提供了 iptables 这个软件来作为防火墙封包过滤的指令。

4.7.2.2. TCP Wrappers
  • 通过服务器程序的外挂 (tcpd) 来处置,与封包过滤不同的是, 这种机制主要是分析谁对某程序进行存取,然后透过规则去分析该服务器程序谁能够联机、谁不能联机。
  • 与程序的名称有关,举例来说,FTP 可以启动在非正规的 port 21 进行监听,当你透过 Linux 内建的 TCP wrappers 限制 FTP 时, 那么你只要知道 FTP 的软件名称 (vsftpd) ,然后对他作限制,则不管 FTP 启动在哪个端口,都会被该规则管理的。
  • TCP wrappers 就是透过 /etc/hosts.allow, /etc/hosts.deny 来管理的一个类似防火墙的机制, 但并非所有的软件都可以透过这两个文件来控管,只有底下的软件才能够透过这两个文件来管理防火墙规则,分别是:
    • 由 super daemon (xinetd) 所管理的服务:就是配置文件在 etc/xinetd.d 里面的服务
    • 有支援 libwrap.so 模块的服务
4.7.2.3. Proxy Server

代理服务器是一种网络服务,它可以『代理』用户的需求,而代为前往服务器取得相关的资料。
一般 proxy 主机通常仅开放 port 80, 21, 20 等 WWW 与 FTP 的埠口而已,而且通常 Proxy 就架设在路由器上面,因此可以完整的掌控局域网络内的对外联机。

4.7.3. Linux 的封包过滤软件:iptables

4.7.3.1. 历史背景

在早期的 Linux 系统中,默认使用的是 iptables 防火墙管理服务来配置防火墙。尽管新型的 firewalld 防火墙管理服务已经被投入使用多年,但是大量的企业在生产环境中依然出于各种原因而继续使用 iptables。

4.7.3.2. iptables 表与规则链

iptables 的表格与相关链示意图: iptables_02.png

iptables 预设的情况下,Linux 的 iptables 至少就有三个表格,包括管理本机进出的 filter 、管理后端主机 (防火墙内部的其他计算机) 的 nat 、管理特殊旗标使用的 mangle (较少使用) 。

  • filter:主要和主机自身有关,主要负责防火墙功能过滤本机流入流出的数据包是默认使用的 table。
    • INPUT:过滤进入主机的数据包。
    • OUTPUT:主要与我们 Linux 本机所要送出的封包有关。
    • FORWARD:负责转发流经主机但不进入本机的数据包,和 NAT table 关系很大。
  • nat:是 Network Address Translation 的缩写, 这个表格主要在进行来源与目的之 IP 或 port 的转换,主要与 Linux 主机后的局域网络内计算机有相关。

    • PREROUTING:在进行路由判断之前所要进行的规则(DNAT/REDIRECT)
    • POSTROUTING:在进行路由判断之后所要进行的规则(SNAT/MASQUERADE)
    • OUTPUT:与发送出去的封包有关


    Table 16: NAT 表
    snat 地址转换
    dnat 标地址转换
    pnat 标端口转换
  • mangle:这个表格主要是与特殊的封包的路由旗标有关,将报文拆开来并修改报文标志位,最后封装起来。早期仅有 PREROUTING 及 OUTPUT 链,不过从 kernel 2.4.18 之后加入了 INPUT 及 FORWARD 链。


所以说,如果你的 Linux 是作为 www 服务,那么要开放客户端对你的 www 要求有响应,就得要处理 filter 的 INPUT 链; 而如果你的 Linux 是作为局域网络的路由器,那么就得要分析 nat 的各个链以及 filter 的 FORWARD 链才行。也就是说, 其实各个表格的链结之间是有关系的!简单的关系可以由下图这么看: iptables_03.gif 从上面的图示可以看出 iptables 可以控制三种封包的流向:

  • 封包进入 Linux 主机使用资源 (路径 A): 在路由判断后确定是向 Linux 主机要求数据的封包,主要就会透过 filter 的 INPUT 链来进行控管;
  • 封包经由 Linux 主机的转递,没有使用主机资源,而是向后端主机流动 (路径 B): 在路由判断之前进行封包表头的修订作业后,发现到封包主要是要透过防火墙而去后端,此时封包就会透过路径 B 来跑动。 也就是说,该封包的目标并非我们的 Linux 本机。主要经过的链是 filter 的 FORWARD 以及 nat 的 POSTROUTING, PREROUTING。
  • 封包由 Linux 本机发送出去 (路径 C): 例如响应客户端的要求,或者是 Linux 本机主动送出的封包,都是透过路径 C 来跑的。先是透过路由判断, 决定了输出的路径后,再透过 filter 的 OUTPUT 链来传送的!当然,最终还是会经过 nat 的 POSTROUTING 链。


由于 mangle 这个表格很少被使用,如果 mangle 拿掉的话,那就容易看的多了: iptables_04.gif

4.7.3.3. iptables 策略和语法
4.7.3.3.1. 策略

防火墙会从上至下的顺序来读取配置的策略规则,在找到匹配项后就立即结束匹配工作并去执行匹配项中定义的行为(即放行或阻止)。如果在读取完所有的策略规则之后没有匹配项,就去执行默认的策略。防火墙策略规则的设置有两种:一种是“通”(即放行),一种是“堵”(即阻止iptables服务把用于处理或过滤流量的策略条目称之为规则,多条规则可以组成一个规则链,而规则链则依据数据包处理位置的不同进行分类,具体如下:

  • 在进行路由选择前处理数据包(PREROUTING);
  • 处理流入的数据包(INPUT);
  • 处理流出的数据包(OUTPUT);
  • 处理转发的数据包(FORWARD);
  • 在进行路由选择后处理数据包(POSTROUTING)。


    一般来说,从内网向外网发送的流量一般都是可控且良性的,因此我们使用最多的就是INPUT规则链,该规则链可以增大黑客人员从外网入侵内网的难度。


    iptables 服务的术语:

    • ACCEPT(允许流量通过)
    • REJECT(拒绝流量通过,拒绝流量后再回复一条"您的信息已经收到,但是被扔掉了"),把 Linux 系统中的防火墙策略设置为 REJECT 拒绝动作后,流量发送方会看到端口不可达的响应。
    • LOG(记录日志信息)
    • DROP(拒绝流量通过,直接将流量丢弃不响应)。把Linux系统中的防火墙策略修改成DROP拒绝动作后,流量发送方会看到响应超时的提醒。但是流量发送方无法判断流量是被拒绝,还是接收方主机当前不在线。
4.7.3.3.2. 语法应用
  1. 规则的查看和清除

    # iptables [-t tables] [-L] [-nv]
    选项与参数:
    -t :后面接 table ,例如 nat 或 filter ,若省略此项目,则使用默认的 filter
    -L :列出目前的 table 的规则
    -n :不进行 IP 与 HOSTNAME 的反查,显示讯息的速度会快很多!
    -v :列出更多的信息,包括通过该规则的封包总位数、相关的网络接口等
    
    // 范例:列出 filter table 三条链的规则
    # iptables -L -n
    
    Chain INPUT (policy ACCEPT) <==针对 INPUT 链,且预设政策为可接受
    target     prot opt source               destination         
    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:3306
    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:22
    REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited
    
    Chain FORWARD (policy DROP) <==针对 FORWARD 链,且预设政策为可接受
    target     prot opt source               destination         
    DOCKER-USER  all  --  0.0.0.0/0            0.0.0.0/0           
    DOCKER-ISOLATION-STAGE-1  all  --  0.0.0.0/0            0.0.0.0/0           
    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
    DOCKER     all  --  0.0.0.0/0            0.0.0.0/0           
    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
    DOCKER     all  --  0.0.0.0/0            0.0.0.0/0           
    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
    DOCKER     all  --  0.0.0.0/0            0.0.0.0/0           
    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
    DOCKER     all  --  0.0.0.0/0            0.0.0.0/0           
    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
    REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited
    
    Chain OUTPUT (policy ACCEPT) <==针对 OUTPUT 链,且预设政策为可接受
    target     prot opt source               destination         
    
    Chain DOCKER (4 references) <==针对 DOCKER 链
    target     prot opt source               destination         
    ACCEPT     tcp  --  0.0.0.0/0            172.21.0.2           tcp dpt:80
    ACCEPT     tcp  --  0.0.0.0/0            172.18.0.2           tcp dpt:9021
    
    Chain DOCKER-ISOLATION-STAGE-1 (1 references)
    target     prot opt source               destination         
    DOCKER-ISOLATION-STAGE-2  all  --  0.0.0.0/0            0.0.0.0/0           
    DOCKER-ISOLATION-STAGE-2  all  --  0.0.0.0/0            0.0.0.0/0           
    DOCKER-ISOLATION-STAGE-2  all  --  0.0.0.0/0            0.0.0.0/0           
    DOCKER-ISOLATION-STAGE-2  all  --  0.0.0.0/0            0.0.0.0/0           
    RETURN     all  --  0.0.0.0/0            0.0.0.0/0           
    
    Chain DOCKER-ISOLATION-STAGE-2 (4 references)
    target     prot opt source               destination         
    DROP       all  --  0.0.0.0/0            0.0.0.0/0           
    DROP       all  --  0.0.0.0/0            0.0.0.0/0           
    DROP       all  --  0.0.0.0/0            0.0.0.0/0           
    DROP       all  --  0.0.0.0/0            0.0.0.0/0           
    RETURN     all  --  0.0.0.0/0            0.0.0.0/0           
    
    Chain DOCKER-USER (1 references)
    target     prot opt source               destination         
    RETURN     all  --  0.0.0.0/0            0.0.0.0/0
    

    5个检查点(内置链)

    • PREROUTING
    • INPUT
    • FORWORD
    • OUTPUT
    • POSTROUTING

    说明栏

    • target:代表进行的动作, ACCEPT 是放行,而 REJECT 则是拒绝,此外,尚有 DROP (丢弃) 的项目!
    • prot:代表使用的封包协议,主要有 tcp, udp 及 icmp 三种封包格式;
    • opt:额外的选项说明;
    • source :代表此规则是针对哪个『来源 IP』进行限制;
    • destination :代表此规则是针对哪个『目标 IP』进行限制
    // 范例:列出 nat table 三条链的规则
    # iptables -t nat -L -n
    
    # iptables -nvL –line-number
    -L 查看当前表的所有规则,默认查看的是filter表,如果要查看NAT表,可以加上-t NAT参数
    -n 不对ip地址进行反查,加上这个参数显示速度会快很多
    -v 输出详细信息,包含通过该规则的数据包数量,总字节数及相应的网络接口
    –line-number 显示规则的序列号,这个参数在删除或修改规则时会用到
    
    // 清空已有的防火墙规则链
    # iptables -F
    # iptables -X
    # iptables -Z
    
  2. 规则配置

    // 把INPUT规则链的默认策略设置为拒绝
    $ iptables -P INPUT DROP
    规则链的默认策略拒绝动作只能是DROP,而不能是REJECT。
    
    //向INPUT链中添加允许ICMP流量进入的策略规则
    $ iptables -I INPUT -p icmp -j ACCEPT
    在日常运维工作中,经常会使用ping命令来检查对方主机是否在线,而向防火墙的INPUT规则链中添加一条允许ICMP流量进入的策略规则就默认允许了
    这种ping命令检测行为。
    
    // 删除INPUT规则链中刚刚加入的那条策略(允许ICMP流量),并把默认策略设置为允许
    $ iptables -D INPUT 1
    $ iptables -P INPUT ACCEPT
    
    // 将INPUT规则链设置为只允许指定网段的主机访问本机的22端口,拒绝来自其他所有主机的流量
    $ iptables -I INPUT -s 192.168.10.0/24 -p tcp --dport 22 -j ACCEPT
    $ iptables -A INPUT -p tcp --dport 22 -j REJECT
    
    // 向INPUT规则链中添加拒绝所有人访问本机12345端口的策略规则
    $ iptables -I INPUT -p tcp --dport 12345 -j REJECT
    $ iptables -I INPUT -p udp --dport 12345 -j REJECT
    
    // 向INPUT规则链中添加拒绝192.168.10.5主机访问本机80端口(Web服务)的策略规则
    $ iptables -I INPUT -p tcp -s 192.168.10.5 --dport 80 -j REJECT
    
    // 向INPUT规则链中添加拒绝所有主机访问本机1000~1024端口的策略规则
    $ iptables -A INPUT -p tcp --dport 1000:1024 -j REJECT
    $ iptables -A INPUT -p udp --dport 1000:1024 -j REJECT
    
    // 保存防火墙策略命令,使其永久生效
    $ service iptables save
    

4.7.4. Linux 的封包过滤软件:Firewalld

  1. 概念
    Firewalld(Dynamic Firewall Manager of Linux systems, Linux系统的动态防火墙管理器),服务是默认的防火墙配置管理工具,它拥有基于CLI(命令行界面)和基于GUI(图形用户界面)的两种管理方式。相较于传统的防火墙管理配置工具,firewalld支持动态更新技术并加入了区域(zone)的概念。简单来说,区域就是firewalld预先准备了几套防火墙策略集合(策略模板),用户可以根据生产场景的不同而选择合适的策略集合,从而实现防火墙策略之间的快速切换。

    Table 17: firewalld中常用的区域名称及策略规则
    区域 默认规则策略
    trusted 允许所有的数据包
    home 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、mdns、ipp-client、amba-client与dhcpv6-client服务相关,则允许流量
    internal 等同于home区域
    work 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、ipp-client与dhcpv6-client服务相关,则允许流量
    public 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、dhcpv6-client服务相关,则允许流量
    external 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh服务相关,则允许流量
    dmz 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh服务相关,则允许流量
    block 拒绝流入的流量,除非与流出的流量相关
    drop 拒绝流入的流量,除非与流出的流量相关
  2. 命令行管理工具(firewall-cmd)
    firewall-cmd是firewalld防火墙配置管理工具的CLI(命令行界面)版本。

    Table 18: firewall-cmd命令中使用的参数以及作用
    参数 作用
    –get-default-zone 查询默认的区域名称
    –set-default-zone=<区域名称> 设置默认的区域,使其永久生效
    –get-zones 显示可用的区域
    –get-services 显示预先定义的服务
    –get-active-zones 显示当前正在使用的区域与网卡名称
    –add-source= 将源自此IP或子网的流量导向指定的区域
    –remove-source= 不再将源自此IP或子网的流量导向某个指定区域
    –add-interface=<网卡名称> 将源自该网卡的所有流量都导向某个指定区域
    –change-interface=<网卡名称> 将某个网卡与区域进行关联
    –list-all 显示当前区域的网卡配置参数、资源、端口以及服务等信息
    –list-all-zones 显示所有区域的网卡配置参数、资源、端口以及服务等信息
    –add-service=<服务名> 设置默认区域允许该服务的流量
    –add-port=<端口号/协议> 设置默认区域允许该端口的流量
    –remove-service=<服务名> 设置默认区域不再允许该服务的流量
    –remove-port=<端口号/协议> 设置默认区域不再允许该端口的流量
    –reload 让“永久生效”的配置规则立即生效,并覆盖当前的配置规则
    –panic-on 开启应急状况模式
    –panic-off 关闭应急状况模式

    使用firewalld配置的防火墙策略默认为运行时(Runtime)模式,又称为当前生效模式,而且随着系统的重启会失效。如果想让配置策略一直存在,就需要使用永久(Permanent)模式了,方法就是在用firewall-cmd命令正常设置防火墙策略时添加–permanent参数,这样配置的防火墙策略就可以永久生效了。但是,永久生效模式有一个“不近人情”的特点,就是使用它设置的策略只有在系统重启之后才能自动生效。如果想让配置的策略立生效,需要手动执行firewall-cmd –reload命令。

    • 查看firewalld服务当前所使用的区域

      # firewall-cmd --get-default-zone
      
    • 查询eno16777728网卡在firewalld服务中的区域

      # firewall-cmd --get-zone-of-interface=eno16777728
      
    • 把firewalld服务中eno16777728网卡的默认区域修改为external,并在系统重启后生效。分别查看当前与永久模式下的区域名称

      # firewall-cmd --permanent --zone=external --change-interface=eno16777728
      # firewall-cmd --get-zone-of-interface=eno16777728
      # firewall-cmd --permanent --get-zone-of-interface=eno16777728
      
    • 把firewalld服务的当前默认区域设置为public

      # firewall-cmd --set-default-zone=public
      # firewall-cmd --get-default-zone
      
    • 启动/关闭firewalld防火墙服务的应急状况模式,阻断一切网络连接(当远程控制服务器时请慎用)

      # firewall-cmd --panic-on
      # firewall-cmd --panic-off
      
    • 查询public区域是否允许请求SSH和HTTPS协议的流量

      # firewall-cmd --zone=public --query-service=ssh
      # firewall-cmd --zone=public --query-service=https
      
    • 把firewalld服务中请求HTTPS协议的流量设置为永久允许,并立即生效

      # firewall-cmd --zone=public --add-service=https
      # firewall-cmd --permanent --zone=public --add-service=https
      # firewall-cmd --reload
      
    • 把firewalld服务中请求HTTP协议的流量设置为永久拒绝,并立即生效:

      # firewall-cmd --permanent --zone=public --remove-service=http
      # firewall-cmd --reload 
      
    • 把在firewalld服务中访问8080和8081端口的流量策略设置为允许,但仅限当前生效

      # firewall-cmd --zone=public --add-port=8080-8081/tcp
      # firewall-cmd --zone=public --list-ports
      
    • 把原本访问本机888端口的流量转发到22端口,要且求当前和长期均有效

      流量转发命令格式为:
      # firewall-cmd --permanent --zone=<区域> --add-forward-port=port=<源端口号>:proto=<协议>:toport=<目标端口号>:toaddr=<目标IP地址>
      
      # firewall-cmd --permanent --zone=public --add-forward-port=port=888:proto=tcp:toport=22:toaddr=192.168.10.10
      # firewall-cmd --reload
      
    • firewalld中的富规则表示更细致、更详细的防火墙策略配置,它可以针对系统服务、端口号、源地址和目标地址等诸多信息进行更有针对性的策略配置。它的优先级在所有的防火墙策略中也是最高的。比如,我们可以在firewalld服务中配置一条富规则,使其拒绝192.168.10.0/24网段的所有用户访问本机的ssh服务(22端口):

      $ sudo firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.10.0/24" service name="ssh" reject"
      

4.7.5. 服务的访问控制列表

TCP Wrappers是RHEL 7系统中默认启用的一款流量监控程序,它能够根据来访主机的地址与本机的目标服务程序作出允许或拒绝的操作。换句话说,Linux系统中其实有两个层面的防火墙,第一种是前面讲到的基于TCP/IP协议的流量过滤工具,而TCP Wrappers服务则是能允许或禁止Linux系统提供服务的防火墙,从而在更高层面保护了Linux系统的安全运行。
TCP Wrappers服务的防火墙策略由两个控制列表文件所控制。系统将会先检查允许控制列表文件(/etc/hosts.allow),如果匹配到相应的允许策略则放行流量;如果没有匹配,则去进一步匹配拒绝控制列表文件(/etc/hosts.deny),若找到匹配项则拒绝该流量。如果这两个文件全都没有匹配到,则默认放行流量。

Table 19: TCP Wrappers服务的控制列表文件中常用的参数
客户端类型 示例 满足示例的客户端列表
单一主机 192.168.10.10 IP地址为192.168.10.10的主机
指定网段 192.168.10. IP段为192.168.10.0/24的主机
指定网段 192.168.10.0/255.255.255.0 IP段为192.168.10.0/24的主机
指定DNS后缀 .linuxprobe.com 所有DNS后缀为.linuxprobe.com的主机
指定主机名称 www.linuxprobe.com 主机名称为www.linuxprobe.com的主机
指定所有客户端 ALL 所有主机全部包括在内
// 在配置TCP Wrappers服务时需要遵循两个原则:
  • 编写拒绝策略规则时,填写的是服务名称,而非协议名称;
  • 建议先编写拒绝策略规则,再编写允许策略规则,以便直观地看到相应的效果。

5. Linux 服务管理

5.1. Linux 网络基础

5.1.1. 启用 HTTPS

  • 创建一个 2048 位 RSA 公钥/私钥对。
  • 生成一个嵌入您的公钥的证书签名请求 (CSR)
  • 将 CSR 与证书颁发机构 (CA) 共享以接收最终证书或证书链。
  • 将最终证书安装在非网络可访问的位置,例如 /etc/ssl(Linux 和 Unix)或 IIS 需要它的位置 (Windows)。
1. 生成密钥和证书签名请求
此部分使用 openssl 命令行程序(大部分 Linux、BSD 和 Mac OS X 系统均附带此程序)来生成私钥/公钥和 CSR。

参考资料:

在服务器上启用 HTTPS

5.1.2. 基本网络配置

  1. 安装网络工具

    $ sudo apt-get install net-tools
    
  2. 配置网络
    • 在 Linux 中,以太网接口被命名为:eth0、eth1等。
    • lspci 命令可以查看网卡硬件信息(如果是 usb 网卡,则需要使用 lsusb 命令)
    • ifconfig 命令:查看接口信息

      $ ifconfig -a
      $ ifconfig eth0
      
    • ifup,ifdown 命令:启用、禁用一个接口

      $ ifup eth0
      $ ifdown eth0
      
  3. 相关配置文件
    • 网卡配置文件:/etc/sysconfig/network-scripts/ifcfg-eth0
    • DNS 配置文件:/etc/resolv.conf
    • 主机名配置文件:/etc/sysconfig/network
    • 静态主机名配置文件:/etc/hosts
  4. 网络测试
    • 测试网路连通性:ping 命令
    • 测试DNS解析:host,dig 命令
    • 显示路由表:ip route 命令
    • 追踪到达目标地址的网络路径:traceroute 命令
    • mtr 命令进行网络质量测试

5.2. DNS

5.3. FTP:Vsftp

  1. Download and Install

    https://security.appspot.com/vsftpd.html#download
    //yum
    yum install -y vsftpd
    
  2. Change default dir

    #local user
    local_root=/usr/share/nginx/html
    #is_enable local view,default_setting is NO
    chroot_local_user=NO
    #anonymous user
    anon_root=/var/ftp/pub
    
  3. Configuring directory of access

    chroot_local_user=YES
    chroot_list_enable=NO
    allow_writeable_chroot=YES
    
    报如下错误,是因为没有添加上面的第三条语句,导致用户无法锁定自己的目录。
       500 OOPS: vsftpd: refusing to run with writable root inside chroot()
    
    notice:
     配置具体情况有以下几种:
    1)当 chroot_list_enable=yes,chroot_local_user=yes时,在/etc/vsftpd/chroot_list文件 中列出的用户,可以切换到上级目录;未在文件中列出的用户,不能切换到站点根目录的上级目录。
    2)当 chroot_list_enable=yes,chroot_local_user=no时,在/etc/vsftpd/chroot_list文件中 列出的用户,不能切换到站点根目录的上级目录;未在文件中列出的用户,可以切换到上级目录。
    3)当 chroot_list_enable=no,chroot_local_user=yes时,所有用户均不能切换到上级目录。
    4)当 chroot_list_enable=no,chroot_local_user=no时,所有用户均可以切换到上级目录。
    
    5)当用户不允许切换到上级目录时,登录后ftp站点的根目录“/”是该ftp账户的主目录,即文件的系统的/var/ftp目录。
    
  4. my vsftpd.conf //CentOS 7, /etc/vsftpd/vsftpd.conf.

    # Example config file /etc/vsftpd/vsftpd.conf
    # Allow anonymous FTP? (Beware - allowed by default if you comment this out).
    anonymous_enable=NO
    #
    local_root=/srv/www/
    #
    # Uncomment this to allow local users to log in.
    # When SELinux is enforcing check for SE bool ftp_home_dir
    local_enable=YES
    #
    # Uncomment this to enable any form of FTP write command.
    write_enable=YES
    #
    # Default umask for local users is 077. You may wish to change this to 022,
    # if your users expect that (022 is used by most other ftpd's)
    local_umask=022
    #
    # Uncomment this to allow the anonymous FTP user to upload files. This only
    # has an effect if the above global write enable is activated. Also, you will
    # obviously need to create a directory writable by the FTP user.
    # When SELinux is enforcing check for SE bool allow_ftpd_anon_write, allow_ftpd_full_access
    #anon_upload_enable=YES
    #
    # Uncomment this if you want the anonymous FTP user to be able to create
    # new directories.
    #anon_mkdir_write_enable=YES
    #
    # Activate directory messages - messages given to remote users when they
    # go into a certain directory.
    dirmessage_enable=YES
    #
    # Activate logging of uploads/downloads.
    xferlog_enable=YES
    #
    # Make sure PORT transfer connections originate from port 20 (ftp-data).
    connect_from_port_20=YES
    #
    # If you want, you can arrange for uploaded anonymous files to be owned by
    # a different user. Note! Using "root" for uploaded files is not
    # recommended!
    #chown_uploads=YES
    #chown_username=whoever
    #
    # You may override where the log file goes if you like. The default is shown
    # below.
    #xferlog_file=/var/log/xferlog
    #
    # If you want, you can have your log file in standard ftpd xferlog format.
    # Note that the default log file location is /var/log/xferlog in this case.
    xferlog_std_format=YES
    #
    # You may change the default value for timing out an idle session.
    #idle_session_timeout=600
    #
    # You may change the default value for timing out a data connection.
    #data_connection_timeout=120
    #
    # It is recommended that you define on your system a unique user which the
    # ftp server can use as a totally isolated and unprivileged user.
    #nopriv_user=ftpsecure
    #
    # Enable this and the server will recognise asynchronous ABOR requests. Not
    # recommended for security (the code is non-trivial). Not enabling it,
    # however, may confuse older FTP clients.
    #async_abor_enable=YES
    #
    # By default the server will pretend to allow ASCII mode but in fact ignore
    # the request. Turn on the below options to have the server actually do ASCII
    # mangling on files when in ASCII mode.
    # Beware that on some FTP servers, ASCII support allows a denial of service
    # attack (DoS) via the command "SIZE /big/file" in ASCII mode. vsftpd
    # predicted this attack and has always been safe, reporting the size of the
    # raw file.
    # ASCII mangling is a horrible feature of the protocol.
    #ascii_upload_enable=YES
    #ascii_download_enable=YES
    #
    # You may fully customise the login banner string:
    #ftpd_banner=Welcome to blah FTP service.
    #
    # You may specify a file of disallowed anonymous e-mail addresses. Apparently
    # useful for combatting certain DoS attacks.
    #deny_email_enable=YES
    # (default follows)
    #banned_email_file=/etc/vsftpd/banned_emails
    #
    # You may specify an explicit list of local users to chroot() to their home
    # directory. If chroot_local_user is YES, then this list becomes a list of
    # users to NOT chroot().
    # (Warning! chroot'ing can be very dangerous. If using chroot, make sure that
    # the user does not have write access to the top level directory within the
    # chroot)
    chroot_local_user=YES
    chroot_list_enable=YES
    allow_writeable_chroot=YES
    # (default follows)
    chroot_list_file=/etc/vsftpd/chroot_list
    #
    # You may activate the "-R" option to the builtin ls. This is disabled by
    # default to avoid remote users being able to cause excessive I/O on large
    # sites. However, some broken FTP clients such as "ncftp" and "mirror" assume
    # the presence of the "-R" option, so there is a strong case for enabling it.
    #ls_recurse_enable=YES
    #
    # When "listen" directive is enabled, vsftpd runs in standalone mode and
    # listens on IPv4 sockets. This directive cannot be used in conjunction
    # with the listen_ipv6 directive.
    listen=NO
    #
    # This directive enables listening on IPv6 sockets. By default, listening
    # on the IPv6 "any" address (::) will accept connections from both IPv6
    # and IPv4 clients. It is not necessary to listen on *both* IPv4 and IPv6
    # sockets. If you want that (perhaps because you want to listen on specific
    # addresses) then you must run two copies of vsftpd with two configuration
    # files.
    # Make sure, that one of the listen options is commented !!
    listen_ipv6=YES
    
    pam_service_name=vsftpd
    userlist_enable=YES
    tcp_wrappers=YES
    
  5. References

    https://security.appspot.com/vsftpd.html
    https://en.wikipedia.org/wiki/Vsftpd
    http://baike.baidu.com/item/vsftpd
    

5.4. NFS

5.5. 文件共享:Samba

5.7. NIS 服务

5.8. NTP 服务

5.9. Proxy 服务

5.10. iSCSI 服务

5.11. Tomcat

5.12. 邮件服务:Postfix

5.13. ELK 日志分析服务

5.14. Rsync 同步服务

6. Linux 集群与虚拟化

6.1. 集群概念

6.2. MySQL 集群

6.3. NoSQL 集群

6.4. 虚拟化概述

  1. 虚拟化(virtualization)技术是一个通用的概念,在不同领域有不同的理解。在计算领域,一般指的是计算虚拟化(computing virtualization),或通常说的服务器虚拟化。

    维基百科上的定义如下:“在计算机技术中,虚拟化是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以用比原本的组态更好的方式来应用这些资源。”
    
  2. 从大类上分,虚拟化技术可分为基于硬件的虚拟化和基于软件的虚拟化。基于软件的虚拟化从对象所在的层次,又可以分为应用虚拟化和平台虚拟化(通常说的虚拟机技术即属于这个范畴)。前者一般指的是一些模拟设备或诸如Wine这样的软件,后者又可以细分为几个子类:
    完全虚拟化
    虚拟机模拟完整的底层硬件环境和特权指令的执行过程,客户操作系统无须进行修改。例如IBM p和z系列的虚拟化、VMware Workstation、VirtualBox、QEMU等;
    硬件辅助虚拟化
    利用硬件(主要是CPU)辅助支持(目前x86体系结构上可用的硬件辅助虚拟化技术包括Intel-VT和AMD-V)处理敏感指令来实现完全虚拟化的功能,客户操作系统无须修改,例如VMware Workstation, Xen, KVM;
    部分虚拟化
    只针对部分硬件资源进行虚拟化,客户操作系统需要进行修改。现在有些虚拟化技术的早期版本仅支持部分虚拟化;
    超虚拟化(paravirtualization)
    部分硬件接口以软件的形式提供给客户机操作系统,客户操作系统需要进行修改,例如早期的Xen;
    操作系统级虚拟化
    内核通过创建多个虚拟的操作系统实例(内核和库)来隔离不同的进程。容器相关技术即在这个范畴。Docker 以及其他容器技术都属于操作系统虚拟化这个范畴,操作系统虚拟化最大的特点就是不需要额外的 supervisor 支持。Docker 虚拟化方式之所以有众多优势,跟操作系统虚拟化技术自身的设计和实现是分不开的。

6.5. Docker

6.5.1. 简介

  1. Docker 是个划时代的开源项目,它彻底释放了计算虚拟化的威力,极大提高了应用的维护效率,降低了云计算应用开发的成本!使用 Docker,可以让应用的部署、测试和分发都变得前所未有的高效和轻松!
  2. Docker 和传统虚拟化方式的区别 virtualization-01.png

    docker-01.png

    对比虚拟机

    特性 容器 虚拟机
    启动速度 秒级 分钟级
    性能 接近原生 较弱
    内存代价 很小 很大
    硬盘使用 一般为MB 一般为GB
    运行密度 单机支持上千个容器 一般几十个
    隔离性 安全隔离 完全隔离
    迁移性 优秀 一般

    Docker architecture architecture-01.png

  3. 传统方式是在硬件层面实现虚拟化,需要有额外的虚拟机管理应用和虚拟机操作系统层。Docker容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,因此更加轻量级。
  4. Docker的构想是要实现“Build, Ship and Run Any App, Anywhere”,即通过对应用的封装(Packaging)、分发(Distribution)、部署(Deployment)、运行(Runtime)生命周期进行管理,达到应用组件级别的“一次封装,到处运行”。这里的应用组件,既可以是一个Web应用、一个编译环境,也可以是一套数据库平台服务,甚至是一个操作系统或集群。
  5. IBM DeveloperWorks网站关于容器技术的描述十分准确:“容器有效地将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求。与虚拟化相比,这样既不需要指令级模拟,也不需要即时编译。容器可以在核心CPU本地运行指令,而不需要任何专门的解释机制。此外,也避免了准虚拟化(para-virtualization)和系统调用替换中的复杂性。”
  6. 为什么要用 docker?
    • 更高效的利用系统资源
    • 更快速的启动时间
    • 一致的运行环境
    • 持续交付和部署
    • 更轻松的迁移
    • 更轻松的维护和扩展
    • 对比传统虚拟机总结

6.5.2. 基本概念

6.5.2.1. 镜像(Image)
6.5.2.2. 容器(Container)
6.5.2.3. 仓库(Repository)

6.6. Vcent

6.7. Openstack

6.8. Kubenetes(k8s)

7. 附录A:常见软件

7.1. GCC

7.1.1. 简单编译

$ gcc test.c -o test

实质上,以上这条命令编译过程分为四个阶段进行的,即预处理(预编译,Preprocessing)、编译(Compilation)、汇编(Assembly)和连接(Linking)。

  1. Preprocessing

    $ gcc -E test.c -o test.i
    或
    $ gcc -E test.c
    

    gcc 的 -E 选项,可以让编译器在预处理后停止,并输出预处理结果。在本例中,预处理结果就是将 stdio.h 文件中的内容插入到 test.c 中了。

  2. Compilation

    $ gcc -S test.i -o test.s
    

    gcc 的 -S 选项,表示在程序编译期间,在生成汇编代码后,停止,-o 输出汇编代码文件。

  3. Assembly

    $ gcc -c test.s -o test.o
    

    对于上一小节中生成的汇编代码文件 test.s,gas 汇编器负责将其编译为目标文件

  4. Linking gcc 连接器是 gas 提供的,负责将程序的目标文件与所需的所有附加的目标文件连接起来,最终生成可执行文件。附加的目标文件包括静态连接库和动态连接库。
    对于上一小节中生成的 test.o,将其与 C 标准输入输出库进行连接,最终生成程序 test

    $ gcc test.o -o test
    

7.1.2. 多个程序文件的编译

$ gcc test1.c test2.c -o test

7.1.3. 检错

$ gcc -pedantic test.c -o test
//警告信息
$ gcc -Wall test.c -p test

-Werror 选项,那么 GCC 会在所有产生警告的地方停止编译,迫使程序员对自己的代码进行修改

$ gcc -Werror test.c -o test

7.1.4. 库文件连接

  1. 编译可执行文件。首先我们要进行编译 test.c 为目标文件,这个时候需要执行

    $ gcc  –c –I /usr/dev/mysql/include test.c –o test.o
    
  2. 链接。最后我们把所有目标文件链接成可执行文件:

    $ gcc –L /usr/dev/mysql/lib –lmysqlclient test.o –o test
    
  3. 强制链接时使用静态链接库。默认情况下, GCC 在链接时优先使用动态链接库,只有当动态链接库不存在时才考虑使用静态链接库,如果需要的话可以在编译时加上 -static 选项,强制使用静态链接库。

    $ gcc –L /usr/dev/mysql/lib –static –lmysqlclient test.o –o test
    

7.1.5. 其他

静态库链接时搜索路径顺序:

  1. ld 会去找GCC命令中的参数 -L
  2. 再找 gcc 的环境变量 LIBRARY_PATH
  3. 再找内定目录 /lib /usr/lib /usr/local/lib 这是当初 compile gcc 时写在程序内的

动态链接时、执行时搜索路径顺序:

  1. 编译目标代码时指定的动态库搜索路径
  2. 环境变量 LD_LIBRARY_PATH 指定的动态库搜索路径
  3. 配置文件 /etc/ld.so.conf 中指定的动态库搜索路径
  4. 默认的动态库搜索路径 /lib
  5. 默认的动态库搜索路径 /usr/lib


有关环境变量

LIBRARY_PATH 环境变量:指定程序静态链接库文件搜索路径
LD_LIBRARY_PATH 环境变量:指定程序动态链接库文件搜索路径

7.2. 系统状态监视命令:top & htop

  1. top

    top.jpg

  2. htop
    • 下载及安装

      $ git clone https://github.com/hishamhm/htop 
      $ tar zxvf htop-2.0.2.tar.gz
      $ cd htop-2.0.2
      $ ./configure
      # make && make install
      

错误解决

configure: error: missing libraries: libncurses
Solving:
$ sudo apt-get install nucurses-dev

7.3. 网络监视命令:iftop

$ sudo apt-get install iftop

7.4. wget vs axel

// yum 源安装
# yum install axel
// 会存在以下问题,原因是安装的版本不是最新的。
too many directs.
// 针对以上问题,采用源码安装
// 依赖安装:
# yum install -y gcc openssl-devel
# wget https://github.com/axel-download-accelerator/axel/releases/download/v2.17.5/axel-2.17.5.tar.gz
# tar zxvf axel-2.17.5.tar.gz
# ./configure && make && sudo make install
# cp axel /usr/bin

7.5. 使用 you-get 和 youtube-dl 下载 YouTube 视频列表

7.5.1. you-get

// 官网
// 安装
$ pip3 install you-get
// 示例
$ you-get 'https://www.youtube.com/watch?v=FwbIeCf19jM'
// you-get 下载YouTube视频时,最近突然会出现编码问题,描述如下:
root@localhost:~# you-get https://www.youtube.com/watch?v=FwbIeCf19jM
[1] 12406
[2] 12407
root@ubuntu-512mb-sgp1-01:~# site:                YouTube
stream:
    - itag:          43
      container:     webm
      quality:       medium
      size:          238.7 MiB (12305670 bytes)
    # download-with: you-get --itag=43 [URL]

you-get: [error] oops, the current environment does not seem to support Unicode.
you-get: please set it to a UTF-8-aware locale first,
you-get: so as to save the video (with some Unicode characters) correctly.
you-get: you can do it like this:
you-get:     (Windows)    % chcp 65001 
you-get:     (Linux)      $ LC_CTYPE=en_US.UTF-8
解决:
$ LC_CTYPE=en_US.UTF-8

7.5.2. youtube-dl

// Youtube更新了视频格式后,很多高清晰度格式都是音频视频文件分离的,需要使用ffmpeg自动和并起来,所以除了安装youtube-dl,还要安装ffmpeg。
// 安装
$ sudo curl -L https://yt-dl.org/downloads/latest/youtube-dl -o /usr/local/bin/youtube-dl
$ sudo chmod a+rx /usr/local/bin/youtube-dl
// 更新youtube-dl
$ sudo youtube-dl -U
// 安装 ffmpeg 以支持视频和音频合成
// 安装所需的2个Repo
$ sudo dnf localinstall --nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-8.noarch.rpm
$ sudo dnf install --nogpgcheck https://download1.rpmfusion.org/nonfree/el/rpmfusion-nonfree-release-8.noarch.rpm
// 安装ffmpeg
$ sudo dnf install ffmpeg ffmpeg-devel
// 安装完毕后验证版本
$ rpm -qi ffmpeg
$ ffmpeg -version
// 示例
$ youtube-dl https://www.youtube.com/watch?v=9o6mAYxm5CQ
$ youtube-dl https://www.youtube.com/watch?v=9o6mAYxm5CQ -o newname.mp4
// 下载多个文件
$ youtube-dl url1 url2 url3
$ youtube-dl -a url.txt
// 查看所有格式以及选择格式下载
$ youtube-dl -F <url>
// 只下载音频
$ youtube-dl -f format_code url
$ youtube-dl -x https://www.youtube.com/watch?v=9o6mAYxm5CQ
// 下载字幕
# --all-subs 下载所有语言的字幕
$ youtube-dl -f 134+140 --all-subs https://www.youtube.com/watch?v=pffIsZ1hBvM
# 查看所有字幕信息(未下载)
$ youtube-dl --list-subs https://www.youtube.com/watch?v=pffIsZ1hBvM
# 只下载某种语言的字幕,加--sub-lang zh-Hans来下载中文字幕
$ youtube-dl --write-sub --sub-lang zh-Hans --skip-download  https://www.youtube.com/watch?v=pffIsZ1hBvM

7.6. MPlayer

// official:http://www.mplayerhq.hu/design7/news.html
$ tar -Jxf MPlayer-1.1.1.tar.xz
$ cd MPlayer-1.1.1
$ sudo ./configure
// 发现,需要安装一个依赖包:yasm
$ wget http://www.tortall.net/projects/yasm/releases/yasm-1.2.0.tar.gz
// 安装完成后,重新配置、编译和安装
$ sudo ./configure
$ sudo make && make install

7.7. google-chrome & chromium

  1. 添加安装源

    $ sudo vim /etc/apt/sources.list
    deb http://dl.google.com/linux/chrome/deb/ stable main
    
  2. 添加公钥验证下载

    $ wget https://dl-ssl.google.com/linux/linux_signing_key.pub
    $ apt-key add linux_signing_key.pub
    
  3. 执行安装

    $ sudo apt update
    // stable ersion
    $ sudo apt install google-chrome-stable
    // beta or unstable ersion
    $ sudo apt install google-chrome-beta
    $ sudo apt install google-chrome-unstable
    
  4. 安装 chromium

    $ sudo apt-get update
    $ sudo apt-get install chromium chromium-l10n
    (chromium-l10n 是用于本地化界面的,是可选的软件包)
    注意:chromium不支持PDF查看
    

7.8. Scrot:截图工具

  1. 安装

    $ sudo apt-get install scrot
    
  2. 使用方法
    • 整个桌面截图(Full desktop)

      $ scrot
      $ scrot ~/Downloads/my_desktop.png //Saving to specified directory.
      
    • 特定区域截图(选择截取)(Specific area)

      $ scrot -s
      
    • 延迟截图(temporize screenshot)

      $ scrot -s -d 5
      
    • 截图调整质量(Adjust the quality of screenshots)

      $ scrot -q 50
      
    • 截图调整大小(Adjust the screen size)

      $ scrot -t 10
      
    • 将截图发送给其他命令(Deliver the intercepted screenshots to other commands)

      $ scrot -e 'mv $f ~/screenshots'
      
  3. 参考资料(References)

    https://linux.cn/article-3197-1.html
    

7.9. rarcrack(压缩包密码破解工具)

支持格式:rar,7z,zip
// install
$ sudo apt-get install libxml2-dev build-essential
$ sudo apt-get install rarcrack
// use
$ rarcrack --threads 10 --type rar test.rar

7.10. 宝塔面板

一款使用方便、功能强大且终身免费的服务器管理软件。详见官网:http://www.bt.cn/

7.11. Cisco AnyConnect VPN Client

  1. 问题解决

    $ sudo systemctl enable vpnagentd_init
    vpnagentd_init.service is not a native service, redirecting to systemd-sysv-install.
    Executing: /lib/systemd/systemd-sysv-install enable vpnagentd_init
    insserv: warning: script 'vpnagentd_init' missing LSB tags and overrides
    insserv: There is a loop between service bt and vpnagentd_init if stopped
    insserv:  loop involving service vpnagentd_init at depth 2
    insserv:  loop involving service bt at depth 1
    insserv: Stopping vpnagentd_init depends on bt and therefore on system facility `$all' which can not be true!
    insserv: exiting now without changing boot order!
    update-rc.d: error: insserv rejected the script header
    
    [solve]:$ sudo vim /etc/init.d/vpnagentd_init
    
    #!/bin/sh
    ### BEGIN INIT INFO
    # Provides: vpnagentd_init
    # Required-Start: $remote_fs $syslog
    # Required-Stop: $remote_fs $syslog
    # Default-Start: 2 3 4 5
    # Default-Stop: 0 1 6
    # Short-Description: Start Cisco vpn agent daemon at boot time
    # Description: Cisco vpn agent daemon
    ### END INIT INFO
    

7.12. Bind:DNS工具

  1. 安装

    # yum install -y bind
    
  2. 配置

    1)# vim /etc/named.conf
    修改内容如下:
     将下面
     listen-on port 53 { 127.0.0.1; };
     allow-query { localhost; };
     改为
     listen-on port 53 { any; };
     allow-query { any; };
    
    2)# vim named.rfc1912.zones
    注意改动位置:
    zone "zrg.com.cn" IN {
    type master;
    file "named.zrg";
    allow-update { none; };
    };
    
    3)# cp /var/named/named.localhost /var/named/named.zrg
    //修改文件所属群组
    #chgrp named /var/named/named.zrg
    
    4)# vim /var/named/named.zrg
    注意改动位置:
    $TTL 1D
    @ IN SOA @ dns.zrg.com.cn. root(
    0 ; serial
    1D ; refresh
    1H ; retry
    1W ; expire
    3H ) ; minimum
    NS dns.zrg.com.cn.
    DNS A 192.168.120.166
    A 127.0.0.1
    AAAA ::1
    
    5)# /etc/init.d/named restart
    # chkconfig named on
    
    6)# vim /etc/sysconfig/network
    Network=yes
    Hostname=dns.zrg.com.cn
    
    7)# vim /etc/resolv.conf
    Search zrg.com.cn
    Nameserver 192.168.120.166
    
    8)# /etc/init.d/named restart
    # ping zrg.com.cn
    # reboot
    

7.13. Composer

  1. 安装

    1.Download composer.phar file.
    2.Excute:
    # php composer.phar
    3.Global:
    # mv composer.phar /usr/local/bin/composer
    4.Permission:
    # chmod 744 composer
    
  2. 问题解决

    error: /usr/bin/env: php: No such file or directory
     solve:Configuring php to become global variables
    

7.14. Cygwin:windows 下 Linux 模拟软件

  1. 安装Cygwin

    略
    提示:安装软件时,可使用中国科技大学软件源mirrors.ustc.edu.cn/cygwin
    
    // 举例说明:安装及配置ssh
    1.运行安装文件
    2.搜索ssh,在Net类别下选上OpenSSH和OpenSSL两项
    3.安装完成后,打开Cygwin,输入ssh-host-config
    当询问if privilege separation should be used 时输入 no . 
    当询问if sshd should be installed as a service 时输入yes . 
    当询问about the value of CYGWIN environment variable enter 时输入 ntsec .
    其余询问均输入 no
    4.在cygwin中输入 cygrunsrv --start sshd 启动sshd
    5.打开cygwin,输入 ssh-keygen,当询问要filenames 和 pass phrases 的时候都点回车,接受默认的值
    6.命令结束后输入 cd ~/.ssh 转到.ssh目录,输入 ls –l 应该包含两个文件:id_rsa.pub 和 id_rsa
    7.在第8步的窗口(当前目录在.ssh)中输入 cat id_rsa.pub >> authorized_keys
    8.输入 ssh localhost 启动SSH
    
  2. 参考资料

    1.Cygwin-Official Site:http://cygwin.com/
    2.Cygwin-Wikipedia:https://en.wikipedia.org/wiki/Cygwin
    3.Cygwin-百度百科:http://baike.baidu.com/view/3968.htm
    4.Cygwin在线安装指南:http://www.crifan.com/files/doc/docbook/cygwin_intro/release/htmls/install_cygwin_setup_exe.html
    

7.15. Wps for Linux

1. 从官网下载安装包,网址:http://www.wps.cn/
2. 安装
$ sudo dpkg -i wps_office_10.xxx.deb
3. 安装完成后,提示“系统缺失字体symbol、wingdings、wingdings 2、wingdings 3、webding”的解决办法:
1) 下载缺失的字体文件,然后复制到Linux系统中的/usr/share/fonts文件夹中。
国外下载地址:https://www.dropbox.com/s/lfy4hvq95ilwyw5/wps_symbol_fonts.zip
国内下载地址:http://pan.baidu.com/s/1mh0lcbY
或者直接 在win 中(C/WINDOWS/FONTS)
2) 执行以下命令,生成字体的索引信息:
$ sudo mkfontscale
$ sudo mkfontdir
3) 运行fc-cache命令更新字体缓存
$ sudo fc-cache

7.16. gnome-screenshots

  1. 常用快捷键

    Prt Scrn to take a screenshot of the desktop.
    Alt+Prt Scrn to take a screenshot of a window.
    Shift+Prt Scrn to take a screenshot of an area you select.
    
  2. 参考资料(References)

8. 附录B:常见问题收集

8.1. 电脑没有声音问题解决

  1. 安装驱动软件

    $ sudo apt-get install alsa-utils
    $ sudo apt-get install alsa-oos
    $ sudo apt-get install esound
    $ sudo apt-get install gnome-audio
    
  2. 检查声卡驱动

    $ lspci |grep Audio
    
  3. 检查内核模块

    $ lsmod |grep snd
    
  4. 检查系统音量

    $ alsamixer
    

    alsamixer 是 alsa 驱动的一个插件,是一个命令行下的图形设置工具。alsamixer 命令,00 表示音量正常,MM表示此声道静音。可以通过M键切换。

  5. 初始化声卡

    $ sudo alsactl init
    
  6. 参考资料

8.2. 命令行下不能输入中文标点符号

使用快捷键 Ctrl+. 一个是lation 符号,一个是全角符号。

8.3. 不能在 Sublime 编辑器(Editor)中输入中文

  1. 下载(Download)

    $ git clone https://github.com/lyfeyaj/sublime-text-imfix.git
    
  2. 配置(Configure)

    $ cd ~/sublime-text-imfix
    $ sudo cp ./lib/libsublime-imfix.so /opt/sublime_text/
    $ sudo cp ./src/subl /usr/bin/ 
    $ LD_PRELOAD=./libsublime-imfix.so subl
    
  3. 新建Shell脚本

    $ vim /home/zrg/sublime
    #!/bin/bash
    LD_PRELOAD=/opt/sublime_text/libsublime-imfix.so subl
    
  4. 参考资料

    http://www.jianshu.com/p/bf05fb3a4709
    

8.4. 解决系统不能支持加密算法:chacha20

$ sudo apt-get install m2crypto gcc -y
$ wget -N --no-check-certificate https://download.libsodium.org/libsodium/releases/libsodium-1.0.8.tar.gz
$ tar zxvf libsodium-1.0.8.tar.gz
$ cd libsodium-1.0.8
$ ./configure
$ sudo make && make install
$ sudo echo "include ld.so.conf.d/*.conf">/etc/ld.so.conf
$ sudo echo "/lib">>/etc/ld.so.conf
$ sudo echo "/usr/lib64">>/etc/ld.so.conf
$ sudo echo "/usr/local/lib">>/etc/ld.so.conf
$ ldconfig

8.5. 软件源配置不全,导致软件不能安装

//Error: Can't fix the error because you are asking some packages to stay the same, that is they break the dependencies between the packages.
//翻译:无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系
//解决:检查安装源,进行重新配置,必要时添加debian官方安装源
$ vim /etc/apt/sources.list
$ sudo apt-get update

8.6. .deb 转换为 .rpm

8.6.1. 下载及安装 alien

1.下载:
$ wget https://packages.debian.org/unstable/source/alien
2.安装:
$ tar xpvf alien_8.95.tar.xz 
$ cd alien-8.95
$ make && make install

8.6.2. 转换(Conversion)

$ alien -r kuaipan4uk_2.0.0.5_amd64.deb

8.7. 软件自启动脚本实例

8.7.1. 实例:php-fpm 服务启动脚本

  1. $ sudo vim /etc/init.d/php-fpm
#!/bin/sh
# DateTime:2017-03-09
# Author:zrg
# chkconfig: - 84 16
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0

phpfpm="/usr/local/php/sbin/php-fpm"
prog=$(basename ${phpfpm})

lockfile=/var/lock/subsys/phpfpm

start() {
    [ -x ${phpfpm} ] || exit 5
    echo -n $"Starting $prog: "
    daemon ${phpfpm}
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}

stop() {
    echo -n $"Stopping $prog: "
    killproc $prog -QUIT
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}

restart() {
    configtest || return $?
    stop
    start
}

reload() {
    configtest || return $?
    echo -n $"Reloading $prog: "
killproc ${phpfpm} -HUP
    RETVAL=$?
    echo
}

force_reload() {
    restart
}

configtest() {
  ${phpfpm} -t
}

rh_status() {
    status $prog
}

rh_status_q() {
    rh_status >/dev/null 2>&1
}

case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart|configtest)
        $1
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    status)
        rh_status
        ;;
     *)
        echo $"Usage: $0 {start|stop|status|restart|reload|configtest}"
        exit 2
esac
脚本说明:
# Source function library.  
. /etc/rc.d/init.d/functions  //类似于include,require,引入文件。
# Source networking configuration.  
. /etc/sysconfig/network   //同理。
//引入后,用到的daemon、status
NETWORKING=yes
 HOSTNAME=E10162
//将他们作为变量赋值,判断网卡是否启动,如果你的 nginx 不走网卡,其实网络这段可以去掉
//daemon便是实现上图漂亮的【 OK 】的函数.

2.设置自启动

# php-fpm 加入服务
chkconfig --add php-fpm
# php-fpm 234 级别下设置为启动
chkconfig php-fpm on
# 查看 php-fpm 服务当前配置
chkconfig --list php-fpm
php-fpm         0:off   1:off   2:on    3:on    4:on    5:on    6:off

3.php-fpm操作

# 启动/关闭/重启/重载
service php-fpm start/stop/restart/reload
# 检查配置文件
#service php-fpm configtest

8.8. 解决 dpkg: warning: files list file for package 'x' missing 问题

for package in $(apt-get upgrade 2>&1 |\
                 grep "warning: files list file for package '" |\
                 grep -Po "[^'\n ]+'" | grep -Po "[^']+"); do
    apt-get install --reinstall "$package";
done

8.9. dpkg: error: failed to open package info file `/var/lib/dpkg/available' for reading

$ sudo dpkg --configure -a
$ sudo apt-get -f install
$ sudo apt-get --fix-missing install
$ sudo apt-get clean
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get dist-upgrade
$ sudo apt-get clean
$ sudo apt-get autoremove

8.10. CentOS 7关闭firewall,安装iptables

1. 查看安装和状态
$ yum installed firewalld iptables
$ systemctl list-unit-files firewalld.service iptables.service
2. 停止并禁止自启动firewall和安装iptables防火墙
$ systemctl stop firewalld.service
$ systemctl disable firewalld.service
$ yum install iptables-service
$ systemctl enable iptables.service
3. 编辑并修改配置文件/etc/sysconfig/iptables,使用如下配置
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:TEST - [0:0]
-A INPUT -j TEST
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -i eth1 -d 192.168.1.100 --syn -m recent --name suduip --rcheck --seconds 1 --hitcount 15 -j DROP
-A INPUT -p tcp -i eth1 -d 192.168.1.100 --syn -m recent --name suduip --set
-A INPUT -i eth1 -p tcp -m tcp -d 192.168.1.100 --syn -m connlimit --connlimit-above 50 --connlimit-mask 32 --connlimit-saddr -j DROP
#-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG SYN -m length --length 0:128 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
... ...
-A INPUT -j DROP
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j TEST
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A OUTPUT -j TEST
-A TEST -j RETURN
COMMIT

4. 查看防火墙规则是否启用。
$ iptables -L