当前位置 : 首页 » 文章分类 :  开发  »  Linux-常用配置

Linux-常用配置

linux配置笔记


/proc/meminfo 内存信息

其实 free 命令中的信息都来自于 /proc/meminfo 文件。/proc/meminfo 文件包含了更多更原始的信息,只是看起来不太直观:

/proc/cpuinfo CPU信息

lscpu 命令的内容来自 cat /proc/cpuinfo

查看cpu核数

总核数 = 物理CPU个数 X 每颗物理CPU的核数
总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数

# 查看物理CPU个数
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l

# 查看每个物理CPU中core的个数(即核数)
cat /proc/cpuinfo| grep "cpu cores"| uniq

# 查看逻辑CPU的个数
cat /proc/cpuinfo| grep "processor"| wc -l

/proc/pid 查看进程的运行目录

通过 ps 及 top 只能看到进程的相对路径,看不到的进程的详细信息,如绝对路径等。
可以通过查看 /proc/pid 得到进程可执行文件的绝对路径信息。
Linux 在启动一个进程时,会给进程分配一个 ID,就是进程号 PID,同时系统会在 /proc 下创建一个以 PID 命名的文件夹,在该文件夹下会有我们的进程的信息,其中包括一个名为 exe 的文件即记录了可执行文件的绝对路径,通过 llls –l 命令即可查看。

exe 符号连接就是可执行程序的绝对路径
cwd 符号链接的是进程运行目录
cmdline 就是程序运行时输入的命令行命令,是个文本文件,可以 cat 查看
environ 记录了进程运行时的环境变量,是个文本文件,可以 cat 查看
fd 目录下是进程打开或使用的文件的符号连接。

[centos@centos ~]$ sudo ls -al /proc/13998
总用量 0
dr-xr-xr-x   9 centos root 0 6月  27 23:23 .
dr-xr-xr-x 141 root   root 0 6月  27 22:58 ..
dr-xr-xr-x   2 centos root 0 8月   8 17:13 attr
-rw-r--r--   1 centos root 0 8月   8 17:13 autogroup
-r--------   1 centos root 0 8月   8 17:13 auxv
-r--r--r--   1 centos root 0 8月   8 17:13 cgroup
--w-------   1 centos root 0 8月   8 17:13 clear_refs
-r--r--r--   1 centos root 0 6月  28 14:23 cmdline
-rw-r--r--   1 centos root 0 8月   8 17:13 comm
-rw-r--r--   1 centos root 0 8月   8 17:13 coredump_filter
-r--r--r--   1 centos root 0 8月   8 17:13 cpuset
lrwxrwxrwx   1 centos root 0 8月   8 17:13 cwd -> /usr/share/elasticsearch
-r--------   1 centos root 0 8月   8 17:13 environ
lrwxrwxrwx   1 centos root 0 8月   8 17:13 exe -> /usr/share/elasticsearch/jdk/bin/java
dr-x------   2 centos root 0 8月   8 17:13 fd
dr-x------   2 centos root 0 8月   8 17:13 fdinfo
-rw-r--r--   1 centos root 0 8月   8 17:13 gid_map
-r--------   1 centos root 0 8月   8 17:13 io
-r--r--r--   1 centos root 0 8月   8 17:13 limits
-rw-r--r--   1 centos root 0 8月   8 17:13 loginuid
dr-x------   2 centos root 0 8月   8 17:13 map_files
-r--r--r--   1 centos root 0 8月   8 17:13 maps
-rw-------   1 centos root 0 8月   8 17:13 mem
-r--r--r--   1 centos root 0 8月   8 17:13 mountinfo
-r--r--r--   1 centos root 0 8月   8 17:13 mounts
-r--------   1 centos root 0 8月   8 17:13 mountstats
dr-xr-xr-x   6 centos root 0 8月   8 17:13 net
dr-x--x--x   2 centos root 0 8月   8 17:13 ns
-r--r--r--   1 centos root 0 8月   8 17:13 numa_maps
-rw-r--r--   1 centos root 0 8月   8 17:13 oom_adj
-r--r--r--   1 centos root 0 8月   8 17:13 oom_score
-rw-r--r--   1 centos root 0 8月   8 17:13 oom_score_adj
-r--r--r--   1 centos root 0 8月   8 17:13 pagemap
-r--------   1 centos root 0 8月   8 17:13 patch_state
-r--r--r--   1 centos root 0 8月   8 17:13 personality
-rw-r--r--   1 centos root 0 8月   8 17:13 projid_map
lrwxrwxrwx   1 centos root 0 8月   8 17:13 root -> /
-rw-r--r--   1 centos root 0 8月   8 17:13 sched
-r--r--r--   1 centos root 0 8月   8 17:13 schedstat
-r--r--r--   1 centos root 0 8月   8 17:13 sessionid
-rw-r--r--   1 centos root 0 8月   8 17:13 setgroups
-r--r--r--   1 centos root 0 8月   8 17:13 smaps
-r--r--r--   1 centos root 0 8月   8 17:13 stack
-r--r--r--   1 centos root 0 6月  27 23:23 stat
-r--r--r--   1 centos root 0 6月  27 23:30 statm
-r--r--r--   1 centos root 0 6月  28 14:23 status
-r--r--r--   1 centos root 0 8月   8 17:13 syscall
dr-xr-xr-x  59 centos root 0 8月   8 17:13 task
-r--r--r--   1 centos root 0 8月   8 17:13 timers
-rw-r--r--   1 centos root 0 8月   8 17:13 uid_map
-r--r--r--   1 centos root 0 8月   8 17:13 wchan

/proc/swaps 交换空间信息

swapon -s 查看系统交换空间使用状况:

$ swapon -s
文件名             类型      大小    已用   权限
/dev/nvme0n1p2  partition    839676    227688    -1

其实 swapon -s 命令查看的是 /proc/swaps 文件的内容,等价于:
cat /proc/swaps

