查看操作系统相关信息

1
2
3
4
查看到的是瞬态的(Tansient hostname)
uname -a
# 查看操作系统环境
cat /etc/redhat-release

修改主机名

  • 静态的(Static hostname)

    “静态”主机名也称为内核主机名,是系统在启动时从/etc/hostname 自动初始化的主机名。

  • 瞬态的(Tansient hostname)

    “瞬态”主机名是在系统运行时临时分配的主机名,例如,通过 DHCP 或 mDNS 服务器分配。

  • 灵活的(Pretty hostname)

    “灵活”主机名也有人叫做“别名”主机名。
    “灵活”主机名则允许使用自由形式(包括特殊/空白字符)的主机名,以展示给终端用户(如 xh01@f5)。
    “静态”主机名和“瞬态”主机名都遵从作为互联网域名同样的字符限制规则。

  • 在 CentOS 7 中,有个叫 hostnamectl 的命令行工具,它允许你查看或修改与主机名相关的配置。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    //查看一下当前主机名的情况,查看全部三种主机名
    hostnamectl

    //或者,查看全部三种主机名
    hostnamectl status

    //只查看静态、瞬态或灵活主机名,分别使用--static,--transient或--pretty选项
    [root@xh00 ~]# hostnamectl --static

    xh00
    [root@xh00 ~]# hostnamectl --transient

    xh01
    [root@xh00 ~]# hostnamectl --pretty


    //或者,查看到的是瞬态的(Tansient hostname)
    hostname

    //或者查看主机名配置文件,查看到的是静态的(Static hostname)
    cat /etc/hostname

临时有效

  • 只能临时修改的主机名,当重启机器后,主机名称又变回来了。

    1
    hostname xh01

永久生效:hostnamectl

  • 一旦修改了静态主机名,/etc/hostname 将被自动更新。然而,/etc/hosts 不会更新以保存所做的修改,所以你每次在修改主机名后一定要手动更新/etc/hosts,之后再重启 CentOS 7。否则系统再启动时会很慢。

    1
    2
    3
    4
    5
    6
    7
    //永久性的修改主机名称,重启(注销重新登录后可查看)后能保持修改后的。
    hostnamectl set-hostname xxx

    //删除hostname
    hostnamectl set-hostname ""
    hostnamectl set-hostname "" --static
    hostnamectl set-hostname "" --pretty

永久生效:修改配置文件

  • 修改配置文件/etc/hostname 来实现主机名的修改。把该文件内容第一行替换成自己想要的主机名重启即可。

    1
    2
    [root@hadoop01 hadoop]# cat /etc/hostname
    hadoop01

永久生效: nmtui

  • 通过 nmtui 修改,之后重启 hostnamed

    1
    2
    nmcli general hostname servername
    systemctl restart systemd-hostnamed
  • 还可以通过 nmtui 进入图形界面来修改主机名。将光标通过键盘的上下键移动到“设定系统主机名”菜单处,按下回车键。

    此时,屏幕出现“设定主机名”选项卡,输入需要设定的主机名,通过键盘方向键将光标移动到“确定”处,回车键确定即可完成主机名的修改。

Centos 配置静态 IP

在 rhel8(含 centos8)上,在/etc/sysconfig/network-scripts/里也看不到任何脚本文件,没有传统的 network.service。因此只能通过其它方法进行网络配置,包括 NM 命令工具集。换言之,在 rhel8 上,必须开启 NM,否则无法使用网络。

手动配置文件静态 IP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@centos ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="dhcp"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="eth0"
UUID="c3766d2e-1c20-4ff0-a984-c8f2b6ba61fd"
DEVICE="eth0"
ONBOOT="yes"

修改如下:

1
2
3
4
5
6
7
8
9
10
11
12
[root@centos ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33

# 删除 dhcp
- BOOTPROTO="dhcp"
# 添加如下内容
BOOTPROTO="static"
IPADDR=192.168.61.45
NETMASK=255.255.255.0
GATEWAY=192.168.61.2
DNS1=192.168.61.2
DNS2=8.8.5.5
PREFIX=24
1
2
3
4
5
6
7
8
9
10
 重启 network  centos7
service network restart

# centos8
[root@centos ~]# nmcli c reload # 重新回载网络配置
[root@centos ~]# nmcli c #查看
NAME UUID TYPE DEVICE
docker0 a2b07a6c-142a-4f39-b13e-1b1a2f5cdff0 bridge docker0
eth0 c3766d2e-1c20-4ff0-a984-c8f2b6ba61fd ethernet eth0

vmware 的配置

修改 NAT 模式

我习惯删除多余不用的模式,修改子网 ip 的地址段

查看网关

点击上图的 NAT 设置:得到网关地址为 192.168.61.2
1576742074_20191218163520007_20920

Vmware Fusion 配置

配置自定义网络连接

1576742076_20191218201233132_999790183

修改虚拟机的网络适配器

1576742078_20191218201434774_1561551553

1576742080_20191218201521715_599301284

注意 : 这里的网关地址用子网 IP , 最后一位为 2, bigsur 版本为 1,具体网关查看方式 cat /Library/Preferences/VMware\ Fusion/vmnet2/nat.conf

重启

发现 IP 改变了,也能访问外网

1576742082_20191218202420137_758375758

Hyper-V 虚拟网络设置

打开 Hyper-V 上的虚拟机交换机管理器:

新建虚拟机网络交换机

如图,虚拟机交换机管理-> 新建虚拟机网络交换机, 勾选外部网络,如下

  • 选择外部网络会出现网桥

  • 使用内部网络需要共享网络

  • 使用上一步创建的外部网络

配置网络

共享网络

以上设置好后就重启虚拟机,就可以在本地物理机访问虚拟机了,如下我们 ping 下刚才的 192.168.137.45,可见是可以 ping 得通的,这时就可以使用 xshell 等终端进行连接操作了:
20191216222049297_24769

Centos 配置 yum 源

  • 清华大学镜像仓库(推荐)

    地址: https://mirrors.cnnic.cn/

  • 阿里镜像

  • https://developer.aliyun.com/mirror/centos

    1
    2
    3
    4
    5
    # CentOS 6

    wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-6.repo
    或者
    curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-6.repo
    1
    2
    3
    4
    5
    # CentOS 7

    wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
    或者
    curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
    1
    2
    3
    4
    5
    # CentOS 8

    wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo
    或者
    curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo
  • 非阿里云 ECS 用户会出现 Couldn't resolve host 'mirrors.cloud.aliyuncs.com' 信息,不影响使用。用户也可自行修改相关配置: eg:
    
    sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
    
    
    1
    2
    3
    4
    5
    6

    - ```sh
    yum clean all # 清除系统所有的 yum 缓存
    yum makecache # 生成 yum 缓存
    yum repolist all # 查看所有的 yum 源
    yum repolist enabled # 查看可用的 yum 源
  • # yum update 不要随便执行,会更新系统内核
    # 升级所有包,改变软件设置和系抄统设置, 系统版本内核都升级。
    yum -y update
    # 升级所有包,不改变软件设置和系统设置,系统版本升级,内核不改变。
    yum -y upgrade
    
    1
    2
    3
    4
    5
    6
    7

    ## 防火墙

    ### 打开防火墙

    ```bash
    systemctl start firewalld # 启动,

关闭防火墙

1
systemctl stop firewalld          # 关闭

重启防火墙

1
service firewalld restart 				#重启

设置开机启动

1
systemctl enable firewalld        # 开机启动

取消开机启动

1
systemctl disable firewalld       # 取消开机启动

查看防火墙状态

1
firewall-cmd --state

查看防火墙规则

1
firewall-cmd --list-all

防火墙中添加应用

1
firewall-cmd --add-service = postgresql --permanent

防火墙添加端口

1
firewall-cmd  --add-port = 9527/tcp --permanent

添加参数介绍

1
2
3
4
firewall-cmd:是 Linux 提供的操作 firewall 的一个工具;
--permanent:表示设置为持久;
--add-port:标识添加的端口;
--add-service: 标识添加的服务

selinux

SELinux 主要作用就是最大限度地减小系统中服务进程可访问的资源(最小权限原则)。

关闭

1
2
3
4
5
6
7
8
9
#查看
cat /etc/selinux/config
#sed -i "s/查找字段/替换字段/g" 文件名
#永久关闭,必须重启
sed -i 's/SELINUX = enforcing/SELINUX = disabled/g' /etc/selinux/config
#临时关闭
setenforce 0


查看SELinux状态

1
2
3
4
5
# getenforce 用这个命令检查
getenforce

##如果 SELinux status 参数为 enabled 即为开启状态
/usr/sbin/sestatus -v
  • Enforcing:强制模式。代表SELinux在运行中,且已经开始限制domain/type之间的验证关系

  • Permissive:宽容模式。代表SELinux在运行中,不过不会限制domain/type之间的验证关系,即使验证不正确,进程仍可以对文件进行操作。不过如果验证不正确会发出警告

  • Disabled:关闭模式。SELinux并没有实际运行

ssh

Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境。SSH通过在网络中创建安全隧道来实现SSH客户端与服务器之间的连接。虽然任何网络服务都可以通过SSH实现安全传输,SSH最常见的用途是远程登录系统,人们通常利用SSH来传输命令行界面和远程执行命令。telnet使用23号端口,所有的信息,包括用户名和密码都是明文传输;而ssh使用22号端口,所有的信息都会被加密传输,安全性得到了很大的提高。

  • ssh使用十分简单,选择以什么用户连接哪台机器,然后输入密码即可:

    1
    2
    $ssh user@hostname
    user@hostname's password:

加密方式

ssh的主要有点就是安全性,安全性依赖于加密方式,现在主要的加密方式有两种:对称加密和非对称加密。

  • 对称加密使用同一个密钥来进行加密和解密,这样在传输时是安全可靠的,但是如何安全的保存密钥呢,在集群中,客户端的数量巨大,一旦任意一个客户端的密钥被窃取,那么整个系统的安全性也不复存在。
  • 由于对称加密的这个弊端,产生了非对称加密,非对称加密中有两个密钥:公钥和私钥。公钥由私钥产生,但却无法推算出私钥;公钥加密后的密文,只能通过对应的私钥来解密。

非对称加密的登录流程

初始状态:终端要登录Server服务器,发起连接请求ssh work@server.com

  1. 服务端运行有ssh服务,并持续监听22号端口,因此可以生成一对公钥和私钥;此时将公钥返回给客户端
  2. 客户端使用公钥,对登录密码进行加密,(如服务器work用户密码为xxx),生成公钥加密字符串
  3. 客户端将公钥加密字符串发送给服务端
  4. 服务端使用私钥,解密公钥加密字符串,得到原始密码
  5. 校验密码是否合法(此为本机work密码)
  6. 返回登录结果给客户端:成功登录或密码错误

在非对称加密中,由于只有公钥会被传输,而私钥是服务端本地保存,因此即便公钥被监听,也无法拿到原始密码,从而登录服务器。

中间人攻击

在非对称加密中可以有效保护登录密码不被泄漏,但这是在建立连接到真实服务器的情况下。设想一下,如果供给者并不监听密码或公钥,而是直接伪装成服务器呢.

存在Hacker服务器劫持了你的ssh建连请求(如通过DNS劫持等方式),导致你与Hacker机器的连接一切正常,因此它能拿到你的明文密码,并通过明文密码来攻击真实的服务端。

SSH采用了非对称的加密方式,是怎么解决这个问题的呢?

  • 通过让我们肉眼比对来判断目标服务器是否是真实服务器

  • fingerprint(公钥指纹)代替key,主要是key过于长(RSA算法生成的公钥有1024位),很难直接比较。所以,对公钥进行hash生成一个128位的指纹,这样就方便比较了。

1
2
3
4
5
6
7
8
9
10
11
[root@hadoop01 hadoop]# ssh  hadoop@192.168.61.45
# 无法确定主机“server.com(10.10.10.24)”的真实性。
The authenticity of host '192.168.61.45 (192.168.61.45)' can't be established.
ECDSA key fingerprint is SHA256: 3Pv+hrn4MBRZu6wy0Wr9Y1PdQDmF+oZmZAwkcbxOwbA.
ECDSA key fingerprint is MD5: 32: b1: c0: b0: db: 1b: db: 34: 34: 59: 69: 0b: 63: 86: d2: 0a.
# 知道它的公钥指纹,是否继续连接?
Are you sure you want to continue connecting (yes/no)? yes
# 输入 yes 继续连接后,就会确认该服务器为可信任服务器,然后添加到 known_hosts 文件中,下次不用再次确认,然后跳转到输入密码的验证阶段。
Warning: Permanently added '192.168.61.45' (ECDSA) to the list of known hosts.
hadoop@192.168.61.45's password:
Last login: Sat Jul 25 01: 45: 34 2020 from 192.168.61.1

SSH免密登录

使用ssh登录远程服务器了,但是每次登录都要输入密码,比较麻烦。ssh提供一种免密登录的方式:公钥登录。

  1. 在客户端使用ssh-keygen生成一对密钥:公钥+私钥
  2. 将客户端公钥追加到服务端的authorized_key文件中,完成公钥认证操作
  3. 认证完成后,客户端向服务端发起登录请求,并传递公钥到服务端
  4. 服务端检索authorized_key文件,确认该公钥是否存在
  5. 如果存在该公钥,则生成随机数R,并用公钥来进行加密,生成公钥加密字符串pubKey(R)
  6. 将公钥加密字符串传递给客户端
  7. 客户端使用私钥解密公钥加密字符串,得到R
  8. 服务端和客户端通信时会产生一个会话ID(sessionKey),用MD5R和SessionKey进行加密,生成摘要(即MD5加密字符串)
  9. 客户端将生成的MD5加密字符串传给服务端
  10. 服务端同样生成MD5(R,SessionKey)加密字符串
  11. 如果客户端传来的加密字符串等于服务端自身生成的加密字符串,则认证成功
  12. 此时不用输入密码,即完成建连,可以开始远程执行shell命令了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
ssh-genkey 是生成密钥的工具,执行完成后生成公钥和密钥,这两个文件会默认保存在~/.ssh/路径下。常用的参数为:
-t: 指定生成密钥类型(rsa、dsa)。默认为 rsa
-f: 指定存放私钥的文件,公钥文件名为私钥文件名加.pub 后缀。默认为 id_rsa
-P: 指定 passphrase(私钥的密码),用于确保私钥的安全。默认为空
-C: 备注。默认为 user@hostname

我们直接执行来生成密钥,所有的参数都可以为空,也就是一直回车确认:
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hadoop/.ssh/id_rsa):
Created directory '/home/hadoop/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/hadoop/.ssh/id_rsa.
Your public key has been saved in /home/hadoop/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256: DFFUH19Nv9PkOpZ3HpvttCawBXJrKFttIWHYQLeBjTg hadoop@hadoop01