$ cat /proc/swaps
Filename                Type        Size    Used    Priority
/swapfile1                              file        1048572    142592    -2

linux OOM killer机制

分配物理页面的方式,可以大大节省物理内存的使用,但有时会导致 Memory Overcommit。所谓 Memory Overcommit,也就是说,所有进程使用的虚拟内存超过了系统的物理内存和交换空间的总和。默认情况下,Linux 是允许 Memory Overcommit 的。并且在大多数情况下,Memory Overcommit 也是安全的,因为很多进程只是申请了很多内存,但实际使用到的内存并不多。
但万一很多进程都使用了申请来的大部分内存,就可能导致物理内存和交换空间不够用了,这时内核的 OOM Killer 就会出马,它会选择杀掉一个或多个进程,这样就能腾出一些内存给其它进程使用。

vm.overcommit_memory

在 Linux 中,可以通过内核参数 vm.overcommit_memory 去控制是否允许 overcommit:
默认值是 0,在这种情况下,只允许轻微的 overcommit,而比较明显的 overcommit 将不被允许。
如果设置为 1,表示总是允许 overcommit。
如果设置为 2,则表示总是禁止 overcommit。也就是说,如果某个申请内存的操作将导致 overcommit,那么这个操作将不会得逞。

vm.overcommit_memory = 1: 总是允许 overcommit
vm.overcommit_memory = 0: 则比较 此次请求分配的虚拟内存大小和系统当前空闲的物理内存加上swap,决定是否放行。
vm.overcommit_memory = 2: 则会比较 进程所有已分配的虚拟内存加上此次请求分配的虚拟内存和系统当前的空闲物理内存加上swap,决定是否放行。

查看 vm.overcommit_memory

$ cat /proc/sys/vm/overcommit_memory
0

有三种方式修改内核参数,但要有root权限:
(1)编辑/etc/sysctl.conf ,改vm.overcommit_memory=1,然后sysctl -p使配置文件生效
(2)sysctl vm.overcommit_memory=1
(3)echo 1 > /proc/sys/vm/overcommit_memory

vm.overcommit_ratio

那么对内核来说,怎样才算 overcommit 呢?
Linux 设定了一个阈值,叫做 CommitLimit,如果所有进程申请的总内存超过了 CommitLimit,那就算是 overcommit 了。在 /proc/meminfo 中可以看到 CommitLimit 的大小:

$ cat /proc/meminfo | grep CommitLimit
CommitLimit:     3037408 kB

CommitLimit 的值是这样计算的:
CommitLimit = [swap size] + [RAM size] * vm.overcommit_ratio / 100
其中的 vm.overcommit_ratio 也是内核参数,它的默认值是 50。
查看 vm.overcommit_ratio

$ cat /proc/sys/vm/overcommit_ratio
50

改为 100
sysctl vm.overcommit_ratio=100

当物理内存和交换空间不够用时,OOM Killer 就会选择杀死进程,那么它是怎样知道要先杀死哪个进程呢?
其实 Linux 的每个进程都有一个 oom_score (位于 /proc/<pid>/oom_score),这个值越大,就越有可能被 OOM Killer 选中。oom_score 的值是由很多因素共同决定的,这里列举几个因素:
如果进程消耗的内存越大,它的 oom_score 通常也会越大。
如果进程运行了很长时间,并且消耗很多 CPU 时间,那么通常它的 oom_score 会偏小。
如果进程以 superuser 的身份运行,那么它的 oom_score 也会偏小。

每个进程都有一个 oom_adj (位于 /proc/<pid>/oom_adj),这个值的范围是 [-17, +15],进程的 oom_adj 会影响 oom_score 的计算,也就是说,我们可以通过调小进程的 oom_adj 从而降低进程的 oom_score。对于一些比较重要的进程,例如 MySQL,我们想尽量避免它被 OOM Killer 杀死,这时候就可以调低它的 oom_adj 的值,例如:
sudo echo -10 > /proc/$(pidof mysqld)/oom_adj

overcommit
https://www.kernel.org/doc/Documentation/vm/overcommit-accounting

Linux 的 OOM Killer 机制分析
http://senlinzhan.github.io/2017/07/03/oom-killer/


/etc/hosts

其实hosts文件的作用相当如DNS,提供IP地址到hostname的对应。
早期的互联网计算机数量少,单机hosts文件里足够存放所有联网计算机。
不过随着互联网的发展,这就远远不够了。于是就出现了分布式的DNS系统。由DNS服务器来提供类似的IP地址到域名的对应。
具体可以man hosts查看相关信息。

Linux系统在向DNS服务器发出域名解析请求之前会查询 /etc/hosts 文件,如果里面有相应的记录,就会使用hosts里面的记录。
/etc/hosts文件通常里面包含这一条记录
127.0.0.1 localhost.localdomain localhost
hosts文件格式是一行一条记录,分别是IP地址 、hostname、 aliases,三者用空白字符分隔,aliases可选。
127.0.0.1到localhost这一条建议不要修改,因为很多应用程序会用到这个,比如sendmail,修改之后这些程序可能就无法正常运行。


设置主机名

hostname 命令用于显示和设置系统的主机名称。

hostname 显示当前主机名
hostname dell 临时设置主机名为dell

环境变量 $HOSTNAME 也保存了当前的主机名。
在使用hostname命令设置主机名后,系统并不会永久保存新的主机名,重新启动机器之后还是原来的主机名。
如果需要永久修改主机名,需要同时修改 /etc/hosts/etc/sysconfig/network 的相关内容。

hostname newhostname 运行后立即生效(新会话生效),但是在系统重启后会丢失所做的修改
echo newhostname > /proc/sys/kernel/hostname 运行后立即生效(新会话生效),但是在系统重启后会丢失所做的修改
sysctl kernel.hostname=newhostname 运行后立即生效(新会话生效),但是在系统重启后会丢失所做的修改
修改 /etc/sysconfig/network 下的 HOSTNAME 变量 HOSTNAME=centos , 重启后生效,永久性修改。
修改 /etc/hosts 添加一行 127.0.0.1 centos, 使得本机的应用程序通过 centos 能够解析到本机

深入理解Linux修改hostname
https://www.cnblogs.com/kerrycode/p/3595724.html


Centos7 hostname 配置

在 CentOS7 中有三种定义的主机名: 静态的(static)、瞬态的(transient)、和灵活的(pretty)。

  • 静态主机名也称为内核主机名,是系统在启动时从 /etc/hostname 内自动初始化的主机名。
  • 瞬态主机名是在系统运行时临时分配的主机名。
  • 灵活主机名则允许使用特殊字符的主机名。

static 主机名设置后是永久生效的,不需要重启系统。

hostnamectl 是 CentOS7 中新增的命令,用来修改主机名。

hostnamectl 查看主机名

hostnamectlhostnamectl status 查看所有当前主机名
aws

$ hostnamectl
   Static hostname: centos
         Icon name: computer-vm
           Chassis: vm
        Machine ID: 05cb8c7b39fe0f70e3ce97e5beab809d
           Boot ID: 10b51cd92dd449b0a72132fc1eb30ab8
    Virtualization: xen
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-957.1.3.el7.x86_64
      Architecture: x86-64

linode

$ hostnamectl
   Static hostname: localhost.localdomain
Transient hostname: li1875-57.members.linode.com
         Icon name: computer-vm
           Chassis: vm
        Machine ID: 7d3446d2dcad4627b80beedf2d3f479a
           Boot ID: 8943de6ddbeb4a66b0bb6d9dd69ceb3f
    Virtualization: kvm
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-1127.el7.x86_64
      Architecture: x86-64

hostnamectl set-hostname 设置主机名

此命令需要 root 权限

hostnamectl set-hostname name 设置所有主机名为 name
这样会将 pretty、static 和 transient 主机名变得相似。Static 和 transient 主机名会简化为 pretty 主机名格式。使用 “-” 替换空格,并删除特殊字符。

hostnamectl set-hostname name [option...] 设置特定类型的主机名为 name
其中 option 是 --pretty, --static--transient 中的一个或多个选项。

hostnamectl set-hostname "" [option...] 清除特定主机名,并将其还原为默认形式,"" 是空白字符串


/etc/passwd 用户信息

使用 useradd 指令所建立的帐号,实际上是保存在/etc/passwd文本文件中。
在该文件中,每一行用户记录的各个数据段用 “:” 分隔,分别定义了用户的各方面属性。各个字段的顺序和含义如下:
注册名:口令:用户标识号:组标识号:用户名:用户主目录:登录shell

口令(passwd):系统用口令来验证用户的合法性。超级用户root或某些高级用户可以使用系统命令passwd来更改系统中所有用户的口令,普通用户也可以在登录系统后使用passwd命令来更改自己的口令。
现在的Unix/Linux系统中,口令不再直接保存在passwd文件中,通常将passwd文件中的口令字段使用一个“x”来代替,将/etc/shadow作为真正的口令文件,用于保存包括个人口令在内的数据。当然shadow文件是不能被普通用户读取的,只有超级用户才有权读取。

查看所有用户

cat /etc/passwd
看第三个参数 uid, 500 以上的,就是后面建的用户了.其它则为系统的用户

禁止用户登录

1 通过修改指定用户的登录 shell 为 /sbin/nologin 来禁止用户登录
例如
usermod -s /sbin/nologin testuser 将 testuser 的 login shell修改为nologin
或者
chsh testuser -s /sbin/nologin 将用户 testuser 的shell修改为nologin
此外,还可以修改 /etc/nologin.txt (没有就新建一个),在里面添加给被禁止用户的提示
解禁用户的方式就是把shell改为他原有的就可以了。

2 如果你是root用户,当你不想让所有用户登录时(比如你要维护系统升级什么的),一个一个地去禁止很麻烦
有一种禁止除 root 用户外所有其他用户登录的方法
在 /etc 目录下建立一个名为 nologin 的文档
touch /etc/nologin 如果该文件存在,那么Linux上的所有用户(除了root以外)都无法登录
可以在 /etc/nologin 中写点什么,告诉用户为何无法登录
cat /etc/nologin
9:00-10:00 系统升级,所有用户都禁止登录!

解禁帐号也简单,直接将 /etc/nologin 删除就行了


/etc/shells

/etc/shells 是系统可用 shell 列表
chsh 改变登陆shell时,会查询这个文件。
一些程序会根据这个文件来判断一个用户是否是有效用户,例如FTP服务会阻止那些shell不在/etc/shells里的用户登陆。

# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/zsh
/bin/tcsh
/bin/csh

(1)Bourne Shell(sh)是 AT&T Bell 实验室的 Steven Bourne为 AT&T 的 Unix 开发的,它是 Unix 的默认 Shell,也是其它Shell的开发基础。Bourne Shell 在编程方面相当优秀,但在处理与用户的交互方面不如其它几种 Shell 。

(2)C Shell(csh)是加州伯克利大学的 Bill Joy 为 BSD Unix 开发的,与 sh 不同,它的语法与 C 语言很相似。它提供了 Bourne Shell 所不能处理的用户交互特征,如命令补全、命令别名、历史命令替换等。但是,C Shell 与 BourneShell 并不兼容。

(3)Korn Shell(ksh)是 AT&T Bell 实验室的 David Korn 开发的,它集合了 C Shell 和 Bourne Shell 的优点,并且与 Bourne Shell 向下完全兼容。Korn Shell 的效率很高,其命令交互界面和编程交互界面都很好。

(4)Bourne Again Shell (即bash)是自由软件基金会(GNU)开发的一个 Shell,它是 Linux 系统中一个默认的 Shell。Bash 不但与 Bourne Shell 兼容,还继承了 C Shell、Korn Shell 等优点。


/etc/group 组信息