## 此时,生成的文件在~/.ssh/目录下,我们会看到这些文件:
id_rsa // 私钥文件
id_rsa.pub // 公钥文件
authorized_keys // 存放客户端公钥的文件
known_hosts // 确认过公钥指纹的可信服务器列表的文件
config // 指定不同域名使用哪个密钥的配置文件

## 因为一台机器即能是客户端,又能是服务端,因此同时存在 authorized_keys(在该机器为服务端时使用)和 Known_hosts(在该机器为客户端时使用)。
  • 例子

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    # 第一步: 在本地机器上使用 ssh-keygen 产生公钥私钥对
    [hadoop@hadoop01 ~]$ ssh-keygen -t rsa -P password
    Generating public/private rsa key pair.
    Enter file in which to save the key (/home/hadoop/.ssh/id_rsa):
    /home/hadoop/.ssh/id_rsa already exists.
    Overwrite (y/n)? y
    Your identification has been saved in /home/hadoop/.ssh/id_rsa.
    Your public key has been saved in /home/hadoop/.ssh/id_rsa.pub.
    The key fingerprint is:
    SHA256: ld27QVjFQSpPw5YeQFArbZoQrXzWxRDMGaRbJuUozCk hadoop@hadoop01
    The key's randomart image is:

    # 第二步: 用 ssh-copy-id 将公钥复制到远程机器中, 第一次需要密码登录
    [hadoop@hadoop01 ~]$ ssh-copy-id username@hostname

    # ERROR: No identities found
    # 当没有值传递的时候或者 如果 ~/.ssh/identity.pub 文件不可访问(不存在), ssh-copy-id 将显示上述的错误信息
    # ssh-copy-id -i ~/.ssh/id_rsa.pub -p 23 username@hostname
    # -p 制定端口
    # -i 指定公钥文件