将用户分组是 Linux 系统中对用户进行管理及控制访问权限的一种手段。每个用户都属于某个用户组;一个组中可以有多个用户,一个用户也可以属于不同的组。当一个用户同时是多个组中的成员时,在 /etc/passwd 文件中记录的是用户所属的主组,也就是登录时所属的默认组,而其他组称为附加组。

用户组(Group)配置文件主要有 /etc/group 和 /etc/gshadow,其中 /etc/gshadow 是 /etc/group 的加密信息文件。

用户组的所有信息都存放在 /etc/group 文件中。此文件的格式是由冒号(:)隔开若干个字段,这些字段具体如下:
组名:口令:组标识号:组内用户列表 每个用户组一条记录
组名:组名是用户组的名称,由字母或数字构成。与 /etc/passwd 中的登录名一样,组名不应重复。
口令:口令或免密字段存放的是用户组加密后的口令字。一般 Linux 系统的用户组都没有口令,即这个字段一般为空,或者是x,密码存放在 /etc/gshadow 中
组标识号:组标识号 GID 与用户标识号类似,也是一个整数,被系统内部用来标识组。别称 GID
组内用户列表:是属于这个组的所有用户的列表,不同用户之间用逗号(,)分隔。这个用户组可能是用户的主组,也可能是附加组。本字段可以为空;

/etc/group 的内容包括用户组(Group)、用户组口令、GID及该用户组所包含的用户(User),每个用户组一条记录;

wheel 用户组

在 Linux 中为了更进一步加强系统的安全性,一个管理员的组,只允许这个组的用户来执行 su - 命令登录为 root 用户,而让其他组的用户即使执行 su - 输入了正确的root密码,也无法登录为root用户。在UNIX和Linux下,这个组的名称通常为 wheel。而这个是在配置文件 /etc/pam.d/su 里面配置的:

auth   required     pam_wheel.so use_uid

wheel 组的概念继承自 UNIX。当服务器需要进行一些日常系统管理员无法执行的高级维护时,往往就要用到 root 权限;而“wheel” 组就是一个包含这些特殊权限的用户池;也就是说,如果你不是“wheel”组的成员,就无法取得 root 权限进行一些特权的操作;
除了 root 用户,只有 wheel 组的成员有特权执行高级操作


/etc/sysctl.conf

vm.max_map_count

vm.max_map_count 文件包含限制一个进程可以拥有的VMA(虚拟内存区域)的数量。虚拟内存区域是一个连续的虚拟地址空间区域。在进程的生命周期中,每当程序尝试在内存中映射文件,链接到共享内存段,或者分配堆空间的时候,这些区域将被创建。调优这个值将限制进程可拥有VMA的数量。限制一个进程拥有VMA的总数可能导致应用程序出错,因为当进程达到了VMA上线但又只能释放少量的内存给其他的内核进程使用时,操作系统会抛出内存不足的错误。如果你的操作系统在NORMAL区域仅占用少量的内存,那么调低这个值可以帮助释放内存给内核用。

默认值为 65536

调整示例,如下调整为默认的4倍
sysctl -w vm.max_map_count=262144

查看修改结果
sysctl -a|grep vm.max_map_count

注意如果使用

sysctl -w vm.max_map_count=262144
sysctl -p

来修改,操作系统重启后值会改变,如果想永久改变需要采用如下形式。
vm.max_map_count=262144 直接写到 /etc/sysctl.conf 中

echo "vm.max_map_count=262144" > /etc/sysctl.conf
sysctl -p

/etc/fstab 文件系统挂载信息

/etc/fstab 是用来存放文件系统的静态信息的文件。
当系统启动的时候,系统会自动地从这个文件读取信息,并且会自动将此文件中指定的文件系统挂载到指定的目录。
它只是一个文本文件,你能够用你喜欢的编辑器打开它,但是必须是root用户才能编辑它。同时fsck、mount、umount的等命令都利用该文件。

$ cat /etc/fstab
#
# <file system>  <dir>  <type>  <options>     <dump> <pass>
LABEL=/     /           ext4    defaults,noatime  1   1
tmpfs       /dev/shm    tmpfs   defaults        0   0
devpts      /dev/pts    devpts  gid=5,mode=620  0   0
sysfs       /sys        sysfs   defaults        0   0
proc        /proc       proc    defaults        0   0

挂载设备 : 不是我们通常理解的文件系统,而是指设备(硬盘及其分区,DVD光驱等)。它告知我们设备(分区)的名字,这是你在命令行中挂载(mount)、卸载(umount)设备时要用到的。
挂载点:告诉我们设备挂载到哪里。
文件系统类型:Linux支持许多文件系统。 要得到一个完整的支持名单查找mount man-page。典型 的名字包括这些:ext2, ext3, reiserfs, xfs, jfs,iso9660, vfat, ntfs, swap和auto, ‘auto’ 不是一个文件系统,而是让mount命令自动判断文件类型,特别对于可移动设备,软盘,DVD驱动器,这样做是很有必要的,因为可能每次挂载的文件类型不一致。
文件系统参数:这部分是最有用的设置!!! 它能使你所挂载的设备在开机时自动加载、使中文显示不出现乱码、限制对挂载分区读写权限。它是与mount命令的用法相关的,要想得到一个完整的列表,参考mount manpage.
备份命令:dump utility用来决定是否做备份的. dump会检查entry并用数字来决定是否对这个文件系统进行备份。允许的数字是0和1。如果是0,dump就会忽略这个文件系统,如果是1,dump就会作一个备份。大部分的用户是没有安装dump的,所以对他们而言这个entry应该写为0。
是否以fsck检验扇区:启动的过程中,系统默认会以fsck检验我们的 filesystem 是否完整 (clean)。 不过,某些 filesystem 是不需要检验的,例如内存置换空间 (swap) ,或者是特殊文件系统例如 /proc 与 /sys 等等。fsck会检查这个头目下的数字来决定检查文件系统的顺序,允许的数字是0, 1, 和2。0 是不要检验, 1 表示最早检验(一般只有根目录会配置为 1), 2 也是要检验,不过1会比较早被检验啦!一般来说,根目录配置为1,其他的要检验的filesystem都配置为 2 就好了。

fstab (简体中文)
https://wiki.archlinux.org/index.php/Fstab_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)


/etc/sysconfig

/etc/sysconfig/network

设置主机名

临时设置
使用hostname命令设置主机名。格式为:hostname 主机名,如下:
hostname hadoop1
该设置为临时生效。重新启动系统后,设置失效。

永久设置
编辑/etc/sysconfig/network文件中的HOSTNAME字段就可以修改主机名。如下所示:

NETWORKING=yes
NETWORKING_IPV6=yes
HOSTNAME=hadoop1

HOSTNAME=hadoop1 表示主机设置为hadoop1 .
注意:修改主机名后,需要重启系统后永久生效。


iptables 防火墙

iptables简介

iptables的前身叫ipfirewall (内核1.x时代),这是一个作者从freeBSD上移植过来的,能够工作在内核当中的,对数据包进行检测的一款简易访问控制工具。但是ipfirewall工作功能极其有限(它需要将所有的规则都放进内核当中,这样规则才能够运行起来,而放进内核,这个做法一般是极其困难的)。当内核发展到2.x系列的时候,软件更名为ipchains,它可以定义多条规则,将他们串起来,共同发挥作用,而现在,它叫做iptables,可以将规则组成一个列表,实现绝对详细的访问控制功能。

yum安装iptables

centos最小化安装也自带iptables防火墙,如果系统中没有iptables,可使用yum安装:
yum install iptables
如何检查系统中是否有iptables?
执行命令:service iptables status查看防火墙状态,如果提示 iptables:unrecognized service 则表示系统尚未安装。


iptables防火墙配置

安装完 iptables 后,配置文件默认在 /etc/sysconfig/iptables

查看防火墙状态

查看防火墙配置
/etc/init.d/iptables statusservice iptables status
结果为:

Table: filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
5    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination
1    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

开放指定端口

添加规则开放80端口:
/sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT
保存配置:
/etc/rc.d/init.d/iptables saveservice iptables save
显示

iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]

或者使用vi打开/etc/sysconfig/iptables文件修改手动添加

-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

重启防火墙:
service iptables restart
再次查看防火墙状态可见多了一条

1    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80

表明80端口开启成功

停止/启动防火墙

service iptables stop
重启系统后失效,防火墙依然存在

启动防火墙
service iptables restart

设置开机启动防火墙

chkconfig iptables off
即关闭iptables开机自启动
执行chkconfig命令,iptables行0-6全是off说明成功关闭:

iptables           0:off    1:off    2:off    3:off    4:off    5:off    6:off

永久关闭后启用
chkconfig iptables on
即添加iptables开机自启动


FirewallD防火墙(centos7自带)

Centos7 以上的发行版都试自带了 firewalld 防火墙的,firewalld 取代了 iptables 防火墙。
其原因是 iptables 的防火墙策略是交由内核层面的 netfilter 网络过滤器来处理的,而 firewalld 则是交由内核层面的 nftables 包过滤框架来处理。
相较于 iptables 防火墙而言,firewalld 支持动态更新技术并加入了区域(zone)的概念。简单来说,区域就是 firewalld 预先准备了几套防火墙策略集合(策略模板),用户可以根据生产场景的不同而选择合适的策略集合,从而实现防火墙策略之间的快速切换。

22 端口默认加入了允许规则,但其他比如 http 80 端口,以及其他中间件的 tcp 端口都是不通的。

启动和启用 firewalld

sudo systemctl start firewalld
sudo systemctl enable firewalld

禁用和停止 firewalld

sudo systemctl stop firewalld
sudo systemctl disable firewalld

查看 firewalld 运行状态

sudo firewall-cmd --state 查看 firewalld 运行状态,结果是 runningnot running

sudo systemctl status firewalld 查看 firewalld 状态,会输出一些详细信息


SELinux 访问控制

SELinux(Security Enhanced Linux) 是 Linux 的一个核心模块,由美国国家安全局 (NSA) 开发并整合到 Linux 核心,是对于强制访问控制(MAC)的实现,是 Linux 历史上最杰出的新安全子系统,提供了比传统的 UNIX 权限更好的访问控制。在 SELinux 的访问控制体系的限制下,进程只能访问那些在他的任务中所需要文件。

SELinux 的三种运行模式

  • enforcing 强制模式,表示 SELinux 运行中,且已经正确的开始限制 domain/type 了;
  • permissive 宽容模式,表示 SELinux 运行中,不过仅会有警告信息,并不会实际限制 domain/type 的存取。这种模式可以运来作为 SELinux 的 debug 之用;
  • disabled 关闭,SELinux 没有运行。

sestatus 查看SELinux状态

通过命令 sestatus 查看 SELinux 状态:

$ sestatus
SELinux status:                 disabled
$ sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      31

getenforce 获取SELinux运行状态

$ getenforce
Disabled
$ getenforce
Enforcing

setenforce 0/1 切换SELinux运行模式

setenforce [0|1] 切换 SELinux 运行模式
setenforce 0 转成 Permissive 宽容模式;
setenforce 1 转成 Enforcing 强制模式
由于 SELinux 整合到 Linux 核心里了,如果由 enforcing 或 permissive 模式改成 disabled,或由 disabled 改成其他两个,系统必须要重新启动;
在 SELinux运行(enforcing 或 permissive模式)时,只能在 enforcing 和 permissive 模式切换,不能够直接关闭 SELinux,只能通过修改配置文件,然后重启系统。
在 SELinux关闭(disabled)时,setenforce 命令不能设置 Enforcing 或 Permissive 模式,只能通过修改配置文件来设置,然后重启系统。

切换为 permissive 模式

$ getenforce
Enforcing
$ sudo setenforce 0
$ getenforce
Permissive

/etc/selinux/config 配置SELinux的状态