对不同服务器的配置

我们的服务器会有很多的用户,如果所有的用户都用同一份密钥,可能就没办法划分权限或者区分用户,如多个用户提交git就需要按照用户名来生成密钥,用于区分用户。同时你可能也希望针对不同的服务器使用不同的密钥对,因此需要config配置文件来配置针对不同服务器的配置:

1
2
3
4
5
6
7
8
$vim ~/.ssh/config
Host a.baidu.com
User work
IdentityFile ~/.ssh/id_rsa

Host b.baidu.com
User zhaoshuaiqiang
IdentityFile ~/.ssh/zhaoshuaiqiang

这样在连接不同的服务器时,就会使用不同的密钥文件来登录。在客户端生成密钥对之后,将公钥追加到服务器的authorized_keys文件中即可。此时,即可免密登录服务器。

1
2
3
4
5
6
7
8
...
15 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAn30bjwtkLW82vTlLMQnI/a42J2g7o+HBCpSzBgNG+xfZuSNQOAU8+FNKQvriT4AL7ToiTtrZDLOEGqyQzaxQejuNnWG6aQ9ETh96qXhVLecWidaBieFGuv+F
uXz6x551xtFXx64AzG+706dhnv1nOACYlrnfvXhi5kZzWzprET+CxMIeYhJQwwc19pF5zCWeU9QUvd1mOu0n8JVycevmuXRdVx9WpXq2+aaaaaaaa3uYGMBxvSLtT40O1AiEZ+k9EeYCnTEV
tnGoVWCyxpwv6rR/GDOtJL/d+/Wb6I0HEKxxe087yZz8GWpQN5TEIAjq3oEjI/aiGw == work@a.baidu.com
16 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAzRmK+CAVLnryXqQwweu8Yji8bGAvqzf8PSDzYn1nmE6ZeDkBbrWvFlVZ2yOip3IX8RjvuPc28mTCr0LsIOOmpvET0SzOkt0hzLBPiyCN/QvbKU/RbUv8v5y2
hEAlbUkMEzv7qOHQEruGEvA5y99gf/nYjK5OFKVpmg838OScUV3i88Xbqk8rtcuRZHWuZLnuB5spBsEE5r1UrnH/Ik7frZr8Vb4X6aZWbAp1yc0SqZ8JXVbmOiakqq0WqkLm+zqhEwr+Ooh2guH23x9zjMqY
Uy+aaaaaBEBC+LepCvskArBt/SRwJDJkcItz8T7kBC3CP0Y0X4hB+6k6/yM/pup5w == work@b.baidu.com