/etc/selinux/config 配置 SELinux 的状态,修改后必须重启系统。

SELINUX=enforcing 默认为enforcing,可设置为enforcing、permissive、disabled中的一项。
SELINUXTYPE=targeted 目前只能设置成targeted、mls中的一项

$ cat /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

1 如果从 disable 切换到enforcing或permissive模式时,由于系统必须要针对文档写入安全性本文的信息,因此开机过程会花费不少时间在等待重新写入 SELinux 安全性本文 (有时也称为 SELinux Label),而且在写完之后还得要再次的重新启动。
2 如果已经运行在Enforcing模式,但是可能由于SELinux的设置问题,导致某些服务无法正常的运行,此时可以将Enforcing 模式改为Permissive模式,让 SELinux只会警告无法顺利联机的信息,而不是直接阻挡主体程序的读取权限。


/etc/security/limits.conf

限制系统用户对shell资源的访问。

用命令ulimit -a可以查看所有shell资源限制值
ulimit -n <文件数目>:指定同一时间最多可开启的文件数
但此命令修改的值只适用于当前shell登录,要想永久修改,需要修改/etc/security/limits.conf配置文件

limits.conf工作原理

limits.conf文件实际是Linux PAM(插入式认证模块,Pluggable Authentication Modules)中 pam_limits.so 的配置文件,突破系统的默认限制,对系统访问资源有一定保护作用。 limits.conf 和sysctl.conf区别在于limits.conf是针对用户,而sysctl.conf是针对整个系统参数配置。
limits.conf是 pam_limits.so的配置文件,然后/etc/pam.d/下的应用程序调用pam_*.so模块。譬如说,当用户访问服务器,服务程序将请求发送到PAM模块,PAM模块根据服务名称在/etc/pam.d目 录下选择一个对应的服务文件,然后根据服务文件的内容选择具体的PAM模块进行处理。

limits.conf文件格式

limits.conf文件格式:username|@groupname type resource limit

  • username|@groupname
    设置需要被限制的用户名,组名前面加@和用户名区别。也可用通配符*来做所有用户的限制

  • type
    类型有softhard-,其中soft 指的是当前系统生效的设置值。hard 表明系统中所能设定的最大值。soft 的限制不能比har 限制高。用 - 就表明同时设置了soft 和hard的值

  • resource
    表示要限制的资源,包括如下:

    • core - 限制内核文件的大小
      何谓core文件?当一个程序崩溃时,在进程当前工作目录的core文件中复制了该进程的存储图像。core文件仅仅是一个内存映象(同时加上调试信息),主要是用来调试的。core文件是个二进制文件,需要用相应的工具来分析程序崩溃时的内存映像,系统默认core文件的大小为0,所以没有被创建。可以用ulimit命令查看和修改core文件的大小,但如果想让修改永久生效,则需要修改配置文件,如 .bash_profile、/etc/profile或/etc/security/limits.conf
    • date - 最大数据大小
    • fsize - 最大文件大小
    • memlock - 最大锁定内存地址空间
    • nofile - 打开文件的最大数目
      对于需要做许多套接字连接并使它们处于打开状态的应用程序而言,最好通过使用ulimit -n,或者通过设置nofile参数,为用户把文件描述符的数量设置得比默认值高一些
    • rss - 最大持久设置大小
    • stack - 最大栈大小
    • cpu - 以分钟为单位的最多 CPU 时间
    • noproc - 进程的最大数目
    • as - 地址空间限制
    • maxlogins - 此用户允许登录的最大数目

limits.conf设置生效

  • 暂时生效,适用于通过 ulimit 命令登录 shell 会话期间
  • 永久生效,通过将一个相应的 ulimit 语句添加到由登录 shell 读取的文件之一(例如 ~/.profile),即特定于 shell 的用户资源文件;或者通过编辑 /etc/security/limits.conf

注意:要使 limits.conf 文件配置生效,必须要确保 pam_limits.so 文件被加入到启动文件中。
查看 /etc/pam.d/login 文件中有:session required /lib/security/pam_limits.so

永久修改所有用户打开文件最大数目

修改/etc/security/limits.conf,添加:* - nofile 1006154
修改/etc/pam.d/login,添加:session required /lib/security/pam_limits.so

限制admin用户登录到sshd的服务不能超过2个

在/etc/security/limits.conf中添加:admin - maxlogins 2
在/etc/pam.d/sshd中添加:session required pam_limits.so


/etc/profile环境变量配置

  • /etc/profile,系统级环境变量,对所有用户起作用。profile文件在系统启动时将被运行。在profile文件添加或修改的内容需要注销系统或执行source命令才能生效。

  • /etc/bashrc,系统级环境变量,对所有用户起作用。修改这个文件不用重启,重新打开一个bash即可生效。

  • ~/.bash_profile,需要需要重启才会生效,/etc/profile对所有用户生效,~/.bash_profile只对当前用户生效。

  • ~/.bashrc,此文件类似于/etc/bashrc,不需要重启生效,重新打开一个bash即可生效,/etc/bashrc对所有用户新打开的bash都生效,但~/.bashrc只对当前用户新打开的bash生效。


login方式与non-login方式

~/.bash_profile 是交互式、login 方式进入bash 运行的;
~/.bashrc 是交互式、non-login 方式进入bash 运行的;
简单地说,.bash_profile只在会话开始时被读取一次,而.bashrc则每次打开新的终端时,都会被读取。
所以一般优先把变量设置在.bashrc里面。
通常二者设置大致相同,所以通常前者会调用后者。

交互式的:顾名思义,这种shell中的命令时由用户从键盘交互式地输入的,运行的结果也能够输出到终端显示给用户看。
非交互式的:这种shell可能由某些自动化过程启动,不能直接从请求用户的输入,也不能直接输出结果给终端用户看。输出最好写到文件。


常见的环境变量

: 表示并列含义,例如A变量值有多个,用:符号进行分离。
. 表示你操作的当前目录。

使用env命令显示所有的环境变量 ,set命令显示所有本地定义的Shell变量。

  • PATH:决定了shell将到哪些目录中寻找命令或程序
  • HOME:当前用户主目录
  • MAIL:是指当前用户的邮件存放目录。
  • SHELL:是指当前用户用的是哪种Shell。
  • HISTSIZE:是指保存历史命令记录的条数。
  • LOGNAME:是指当前用户的登录名。
  • HOSTNAME:是指主机名称,许多应用程序如果要用到主机名的话,通常是从这个环境变量中来取得的。
  • LANG/LANGUGE:是和语言相关的环境变量,使用多种语言的用户可以修改此环境变量。
  • PS1:是基本提示符,对于root用户是#,对于普通用户是$。
  • PS2:是附属提示符,默认是“>”。

Linux代理配置

vi /etc/profile
添加如下内容:

http_proxy=http://[username:password@]proxy_ip:port/
https_proxy=http://[username:password@]proxy_ip:port/
ftp_proxy=http://[username:password@]proxy_ip:port/
no_proxy = 192.168.20. # 访问局域网地址192.168.20.*时不使用代理,可以用逗号分隔多个地址
ALL_PROXY=socks5://127.0.0.1:1080 # 全局代理
export http_proxy
export https_proxy
export ftp_proxy
export no_proxy
export ALL_PROXY

之后
source /etc/profile 使配置生效

例如:

http_proxy=http://172.17.18.80:8080/
https_proxy=http://172.17.18.80:8080/
ftp_proxy=http://172.17.18.80:8080/
ALL_PROXY=socks5://127.0.0.1:1080 # 全局代理
export http_proxy
export https_proxy
export ftp_proxy
export ALL_PROXY

如果需要为某个用户设置一个系统级的代理,可以在~/.bash_profile中设置。


$PS1命令提示符配置

$PS1 是Linux终端用户的一个环境变量,用来说明命令行提示符的设置。
可以使用 man bash命令查看bash手册,找到该变量支持的特殊字符,以及这些特殊字符的意义:

\d :#代表日期,格式为weekday month date,例如:"Mon Aug 1"
\H :#完整的主机名称。
\h :#仅取主机的第一个名字,如上例,则为fc4,.linux则被省略
\t :#显示时间为24小时格式,如:HH:MM:SS
\T :#显示时间为12小时格式
\A :#显示时间为24小时格式:HH:MM
\u :#当前用户的账号名称
\v :#BASH的版本信息
\w :#完整的工作目录名称。家目录会以 ~代替
\W :#利用basename取得工作目录名称,所以只会列出最后一个目录
\# :#下达的第几个命令
\$ :#提示字符,如果是root时,提示符为:# ,普通用户则为:$

centos 中默认命令提示符格式:

$ echo $PS1
[\u@\h \W]\$

写入 /etc/profile/etc/bashrc 对全部用户生效;
写入 ~/.bash_profile~/.bashrc 只对当前用户生效。

配置 ~/.bashrc 文件, 然后使用source使其生效

$ vi ~/.bashrc
#在文件最后添加如下设置
export PS1="[\u@\h \W] \$ "
$ source ~/.bashrc #使其设置生效

/etc/locatime Linux时区设置

查看当前时区date -R

$ date -R
Sun, 10 Mar 2019 05:05:22 +0000

下面以设置上海时区Asia/Shanghai为例:

修改linux时区

1、使用tzselect获取时间文件

$ tzselect
Please identify a location so that time zone rules can be set correctly.
Please select a continent, ocean, "coord", or "TZ".
 1) Africa
 2) Americas
 3) Antarctica
 4) Asia
 5) Atlantic Ocean
 6) Australia
 7) Europe
 8) Indian Ocean
 9) Pacific Ocean
10) coord - I want to use geographical coordinates.
11) TZ - I want to specify the time zone using the Posix TZ format.
#?

输入序号选择大洲,输入4选择亚洲

#? 4
Please select a country whose clocks agree with yours.
 1) Afghanistan          18) Israel            35) Palestine
 2) Armenia          19) Japan            36) Philippines
 3) Azerbaijan          20) Jordan            37) Qatar
 4) Bahrain          21) Kazakhstan        38) Russia
 5) Bangladesh          22) Korea (North)        39) Saudi Arabia
 6) Bhutan          23) Korea (South)        40) Singapore
 7) Brunei          24) Kuwait            41) Sri Lanka
 8) Cambodia          25) Kyrgyzstan        42) Syria
 9) China          26) Laos            43) Taiwan
10) Cyprus          27) Lebanon            44) Tajikistan
11) East Timor          28) Macau            45) Thailand
12) Georgia          29) Malaysia            46) Turkmenistan
13) Hong Kong          30) Mongolia            47) United Arab Emirates
14) India          31) Myanmar (Burma)        48) Uzbekistan
15) Indonesia          32) Nepal            49) Vietnam
16) Iran          33) Oman            50) Yemen
17) Iraq          34) Pakistan
▽
#?

输入序号选择国家,输入9选择中国

#? 9
▽
ZONE="Asia/Shanghai"
Please select one of the following time zone regions.
1) Beijing Time
2) Xinjiang Time
#?

输入序号选择时区,中国有两个时区,选择1北京时间

#? 1
The following information has been given:

    China
    Beijing Time

Therefore TZ='Asia/Shanghai' will be used.
Selected time is now:    Sun Mar 10 13:06:20 CST 2019.
Universal Time is now:    Sun Mar 10 05:06:20 UTC 2019.
Is the above information OK?
1) Yes
2) No
#?

输入序号确认,输入1确认yes

#? 1
You can make this change permanent for yourself by appending the line
    TZ='Asia/Shanghai'; export TZ
to the file '.profile' in your home directory; then log out and log in again.

Here is that TZ value again, this time on standard output so that you
can use the /usr/bin/tzselect command in shell scripts:
Asia/Shanghai