私钥的安全性

假设你已经实现了服务器集群的免密登录,那么如果你的一台客户端被攻击成功了,那么整个集群的安全性便荡然无存了。因此,我们有时还需要对密钥做安全性保障,即设置私钥密码:

1
2
// 使用 rsa 方法加密,生成 test 密钥对,私钥密码为 123456
ssh-keygen -t rsa -f test -P 123456

此时,各机器仍然是免密登录,但是需要你输入私钥密码:

1
2
$ssh work@a.baidu.com
Enter passphrase for key '/home/work/.ssh/test':

scp传输文件

scp(secure copy)linux系统下基于ssh登录进行安全的远程文件拷贝的命令。与scp相似的命令是cp,但是cp只能本机拷贝而不能跨服务器,因此需要与ssh合作构成scp命令。远程拷贝的命令还有rsyncscp消耗资源少,不会提高多少系统负荷,在这一点上,rsync就远远不及它了。rsyncscp会快一点,但当小文件多的情况下,rsync会导致硬盘I/O非常高,而scp基本不影响系统正常使用。

  • 传递文件到远程

    1
    scp local_file remote_username@remote_ip: remote_file
  • 传递文件夹到远程

    1
    scp -r local_folder remote_username@remote_ip: remote_folder
  • 复制远程文件到本地(只是调换下文件参数位置即可)

    1
    scp remote_username@remote_ip: remote_file local_file
  • 我们直接使用scp来跨机器拷贝文件,会提示输入密码:

    1
    2
    3
    # 提示输入 server 端服务器的 work 用户密码
    [work@client.com ~]$ scp test.php work@server.com:/home/work
    work@server.com's password:

    scp是先使用ssh连接服务端机器后,再使用网络来执行远程拷贝(cp)

  • 参考ssh的过程:

    1
    2
    3
    # 同样的提示输入 server 端服务器的 work 用户密码
    [work@client.com ~]$ ssh work@server.com
    work@server.com's password:

加入sudo权限

  • CentOS7给普通用户配置sudo权限,即把普通用户加入wheel用户组

    • 在CentOS系统中,默认情况下,wheel用户组成员被授予sudo权限。

      1
      2
      3
      [root@localhost ~]# cat /etc/sudoers
      ## Allows people in group wheel to run all commands
      %wheel ALL =(ALL) ALL
    • 授予 sudo 权限

      1
      2
      3
      4
      5
      6
      usermod -aG wheel user
      # -g <群组>  修改用户所属的群组。
      # -G <群组>  修改用户所属的附加群组。
      # -a 表示在原来所属组的基础上追加
      -G 修改当前次要组
      -G -a 是增加新的次要组
    • 检查用户是否添加进 wheel 组

      1
      2
      3
      4
      5
      $ lid -g wheel
      # 显示用户 id 和组 id 信息
      # id 命令可以显示真实有效的用户 ID(UID) 和组 ID(GID)。
      # UID 是对一个用户的单一身份标识。组 ID(GID)则对应多个 UID。
      $ id username
  • 修改sudo配置文件,在root下执行,否则请加sudo

    1
    2
    3
    4
    5
    # 打开 sudo 配置文件
    visudo
    # 找到下面这两行,并在下面新增红色部分
    root ALL =(ALL) ALL
    username ALL =(ALL) ALL

校准时间

  • 使用ntp校时包:

    1
    2
    yum install -y ntp
    ntpdate cn.pool.ntp.org