获取时间文件完成后,就有了时间文件:/usr/share/zoneinfo/Asia/Shanghai
注意:tzselect命令只告诉你选择的时区的写法,并不会生效。所以现在它还不是东8区北京时间。
你可以在.profile、.bash_profile或者/etc/profile中设置正确的TZ环境变量并导出。 例如在.bash_profile里面设置 TZ=’Asia/Shanghai’; export TZ并使其生效source .bash_profile

如果想全局生效,可以继续下面的步骤。

2、修改系统时区文件/etc/sysconfig/clock

注意, 有的系统 比如 centos7 中没有此时区文件,可以跳过步骤2
使用新时区更新 /etc/sysconfig/clock 文件。
(1)使用您常用的文本编辑器(如 vim 或 nano)打开 /etc/sysconfig/clock 文件。您需要在编辑器命令中使用 sudo,因为 /etc/sysconfig/clock 归 root 所有。
(2)查找 ZONE 条目,将其更改为时区文件 (忽略路径的 /usr/share/zoneinfo 部分)。例如,要更改为上海时区,请将 ZONE 条目更改为以下内容:

ZONE="Asia/Shanghai"

(3)保存文件,退出文本编辑器。

3、替换或链接/etc/locatime的时区文件

/etc/localtime 与时区文件之间创建一个符号链接,以便实例在引用本地时间信息时找到此时区文件。

sudo ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

或者直接替换

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

查看时区:

$ date -R
Sun, 10 Mar 2019 14:36:00 +0800

看到已经修改为+8区

/etc/sysconfig/clock和/etc/localtime的区别

1)/etc/sysconfig/clock 文件,只对 hwclock 命令有效,且只在系统启动和关闭的时候才有用
在 /etc/sysconfig/clock 中 UTC=false 时,date、hwclock、hwclcok –localtime 输出的时间应该都一致,且此时 hwclock –utc是没有意义的;
在 /etc/sysconfig/clock 中 UTC=ture 时,date、hwclock 的输出是一致的,hwclock –localtime 的输出则是UTC时间;
系统关闭时会同步系统时间到硬件时钟,系统启动时会从硬件时钟读取时间更新到系统,这2个步骤都要根据 /etc/sysconfig/clock 文件中UTC的参数来设置时区转换。

2)/etc/localtime
这个文件用来设置系统的时区,将 /usr/share/zoneinfo/ 中相应文件拷贝到 /etc 下并重命名为 localtime 即可修改时区设置,而且这种修改对 date 命令是及时生效的。不论是 date 还是 hwclock 都会用到这个文件,会根据这个文件的时区设置来进行UTC和本地之间之间的换算。

linux修改时区
http://coolnull.com/235.html

Linux查看设置系统时区
https://www.cnblogs.com/kerrycode/p/4217995.html

/etc/localtime和/etc/timezone区别

/etc/timezone 是一个纯文本文件

$ cat /etc/timezone
Asia/shanghai

/etc/localtime 通常链接到一个时区文件

$ ll /etc/localtime
lrwxrwxrwx. 1 root root 33 12月 21 21:15 /etc/localtime -> /usr/share/zoneinfo/Asia/Shanghai

/etc/localtime 是用来描述本机时间,而 /etc/timezone 是用来描述本机所属的时区


上一篇 2016年第三季度运动记录

下一篇 VPS

阅读
评论
10,790
阅读预计45分钟
创建日期 2016-06-17
修改日期 2020-08-29
类别
标签
目录
  1. /proc/meminfo 内存信息
  2. /proc/cpuinfo CPU信息
    1. 查看cpu核数
  3. /proc/pid 查看进程的运行目录
  4. /proc/swaps 交换空间信息
  5. linux OOM killer机制
    1. vm.overcommit_memory
    2. vm.overcommit_ratio
  6. /etc/hosts
    1. 设置主机名
    2. Centos7 hostname 配置
      1. hostnamectl 查看主机名
      2. hostnamectl set-hostname 设置主机名
  7. /etc/passwd 用户信息
    1. 查看所有用户
    2. 禁止用户登录
  8. /etc/shells
  9. /etc/group 组信息
    1. wheel 用户组
  10. /etc/sysctl.conf
    1. vm.max_map_count
  11. /etc/fstab 文件系统挂载信息
  12. /etc/sysconfig
    1. /etc/sysconfig/network
      1. 设置主机名
  13. iptables 防火墙
    1. iptables简介
    2. yum安装iptables
    3. iptables防火墙配置
    4. 查看防火墙状态
    5. 开放指定端口
    6. 停止/启动防火墙
    7. 设置开机启动防火墙
  14. FirewallD防火墙(centos7自带)
    1. 启动和启用 firewalld
    2. 禁用和停止 firewalld
    3. 查看 firewalld 运行状态
  15. SELinux 访问控制
    1. SELinux 的三种运行模式
    2. sestatus 查看SELinux状态
    3. getenforce 获取SELinux运行状态
    4. setenforce 0/1 切换SELinux运行模式
    5. /etc/selinux/config 配置SELinux的状态
  16. /etc/security/limits.conf
    1. limits.conf工作原理
    2. limits.conf文件格式
    3. limits.conf设置生效
    4. 永久修改所有用户打开文件最大数目
    5. 限制admin用户登录到sshd的服务不能超过2个
  17. /etc/profile环境变量配置
    1. login方式与non-login方式
    2. 常见的环境变量
    3. Linux代理配置
    4. $PS1命令提示符配置
  18. /etc/locatime Linux时区设置
    1. 查看当前时区date -R
    2. 修改linux时区
      1. 1、使用tzselect获取时间文件
      2. 2、修改系统时区文件/etc/sysconfig/clock
      3. 3、替换或链接/etc/locatime的时区文件
    3. /etc/sysconfig/clock和/etc/localtime的区别
    4. /etc/localtime和/etc/timezone区别

页面信息

location:
protocol:
host:
hostname:
origin:
pathname:
href:
document:
referrer:
navigator:
platform:
userAgent:

评论